All checks were successful
Build, test and publish / verify (push) Successful in 7m6s
62 lines
3.5 KiB
Java
62 lines
3.5 KiB
Java
package nl.agilecc.agiledancers;
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
import nl.agilecc.agiledancers.model.scheduling.GroupRequirement;
|
|
import nl.agilecc.agiledancers.model.scheduling.SchedulingFailureKind;
|
|
import nl.agilecc.agiledancers.model.scheduling.SchedulingInput;
|
|
import nl.agilecc.agiledancers.model.scheduling.SchedulingPhase;
|
|
import nl.agilecc.agiledancers.model.scheduling.SchedulingProgress;
|
|
import nl.agilecc.agiledancers.model.scheduling.SchedulingResult;
|
|
import nl.agilecc.agiledancers.model.scheduling.SchedulingSummary;
|
|
import nl.agilecc.agiledancers.model.scheduling.VarietyScore;
|
|
import nl.agilecc.agiledancers.model.specifications.DanceGroupStyle;
|
|
import nl.agilecc.agiledancers.service.SchedulingFailure;
|
|
import nl.agilecc.agiledancers.solver.OrToolsSchedulingEngine;
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
class SchedulingProgressTest {
|
|
public @Test void realSolverReportsDiscoveryDuringEachPhase() {
|
|
final SchedulingInput input = new SchedulingInput(1, 0, 2, List.of(new GroupRequirement(2, 1)));
|
|
final List<SchedulingProgress> updates = new ArrayList<>();
|
|
final SchedulingResult result = new OrToolsSchedulingEngine().solve(input, updates::add);
|
|
assertTrue(result.optimal());
|
|
assertEquals(
|
|
List.of(SchedulingPhase.ATTENDANCE, SchedulingPhase.SPREAD, SchedulingPhase.VARIETY),
|
|
updates.stream().map(SchedulingProgress::phase).distinct().toList());
|
|
assertEquals(new SchedulingProgress(SchedulingPhase.ATTENDANCE, false), updates.getFirst());
|
|
assertTrue(updates.contains(new SchedulingProgress(SchedulingPhase.ATTENDANCE, true)));
|
|
assertTrue(updates.contains(new SchedulingProgress(SchedulingPhase.VARIETY, true)));
|
|
}
|
|
|
|
public @Test void noSolutionAndInfeasibleHaveStableDistinctOutcomes() {
|
|
final SchedulingInput input = new SchedulingInput(1, 0, 1, List.of(new GroupRequirement(2, 1)));
|
|
assertEquals(
|
|
SchedulingFailureKind.NO_SOLUTION,
|
|
assertThrows(SchedulingFailure.class, () -> new OrToolsSchedulingEngine(0).solve(input))
|
|
.getOutcome());
|
|
final SchedulingInput impossible = new SchedulingInput(1, 0, 1, List.of(new GroupRequirement(2, 2)));
|
|
assertEquals(
|
|
SchedulingFailureKind.INFEASIBLE,
|
|
assertThrows(SchedulingFailure.class, () -> new OrToolsSchedulingEngine().solve(impossible))
|
|
.getOutcome());
|
|
}
|
|
|
|
public @Test void summaryMatchesTheThreeObjectiveDefinitionsAndCoachExemptions() {
|
|
final GroupRequirement showcase = new GroupRequirement(1, 1, true, Set.of(10L, 11L), Set.of(), 20);
|
|
final GroupRequirement regular =
|
|
new GroupRequirement(2, 2, false, Set.of(10L, 11L), Set.of(DanceGroupStyle.MODERN), 22);
|
|
final SchedulingInput input = new SchedulingInput(1, 0, 3, List.of(showcase, regular), 1, Set.of(11L));
|
|
final SchedulingResult result = new SchedulingResult(false, List.of(List.of(1L, 2L), List.of(2L), List.of()));
|
|
final SchedulingSummary summary = SchedulingSummary.of(input, result);
|
|
assertEquals(1, summary.attendanceExcess());
|
|
assertEquals(2, summary.performanceSpread());
|
|
assertEquals(VarietyScore.penalty(showcase, regular), summary.varietyPenalty());
|
|
}
|
|
}
|