>(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