Skip to content

Commit d5f32bc

Browse files
committed
test: add new tests
1 parent e13264c commit d5f32bc

6 files changed

Lines changed: 88 additions & 19 deletions

File tree

core/src/test/java/ai/timefold/solver/core/impl/constructionheuristic/DefaultConstructionHeuristicPhaseTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,9 @@ void solveWithEntityValueRangeListVariable() {
366366
.withEasyScoreCalculatorClass(TestdataListEntityProvidingScoreCalculator.class)
367367
.withPhases(new ConstructionHeuristicPhaseConfig());
368368

369-
var value1 = new TestdataValue("v1");
370-
var value2 = new TestdataValue("v2");
371-
var value3 = new TestdataValue("v3");
369+
var value1 = new TestdataListValue("v1");
370+
var value2 = new TestdataListValue("v2");
371+
var value3 = new TestdataListValue("v3");
372372
var entity1 = new TestdataListEntityProvidingEntity("e1", List.of(value1, value2));
373373
var entity2 = new TestdataListEntityProvidingEntity("e2", List.of(value2, value3));
374374

core/src/test/java/ai/timefold/solver/core/impl/domain/solution/descriptor/SolutionDescriptorTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import ai.timefold.solver.core.testdomain.invalid.nosolution.TestdataNoSolution;
4343
import ai.timefold.solver.core.testdomain.invalid.variablemap.TestdataMapConfigurationSolution;
4444
import ai.timefold.solver.core.testdomain.list.TestdataListSolution;
45+
import ai.timefold.solver.core.testdomain.list.TestdataListValue;
4546
import ai.timefold.solver.core.testdomain.list.unassignedvar.TestdataAllowsUnassignedValuesListSolution;
4647
import ai.timefold.solver.core.testdomain.list.valuerange.TestdataListEntityProvidingEntity;
4748
import ai.timefold.solver.core.testdomain.list.valuerange.TestdataListEntityProvidingSolution;
@@ -500,11 +501,11 @@ void listVariableProblemScaleEntityProvidingValueRange() {
500501
var solutionDescriptor = TestdataListEntityProvidingSolution.buildSolutionDescriptor();
501502
var solution = new TestdataListEntityProvidingSolution();
502503
var valueRangeResolver = new ValueRangeState<TestdataListEntityProvidingSolution>();
503-
var v1 = new TestdataValue("1");
504-
var v2 = new TestdataValue("2");
504+
var v1 = new TestdataListValue("1");
505+
var v2 = new TestdataListValue("2");
505506
solution.setEntityList(List.of(
506507
new TestdataListEntityProvidingEntity("e1", List.of(v1, v2)),
507-
new TestdataListEntityProvidingEntity("e2", List.of(v1, v2, new TestdataValue("3")))));
508+
new TestdataListEntityProvidingEntity("e2", List.of(v1, v2, new TestdataListValue("3")))));
508509
assertSoftly(softly -> {
509510
softly.assertThat(solutionDescriptor.getGenuineEntityCount(solution)).isEqualTo(2L);
510511
softly.assertThat(solutionDescriptor.getGenuineVariableCount(solution)).isEqualTo(2L);

core/src/test/java/ai/timefold/solver/core/impl/heuristic/selector/move/generic/list/ListAssignMoveTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,34 @@
1111
import ai.timefold.solver.core.impl.domain.variable.descriptor.ListVariableDescriptor;
1212
import ai.timefold.solver.core.impl.move.director.MoveDirector;
1313
import ai.timefold.solver.core.impl.score.director.InnerScoreDirector;
14+
import ai.timefold.solver.core.impl.score.director.ValueRangeState;
1415
import ai.timefold.solver.core.testdomain.list.TestdataListEntity;
1516
import ai.timefold.solver.core.testdomain.list.TestdataListSolution;
1617
import ai.timefold.solver.core.testdomain.list.TestdataListValue;
1718

19+
import ai.timefold.solver.core.testdomain.list.valuerange.TestdataListEntityProvidingEntity;
20+
import ai.timefold.solver.core.testdomain.list.valuerange.TestdataListEntityProvidingSolution;
1821
import org.junit.jupiter.api.BeforeEach;
1922
import org.junit.jupiter.api.Test;
2023

24+
import java.util.List;
25+
2126
class ListAssignMoveTest {
2227

2328
private final InnerScoreDirector<TestdataListSolution, ?> innerScoreDirector = mock(InnerScoreDirector.class);
2429
private final MoveDirector<TestdataListSolution, ?> moveDirector = new MoveDirector<>(innerScoreDirector);
2530
private final ListVariableDescriptor<TestdataListSolution> variableDescriptor =
2631
TestdataListEntity.buildVariableDescriptorForValueList();
32+
private final InnerScoreDirector<TestdataListEntityProvidingSolution, ?> otherInnerScoreDirector =
33+
mock(InnerScoreDirector.class);
34+
private final ListVariableDescriptor<TestdataListEntityProvidingSolution> otherVariableDescriptor =
35+
TestdataListEntityProvidingEntity.buildVariableDescriptorForValueList();
2736

2837
@BeforeEach
2938
void setUp() {
3039
when(innerScoreDirector.getSolutionDescriptor())
3140
.thenReturn(variableDescriptor.getEntityDescriptor().getSolutionDescriptor());
41+
when(otherInnerScoreDirector.getValueRangeResolver()).thenReturn(new ValueRangeState<>());
3242
}
3343

3444
@Test
@@ -58,6 +68,23 @@ void doMove() {
5868
assertThat(e1.getValueList()).containsExactly(v1, v2, v3);
5969
}
6070

71+
@Test
72+
void isMoveDoableValueRangeProviderOnEntity() {
73+
var v1 = new TestdataListValue("1");
74+
var v2 = new TestdataListValue("2");
75+
var v3 = new TestdataListValue("3");
76+
var e1 = new TestdataListEntityProvidingEntity("e1", List.of(v1, v2));
77+
var e2 = new TestdataListEntityProvidingEntity("e2", List.of(v1, v3));
78+
// different entity => valid value
79+
assertThat(new ListAssignMove<>(otherVariableDescriptor, v1, e1, 0).isMoveDoable(otherInnerScoreDirector))
80+
.isTrue();
81+
assertThat(new ListAssignMove<>(otherVariableDescriptor, v1, e2, 0).isMoveDoable(otherInnerScoreDirector))
82+
.isTrue();
83+
// different entity => invalid value
84+
assertThat(new ListAssignMove<>(otherVariableDescriptor, v3, e1, 0).isMoveDoable(otherInnerScoreDirector))
85+
.isFalse();
86+
}
87+
6188
@Test
6289
void rebase() {
6390
var v1 = new TestdataListValue("1");

core/src/test/java/ai/timefold/solver/core/impl/heuristic/selector/move/generic/list/ListChangeMoveSelectorTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ void original() {
109109

110110
@Test
111111
void originalWithEntityValueRange() {
112-
var v1 = new TestdataValue("1");
113-
var v2 = new TestdataValue("2");
114-
var v3 = new TestdataValue("3");
112+
var v1 = new TestdataListValue("1");
113+
var v2 = new TestdataListValue("2");
114+
var v3 = new TestdataListValue("3");
115115
var a = new TestdataListEntityProvidingEntity("A", List.of(v1, v2));
116116
a.setValueList(List.of(v2, v1));
117117
var b = new TestdataListEntityProvidingEntity("B", List.of(v2, v3));
@@ -435,9 +435,9 @@ void random() {
435435

436436
@Test
437437
void randomWithEntityValueRange() {
438-
var v1 = new TestdataValue("1");
439-
var v2 = new TestdataValue("2");
440-
var v3 = new TestdataValue("3");
438+
var v1 = new TestdataListValue("1");
439+
var v2 = new TestdataListValue("2");
440+
var v3 = new TestdataListValue("3");
441441
var a = new TestdataListEntityProvidingEntity("A", List.of(v1, v2));
442442
a.setValueList(List.of(v2, v1));
443443
var b = new TestdataListEntityProvidingEntity("B", List.of(v2, v3));

core/src/test/java/ai/timefold/solver/core/impl/heuristic/selector/move/generic/list/ListChangeMoveTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import static org.mockito.Mockito.mock;
88
import static org.mockito.Mockito.verify;
99
import static org.mockito.Mockito.verifyNoMoreInteractions;
10+
import static org.mockito.Mockito.when;
1011

1112
import java.util.List;
1213
import java.util.stream.Stream;
@@ -15,11 +16,15 @@
1516
import ai.timefold.solver.core.config.heuristic.selector.move.generic.list.ListChangeMoveSelectorConfig;
1617
import ai.timefold.solver.core.impl.domain.variable.descriptor.ListVariableDescriptor;
1718
import ai.timefold.solver.core.impl.score.director.InnerScoreDirector;
19+
import ai.timefold.solver.core.impl.score.director.ValueRangeState;
1820
import ai.timefold.solver.core.testdomain.TestdataObject;
1921
import ai.timefold.solver.core.testdomain.list.TestdataListEntity;
2022
import ai.timefold.solver.core.testdomain.list.TestdataListSolution;
2123
import ai.timefold.solver.core.testdomain.list.TestdataListValue;
24+
import ai.timefold.solver.core.testdomain.list.valuerange.TestdataListEntityProvidingEntity;
25+
import ai.timefold.solver.core.testdomain.list.valuerange.TestdataListEntityProvidingSolution;
2226

27+
import org.junit.jupiter.api.BeforeEach;
2328
import org.junit.jupiter.api.Test;
2429
import org.junit.jupiter.params.ParameterizedTest;
2530
import org.junit.jupiter.params.provider.Arguments;
@@ -36,6 +41,16 @@ class ListChangeMoveTest {
3641
private final InnerScoreDirector<TestdataListSolution, ?> scoreDirector = mock(InnerScoreDirector.class);
3742
private final ListVariableDescriptor<TestdataListSolution> variableDescriptor =
3843
TestdataListEntity.buildVariableDescriptorForValueList();
44+
private final InnerScoreDirector<TestdataListEntityProvidingSolution, ?> otherInnerScoreDirector =
45+
mock(InnerScoreDirector.class);
46+
private final ListVariableDescriptor<TestdataListEntityProvidingSolution> otherVariableDescriptor =
47+
TestdataListEntityProvidingEntity.buildVariableDescriptorForValueList();
48+
49+
50+
@BeforeEach
51+
void setUp() {
52+
when(otherInnerScoreDirector.getValueRangeResolver()).thenReturn(new ValueRangeState<>());
53+
}
3954

4055
@Test
4156
void isMoveDoable() {
@@ -52,6 +67,20 @@ void isMoveDoable() {
5267
assertThat(new ListChangeMove<>(variableDescriptor, e1, 0, e2, 0).isMoveDoable(scoreDirector)).isTrue();
5368
}
5469

70+
@Test
71+
void isMoveDoableValueRangeProviderOnEntity() {
72+
var e1 = new TestdataListEntityProvidingEntity("e1", List.of(v1, v2));
73+
e1.setValueList(List.of(v1, v2));
74+
var e2 = new TestdataListEntityProvidingEntity("e2", List.of(v1, v3));
75+
e2.setValueList(List.of(v3));
76+
// different entity => valid value
77+
assertThat(new ListChangeMove<>(otherVariableDescriptor, e1, 0, e2, 0).isMoveDoable(otherInnerScoreDirector))
78+
.isTrue();
79+
// different entity => invalid value
80+
assertThat(new ListChangeMove<>(otherVariableDescriptor, e1, 1, e2, 0).isMoveDoable(otherInnerScoreDirector))
81+
.isFalse();
82+
}
83+
5584
@Test
5685
void doMove() {
5786
TestdataListEntity e1 = new TestdataListEntity("e1", v1, v2);

core/src/test/java/ai/timefold/solver/core/testdomain/list/valuerange/TestdataListEntityProvidingEntity.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,50 @@
66
import ai.timefold.solver.core.api.domain.entity.PlanningEntity;
77
import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider;
88
import ai.timefold.solver.core.api.domain.variable.PlanningListVariable;
9+
import ai.timefold.solver.core.impl.domain.entity.descriptor.EntityDescriptor;
10+
import ai.timefold.solver.core.impl.domain.variable.descriptor.ListVariableDescriptor;
911
import ai.timefold.solver.core.testdomain.TestdataObject;
10-
import ai.timefold.solver.core.testdomain.TestdataValue;
12+
import ai.timefold.solver.core.testdomain.list.TestdataListValue;
1113

1214
@PlanningEntity
1315
public class TestdataListEntityProvidingEntity extends TestdataObject {
1416

17+
public static EntityDescriptor<TestdataListEntityProvidingSolution> buildEntityDescriptor() {
18+
return TestdataListEntityProvidingSolution.buildSolutionDescriptor()
19+
.findEntityDescriptorOrFail(TestdataListEntityProvidingEntity.class);
20+
}
21+
22+
public static ListVariableDescriptor<TestdataListEntityProvidingSolution> buildVariableDescriptorForValueList() {
23+
return (ListVariableDescriptor<TestdataListEntityProvidingSolution>) buildEntityDescriptor()
24+
.getGenuineVariableDescriptor("valueList");
25+
}
26+
1527
@ValueRangeProvider(id = "valueRange")
16-
private final List<TestdataValue> valueRange;
28+
private final List<TestdataListValue> valueRange;
1729
@PlanningListVariable(valueRangeProviderRefs = "valueRange")
18-
private List<TestdataValue> valueList;
30+
private List<TestdataListValue> valueList;
1931

2032
public TestdataListEntityProvidingEntity() {
2133
// Required for cloning
2234
valueRange = new ArrayList<>();
2335
valueList = new ArrayList<>();
2436
}
2537

26-
public TestdataListEntityProvidingEntity(String code, List<TestdataValue> valueRange) {
38+
public TestdataListEntityProvidingEntity(String code, List<TestdataListValue> valueRange) {
2739
super(code);
2840
this.valueRange = valueRange;
2941
valueList = new ArrayList<>();
3042
}
3143

32-
public List<TestdataValue> getValueRange() {
44+
public List<TestdataListValue> getValueRange() {
3345
return valueRange;
3446
}
3547

36-
public List<TestdataValue> getValueList() {
48+
public List<TestdataListValue> getValueList() {
3749
return valueList;
3850
}
3951

40-
public void setValueList(List<TestdataValue> valueList) {
52+
public void setValueList(List<TestdataListValue> valueList) {
4153
this.valueList = valueList;
4254
}
4355
}

0 commit comments

Comments
 (0)