/*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.optaplanner.core.api.score.buildin.hardsoftbigdecimal;
import java.math.BigDecimal;
import org.junit.Test;
import org.optaplanner.core.api.score.buildin.AbstractScoreTest;
import org.optaplanner.core.impl.testdata.util.PlannerAssert;
import org.optaplanner.core.impl.testdata.util.PlannerTestUtils;
import static org.junit.Assert.*;
public class HardSoftBigDecimalScoreTest extends AbstractScoreTest {
@Test
public void parseScore() {
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("-147.2"), new BigDecimal("-258.3")),
HardSoftBigDecimalScore.parseScore("-147.2hard/-258.3soft"));
assertEquals(HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-147.2"), new BigDecimal("-258.3")),
HardSoftBigDecimalScore.parseScore("-7init/-147.2hard/-258.3soft"));
}
@Test
public void toShortString() {
assertEquals("0",
HardSoftBigDecimalScore.valueOf(new BigDecimal("0.0"), new BigDecimal("0.0")).toShortString());
assertEquals("-258.3soft",
HardSoftBigDecimalScore.valueOf(new BigDecimal("0.0"), new BigDecimal("-258.3")).toShortString());
assertEquals("-147.2hard",
HardSoftBigDecimalScore.valueOf(new BigDecimal("-147.2"), new BigDecimal("0.0")).toShortString());
assertEquals("-147.2hard/-258.3soft",
HardSoftBigDecimalScore.valueOf(new BigDecimal("-147.2"), new BigDecimal("-258.3")).toShortString());
assertEquals("-7init",
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("0.0"), new BigDecimal("0.0")).toShortString());
assertEquals("-7init/-258.3soft",
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("0.0"), new BigDecimal("-258.3")).toShortString());
assertEquals("-7init/-147.2hard/-258.3soft",
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-147.2"), new BigDecimal("-258.3")).toShortString());
}
@Test
public void testToString() {
assertEquals("0.0hard/-258.3soft",
HardSoftBigDecimalScore.valueOf(new BigDecimal("0.0"), new BigDecimal("-258.3")).toString());
assertEquals("-147.2hard/-258.3soft",
HardSoftBigDecimalScore.valueOf(new BigDecimal("-147.2"), new BigDecimal("-258.3")).toString());
assertEquals("-7init/-147.2hard/-258.3soft",
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-147.2"), new BigDecimal("-258.3")).toString());
}
@Test(expected = IllegalArgumentException.class)
public void parseScoreIllegalArgument() {
HardSoftBigDecimalScore.parseScore("-147.2");
}
@Test
public void toInitializedScore() {
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("-147.2"), new BigDecimal("-258.3")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-147.2"), new BigDecimal("-258.3")).toInitializedScore());
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("-147.2"), new BigDecimal("-258.3")),
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-147.2"), new BigDecimal("-258.3")).toInitializedScore());
}
@Test
public void withInitScore() {
assertEquals(HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-147.2"), new BigDecimal("-258.3")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-147.2"), new BigDecimal("-258.3")).withInitScore(-7));
}
@Test
public void feasible() {
assertScoreNotFeasible(
HardSoftBigDecimalScore.valueOf(new BigDecimal("-5"), new BigDecimal("-300")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-5"), new BigDecimal("4000")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-0.007"), new BigDecimal("4000")),
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-5"), new BigDecimal("-300")),
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("0"), new BigDecimal("-300"))
);
assertScoreFeasible(
HardSoftBigDecimalScore.valueOf(new BigDecimal("0"), new BigDecimal("-300.007")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("0"), new BigDecimal("-300")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("2"), new BigDecimal("-300")),
HardSoftBigDecimalScore.valueOfUninitialized(0, new BigDecimal("0"), new BigDecimal("-300"))
);
}
@Test
public void add() {
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("19"), new BigDecimal("-320")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("20"), new BigDecimal("-20")).add(
HardSoftBigDecimalScore.valueOf(new BigDecimal("-1"), new BigDecimal("-300"))));
assertEquals(HardSoftBigDecimalScore.valueOfUninitialized(-77, new BigDecimal("19"), new BigDecimal("-320")),
HardSoftBigDecimalScore.valueOfUninitialized(-70, new BigDecimal("20"), new BigDecimal("-20")).add(
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-1"), new BigDecimal("-300"))));
}
@Test
public void subtract() {
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("21"), new BigDecimal("280")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("20"), new BigDecimal("-20")).subtract(
HardSoftBigDecimalScore.valueOf(new BigDecimal("-1"), new BigDecimal("-300"))));
assertEquals(HardSoftBigDecimalScore.valueOfUninitialized(-63, new BigDecimal("21"), new BigDecimal("280")),
HardSoftBigDecimalScore.valueOfUninitialized(-70, new BigDecimal("20"), new BigDecimal("-20")).subtract(
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-1"), new BigDecimal("-300"))));
}
@Test
public void multiply() {
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("6.0"), new BigDecimal("-6.0")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("5.0"), new BigDecimal("-5.0")).multiply(1.2));
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("1.2"), new BigDecimal("-1.2")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("1.0"), new BigDecimal("-1.0")).multiply(1.2));
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("4.8"), new BigDecimal("-4.8")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("4.0"), new BigDecimal("-4.0")).multiply(1.2));
assertEquals(HardSoftBigDecimalScore.valueOfUninitialized(-14, new BigDecimal("8.6"), new BigDecimal("-10.4")),
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("4.3"), new BigDecimal("-5.2")).multiply(2.0));
}
@Test
public void divide() {
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("5.0"), new BigDecimal("-5.0")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("25.0"), new BigDecimal("-25.0")).divide(5.0));
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("4.2"), new BigDecimal("-4.2")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("21.0"), new BigDecimal("-21.0")).divide(5.0));
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("4.8"), new BigDecimal("-4.8")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("24.0"), new BigDecimal("-24.0")).divide(5.0));
assertEquals(HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("4.3"), new BigDecimal("-5.2")),
HardSoftBigDecimalScore.valueOfUninitialized(-14, new BigDecimal("8.6"), new BigDecimal("-10.4")).divide(2.0));
}
@Test
public void power() {
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("16.0"), new BigDecimal("25.0")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-4.0"), new BigDecimal("5.0")).power(2.0));
assertEquals(HardSoftBigDecimalScore.valueOfUninitialized(-343, new BigDecimal("-64.0"), new BigDecimal("125.0")),
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-4.0"), new BigDecimal("5.0")).power(3.0));
}
@Test
public void negate() {
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("-4.0"), new BigDecimal("5.0")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("4.0"), new BigDecimal("-5.0")).negate());
assertEquals(HardSoftBigDecimalScore.valueOf(new BigDecimal("4.0"), new BigDecimal("-5.0")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-4.0"), new BigDecimal("5.0")).negate());
}
@Test
public void equalsAndHashCode() {
assertScoresEqualsAndHashCode(
HardSoftBigDecimalScore.valueOf(new BigDecimal("-10.0"), new BigDecimal("-200.0")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-10.0"), new BigDecimal("-200.0")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-10.000"), new BigDecimal("-200.000")),
HardSoftBigDecimalScore.valueOfUninitialized(0, new BigDecimal("-10.0"), new BigDecimal("-200.0"))
);
assertScoresEqualsAndHashCode(
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-10.0"), new BigDecimal("-200.0")),
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-10.0"), new BigDecimal("-200.0"))
);
assertScoresNotEquals(
HardSoftBigDecimalScore.valueOf(new BigDecimal("-10.0"), new BigDecimal("-200.0")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-30.0"), new BigDecimal("-200.0")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-10.0"), new BigDecimal("-400.0")),
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-10.0"), new BigDecimal("-200.0"))
);
}
@Test
public void compareTo() {
PlannerAssert.assertCompareToOrder(
HardSoftBigDecimalScore.valueOfUninitialized(-8, new BigDecimal("0"), new BigDecimal("0")),
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-20"), new BigDecimal("-20")),
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-1"), new BigDecimal("-300")),
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("0"), new BigDecimal("0")),
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("0"), new BigDecimal("1")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-20.06"), new BigDecimal("-20")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-20.007"), new BigDecimal("-20")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-20"), new BigDecimal("-20.06")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-20"), new BigDecimal("-20.007")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-20"), new BigDecimal("-20")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-1"), new BigDecimal("-300")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("-1"), new BigDecimal("4000")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("0"), new BigDecimal("-1")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("0"), new BigDecimal("0")),
HardSoftBigDecimalScore.valueOf(new BigDecimal("0"), new BigDecimal("1"))
);
}
@Test
public void serializeAndDeserialize() {
PlannerTestUtils.serializeAndDeserializeWithAll(
HardSoftBigDecimalScore.valueOf(new BigDecimal("-12.3"), new BigDecimal("3400.5")),
output -> {
assertEquals(0, output.getInitScore());
assertEquals(new BigDecimal("-12.3"), output.getHardScore());
assertEquals(new BigDecimal("3400.5"), output.getSoftScore());
}
);
PlannerTestUtils.serializeAndDeserializeWithAll(
HardSoftBigDecimalScore.valueOfUninitialized(-7, new BigDecimal("-12.3"), new BigDecimal("3400.5")),
output -> {
assertEquals(-7, output.getInitScore());
assertEquals(new BigDecimal("-12.3"), output.getHardScore());
assertEquals(new BigDecimal("3400.5"), output.getSoftScore());
}
);
}
}