Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 0 additions & 17 deletions build/bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -150,23 +150,6 @@
<type>test-jar</type>
<version>${version.ai.timefold.solver}</version>
</dependency>
<dependency>
<groupId>ai.timefold.solver</groupId>
<artifactId>timefold-solver-test</artifactId>
<version>${version.ai.timefold.solver}</version>
</dependency>
<dependency>
<groupId>ai.timefold.solver</groupId>
<artifactId>timefold-solver-test</artifactId>
<version>${version.ai.timefold.solver}</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>ai.timefold.solver</groupId>
<artifactId>timefold-solver-test</artifactId>
<type>test-jar</type>
<version>${version.ai.timefold.solver}</version>
</dependency>
<!-- quarkus-integration -->
<dependency>
<groupId>ai.timefold.solver</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public record MatchAnalysis<Score_ extends Score<Score_>>(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?"""
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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 {

Expand Down
Original file line number Diff line number Diff line change
@@ -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 {

Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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}.
*
* <p>
* Example of usage:
*
* <pre>
Expand All @@ -27,41 +24,39 @@
* }
* </pre>
*/
@NullMarked
public class MockProblemChangeDirector implements ProblemChangeDirector {

private Map<Object, Object> lookUpTable = new IdentityHashMap<>();

@Override
public <Entity> void addEntity(@NonNull Entity entity, @NonNull Consumer<Entity> entityConsumer) {
public <Entity> void addEntity(Entity entity, Consumer<Entity> entityConsumer) {
entityConsumer.accept(this.lookUpWorkingObject(entity));
}

@Override
public <Entity> void removeEntity(@NonNull Entity entity, Consumer<Entity> entityConsumer) {
public <Entity> void removeEntity(Entity entity, Consumer<Entity> entityConsumer) {
entityConsumer.accept(this.lookUpWorkingObject(entity));
}

@Override
public <Entity> void changeVariable(@NonNull Entity entity, @NonNull String variableName,
@NonNull Consumer<Entity> entityConsumer) {
public <Entity> void changeVariable(Entity entity, String variableName, Consumer<Entity> entityConsumer) {
entityConsumer.accept(this.lookUpWorkingObject(entity));
}

@Override
public <ProblemFact> void addProblemFact(@NonNull ProblemFact problemFact,
@NonNull Consumer<ProblemFact> problemFactConsumer) {
public <ProblemFact> void addProblemFact(ProblemFact problemFact, Consumer<ProblemFact> problemFactConsumer) {
problemFactConsumer.accept(this.lookUpWorkingObject(problemFact));
}

@Override
public <ProblemFact> void removeProblemFact(@NonNull ProblemFact problemFact,
@NonNull Consumer<ProblemFact> problemFactConsumer) {
public <ProblemFact> void removeProblemFact(ProblemFact problemFact, Consumer<ProblemFact> problemFactConsumer) {
problemFactConsumer.accept(this.lookUpWorkingObject(problemFact));
}

@Override
public <EntityOrProblemFact> void changeProblemProperty(@NonNull EntityOrProblemFact problemFactOrEntity,
@NonNull Consumer<EntityOrProblemFact> problemFactOrEntityConsumer) {
public <EntityOrProblemFact> void changeProblemProperty(EntityOrProblemFact problemFactOrEntity,
Consumer<EntityOrProblemFact> problemFactOrEntityConsumer) {
problemFactOrEntityConsumer.accept(this.lookUpWorkingObject(problemFactOrEntity));
}

Expand All @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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" +
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -16,14 +16,14 @@
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;
import ai.timefold.solver.core.impl.score.stream.common.AbstractConstraint;
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;
Expand Down Expand Up @@ -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";
};
}

}
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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.
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package ai.timefold.solver.test.impl.score.stream;
package ai.timefold.solver.core.impl.score.stream.test;

import static java.util.Objects.requireNonNull;

import java.util.Objects;

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<Solution_, Score_ extends Score<Score_>>
extends AbstractMultiConstraintAssertion<Solution_, Score_> implements ShadowVariableAwareMultiConstraintAssertion {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Solution_, Score_ extends Score<Score_>>
extends AbstractSingleConstraintAssertion<Solution_, Score_> implements ShadowVariableAwareSingleConstraintAssertion {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Loading
Loading