diff --git a/build/bom/pom.xml b/build/bom/pom.xml index 5c21e8802cd..53b804cea04 100644 --- a/build/bom/pom.xml +++ b/build/bom/pom.xml @@ -150,23 +150,6 @@ test-jar ${version.ai.timefold.solver} - - ai.timefold.solver - timefold-solver-test - ${version.ai.timefold.solver} - - - ai.timefold.solver - timefold-solver-test - ${version.ai.timefold.solver} - sources - - - ai.timefold.solver - timefold-solver-test - test-jar - ${version.ai.timefold.solver} - ai.timefold.solver diff --git a/core/src/main/java/ai/timefold/solver/core/api/score/analysis/MatchAnalysis.java b/core/src/main/java/ai/timefold/solver/core/api/score/analysis/MatchAnalysis.java index 8cb4d47d93f..22fbfb76ade 100644 --- a/core/src/main/java/ai/timefold/solver/core/api/score/analysis/MatchAnalysis.java +++ b/core/src/main/java/ai/timefold/solver/core/api/score/analysis/MatchAnalysis.java @@ -24,7 +24,7 @@ public record MatchAnalysis>(ConstraintRef constrai Objects.requireNonNull(constraintRef); Objects.requireNonNull(score); // Null justification is impossible; - // if the fetch policy doesn't requre match analysis, the code shouldn't even get here. + // if the fetch policy doesn't require match analysis, the code shouldn't even get here. Objects.requireNonNull(justification, () -> """ Impossible state: Received a null justification. Maybe check your %s's justifyWith() implementation for that constraint?""" diff --git a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/ConstraintVerifier.java b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/ConstraintVerifier.java similarity index 97% rename from tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/ConstraintVerifier.java rename to core/src/main/java/ai/timefold/solver/core/api/score/stream/test/ConstraintVerifier.java index 4bcba9024ca..dd0e6d80726 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/ConstraintVerifier.java +++ b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/ConstraintVerifier.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.score.stream; +package ai.timefold.solver.core.api.score.stream.test; import static java.util.Objects.requireNonNull; @@ -13,7 +13,7 @@ import ai.timefold.solver.core.config.solver.SolverConfig; import ai.timefold.solver.core.config.util.ConfigUtils; import ai.timefold.solver.core.impl.domain.solution.descriptor.SolutionDescriptor; -import ai.timefold.solver.test.impl.score.stream.DefaultConstraintVerifier; +import ai.timefold.solver.core.impl.score.stream.test.DefaultConstraintVerifier; import org.jspecify.annotations.NonNull; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/MultiConstraintAssertion.java b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/MultiConstraintAssertion.java similarity index 94% rename from tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/MultiConstraintAssertion.java rename to core/src/main/java/ai/timefold/solver/core/api/score/stream/test/MultiConstraintAssertion.java index 3c0f76aa9a0..2ec5da62e07 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/MultiConstraintAssertion.java +++ b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/MultiConstraintAssertion.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.score.stream; +package ai.timefold.solver.core.api.score.stream.test; import ai.timefold.solver.core.api.score.Score; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/MultiConstraintVerification.java b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/MultiConstraintVerification.java similarity index 90% rename from tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/MultiConstraintVerification.java rename to core/src/main/java/ai/timefold/solver/core/api/score/stream/test/MultiConstraintVerification.java index c449636963a..50563f918ee 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/MultiConstraintVerification.java +++ b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/MultiConstraintVerification.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.score.stream; +package ai.timefold.solver.core.api.score.stream.test; import org.jspecify.annotations.NonNull; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/ShadowVariableAwareMultiConstraintAssertion.java b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/ShadowVariableAwareMultiConstraintAssertion.java similarity index 88% rename from tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/ShadowVariableAwareMultiConstraintAssertion.java rename to core/src/main/java/ai/timefold/solver/core/api/score/stream/test/ShadowVariableAwareMultiConstraintAssertion.java index 654674d4ddb..0c3e0f99bd4 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/ShadowVariableAwareMultiConstraintAssertion.java +++ b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/ShadowVariableAwareMultiConstraintAssertion.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.score.stream; +package ai.timefold.solver.core.api.score.stream.test; public interface ShadowVariableAwareMultiConstraintAssertion extends MultiConstraintAssertion { diff --git a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/ShadowVariableAwareSingleConstraintAssertion.java b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/ShadowVariableAwareSingleConstraintAssertion.java similarity index 88% rename from tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/ShadowVariableAwareSingleConstraintAssertion.java rename to core/src/main/java/ai/timefold/solver/core/api/score/stream/test/ShadowVariableAwareSingleConstraintAssertion.java index ab54853a99f..7ec6e279033 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/ShadowVariableAwareSingleConstraintAssertion.java +++ b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/ShadowVariableAwareSingleConstraintAssertion.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.score.stream; +package ai.timefold.solver.core.api.score.stream.test; public interface ShadowVariableAwareSingleConstraintAssertion extends SingleConstraintAssertion { diff --git a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/SingleConstraintAssertion.java b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/SingleConstraintAssertion.java similarity index 99% rename from tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/SingleConstraintAssertion.java rename to core/src/main/java/ai/timefold/solver/core/api/score/stream/test/SingleConstraintAssertion.java index 8a9cb243c31..f67a8d27096 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/SingleConstraintAssertion.java +++ b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/SingleConstraintAssertion.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.score.stream; +package ai.timefold.solver.core.api.score.stream.test; import java.math.BigDecimal; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/SingleConstraintVerification.java b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/SingleConstraintVerification.java similarity index 96% rename from tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/SingleConstraintVerification.java rename to core/src/main/java/ai/timefold/solver/core/api/score/stream/test/SingleConstraintVerification.java index b6962d07abb..9f6af157e9e 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/api/score/stream/SingleConstraintVerification.java +++ b/core/src/main/java/ai/timefold/solver/core/api/score/stream/test/SingleConstraintVerification.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.score.stream; +package ai.timefold.solver.core.api.score.stream.test; import ai.timefold.solver.core.api.domain.variable.InverseRelationShadowVariable; import ai.timefold.solver.core.api.domain.variable.PlanningListVariable; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/api/solver/change/MockProblemChangeDirector.java b/core/src/main/java/ai/timefold/solver/core/api/solver/change/MockProblemChangeDirector.java similarity index 66% rename from tools/test/src/main/java/ai/timefold/solver/test/api/solver/change/MockProblemChangeDirector.java rename to core/src/main/java/ai/timefold/solver/core/api/solver/change/MockProblemChangeDirector.java index f7c7c583b67..59861002bc9 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/api/solver/change/MockProblemChangeDirector.java +++ b/core/src/main/java/ai/timefold/solver/core/api/solver/change/MockProblemChangeDirector.java @@ -1,21 +1,18 @@ -package ai.timefold.solver.test.api.solver.change; +package ai.timefold.solver.core.api.solver.change; import java.util.IdentityHashMap; import java.util.Map; import java.util.function.Consumer; -import ai.timefold.solver.core.api.solver.change.ProblemChangeDirector; - -import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; /** - * Use for unit-testing {@link ai.timefold.solver.core.api.solver.change.ProblemChange}s. - * + * Use for unit-testing {@link ProblemChange}s. * Together with Mockito this class makes it possible to verify that a - * {@link ai.timefold.solver.core.api.solver.change.ProblemChange} implementation correctly calls methods of + * {@link ProblemChange} implementation correctly calls methods of * the {@link ProblemChangeDirector}. - * + *

* Example of usage: * *

@@ -27,41 +24,39 @@
  * }
  * 
*/ +@NullMarked public class MockProblemChangeDirector implements ProblemChangeDirector { private Map lookUpTable = new IdentityHashMap<>(); @Override - public void addEntity(@NonNull Entity entity, @NonNull Consumer entityConsumer) { + public void addEntity(Entity entity, Consumer entityConsumer) { entityConsumer.accept(this.lookUpWorkingObject(entity)); } @Override - public void removeEntity(@NonNull Entity entity, Consumer entityConsumer) { + public void removeEntity(Entity entity, Consumer entityConsumer) { entityConsumer.accept(this.lookUpWorkingObject(entity)); } @Override - public void changeVariable(@NonNull Entity entity, @NonNull String variableName, - @NonNull Consumer entityConsumer) { + public void changeVariable(Entity entity, String variableName, Consumer entityConsumer) { entityConsumer.accept(this.lookUpWorkingObject(entity)); } @Override - public void addProblemFact(@NonNull ProblemFact problemFact, - @NonNull Consumer problemFactConsumer) { + public void addProblemFact(ProblemFact problemFact, Consumer problemFactConsumer) { problemFactConsumer.accept(this.lookUpWorkingObject(problemFact)); } @Override - public void removeProblemFact(@NonNull ProblemFact problemFact, - @NonNull Consumer problemFactConsumer) { + public void removeProblemFact(ProblemFact problemFact, Consumer problemFactConsumer) { problemFactConsumer.accept(this.lookUpWorkingObject(problemFact)); } @Override - public void changeProblemProperty(@NonNull EntityOrProblemFact problemFactOrEntity, - @NonNull Consumer problemFactOrEntityConsumer) { + public void changeProblemProperty(EntityOrProblemFact problemFactOrEntity, + Consumer problemFactOrEntityConsumer) { problemFactOrEntityConsumer.accept(this.lookUpWorkingObject(problemFactOrEntity)); } @@ -86,7 +81,7 @@ public void updateShadowVariables() { /** * Defines what {@link #lookUpWorkingObject(Object)} returns. */ - public @NonNull LookUpMockBuilder whenLookingUp(Object forObject) { + public LookUpMockBuilder whenLookingUp(Object forObject) { return new LookUpMockBuilder(forObject); } diff --git a/core/src/main/java/ai/timefold/solver/core/api/solver/change/ProblemChangeDirector.java b/core/src/main/java/ai/timefold/solver/core/api/solver/change/ProblemChangeDirector.java index bf09d00e823..64fea2db4f8 100644 --- a/core/src/main/java/ai/timefold/solver/core/api/solver/change/ProblemChangeDirector.java +++ b/core/src/main/java/ai/timefold/solver/core/api/solver/change/ProblemChangeDirector.java @@ -19,6 +19,7 @@ * To see an example implementation, please refer to the {@link ProblemChange} Javadoc. * * @see Lookup You may need to perform lookups of working objects from external objects. + * @see MockProblemChangeDirector You may need to use this for testing purposes. */ @NullMarked public interface ProblemChangeDirector diff --git a/core/src/main/java/ai/timefold/solver/core/impl/move/DefaultMoveTestContext.java b/core/src/main/java/ai/timefold/solver/core/impl/move/DefaultMoveTestContext.java index 9fff9e37719..4e16face818 100644 --- a/core/src/main/java/ai/timefold/solver/core/impl/move/DefaultMoveTestContext.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/move/DefaultMoveTestContext.java @@ -5,8 +5,8 @@ import ai.timefold.solver.core.impl.score.director.AbstractScoreDirector; import ai.timefold.solver.core.preview.api.move.Move; -import ai.timefold.solver.core.preview.api.move.MoveTestContext; import ai.timefold.solver.core.preview.api.move.SolutionView; +import ai.timefold.solver.core.preview.api.move.test.MoveTestContext; import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/ai/timefold/solver/core/impl/move/DefaultMoveTester.java b/core/src/main/java/ai/timefold/solver/core/impl/move/DefaultMoveTester.java index 5e435769d3c..7c6b70255c6 100644 --- a/core/src/main/java/ai/timefold/solver/core/impl/move/DefaultMoveTester.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/move/DefaultMoveTester.java @@ -6,8 +6,8 @@ import ai.timefold.solver.core.impl.domain.solution.descriptor.DefaultPlanningSolutionMetaModel; import ai.timefold.solver.core.impl.score.director.AbstractScoreDirectorFactory; import ai.timefold.solver.core.preview.api.domain.metamodel.PlanningSolutionMetaModel; -import ai.timefold.solver.core.preview.api.move.MoveTestContext; -import ai.timefold.solver.core.preview.api.move.MoveTester; +import ai.timefold.solver.core.preview.api.move.test.MoveTestContext; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/ai/timefold/solver/core/impl/neighborhood/DefaultNeighborhoodTestContext.java b/core/src/main/java/ai/timefold/solver/core/impl/neighborhood/DefaultNeighborhoodTestContext.java index f1ef00191f9..4a8ba77e189 100644 --- a/core/src/main/java/ai/timefold/solver/core/impl/neighborhood/DefaultNeighborhoodTestContext.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/neighborhood/DefaultNeighborhoodTestContext.java @@ -7,8 +7,8 @@ import ai.timefold.solver.core.impl.localsearch.scope.LocalSearchPhaseScope; import ai.timefold.solver.core.impl.localsearch.scope.LocalSearchStepScope; import ai.timefold.solver.core.preview.api.move.Move; -import ai.timefold.solver.core.preview.api.move.MoveTestContext; -import ai.timefold.solver.core.preview.api.neighborhood.NeighborhoodTestContext; +import ai.timefold.solver.core.preview.api.move.test.MoveTestContext; +import ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTestContext; import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/ai/timefold/solver/core/impl/neighborhood/DefaultNeighborhoodTester.java b/core/src/main/java/ai/timefold/solver/core/impl/neighborhood/DefaultNeighborhoodTester.java index 580d640872d..4fa0edfb32c 100644 --- a/core/src/main/java/ai/timefold/solver/core/impl/neighborhood/DefaultNeighborhoodTester.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/neighborhood/DefaultNeighborhoodTester.java @@ -10,10 +10,10 @@ import ai.timefold.solver.core.impl.neighborhood.stream.DefaultMoveStreamFactory; import ai.timefold.solver.core.impl.solver.scope.SolverScope; import ai.timefold.solver.core.preview.api.domain.metamodel.PlanningSolutionMetaModel; -import ai.timefold.solver.core.preview.api.move.MoveTester; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.preview.api.neighborhood.MoveProvider; -import ai.timefold.solver.core.preview.api.neighborhood.NeighborhoodTestContext; -import ai.timefold.solver.core.preview.api.neighborhood.NeighborhoodTester; +import ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTestContext; +import ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTester; import org.jspecify.annotations.NullMarked; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractConstraintAssertion.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractConstraintAssertion.java similarity index 98% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractConstraintAssertion.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractConstraintAssertion.java index 8429467be07..403af571c36 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractConstraintAssertion.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractConstraintAssertion.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import java.util.Map; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractConstraintVerification.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractConstraintVerification.java similarity index 94% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractConstraintVerification.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractConstraintVerification.java index 9957297ac0e..39a01a57e28 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractConstraintVerification.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractConstraintVerification.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import java.util.Arrays; import java.util.Collection; @@ -29,7 +29,7 @@ protected void assertCorrectArguments(Object... facts) { "Maybe call givenSolution() instead?", facts[0]); } Arrays.stream(facts) - .filter(fact -> fact instanceof Collection) + .filter(Collection.class::isInstance) .findFirst() .ifPresent(collection -> LOGGER.warn("Called given() with collection ({}) as argument." + "This will treat the collection itself as a fact, and not its contents.\n" + diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractMultiConstraintAssertion.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractMultiConstraintAssertion.java similarity index 95% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractMultiConstraintAssertion.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractMultiConstraintAssertion.java index 38399688115..fe656e62d7e 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractMultiConstraintAssertion.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractMultiConstraintAssertion.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import static java.util.Objects.requireNonNull; @@ -9,10 +9,10 @@ import ai.timefold.solver.core.api.score.constraint.ConstraintMatchTotal; import ai.timefold.solver.core.api.score.constraint.Indictment; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; +import ai.timefold.solver.core.api.score.stream.test.MultiConstraintAssertion; import ai.timefold.solver.core.impl.score.DefaultScoreExplanation; import ai.timefold.solver.core.impl.score.director.InnerScore; import ai.timefold.solver.core.impl.score.stream.common.AbstractConstraintStreamScoreDirectorFactory; -import ai.timefold.solver.test.api.score.stream.MultiConstraintAssertion; import org.jspecify.annotations.NonNull; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractSingleConstraintAssertion.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractSingleConstraintAssertion.java similarity index 98% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractSingleConstraintAssertion.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractSingleConstraintAssertion.java index 51926ad5fcb..a1351ccc702 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/AbstractSingleConstraintAssertion.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/AbstractSingleConstraintAssertion.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; @@ -16,6 +16,7 @@ import ai.timefold.solver.core.api.score.constraint.ConstraintMatchTotal; import ai.timefold.solver.core.api.score.constraint.Indictment; import ai.timefold.solver.core.api.score.stream.ConstraintJustification; +import ai.timefold.solver.core.api.score.stream.test.SingleConstraintAssertion; import ai.timefold.solver.core.impl.score.DefaultScoreExplanation; import ai.timefold.solver.core.impl.score.definition.ScoreDefinition; import ai.timefold.solver.core.impl.score.director.InnerScore; @@ -23,7 +24,6 @@ import ai.timefold.solver.core.impl.score.stream.common.AbstractConstraintStreamScoreDirectorFactory; import ai.timefold.solver.core.impl.score.stream.common.ScoreImpactType; import ai.timefold.solver.core.impl.util.Pair; -import ai.timefold.solver.test.api.score.stream.SingleConstraintAssertion; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; @@ -749,13 +749,11 @@ private String buildNoImpactAssertionErrorMessage(Number actualImpact, String co } private static String getImpactTypeLabel(ScoreImpactType scoreImpactType) { - if (scoreImpactType == ScoreImpactType.PENALTY) { - return "penalty"; - } else if (scoreImpactType == ScoreImpactType.REWARD) { - return "reward"; - } else { // Needs to work with null. - return "impact"; - } + return switch (scoreImpactType) { + case PENALTY -> "penalty"; + case REWARD -> "reward"; + case MIXED -> "impact"; + }; } } diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/ConfiguredConstraintVerifier.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/ConfiguredConstraintVerifier.java similarity index 95% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/ConfiguredConstraintVerifier.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/ConfiguredConstraintVerifier.java index e3264c19b92..3601c110180 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/ConfiguredConstraintVerifier.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/ConfiguredConstraintVerifier.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import static java.util.Objects.requireNonNull; @@ -10,9 +10,9 @@ import ai.timefold.solver.core.api.score.stream.Constraint; import ai.timefold.solver.core.api.score.stream.ConstraintFactory; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import ai.timefold.solver.core.config.solver.EnvironmentMode; import ai.timefold.solver.core.impl.domain.solution.descriptor.SolutionDescriptor; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; /** * Represents a {@link ConstraintVerifier} with pre-set values. diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultConstraintVerifier.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultConstraintVerifier.java similarity index 95% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultConstraintVerifier.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultConstraintVerifier.java index 445ed2a47b5..121e1da28c0 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultConstraintVerifier.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultConstraintVerifier.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiFunction; @@ -7,8 +7,8 @@ import ai.timefold.solver.core.api.score.stream.Constraint; import ai.timefold.solver.core.api.score.stream.ConstraintFactory; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import ai.timefold.solver.core.impl.domain.solution.descriptor.SolutionDescriptor; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; import org.jspecify.annotations.NonNull; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultMultiConstraintAssertion.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultMultiConstraintAssertion.java similarity index 95% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultMultiConstraintAssertion.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultMultiConstraintAssertion.java index 7b112eef05c..e57bef622a4 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultMultiConstraintAssertion.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultMultiConstraintAssertion.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import java.util.Map; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultMultiConstraintVerification.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultMultiConstraintVerification.java similarity index 90% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultMultiConstraintVerification.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultMultiConstraintVerification.java index 5748330b0e9..b7b534b7573 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultMultiConstraintVerification.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultMultiConstraintVerification.java @@ -1,9 +1,9 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import ai.timefold.solver.core.api.score.Score; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; +import ai.timefold.solver.core.api.score.stream.test.MultiConstraintVerification; import ai.timefold.solver.core.impl.score.stream.common.AbstractConstraintStreamScoreDirectorFactory; -import ai.timefold.solver.test.api.score.stream.MultiConstraintVerification; import org.jspecify.annotations.NonNull; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultShadowVariableAwareMultiConstraintAssertion.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultShadowVariableAwareMultiConstraintAssertion.java similarity index 89% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultShadowVariableAwareMultiConstraintAssertion.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultShadowVariableAwareMultiConstraintAssertion.java index b5804c063b3..18311aad1f9 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultShadowVariableAwareMultiConstraintAssertion.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultShadowVariableAwareMultiConstraintAssertion.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import static java.util.Objects.requireNonNull; @@ -6,10 +6,10 @@ import ai.timefold.solver.core.api.score.Score; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; +import ai.timefold.solver.core.api.score.stream.test.MultiConstraintAssertion; +import ai.timefold.solver.core.api.score.stream.test.ShadowVariableAwareMultiConstraintAssertion; import ai.timefold.solver.core.impl.score.constraint.ConstraintMatchPolicy; import ai.timefold.solver.core.impl.score.stream.common.AbstractConstraintStreamScoreDirectorFactory; -import ai.timefold.solver.test.api.score.stream.MultiConstraintAssertion; -import ai.timefold.solver.test.api.score.stream.ShadowVariableAwareMultiConstraintAssertion; public final class DefaultShadowVariableAwareMultiConstraintAssertion> extends AbstractMultiConstraintAssertion implements ShadowVariableAwareMultiConstraintAssertion { diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultShadowVariableAwareSingleConstraintAssertion.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultShadowVariableAwareSingleConstraintAssertion.java similarity index 87% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultShadowVariableAwareSingleConstraintAssertion.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultShadowVariableAwareSingleConstraintAssertion.java index 6c8a6f17ab7..55b9dbb64f6 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultShadowVariableAwareSingleConstraintAssertion.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultShadowVariableAwareSingleConstraintAssertion.java @@ -1,12 +1,12 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import java.util.Objects; import ai.timefold.solver.core.api.score.Score; +import ai.timefold.solver.core.api.score.stream.test.ShadowVariableAwareSingleConstraintAssertion; +import ai.timefold.solver.core.api.score.stream.test.SingleConstraintAssertion; import ai.timefold.solver.core.impl.score.constraint.ConstraintMatchPolicy; import ai.timefold.solver.core.impl.score.stream.common.AbstractConstraintStreamScoreDirectorFactory; -import ai.timefold.solver.test.api.score.stream.ShadowVariableAwareSingleConstraintAssertion; -import ai.timefold.solver.test.api.score.stream.SingleConstraintAssertion; public final class DefaultShadowVariableAwareSingleConstraintAssertion> extends AbstractSingleConstraintAssertion implements ShadowVariableAwareSingleConstraintAssertion { diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultSingleConstraintAssertion.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultSingleConstraintAssertion.java similarity index 95% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultSingleConstraintAssertion.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultSingleConstraintAssertion.java index 481eea179ac..da57ff2146e 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultSingleConstraintAssertion.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultSingleConstraintAssertion.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import java.util.Map; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultSingleConstraintVerification.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultSingleConstraintVerification.java similarity index 89% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultSingleConstraintVerification.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultSingleConstraintVerification.java index be7cf801a29..3f9f4bf207f 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/DefaultSingleConstraintVerification.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/DefaultSingleConstraintVerification.java @@ -1,8 +1,8 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import ai.timefold.solver.core.api.score.Score; +import ai.timefold.solver.core.api.score.stream.test.SingleConstraintVerification; import ai.timefold.solver.core.impl.score.stream.common.AbstractConstraintStreamScoreDirectorFactory; -import ai.timefold.solver.test.api.score.stream.SingleConstraintVerification; import org.jspecify.annotations.NonNull; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/NumberEqualityUtil.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/NumberEqualityUtil.java similarity index 89% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/NumberEqualityUtil.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/NumberEqualityUtil.java index 2b1908174ef..67ec47198dc 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/NumberEqualityUtil.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/NumberEqualityUtil.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import java.math.BigDecimal; import java.util.Comparator; @@ -95,13 +95,18 @@ final class NumberEqualityUtil { * @return never null */ public static Comparator getComparison(Number expectedImpact) { - return Comparator.comparing(a -> { - if (a instanceof BigDecimal bigDecimal) { - return bigDecimal; - } else { - return BigDecimal.valueOf(a.longValue()); - } - }); + if (expectedImpact instanceof Integer || expectedImpact instanceof Long || expectedImpact instanceof BigDecimal) { + return Comparator.comparing(a -> { + if (a instanceof BigDecimal bigDecimal) { + return bigDecimal; + } else { + return BigDecimal.valueOf(a.longValue()); + } + }); + } + + throw new IllegalStateException("Impossible state: unknown impact type class (%s) for impact (%s)." + .formatted(expectedImpact.getClass(), expectedImpact)); } private NumberEqualityUtil() { diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/ScoreDirectorFactoryCache.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/ScoreDirectorFactoryCache.java similarity index 98% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/ScoreDirectorFactoryCache.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/ScoreDirectorFactoryCache.java index 6732f2d4949..f14a2428f48 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/ScoreDirectorFactoryCache.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/ScoreDirectorFactoryCache.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import java.util.HashMap; import java.util.List; diff --git a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/SessionBasedAssertionBuilder.java b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/SessionBasedAssertionBuilder.java similarity index 96% rename from tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/SessionBasedAssertionBuilder.java rename to core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/SessionBasedAssertionBuilder.java index afcc727b211..2b93b4341d3 100644 --- a/tools/test/src/main/java/ai/timefold/solver/test/impl/score/stream/SessionBasedAssertionBuilder.java +++ b/core/src/main/java/ai/timefold/solver/core/impl/score/stream/test/SessionBasedAssertionBuilder.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.impl.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import java.util.Objects; diff --git a/core/src/main/java/ai/timefold/solver/core/preview/api/move/Move.java b/core/src/main/java/ai/timefold/solver/core/preview/api/move/Move.java index b6f4d04b648..7f105a51d47 100644 --- a/core/src/main/java/ai/timefold/solver/core/preview/api/move/Move.java +++ b/core/src/main/java/ai/timefold/solver/core/preview/api/move/Move.java @@ -9,6 +9,7 @@ import ai.timefold.solver.core.api.domain.solution.PlanningSolution; import ai.timefold.solver.core.api.domain.solution.ProblemFactProperty; import ai.timefold.solver.core.api.domain.variable.PlanningVariable; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; diff --git a/core/src/main/java/ai/timefold/solver/core/preview/api/move/MoveTestContext.java b/core/src/main/java/ai/timefold/solver/core/preview/api/move/test/MoveTestContext.java similarity index 94% rename from core/src/main/java/ai/timefold/solver/core/preview/api/move/MoveTestContext.java rename to core/src/main/java/ai/timefold/solver/core/preview/api/move/test/MoveTestContext.java index 60ffca06b58..3a1ad850478 100644 --- a/core/src/main/java/ai/timefold/solver/core/preview/api/move/MoveTestContext.java +++ b/core/src/main/java/ai/timefold/solver/core/preview/api/move/test/MoveTestContext.java @@ -1,7 +1,10 @@ -package ai.timefold.solver.core.preview.api.move; +package ai.timefold.solver.core.preview.api.move.test; import java.util.function.Consumer; +import ai.timefold.solver.core.preview.api.move.Move; +import ai.timefold.solver.core.preview.api.move.SolutionView; + import org.jspecify.annotations.NullMarked; /** diff --git a/core/src/main/java/ai/timefold/solver/core/preview/api/move/MoveTester.java b/core/src/main/java/ai/timefold/solver/core/preview/api/move/test/MoveTester.java similarity index 96% rename from core/src/main/java/ai/timefold/solver/core/preview/api/move/MoveTester.java rename to core/src/main/java/ai/timefold/solver/core/preview/api/move/test/MoveTester.java index bad7475500e..715aa5fdd04 100644 --- a/core/src/main/java/ai/timefold/solver/core/preview/api/move/MoveTester.java +++ b/core/src/main/java/ai/timefold/solver/core/preview/api/move/test/MoveTester.java @@ -1,7 +1,8 @@ -package ai.timefold.solver.core.preview.api.move; +package ai.timefold.solver.core.preview.api.move.test; import ai.timefold.solver.core.impl.move.DefaultMoveTester; import ai.timefold.solver.core.preview.api.domain.metamodel.PlanningSolutionMetaModel; +import ai.timefold.solver.core.preview.api.move.Move; import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/MoveProvider.java b/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/MoveProvider.java index fd2140a8eb1..48d78292409 100644 --- a/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/MoveProvider.java +++ b/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/MoveProvider.java @@ -3,6 +3,7 @@ import ai.timefold.solver.core.api.domain.solution.PlanningSolution; import ai.timefold.solver.core.preview.api.neighborhood.stream.MoveStream; import ai.timefold.solver.core.preview.api.neighborhood.stream.MoveStreamFactory; +import ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTester; import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/NeighborhoodTestContext.java b/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/test/NeighborhoodTestContext.java similarity index 96% rename from core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/NeighborhoodTestContext.java rename to core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/test/NeighborhoodTestContext.java index fb909c62689..c93684bf962 100644 --- a/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/NeighborhoodTestContext.java +++ b/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/test/NeighborhoodTestContext.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.core.preview.api.neighborhood; +package ai.timefold.solver.core.preview.api.neighborhood.test; import java.util.ArrayList; import java.util.Collections; @@ -10,7 +10,8 @@ import java.util.stream.StreamSupport; import ai.timefold.solver.core.preview.api.move.Move; -import ai.timefold.solver.core.preview.api.move.MoveTestContext; +import ai.timefold.solver.core.preview.api.move.test.MoveTestContext; +import ai.timefold.solver.core.preview.api.neighborhood.MoveProvider; import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/NeighborhoodTester.java b/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/test/NeighborhoodTester.java similarity index 95% rename from core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/NeighborhoodTester.java rename to core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/test/NeighborhoodTester.java index 0d178a4896f..1da3ea9a1b4 100644 --- a/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/NeighborhoodTester.java +++ b/core/src/main/java/ai/timefold/solver/core/preview/api/neighborhood/test/NeighborhoodTester.java @@ -1,7 +1,8 @@ -package ai.timefold.solver.core.preview.api.neighborhood; +package ai.timefold.solver.core.preview.api.neighborhood.test; import ai.timefold.solver.core.impl.neighborhood.DefaultNeighborhoodTester; import ai.timefold.solver.core.preview.api.domain.metamodel.PlanningSolutionMetaModel; +import ai.timefold.solver.core.preview.api.neighborhood.MoveProvider; import org.jspecify.annotations.NullMarked; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/solver/change/MockProblemChangeDirectorTest.java b/core/src/test/java/ai/timefold/solver/core/api/solver/change/MockProblemChangeDirectorTest.java similarity index 53% rename from tools/test/src/test/java/ai/timefold/solver/test/api/solver/change/MockProblemChangeDirectorTest.java rename to core/src/test/java/ai/timefold/solver/core/api/solver/change/MockProblemChangeDirectorTest.java index 736c3f7227d..e88fd2d531a 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/solver/change/MockProblemChangeDirectorTest.java +++ b/core/src/test/java/ai/timefold/solver/core/api/solver/change/MockProblemChangeDirectorTest.java @@ -1,6 +1,5 @@ -package ai.timefold.solver.test.api.solver.change; +package ai.timefold.solver.core.api.solver.change; -import ai.timefold.solver.core.api.solver.change.ProblemChange; import ai.timefold.solver.core.testdomain.score.lavish.TestdataLavishEntity; import ai.timefold.solver.core.testdomain.score.lavish.TestdataLavishEntityGroup; import ai.timefold.solver.core.testdomain.score.lavish.TestdataLavishSolution; @@ -14,21 +13,21 @@ class MockProblemChangeDirectorTest { @Test void problemChange() { - final TestdataLavishEntityGroup entityGroupOne = new TestdataLavishEntityGroup("entityGroupOne"); - final TestdataLavishValueGroup valueGroupOne = new TestdataLavishValueGroup("valueGroupOne"); - final TestdataLavishEntity addedEntity = new TestdataLavishEntity("newly added entity", entityGroupOne); - final TestdataLavishEntity removedEntity = new TestdataLavishEntity("entity to remove", entityGroupOne); - final TestdataLavishValue addedFact = new TestdataLavishValue("newly added fact", valueGroupOne); - final TestdataLavishValue removedFact = new TestdataLavishValue("fact to remove", valueGroupOne); - final TestdataLavishEntity changedEntity = new TestdataLavishEntity("changed entity", entityGroupOne); - final TestdataLavishValue changedFact = new TestdataLavishValue("changed entity value", valueGroupOne); + var entityGroupOne = new TestdataLavishEntityGroup("entityGroupOne"); + var valueGroupOne = new TestdataLavishValueGroup("valueGroupOne"); + var addedEntity = new TestdataLavishEntity("newly added entity", entityGroupOne); + var removedEntity = new TestdataLavishEntity("entity to remove", entityGroupOne); + var addedFact = new TestdataLavishValue("newly added fact", valueGroupOne); + var removedFact = new TestdataLavishValue("fact to remove", valueGroupOne); + var changedEntity = new TestdataLavishEntity("changed entity", entityGroupOne); + var changedFact = new TestdataLavishValue("changed entity value", valueGroupOne); // Working solution counterparts. - final TestdataLavishEntity removedWorkingEntity = new TestdataLavishEntity("working entity to remove", entityGroupOne); - final TestdataLavishValue removedWorkingFact = new TestdataLavishValue("working fact to remove", valueGroupOne); - final TestdataLavishEntity changedWorkingEntity = new TestdataLavishEntity("working changed entity", entityGroupOne); + var removedWorkingEntity = new TestdataLavishEntity("working entity to remove", entityGroupOne); + var removedWorkingFact = new TestdataLavishValue("working fact to remove", valueGroupOne); + var changedWorkingEntity = new TestdataLavishEntity("working changed entity", entityGroupOne); - MockProblemChangeDirector mockProblemChangeDirector = new MockProblemChangeDirector(); + var mockProblemChangeDirector = new MockProblemChangeDirector(); // Configure look-up mocks. mockProblemChangeDirector .whenLookingUp(removedEntity).thenReturn(removedWorkingEntity) @@ -52,18 +51,18 @@ void problemChange() { problemChangeDirector.removeProblemFact(removedFact, workingSolution.getValueList()::remove); }); - TestdataLavishSolution testdataSolution = TestdataLavishSolution.generateSolution(); + var testdataSolution = TestdataLavishSolution.generateSolution(); testdataSolution.getEntityList().add(removedWorkingEntity); testdataSolution.getEntityList().add(changedWorkingEntity); testdataSolution.getValueList().add(removedWorkingFact); problemChange.doChange(testdataSolution, mockProblemChangeDirector); - SoftAssertions.assertSoftly((softAssertions) -> { - softAssertions.assertThat(testdataSolution.getEntityList()).doesNotContain(removedWorkingEntity); - softAssertions.assertThat(testdataSolution.getValueList()).doesNotContain(removedWorkingFact); - softAssertions.assertThat(changedWorkingEntity.getValue()).isEqualTo(changedFact); - softAssertions.assertThat(changedWorkingEntity.getEntityGroup()).isNull(); + SoftAssertions.assertSoftly(softly -> { + softly.assertThat(testdataSolution.getEntityList()).doesNotContain(removedWorkingEntity); + softly.assertThat(testdataSolution.getValueList()).doesNotContain(removedWorkingFact); + softly.assertThat(changedWorkingEntity.getValue()).isEqualTo(changedFact); + softly.assertThat(changedWorkingEntity.getEntityGroup()).isNull(); }); } } diff --git a/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/MixedModelTest.java b/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/MixedModelTest.java index 2c7101ff8fc..2ceb1c6f6f7 100644 --- a/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/MixedModelTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/MixedModelTest.java @@ -5,8 +5,8 @@ import java.util.List; import ai.timefold.solver.core.preview.api.domain.metamodel.PlanningSolutionMetaModel; -import ai.timefold.solver.core.preview.api.move.MoveTester; import ai.timefold.solver.core.preview.api.move.builtin.Moves; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.testdomain.shadow.mixed.TestdataMixedEntity; import ai.timefold.solver.core.testdomain.shadow.mixed.TestdataMixedSolution; import ai.timefold.solver.core.testdomain.shadow.mixed.TestdataMixedValue; diff --git a/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/DependencyValuesShadowVariableTest.java b/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/DependencyValuesShadowVariableTest.java index 65336fb007c..fb68c2a33f2 100644 --- a/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/DependencyValuesShadowVariableTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/DependencyValuesShadowVariableTest.java @@ -13,8 +13,8 @@ import ai.timefold.solver.core.config.solver.SolverConfig; import ai.timefold.solver.core.config.solver.termination.TerminationConfig; import ai.timefold.solver.core.preview.api.domain.metamodel.PlanningSolutionMetaModel; -import ai.timefold.solver.core.preview.api.move.MoveTester; import ai.timefold.solver.core.preview.api.move.builtin.Moves; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.testdomain.shadow.dependency.TestdataDependencyConstraintProvider; import ai.timefold.solver.core.testdomain.shadow.dependency.TestdataDependencyEntity; import ai.timefold.solver.core.testdomain.shadow.dependency.TestdataDependencySolution; diff --git a/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/DynamicFollowerValuesShadowVariableTest.java b/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/DynamicFollowerValuesShadowVariableTest.java index 60342089d43..c061271f0a6 100644 --- a/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/DynamicFollowerValuesShadowVariableTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/DynamicFollowerValuesShadowVariableTest.java @@ -8,8 +8,8 @@ import ai.timefold.solver.core.config.solver.EnvironmentMode; import ai.timefold.solver.core.config.solver.SolverConfig; import ai.timefold.solver.core.config.solver.termination.TerminationConfig; -import ai.timefold.solver.core.preview.api.move.MoveTester; import ai.timefold.solver.core.preview.api.move.builtin.Moves; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.testdomain.TestdataValue; import ai.timefold.solver.core.testdomain.shadow.dynamic_follower.TestdataDynamicFollowerConstraintProvider; import ai.timefold.solver.core.testdomain.shadow.dynamic_follower.TestdataDynamicFollowerEntity; diff --git a/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/FollowerSetValuesShadowVariableTest.java b/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/FollowerSetValuesShadowVariableTest.java index 23b6de08625..01a90f5772d 100644 --- a/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/FollowerSetValuesShadowVariableTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/FollowerSetValuesShadowVariableTest.java @@ -8,8 +8,8 @@ import ai.timefold.solver.core.config.solver.EnvironmentMode; import ai.timefold.solver.core.config.solver.SolverConfig; import ai.timefold.solver.core.config.solver.termination.TerminationConfig; -import ai.timefold.solver.core.preview.api.move.MoveTester; import ai.timefold.solver.core.preview.api.move.builtin.Moves; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.testdomain.TestdataValue; import ai.timefold.solver.core.testdomain.shadow.follower.TestdataFollowerConstraintProvider; import ai.timefold.solver.core.testdomain.shadow.follower.TestdataLeaderEntity; diff --git a/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/FollowerValuesShadowVariableTest.java b/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/FollowerValuesShadowVariableTest.java index 07921b08225..2114905e2ec 100644 --- a/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/FollowerValuesShadowVariableTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/domain/variable/declarative/FollowerValuesShadowVariableTest.java @@ -8,8 +8,8 @@ import ai.timefold.solver.core.config.solver.EnvironmentMode; import ai.timefold.solver.core.config.solver.SolverConfig; import ai.timefold.solver.core.config.solver.termination.TerminationConfig; -import ai.timefold.solver.core.preview.api.move.MoveTester; import ai.timefold.solver.core.preview.api.move.builtin.Moves; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.testdomain.TestdataValue; import ai.timefold.solver.core.testdomain.shadow.follower.TestdataFollowerConstraintProvider; import ai.timefold.solver.core.testdomain.shadow.follower.TestdataFollowerEntity; diff --git a/core/src/test/java/ai/timefold/solver/core/impl/neighborhood/NeighborhoodsTest.java b/core/src/test/java/ai/timefold/solver/core/impl/neighborhood/NeighborhoodsTest.java index 933bf114a83..a94afe7c3b1 100644 --- a/core/src/test/java/ai/timefold/solver/core/impl/neighborhood/NeighborhoodsTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/neighborhood/NeighborhoodsTest.java @@ -39,9 +39,9 @@ import ai.timefold.solver.core.preview.api.move.builtin.Moves; import ai.timefold.solver.core.preview.api.move.builtin.SwapMove; import ai.timefold.solver.core.preview.api.neighborhood.MoveProvider; -import ai.timefold.solver.core.preview.api.neighborhood.NeighborhoodTester; import ai.timefold.solver.core.preview.api.neighborhood.stream.MoveStream; import ai.timefold.solver.core.preview.api.neighborhood.stream.MoveStreamFactory; +import ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTester; import ai.timefold.solver.core.testdomain.TestdataEntity; import ai.timefold.solver.core.testdomain.TestdataSolution; import ai.timefold.solver.core.testdomain.TestdataValue; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/DuplicateConstraintAssertionTest.java b/core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/DuplicateConstraintAssertionTest.java similarity index 62% rename from tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/DuplicateConstraintAssertionTest.java rename to core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/DuplicateConstraintAssertionTest.java index ecad164f0e2..b7b7cbd2fe9 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/DuplicateConstraintAssertionTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/DuplicateConstraintAssertionTest.java @@ -1,11 +1,12 @@ -package ai.timefold.solver.test.api.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierDuplicateConstraintProvider; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierExtendedSolution; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierFirstEntity; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierSecondEntity; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierDuplicateConstraintProvider; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierExtendedSolution; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierFirstEntity; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierSecondEntity; import org.junit.jupiter.api.Test; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/MultiConstraintAssertionTest.java b/core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/MultiConstraintAssertionTest.java similarity index 94% rename from tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/MultiConstraintAssertionTest.java rename to core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/MultiConstraintAssertionTest.java index 4152db5ea0c..69b6af51dad 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/MultiConstraintAssertionTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/MultiConstraintAssertionTest.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import static org.assertj.core.api.Assertions.assertThatCode; @@ -10,6 +10,11 @@ import ai.timefold.solver.core.api.score.stream.Constraint; import ai.timefold.solver.core.api.score.stream.ConstraintFactory; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierConstraintProvider; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierExtendedSolution; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierFirstEntity; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierSecondEntity; import ai.timefold.solver.core.testdomain.list.TestdataListEntity; import ai.timefold.solver.core.testdomain.list.TestdataListSolution; import ai.timefold.solver.core.testdomain.list.TestdataListValue; @@ -23,10 +28,6 @@ import ai.timefold.solver.core.testdomain.shadow.multiplelistener.TestdataListMultipleShadowVariableEntity; import ai.timefold.solver.core.testdomain.shadow.multiplelistener.TestdataListMultipleShadowVariableSolution; import ai.timefold.solver.core.testdomain.shadow.multiplelistener.TestdataListMultipleShadowVariableValue; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierConstraintProvider; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierExtendedSolution; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierFirstEntity; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierSecondEntity; import org.jspecify.annotations.NonNull; import org.junit.jupiter.api.Test; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/NullOverridesTest.java b/core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/NullOverridesTest.java similarity index 87% rename from tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/NullOverridesTest.java rename to core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/NullOverridesTest.java index 8355c06d0f5..c1bfaea7843 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/NullOverridesTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/NullOverridesTest.java @@ -1,5 +1,6 @@ -package ai.timefold.solver.test.api.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import ai.timefold.solver.core.testdomain.TestdataEntity; import ai.timefold.solver.core.testdomain.constraintweightoverrides.TestdataConstraintWeightOverridesConstraintProvider; import ai.timefold.solver.core.testdomain.constraintweightoverrides.TestdataConstraintWeightOverridesSolution; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/SingleConstraintAssertionTest.java b/core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/SingleConstraintAssertionTest.java similarity index 98% rename from tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/SingleConstraintAssertionTest.java rename to core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/SingleConstraintAssertionTest.java index f4c02004744..084ede596b6 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/score/stream/SingleConstraintAssertionTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/score/stream/test/SingleConstraintAssertionTest.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.score.stream; +package ai.timefold.solver.core.impl.score.stream.test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; @@ -16,7 +16,16 @@ import ai.timefold.solver.core.api.score.stream.ConstraintFactory; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; import ai.timefold.solver.core.api.score.stream.DefaultConstraintJustification; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import ai.timefold.solver.core.testdomain.TestdataValue; +import ai.timefold.solver.core.testdomain.constraintverifier.TestFirstJustification; +import ai.timefold.solver.core.testdomain.constraintverifier.TestSecondJustification; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierConstraintProvider; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierExtendedSolution; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierFirstEntity; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierJustificationProvider; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierSecondEntity; +import ai.timefold.solver.core.testdomain.constraintverifier.TestdataConstraintVerifierSolution; import ai.timefold.solver.core.testdomain.list.TestdataListEntity; import ai.timefold.solver.core.testdomain.list.TestdataListSolution; import ai.timefold.solver.core.testdomain.list.TestdataListValue; @@ -34,14 +43,6 @@ import ai.timefold.solver.core.testdomain.shadow.multiplelistener.TestdataListMultipleShadowVariableEntity; import ai.timefold.solver.core.testdomain.shadow.multiplelistener.TestdataListMultipleShadowVariableSolution; import ai.timefold.solver.core.testdomain.shadow.multiplelistener.TestdataListMultipleShadowVariableValue; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierConstraintProvider; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierExtendedSolution; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierFirstEntity; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierJustificationProvider; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierSecondEntity; -import ai.timefold.solver.test.api.testdomain.TestdataConstraintVerifierSolution; -import ai.timefold.solver.test.api.testdomain.justification.TestFirstJustification; -import ai.timefold.solver.test.api.testdomain.justification.TestSecondJustification; import org.jspecify.annotations.NonNull; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ChangeMoveProviderTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ChangeMoveProviderTest.java index 1f1c91e83cc..79a607052cc 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ChangeMoveProviderTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ChangeMoveProviderTest.java @@ -5,7 +5,7 @@ import java.util.Collections; -import ai.timefold.solver.core.preview.api.neighborhood.NeighborhoodTester; +import ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTester; import ai.timefold.solver.core.testdomain.TestdataEntity; import ai.timefold.solver.core.testdomain.TestdataSolution; import ai.timefold.solver.core.testdomain.TestdataValue; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ChangeMoveTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ChangeMoveTest.java index 82dfeac75de..402e512c1ae 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ChangeMoveTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ChangeMoveTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import ai.timefold.solver.core.preview.api.move.MoveTester; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.testdomain.TestdataEntity; import ai.timefold.solver.core.testdomain.TestdataSolution; import ai.timefold.solver.core.testdomain.TestdataValue; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/CompositeMoveTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/CompositeMoveTest.java index f0afd909034..0fd6a37dcbd 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/CompositeMoveTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/CompositeMoveTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import ai.timefold.solver.core.preview.api.move.MoveTester; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.testdomain.TestdataEntity; import ai.timefold.solver.core.testdomain.TestdataSolution; import ai.timefold.solver.core.testdomain.TestdataValue; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListAssignMoveTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListAssignMoveTest.java index 67c36e1f286..55dcd36e3a5 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListAssignMoveTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListAssignMoveTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import ai.timefold.solver.core.preview.api.move.MoveTester; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.testdomain.list.TestdataListEntity; import ai.timefold.solver.core.testdomain.list.TestdataListSolution; import ai.timefold.solver.core.testdomain.list.TestdataListValue; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListChangeMoveProviderTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListChangeMoveProviderTest.java index c92affb18ae..7f66786fdfd 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListChangeMoveProviderTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListChangeMoveProviderTest.java @@ -7,7 +7,7 @@ import ai.timefold.solver.core.api.solver.SolutionManager; import ai.timefold.solver.core.preview.api.move.Move; -import ai.timefold.solver.core.preview.api.neighborhood.NeighborhoodTester; +import ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTester; import ai.timefold.solver.core.testdomain.list.TestdataListEntity; import ai.timefold.solver.core.testdomain.list.TestdataListSolution; import ai.timefold.solver.core.testdomain.list.unassignedvar.TestdataAllowsUnassignedValuesListEntity; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListChangeMoveTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListChangeMoveTest.java index e2492c1e1cd..4df111ccd97 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListChangeMoveTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListChangeMoveTest.java @@ -5,8 +5,8 @@ import java.util.List; import ai.timefold.solver.core.api.domain.common.Lookup; -import ai.timefold.solver.core.preview.api.move.MoveTester; import ai.timefold.solver.core.preview.api.move.MutableSolutionView; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.testdomain.list.TestdataListEntity; import ai.timefold.solver.core.testdomain.list.TestdataListSolution; import ai.timefold.solver.core.testdomain.list.TestdataListValue; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListSwapMoveProviderTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListSwapMoveProviderTest.java index 78d6acabbac..33b36f93d19 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListSwapMoveProviderTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListSwapMoveProviderTest.java @@ -4,7 +4,7 @@ import static org.assertj.core.api.SoftAssertions.assertSoftly; import ai.timefold.solver.core.api.solver.SolutionManager; -import ai.timefold.solver.core.preview.api.neighborhood.NeighborhoodTester; +import ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTester; import ai.timefold.solver.core.testdomain.list.TestdataListEntity; import ai.timefold.solver.core.testdomain.list.TestdataListSolution; import ai.timefold.solver.core.testdomain.list.TestdataListValue; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListSwapMoveTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListSwapMoveTest.java index 6250c7df1af..253dfa72f1b 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListSwapMoveTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/ListSwapMoveTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import ai.timefold.solver.core.preview.api.move.MoveTester; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.testdomain.list.TestdataListEntity; import ai.timefold.solver.core.testdomain.list.TestdataListSolution; import ai.timefold.solver.core.testdomain.list.TestdataListValue; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/SwapMoveProviderTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/SwapMoveProviderTest.java index 46a7efb0805..fe6fc973398 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/SwapMoveProviderTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/SwapMoveProviderTest.java @@ -4,7 +4,7 @@ import static org.assertj.core.api.SoftAssertions.assertSoftly; import ai.timefold.solver.core.preview.api.domain.metamodel.PlanningVariableMetaModel; -import ai.timefold.solver.core.preview.api.neighborhood.NeighborhoodTester; +import ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTester; import ai.timefold.solver.core.testdomain.TestdataEntity; import ai.timefold.solver.core.testdomain.TestdataSolution; import ai.timefold.solver.core.testdomain.multivar.TestdataMultiVarEntity; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/SwapMoveTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/SwapMoveTest.java index fdc523ac98d..02144517c13 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/SwapMoveTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/move/builtin/SwapMoveTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import ai.timefold.solver.core.preview.api.move.MoveTester; +import ai.timefold.solver.core.preview.api.move.test.MoveTester; import ai.timefold.solver.core.testdomain.TestdataEntity; import ai.timefold.solver.core.testdomain.TestdataSolution; import ai.timefold.solver.core.testdomain.TestdataValue; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/move/MoveTesterTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/move/test/MoveTesterTest.java similarity index 98% rename from core/src/test/java/ai/timefold/solver/core/preview/api/move/MoveTesterTest.java rename to core/src/test/java/ai/timefold/solver/core/preview/api/move/test/MoveTesterTest.java index e7f0693c323..8ce4aa2677d 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/move/MoveTesterTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/move/test/MoveTesterTest.java @@ -1,9 +1,10 @@ -package ai.timefold.solver.core.preview.api.move; +package ai.timefold.solver.core.preview.api.move.test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatNullPointerException; import ai.timefold.solver.core.preview.api.domain.metamodel.PlanningSolutionMetaModel; +import ai.timefold.solver.core.preview.api.move.Move; import ai.timefold.solver.core.testdomain.TestdataEntity; import ai.timefold.solver.core.testdomain.TestdataSolution; import ai.timefold.solver.core.testdomain.TestdataValue; diff --git a/core/src/test/java/ai/timefold/solver/core/preview/api/neighborhood/NeighborhoodTesterTest.java b/core/src/test/java/ai/timefold/solver/core/preview/api/neighborhood/test/NeighborhoodTesterTest.java similarity index 99% rename from core/src/test/java/ai/timefold/solver/core/preview/api/neighborhood/NeighborhoodTesterTest.java rename to core/src/test/java/ai/timefold/solver/core/preview/api/neighborhood/test/NeighborhoodTesterTest.java index c34ef2cbdb8..b13db5dd4ef 100644 --- a/core/src/test/java/ai/timefold/solver/core/preview/api/neighborhood/NeighborhoodTesterTest.java +++ b/core/src/test/java/ai/timefold/solver/core/preview/api/neighborhood/test/NeighborhoodTesterTest.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.core.preview.api.neighborhood; +package ai.timefold.solver.core.preview.api.neighborhood.test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/justification/TestFirstJustification.java b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestFirstJustification.java similarity index 72% rename from tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/justification/TestFirstJustification.java rename to core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestFirstJustification.java index 58610b24fab..8038d52ed88 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/justification/TestFirstJustification.java +++ b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestFirstJustification.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.testdomain.justification; +package ai.timefold.solver.core.testdomain.constraintverifier; import ai.timefold.solver.core.api.score.stream.ConstraintJustification; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/justification/TestSecondJustification.java b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestSecondJustification.java similarity index 72% rename from tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/justification/TestSecondJustification.java rename to core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestSecondJustification.java index 6970cd33bd2..d90b7b6705c 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/justification/TestSecondJustification.java +++ b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestSecondJustification.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.testdomain.justification; +package ai.timefold.solver.core.testdomain.constraintverifier; import ai.timefold.solver.core.api.score.stream.ConstraintJustification; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierConstraintProvider.java b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierConstraintProvider.java similarity index 97% rename from tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierConstraintProvider.java rename to core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierConstraintProvider.java index 80a0d68e51c..f5b1d48d109 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierConstraintProvider.java +++ b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierConstraintProvider.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.testdomain; +package ai.timefold.solver.core.testdomain.constraintverifier; import java.util.Objects; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierDuplicateConstraintProvider.java b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierDuplicateConstraintProvider.java similarity index 93% rename from tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierDuplicateConstraintProvider.java rename to core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierDuplicateConstraintProvider.java index 7f16ebb1970..75293f7b648 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierDuplicateConstraintProvider.java +++ b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierDuplicateConstraintProvider.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.testdomain; +package ai.timefold.solver.core.testdomain.constraintverifier; import ai.timefold.solver.core.api.score.HardSoftScore; import ai.timefold.solver.core.api.score.stream.Constraint; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierExtendedSolution.java b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierExtendedSolution.java similarity index 97% rename from tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierExtendedSolution.java rename to core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierExtendedSolution.java index 585b7c998aa..4f835cbe6b6 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierExtendedSolution.java +++ b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierExtendedSolution.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.testdomain; +package ai.timefold.solver.core.testdomain.constraintverifier; import java.util.ArrayList; import java.util.List; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierFirstEntity.java b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierFirstEntity.java similarity index 94% rename from tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierFirstEntity.java rename to core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierFirstEntity.java index e0c6df94636..46d2f63abb6 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierFirstEntity.java +++ b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierFirstEntity.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.testdomain; +package ai.timefold.solver.core.testdomain.constraintverifier; import ai.timefold.solver.core.api.domain.entity.PlanningEntity; import ai.timefold.solver.core.api.domain.variable.PlanningVariable; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierJustificationProvider.java b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierJustificationProvider.java similarity index 92% rename from tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierJustificationProvider.java rename to core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierJustificationProvider.java index a6c38bca715..d86ebb96225 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierJustificationProvider.java +++ b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierJustificationProvider.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.testdomain; +package ai.timefold.solver.core.testdomain.constraintverifier; import java.util.Set; @@ -6,7 +6,6 @@ import ai.timefold.solver.core.api.score.stream.Constraint; import ai.timefold.solver.core.api.score.stream.ConstraintFactory; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; -import ai.timefold.solver.test.api.testdomain.justification.TestFirstJustification; import org.jspecify.annotations.NonNull; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierSecondEntity.java b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierSecondEntity.java similarity index 93% rename from tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierSecondEntity.java rename to core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierSecondEntity.java index 68d63058904..963b1902e1f 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierSecondEntity.java +++ b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierSecondEntity.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.testdomain; +package ai.timefold.solver.core.testdomain.constraintverifier; import ai.timefold.solver.core.api.domain.common.PlanningId; import ai.timefold.solver.core.api.domain.entity.PlanningEntity; diff --git a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierSolution.java b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierSolution.java similarity index 97% rename from tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierSolution.java rename to core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierSolution.java index d09afa47f43..9c1ab256230 100644 --- a/tools/test/src/test/java/ai/timefold/solver/test/api/testdomain/TestdataConstraintVerifierSolution.java +++ b/core/src/test/java/ai/timefold/solver/core/testdomain/constraintverifier/TestdataConstraintVerifierSolution.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.test.api.testdomain; +package ai.timefold.solver.core.testdomain.constraintverifier; import java.util.ArrayList; import java.util.List; diff --git a/docs/TODO.md b/docs/TODO.md index b0e92a8c2b8..39a72b2d111 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -39,5 +39,8 @@ - [ ] `AutoDiscoverMemberType` is gone - [ ] Constraint name and group now forces strict validation. - [ ] `SolverManager` and `SolverJob` no longer have the `ProblemId_` type parameter. +- [ ] `timefold-solver-test` is no more +- [ ] `MockProblemChangeDirector` and `ConstraintVerifier` have moved. +- [ ] `MoveTester` and `NeighborhoodTester` have moved. Remove this file when done. \ No newline at end of file diff --git a/docs/src/modules/ROOT/pages/constraints-and-score/score-calculation.adoc b/docs/src/modules/ROOT/pages/constraints-and-score/score-calculation.adoc index 25c20b46ab3..a68cb4cde89 100644 --- a/docs/src/modules/ROOT/pages/constraints-and-score/score-calculation.adoc +++ b/docs/src/modules/ROOT/pages/constraints-and-score/score-calculation.adoc @@ -1753,7 +1753,6 @@ to determine if using it brings benefits for your use case. We recommend that you test your constraints to ensure that they behave as expected. Constraint streams include the Constraint Verifier unit testing harness. -To use it, first add a test scoped dependency to the `timefold-solver-test` JAR. [#constraintStreamsTestingIsolatedConstraints] diff --git a/docs/src/modules/ROOT/pages/quickstart/hello-world/hello-world-quickstart.adoc b/docs/src/modules/ROOT/pages/quickstart/hello-world/hello-world-quickstart.adoc index 856f6a3250b..42ea0f85542 100644 --- a/docs/src/modules/ROOT/pages/quickstart/hello-world/hello-world-quickstart.adoc +++ b/docs/src/modules/ROOT/pages/quickstart/hello-world/hello-world-quickstart.adoc @@ -96,7 +96,6 @@ include::../shared/java-prerequisites.adoc[] Create a Maven or Gradle build file and add these dependencies: * `timefold-solver-core` (compile scope) to solve the school timetable problem. -* `timefold-solver-test` (test scope) to JUnit test the school timetabling constraints. * A xref:using-timefold-solver/running-the-solver.adoc#logging[logging] implementation, such as `logback-classic` (runtime scope), to see what Timefold Solver is doing. [tabs] @@ -149,13 +148,6 @@ Your `pom.xml` file has the following content: logback-classic runtime
- - - - ai.timefold.solver - timefold-solver-test - test - @@ -199,7 +191,6 @@ repositories { dependencies { implementation platform("ai.timefold.solver:timefold-solver-bom:${timefoldSolverVersion}") implementation "ai.timefold.solver:timefold-solver-core" - testImplementation "ai.timefold.solver:timefold-solver-test" runtimeOnly "ch.qos.logback:logback-classic:${logbackVersion}" } @@ -755,7 +746,7 @@ import org.acme.schooltimetabling.domain.Room; import org.acme.schooltimetabling.domain.Timetable; import org.acme.schooltimetabling.domain.Timeslot; import org.junit.jupiter.api.Test; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; class TimetableConstraintProviderTest { @@ -791,7 +782,7 @@ Create the `src/test/kotlin/org/acme/schooltimetabling/solver/TimetableConstrain package org.acme.schooltimetabling.solver import ai.timefold.solver.core.api.score.stream.ConstraintFactory -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import org.acme.schooltimetabling.domain.Lesson import org.acme.schooltimetabling.domain.Room import org.acme.schooltimetabling.domain.Timeslot diff --git a/docs/src/modules/ROOT/pages/quickstart/quarkus-vehicle-routing/quarkus-vehicle-routing-quickstart.adoc b/docs/src/modules/ROOT/pages/quickstart/quarkus-vehicle-routing/quarkus-vehicle-routing-quickstart.adoc index cd1d6bbb579..4b67ebcca8a 100644 --- a/docs/src/modules/ROOT/pages/quickstart/quarkus-vehicle-routing/quarkus-vehicle-routing-quickstart.adoc +++ b/docs/src/modules/ROOT/pages/quickstart/quarkus-vehicle-routing/quarkus-vehicle-routing-quickstart.adoc @@ -530,7 +530,7 @@ which lowers maintenance when adding a new constraint with proper test coverage. First update your build tool configuration: -Add a `timefold-solver-test` dependency in your `pom.xml`: +Add some dependencies in your `pom.xml`: [source,xml] ---- @@ -538,11 +538,6 @@ Add a `timefold-solver-test` dependency in your `pom.xml`: quarkus-junit5 test - - ai.timefold.solver - timefold-solver-test - test - ---- Then create the test itself: @@ -566,7 +561,7 @@ import java.util.Arrays; import jakarta.inject.Inject; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import org.acme.vehiclerouting.domain.Location; import org.acme.vehiclerouting.domain.Vehicle; @@ -636,8 +631,8 @@ import java.util.Arrays import jakarta.inject.Inject -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier import ai.timefold.solver.core.api.score.stream.ConstraintFactory +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier import org.acme.vehiclerouting.domain.Location import org.acme.vehiclerouting.domain.Vehicle diff --git a/docs/src/modules/ROOT/pages/quickstart/quarkus/quarkus-quickstart.adoc b/docs/src/modules/ROOT/pages/quickstart/quarkus/quarkus-quickstart.adoc index 60605d83fd0..2ed240c1a53 100644 --- a/docs/src/modules/ROOT/pages/quickstart/quarkus/quarkus-quickstart.adoc +++ b/docs/src/modules/ROOT/pages/quickstart/quarkus/quarkus-quickstart.adoc @@ -231,7 +231,7 @@ First update your build tool configuration: Maven:: + -- -Add a `timefold-solver-test` dependency in your `pom.xml`: +Add the subsequent dependency in your `pom.xml`: [source,xml,subs=attributes+] ---- @@ -239,27 +239,15 @@ Add a `timefold-solver-test` dependency in your `pom.xml`: quarkus-junit5 test - - io.rest-assured - rest-assured - test - - - ai.timefold.solver - timefold-solver-test - {timefold-solver-version} - test - ---- -- Gradle:: + -- -Add the subsequent dependencies to your `build.gradle`: +Add the subsequent dependency to your `build.gradle`: [source,groovy,subs=attributes+] ---- testImplementation "io.quarkus:quarkus-junit5" - testImplementation "ai.timefold.solver:timefold-solver-test:{timefold-solver-version}" ---- -- ==== diff --git a/docs/src/modules/ROOT/pages/quickstart/shared/constrainttests.adoc b/docs/src/modules/ROOT/pages/quickstart/shared/constrainttests.adoc index c4cde28b742..5437c95a7f4 100644 --- a/docs/src/modules/ROOT/pages/quickstart/shared/constrainttests.adoc +++ b/docs/src/modules/ROOT/pages/quickstart/shared/constrainttests.adoc @@ -1,4 +1,4 @@ -Then create the test itself: +Now create the test itself: [tabs] ==== @@ -22,7 +22,7 @@ import org.acme.schooltimetabling.domain.Room; import org.acme.schooltimetabling.domain.Timetable; import org.acme.schooltimetabling.domain.Timeslot; import org.junit.jupiter.api.Test; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; {testannotation} class TimetableConstraintProviderTest { @@ -56,7 +56,7 @@ Create the `src/test/kotlin/org/acme/schooltimetabling/solver/TimetableConstrain ---- package org.acme.schooltimetabling.solver -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier import {testannotationfq} import {wiringannotationfq} import org.acme.schooltimetabling.domain.Lesson diff --git a/docs/src/modules/ROOT/pages/quickstart/spring-boot/spring-boot-quickstart.adoc b/docs/src/modules/ROOT/pages/quickstart/spring-boot/spring-boot-quickstart.adoc index 824c7fedfbd..f4eb1358155 100644 --- a/docs/src/modules/ROOT/pages/quickstart/spring-boot/spring-boot-quickstart.adoc +++ b/docs/src/modules/ROOT/pages/quickstart/spring-boot/spring-boot-quickstart.adoc @@ -266,41 +266,6 @@ To test each constraint in isolation, use a `ConstraintVerifier` in unit tests. It tests each constraint's corner cases in isolation from the other tests, which lowers maintenance when adding a new constraint with proper test coverage. -First add the `timefold-solver-test` dependency to your build file: - -[tabs] -==== -Maven:: -+ --- -Add the folllowing dependencies to your `pom.xml`: -[source,xml,subs=attributes+] ----- - - org.springframework.boot - spring-boot-starter-test - test - - - ai.timefold.solver - timefold-solver-test - {timefold-solver-version} - test - ----- --- -Gradle:: -+ --- -Add the subsequent dependencies to your `build.gradle`: -[source,groovy,subs=attributes+] ----- - testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("ai.timefold.solver:timefold-solver-test:{timefold-solver-version}") ----- --- -==== - include::../shared/constrainttests.adoc[] This test verifies that the constraint `TimetableConstraintProvider::roomConflict`, @@ -319,7 +284,7 @@ Java:: ---- package org.acme.schooltimetabling.config; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import org.acme.schooltimetabling.domain.Lesson; import org.acme.schooltimetabling.domain.Timetable; import org.acme.schooltimetabling.solver.TimetableConstraintProvider; @@ -343,7 +308,7 @@ Kotlin:: ---- package org.acme.schooltimetabling.config -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import org.acme.schooltimetabling.domain.Lesson import org.acme.schooltimetabling.domain.Timetable import org.acme.schooltimetabling.solver.TimetableConstraintProvider diff --git a/quarkus-integration/quarkus-benchmark/deployment/pom.xml b/quarkus-integration/quarkus-benchmark/deployment/pom.xml index cc3233bf4b9..1312e53f719 100644 --- a/quarkus-integration/quarkus-benchmark/deployment/pom.xml +++ b/quarkus-integration/quarkus-benchmark/deployment/pom.xml @@ -59,11 +59,6 @@ rest-assured test - - ai.timefold.solver - timefold-solver-test - test - org.mockito mockito-core diff --git a/quarkus-integration/quarkus/deployment/pom.xml b/quarkus-integration/quarkus/deployment/pom.xml index b50efa3f675..e77ade56f95 100644 --- a/quarkus-integration/quarkus/deployment/pom.xml +++ b/quarkus-integration/quarkus/deployment/pom.xml @@ -58,11 +58,6 @@ test-jar test - - ai.timefold.solver - timefold-solver-test - test - org.mockito mockito-core diff --git a/quarkus-integration/quarkus/deployment/src/main/java/ai/timefold/solver/quarkus/deployment/DotNames.java b/quarkus-integration/quarkus/deployment/src/main/java/ai/timefold/solver/quarkus/deployment/DotNames.java index 1b4b29b35e7..93304e70db5 100644 --- a/quarkus-integration/quarkus/deployment/src/main/java/ai/timefold/solver/quarkus/deployment/DotNames.java +++ b/quarkus-integration/quarkus/deployment/src/main/java/ai/timefold/solver/quarkus/deployment/DotNames.java @@ -33,6 +33,7 @@ import ai.timefold.solver.core.api.score.calculator.EasyScoreCalculator; import ai.timefold.solver.core.api.score.calculator.IncrementalScoreCalculator; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.api.solver.SolverManager; import ai.timefold.solver.core.config.solver.SolverConfig; @@ -83,10 +84,7 @@ public final class DotNames { static final DotName SOLVER_MANAGER_CONFIG = DotName.createSimple(SolverManagerConfig.class.getName()); static final DotName SOLVER_FACTORY = DotName.createSimple(SolverFactory.class.getName()); static final DotName SOLVER_MANAGER = DotName.createSimple(SolverManager.class.getName()); - - // Need to use String since timefold-solver-test is not on the compile classpath - static final DotName CONSTRAINT_VERIFIER = - DotName.createSimple("ai.timefold.solver.test.api.score.stream.ConstraintVerifier"); + static final DotName CONSTRAINT_VERIFIER = DotName.createSimple(ConstraintVerifier.class.getName()); static final DotName[] PLANNING_ENTITY_FIELD_ANNOTATIONS = { PLANNING_PIN, diff --git a/quarkus-integration/quarkus/deployment/src/main/java/ai/timefold/solver/quarkus/deployment/TimefoldProcessor.java b/quarkus-integration/quarkus/deployment/src/main/java/ai/timefold/solver/quarkus/deployment/TimefoldProcessor.java index 4a8128f4c09..e2fa1df722d 100644 --- a/quarkus-integration/quarkus/deployment/src/main/java/ai/timefold/solver/quarkus/deployment/TimefoldProcessor.java +++ b/quarkus-integration/quarkus/deployment/src/main/java/ai/timefold/solver/quarkus/deployment/TimefoldProcessor.java @@ -2,7 +2,6 @@ import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT; -import java.lang.constant.ClassDesc; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -45,6 +44,7 @@ import ai.timefold.solver.core.impl.domain.solution.descriptor.SolutionDescriptor; import ai.timefold.solver.core.impl.domain.variable.declarative.RootVariableSource; import ai.timefold.solver.core.impl.heuristic.selector.common.nearby.NearbyDistanceMeter; +import ai.timefold.solver.core.impl.score.stream.test.DefaultConstraintVerifier; import ai.timefold.solver.quarkus.TimefoldRecorder; import ai.timefold.solver.quarkus.bean.BeanUtil; import ai.timefold.solver.quarkus.bean.DefaultTimefoldBeanProvider; @@ -761,10 +761,8 @@ private void generateConstraintVerifier(SolverConfig solverConfig, enabledPreviewFeatureSet, planningSolutionClassResultHandle, planningEntityClassesResultHandle)); var constraintVerifierResultHandle = methodCreator.new_( - ConstructorDesc.of( - ClassDesc.of( - "ai.timefold.solver.test.impl.score.stream.DefaultConstraintVerifier"), - ConstraintProvider.class, SolutionDescriptor.class), + ConstructorDesc.of(DefaultConstraintVerifier.class, ConstraintProvider.class, + SolutionDescriptor.class), constraintProviderResultHandle, solutionDescriptorResultHandle); methodCreator.return_(constraintVerifierResultHandle); diff --git a/quarkus-integration/quarkus/deployment/src/test/java/ai/timefold/solver/quarkus/verifier/TimefoldConstraintVerifierTest.java b/quarkus-integration/quarkus/deployment/src/test/java/ai/timefold/solver/quarkus/verifier/TimefoldConstraintVerifierTest.java index 150543879c8..599580c118e 100644 --- a/quarkus-integration/quarkus/deployment/src/test/java/ai/timefold/solver/quarkus/verifier/TimefoldConstraintVerifierTest.java +++ b/quarkus-integration/quarkus/deployment/src/test/java/ai/timefold/solver/quarkus/verifier/TimefoldConstraintVerifierTest.java @@ -5,10 +5,10 @@ import jakarta.inject.Inject; import ai.timefold.solver.core.api.score.SimpleScore; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import ai.timefold.solver.quarkus.testdomain.normal.TestdataQuarkusConstraintProvider; import ai.timefold.solver.quarkus.testdomain.normal.TestdataQuarkusEntity; import ai.timefold.solver.quarkus.testdomain.normal.TestdataQuarkusSolution; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; diff --git a/spring-integration/spring-boot-autoconfigure/pom.xml b/spring-integration/spring-boot-autoconfigure/pom.xml index 1c2c0e7bd62..5df558d5a40 100644 --- a/spring-integration/spring-boot-autoconfigure/pom.xml +++ b/spring-integration/spring-boot-autoconfigure/pom.xml @@ -36,13 +36,6 @@ timefold-solver-jackson - - - ai.timefold.solver - timefold-solver-test - true - - ai.timefold.solver diff --git a/spring-integration/spring-boot-autoconfigure/src/main/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverBeanFactory.java b/spring-integration/spring-boot-autoconfigure/src/main/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverBeanFactory.java index 54d4ef8460f..63534c24e3c 100644 --- a/spring-integration/spring-boot-autoconfigure/src/main/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverBeanFactory.java +++ b/spring-integration/spring-boot-autoconfigure/src/main/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverBeanFactory.java @@ -7,6 +7,9 @@ import ai.timefold.solver.core.api.score.stream.ConstraintFactory; import ai.timefold.solver.core.api.score.stream.ConstraintMetaModel; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; +import ai.timefold.solver.core.api.score.stream.test.MultiConstraintVerification; +import ai.timefold.solver.core.api.score.stream.test.SingleConstraintVerification; import ai.timefold.solver.core.api.solver.SolutionManager; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.api.solver.SolverManager; @@ -18,9 +21,6 @@ import ai.timefold.solver.jackson.api.TimefoldJacksonModule; import ai.timefold.solver.spring.boot.autoconfigure.config.SolverManagerProperties; import ai.timefold.solver.spring.boot.autoconfigure.config.TimefoldProperties; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; -import ai.timefold.solver.test.api.score.stream.MultiConstraintVerification; -import ai.timefold.solver.test.api.score.stream.SingleConstraintVerification; import org.jspecify.annotations.NonNull; import org.springframework.beans.BeansException; diff --git a/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverConstraintAutoConfigurationTest.java b/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverConstraintAutoConfigurationTest.java index 0628e3f5321..0c84fb01e38 100644 --- a/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverConstraintAutoConfigurationTest.java +++ b/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverConstraintAutoConfigurationTest.java @@ -7,6 +7,7 @@ import ai.timefold.solver.core.api.score.SimpleScore; import ai.timefold.solver.core.api.score.stream.ConstraintMetaModel; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.config.solver.SolverConfig; import ai.timefold.solver.spring.boot.autoconfigure.basic.NormalSpringTestConfiguration; @@ -16,7 +17,6 @@ import ai.timefold.solver.spring.boot.autoconfigure.config.SolverProperty; import ai.timefold.solver.spring.boot.autoconfigure.config.TimefoldProperties; import ai.timefold.solver.spring.boot.autoconfigure.multiple.MultipleConstraintSpringTestConfiguration; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; import org.assertj.core.api.AssertionsForClassTypes; import org.junit.jupiter.api.Test; diff --git a/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverMultipleSolverAutoConfigurationTest.java b/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverMultipleSolverAutoConfigurationTest.java index 23cb458b416..1c9c9f04b6a 100644 --- a/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverMultipleSolverAutoConfigurationTest.java +++ b/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverMultipleSolverAutoConfigurationTest.java @@ -8,6 +8,7 @@ import java.util.stream.IntStream; import ai.timefold.solver.core.api.score.HardSoftScore; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import ai.timefold.solver.core.api.solver.SolutionManager; import ai.timefold.solver.core.api.solver.SolverConfigOverride; import ai.timefold.solver.core.api.solver.SolverFactory; @@ -39,7 +40,6 @@ import ai.timefold.solver.spring.boot.autoconfigure.invalid.solution.InvalidSolutionSpringTestConfiguration; import ai.timefold.solver.spring.boot.autoconfigure.invalid.type.InvalidEntityTypeSpringTestConfiguration; import ai.timefold.solver.spring.boot.autoconfigure.multimodule.MultiModuleSpringTestConfiguration; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.parallel.Execution; diff --git a/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverWithSolverConfigXmlAutoConfigurationTest.java b/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverWithSolverConfigXmlAutoConfigurationTest.java index 97fc3a6e7af..6bde525ca91 100644 --- a/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverWithSolverConfigXmlAutoConfigurationTest.java +++ b/spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverWithSolverConfigXmlAutoConfigurationTest.java @@ -10,6 +10,7 @@ import java.util.Collections; import ai.timefold.solver.core.api.score.SimpleScore; +import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; import ai.timefold.solver.core.api.solver.SolutionManager; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.api.solver.SolverManager; @@ -30,7 +31,6 @@ import ai.timefold.solver.spring.boot.autoconfigure.basic.domain.TestdataSpringSolution; import ai.timefold.solver.spring.boot.autoconfigure.invalid.entity.InvalidEntitySpringTestConfiguration; import ai.timefold.solver.spring.boot.autoconfigure.invalid.type.InvalidEntityTypeSpringTestConfiguration; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.parallel.Execution; diff --git a/tools/migration/pom.xml b/tools/migration/pom.xml index 1e6cbd60510..8c0efa6a2ee 100644 --- a/tools/migration/pom.xml +++ b/tools/migration/pom.xml @@ -32,6 +32,10 @@ org.openrewrite rewrite-java + + org.openrewrite + rewrite-maven + org.openrewrite rewrite-xml @@ -69,11 +73,6 @@ logback-classic test - - ai.timefold.solver - timefold-solver-test - test - ai.timefold.solver @@ -92,6 +91,16 @@ true + + + maven-dependency-plugin + + + org.openrewrite:rewrite-maven:jar + + + + diff --git a/tools/migration/src/main/java/ai/timefold/solver/migration/AbstractRecipe.java b/tools/migration/src/main/java/ai/timefold/solver/migration/AbstractRecipe.java index 27941966fda..06a362855fd 100644 --- a/tools/migration/src/main/java/ai/timefold/solver/migration/AbstractRecipe.java +++ b/tools/migration/src/main/java/ai/timefold/solver/migration/AbstractRecipe.java @@ -1,11 +1,7 @@ package ai.timefold.solver.migration; import org.openrewrite.Recipe; -import org.openrewrite.java.JavaParser; public abstract class AbstractRecipe extends Recipe { - public static final JavaParser.Builder JAVA_PARSER = JavaParser.fromJavaVersion() - .classpath(JavaParser.runtimeClasspath()); - } diff --git a/tools/migration/src/main/java/ai/timefold/solver/migration/ConstraintStreamMigrationRecipe.java b/tools/migration/src/main/java/ai/timefold/solver/migration/one/ConstraintStreamMigrationRecipe.java similarity index 96% rename from tools/migration/src/main/java/ai/timefold/solver/migration/ConstraintStreamMigrationRecipe.java rename to tools/migration/src/main/java/ai/timefold/solver/migration/one/ConstraintStreamMigrationRecipe.java index 5eda1f23fd1..cb6bd92a39a 100644 --- a/tools/migration/src/main/java/ai/timefold/solver/migration/ConstraintStreamMigrationRecipe.java +++ b/tools/migration/src/main/java/ai/timefold/solver/migration/one/ConstraintStreamMigrationRecipe.java @@ -1,7 +1,9 @@ -package ai.timefold.solver.migration; +package ai.timefold.solver.migration.one; import java.util.List; +import ai.timefold.solver.migration.AbstractRecipe; + import org.openrewrite.Recipe; import org.openrewrite.java.ChangeMethodName; diff --git a/tools/migration/src/main/java/ai/timefold/solver/migration/GeneralChangeTypeMigrationRecipe.java b/tools/migration/src/main/java/ai/timefold/solver/migration/one/GeneralChangeTypeMigrationRecipe.java similarity index 97% rename from tools/migration/src/main/java/ai/timefold/solver/migration/GeneralChangeTypeMigrationRecipe.java rename to tools/migration/src/main/java/ai/timefold/solver/migration/one/GeneralChangeTypeMigrationRecipe.java index afa59c68cc6..bb3f6a40ecd 100644 --- a/tools/migration/src/main/java/ai/timefold/solver/migration/GeneralChangeTypeMigrationRecipe.java +++ b/tools/migration/src/main/java/ai/timefold/solver/migration/one/GeneralChangeTypeMigrationRecipe.java @@ -1,7 +1,9 @@ -package ai.timefold.solver.migration; +package ai.timefold.solver.migration.one; import java.util.List; +import ai.timefold.solver.migration.AbstractRecipe; + import org.openrewrite.Recipe; import org.openrewrite.java.ChangeType; diff --git a/tools/migration/src/main/java/ai/timefold/solver/migration/one/TestingAPIsMigrationRecipe.java b/tools/migration/src/main/java/ai/timefold/solver/migration/one/TestingAPIsMigrationRecipe.java new file mode 100644 index 00000000000..1b9ca504783 --- /dev/null +++ b/tools/migration/src/main/java/ai/timefold/solver/migration/one/TestingAPIsMigrationRecipe.java @@ -0,0 +1,39 @@ +package ai.timefold.solver.migration.one; + +import java.util.List; + +import ai.timefold.solver.migration.AbstractRecipe; + +import org.openrewrite.Recipe; +import org.openrewrite.java.ChangePackage; +import org.openrewrite.java.ChangeType; + +public class TestingAPIsMigrationRecipe extends AbstractRecipe { + + @Override + public String getDisplayName() { + return "Migrate testing APIs to their new packages"; + } + + @Override + public String getDescription() { + return getDisplayName() + "."; + } + + @Override + public List getRecipeList() { + return List.of( + new ChangePackage("ai.timefold.solver.test.api.score.stream", "ai.timefold.solver.core.api.score.stream.test", + true), + new ChangePackage("ai.timefold.solver.test.api.solver.change", "ai.timefold.solver.core.api.solver.change", + true), + new ChangeType("ai.timefold.solver.core.preview.api.move.MoveTester", + "ai.timefold.solver.core.preview.api.move.test.MoveTester", true), + new ChangeType("ai.timefold.solver.core.preview.api.move.MoveTestContext", + "ai.timefold.solver.core.preview.api.move.test.MoveTestContext", true), + new ChangeType("ai.timefold.solver.core.preview.api.neighborhood.NeighborhoodTester", + "ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTester", true), + new ChangeType("ai.timefold.solver.core.preview.api.neighborhood.NeighborhoodTestContext", + "ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTestContext", true)); + } +} diff --git a/tools/migration/src/main/java/ai/timefold/solver/migration/one/package-info.java b/tools/migration/src/main/java/ai/timefold/solver/migration/one/package-info.java new file mode 100644 index 00000000000..bf6311f7383 --- /dev/null +++ b/tools/migration/src/main/java/ai/timefold/solver/migration/one/package-info.java @@ -0,0 +1,4 @@ +/** + * This package contains recipes to migrate from the final 1.x release to the 2.0.0 release. + */ +package ai.timefold.solver.migration.one; \ No newline at end of file diff --git a/tools/migration/src/main/resources/META-INF/rewrite/ToLatest.yml b/tools/migration/src/main/resources/META-INF/rewrite/ToLatest.yml index 8ca8fa42053..e5bf461c725 100644 --- a/tools/migration/src/main/resources/META-INF/rewrite/ToLatest.yml +++ b/tools/migration/src/main/resources/META-INF/rewrite/ToLatest.yml @@ -3,9 +3,14 @@ name: ai.timefold.solver.migration.ToLatest displayName: Upgrade to the latest Timefold Solver description: 'Replace all your calls to deleted/deprecated types and methods of Timefold Solver with their proper alternatives.' recipeList: - - ai.timefold.solver.migration.GeneralChangeTypeMigrationRecipe - - ai.timefold.solver.migration.ConstraintStreamMigrationRecipe + - ai.timefold.solver.migration.ChangeVersion + - ai.timefold.solver.migration.one.GeneralChangeTypeMigrationRecipe + - ai.timefold.solver.migration.one.ConstraintStreamMigrationRecipe - org.openrewrite.java.DeleteMethodArgument: methodPattern: ai.timefold.solver.core.api.score.constraint.ConstraintRef of(String, String) argumentIndex: 0 + - ai.timefold.solver.migration.one.TestingAPIsMigrationRecipe - org.openrewrite.java.RemoveUnusedImports + - org.openrewrite.maven.RemoveDependency: + groupId: ai.timefold.solver + artifactId: timefold-solver-test diff --git a/tools/migration/src/test/java/ai/timefold/solver/migration/ConstraintStreamMigrationRecipeTest.java b/tools/migration/src/test/java/ai/timefold/solver/migration/one/ConstraintStreamMigrationRecipeTest.java similarity index 99% rename from tools/migration/src/test/java/ai/timefold/solver/migration/ConstraintStreamMigrationRecipeTest.java rename to tools/migration/src/test/java/ai/timefold/solver/migration/one/ConstraintStreamMigrationRecipeTest.java index 470eb4a48e3..cada2e9d981 100644 --- a/tools/migration/src/test/java/ai/timefold/solver/migration/ConstraintStreamMigrationRecipeTest.java +++ b/tools/migration/src/test/java/ai/timefold/solver/migration/one/ConstraintStreamMigrationRecipeTest.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.migration; +package ai.timefold.solver.migration.one; import static org.openrewrite.java.Assertions.java; diff --git a/tools/migration/src/test/java/ai/timefold/solver/migration/GeneralChangeTypeMigrationRecipeTest.java b/tools/migration/src/test/java/ai/timefold/solver/migration/one/GeneralChangeTypeMigrationRecipeTest.java similarity index 99% rename from tools/migration/src/test/java/ai/timefold/solver/migration/GeneralChangeTypeMigrationRecipeTest.java rename to tools/migration/src/test/java/ai/timefold/solver/migration/one/GeneralChangeTypeMigrationRecipeTest.java index 956d37e59bd..68fc3efbd29 100644 --- a/tools/migration/src/test/java/ai/timefold/solver/migration/GeneralChangeTypeMigrationRecipeTest.java +++ b/tools/migration/src/test/java/ai/timefold/solver/migration/one/GeneralChangeTypeMigrationRecipeTest.java @@ -1,4 +1,4 @@ -package ai.timefold.solver.migration; +package ai.timefold.solver.migration.one; import static org.openrewrite.java.Assertions.java; diff --git a/tools/migration/src/test/java/ai/timefold/solver/migration/one/TestingAPIsMigrationRecipeTest.java b/tools/migration/src/test/java/ai/timefold/solver/migration/one/TestingAPIsMigrationRecipeTest.java new file mode 100644 index 00000000000..94982c107f8 --- /dev/null +++ b/tools/migration/src/test/java/ai/timefold/solver/migration/one/TestingAPIsMigrationRecipeTest.java @@ -0,0 +1,74 @@ +package ai.timefold.solver.migration.one; + +import static org.openrewrite.java.Assertions.java; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.style.ImportLayoutStyle; +import org.openrewrite.style.NamedStyles; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; +import org.openrewrite.test.TypeValidation; + +@Execution(ExecutionMode.CONCURRENT) +class TestingAPIsMigrationRecipeTest implements RewriteTest { + + private static final class NoWildCardImportStyle extends NamedStyles { + + public NoWildCardImportStyle() { + super(UUID.randomUUID(), "ImportStyle", "ImportStyle", "ImportStyle", Collections.emptySet(), + List.of(ImportLayoutStyle.builder().classCountToUseStarImport(9999999).importStaticAllOthers() + .importAllOthers().build())); + } + } + + @Override + public void defaults(RecipeSpec spec) { + spec.recipes(new TestingAPIsMigrationRecipe()) + .typeValidationOptions(TypeValidation.builder().allowMissingType(ignore -> true).build()) + .parser(JavaParser.fromJavaVersion().styles(List.of(new NoWildCardImportStyle())) + // We must add all old classes as stubs to the JavaTemplate + .dependsOn("package ai.timefold.solver.test.api.score.stream; public class ConstraintVerifier {}", + "package ai.timefold.solver.test.api.solver.change; public class MockProblemChangeDirector {}", + "package ai.timefold.solver.core.preview.api.move; public class MoveTester {}", + "package ai.timefold.solver.core.preview.api.neighborhood; public class NeighborhoodTester {}")); + } + + @Test + void migrate() { + rewriteRun(java(""" + package timefold; + + import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; + import ai.timefold.solver.test.api.solver.change.MockProblemChangeDirector; + import ai.timefold.solver.core.preview.api.move.MoveTester; + import ai.timefold.solver.core.preview.api.neighborhood.NeighborhoodTester; + + public class Test { + ConstraintVerifier constraintVerifier; + MockProblemChangeDirector problemChangeDirector; + MoveTester moveTester; + NeighborhoodTester neighborhoodTester; + }""", """ + package timefold; + + import ai.timefold.solver.core.api.score.stream.test.ConstraintVerifier; + import ai.timefold.solver.core.api.solver.change.MockProblemChangeDirector; + import ai.timefold.solver.core.preview.api.move.test.MoveTester; + import ai.timefold.solver.core.preview.api.neighborhood.test.NeighborhoodTester; + + public class Test { + ConstraintVerifier constraintVerifier; + MockProblemChangeDirector problemChangeDirector; + MoveTester moveTester; + NeighborhoodTester neighborhoodTester; + }""")); + } + +} diff --git a/tools/pom.xml b/tools/pom.xml index fbed2247e88..f5d53727d47 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -27,7 +27,6 @@ benchmark benchmark-aggregator migration - test diff --git a/tools/test/pom.xml b/tools/test/pom.xml deleted file mode 100644 index 9c2386326a8..00000000000 --- a/tools/test/pom.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - 4.0.0 - - ai.timefold.solver - timefold-solver-build-parent - 999-SNAPSHOT - ../../build/build-parent/pom.xml - - - timefold-solver-test - - Timefold Solver Testing Support - - Timefold solves planning problems. - This lightweight, embeddable planning engine implements powerful and scalable algorithms - to optimize business resource scheduling and planning. - - This module contains support for testing the solver. - This module is intended to be used a test-scoped dependency. - - https://solver.timefold.ai - - - ai.timefold.solver.test - - - - - - ai.timefold.solver - timefold-solver-core - - - ai.timefold.solver - timefold-solver-core - test-jar - test - - - - - org.apache.commons - commons-lang3 - test - - - - - org.slf4j - slf4j-api - - - ch.qos.logback - logback-classic - test - - - - org.junit.jupiter - junit-jupiter-api - test - - - org.assertj - assertj-core - test - - - - org.jspecify - jspecify - - - - - - - org.revapi - revapi-maven-plugin - - true - - - - maven-dependency-plugin - - - ai.timefold.solver:timefold-solver-core:jar - - - - - - - diff --git a/tools/test/src/build/revapi-differences.json b/tools/test/src/build/revapi-differences.json deleted file mode 100644 index 8eedb527e22..00000000000 --- a/tools/test/src/build/revapi-differences.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - { - "extension": "revapi.differences", - "configuration": { - } - } -] \ No newline at end of file diff --git a/tools/test/src/build/revapi-filter.json b/tools/test/src/build/revapi-filter.json deleted file mode 100644 index fbd5103c95f..00000000000 --- a/tools/test/src/build/revapi-filter.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "extension": "revapi.filter", - "configuration": { - "elements": { - "include": [ - "class ai\\.timefold\\.solver\\.test\\.api.*" - ] - } - } - } -] \ No newline at end of file diff --git a/tools/test/src/test/resources/logback-test.xml b/tools/test/src/test/resources/logback-test.xml deleted file mode 100644 index bd7ab3c1bb2..00000000000 --- a/tools/test/src/test/resources/logback-test.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - %d{HH:mm:ss.SSS} [%-12.12t] %-5p %m%n - - - - - - - - - - - - - -