use of org.kie.kogito.taskassigning.core.model.TaskAssigningSolution in project kogito-apps by kiegroup.
the class TaskAssigningResourceTest method getSolution.
@Test
void getSolution() {
TaskAssigningSolution solution = new TaskAssigningSolution();
doReturn(solution).when(service).getCurrentSolution();
assertThat(resource.getSolution()).isSameAs(solution);
}
use of org.kie.kogito.taskassigning.core.model.TaskAssigningSolution in project kogito-apps by kiegroup.
the class PlanningBuilderTest method build.
@Test
void build() {
context = new TaskAssigningServiceContext();
List<TaskAssignment> user1Assignments = Arrays.asList(mockTaskAssignment(USER1_TASK1), mockTaskAssignment(DUMMY_TASK_ASSIGNMENT.getId()), mockTaskAssignment(USER1_TASK2), mockTaskAssignment(USER1_TASK3));
User user1 = mockUser(USER1, user1Assignments);
List<TaskAssignment> user2Assignments = Arrays.asList(mockTaskAssignment(USER2_TASK1), mockTaskAssignment(USER2_TASK2));
User user2 = mockUser(USER2, user2Assignments);
List<TaskAssignment> user3Assignments = Arrays.asList(mockTaskAssignment(USER3_TASK1), mockTaskAssignment(USER3_TASK2), mockTaskAssignment(USER3_TASK3), mockTaskAssignment(USER3_TASK4));
User user3 = mockUser(USER3, user3Assignments);
List<TaskAssignment> planningUserAssignments = Arrays.asList(mockTaskAssignment(PLANNING_USER_TASK1), mockTaskAssignment(PLANNING_USER_TASK2), mockTaskAssignment(PLANNING_USER_TASK3), mockTaskAssignment(PLANNING_USER_TASK4), mockTaskAssignment(PLANNING_USER_TASK5));
User planningUser = mockUser(PLANNING_USER_ID, planningUserAssignments);
List<TaskAssignment> allAssignments = new ArrayList<>(user1Assignments);
allAssignments.addAll(user2Assignments);
allAssignments.addAll(user3Assignments);
allAssignments.addAll(planningUserAssignments);
List<User> allUsers = Arrays.asList(user1, user2, user3, planningUser);
TaskAssigningSolution solution = new TaskAssigningSolution("1", allUsers, allAssignments);
context.setTaskPublished(USER1_TASK1, false);
context.setTaskPublished(DUMMY_TASK_ASSIGNMENT.getId(), false);
context.setTaskPublished(USER1_TASK2, false);
context.setTaskPublished(USER1_TASK3, false);
context.setTaskPublished(USER2_TASK1, true);
context.setTaskPublished(USER2_TASK2, true);
context.setTaskPublished(USER3_TASK1, false);
context.setTaskPublished(USER3_TASK2, true);
context.setTaskPublished(USER3_TASK3, true);
context.setTaskPublished(USER3_TASK4, false);
context.setTaskPublished(PLANNING_USER_TASK1, true);
context.setTaskPublished(PLANNING_USER_TASK2, false);
context.setTaskPublished(PLANNING_USER_TASK3, false);
context.setTaskPublished(PLANNING_USER_TASK4, false);
context.setTaskPublished(PLANNING_USER_TASK5, false);
List<PlanningItem> planningItems = PlanningBuilder.create().withContext(context).withPublishWindowSize(2).forSolution(solution).build();
List<TaskAssignment> expectedAssignmentsInPlanning = new ArrayList<>();
expectedAssignmentsInPlanning.add(user1Assignments.get(0));
expectedAssignmentsInPlanning.add(user1Assignments.get(2));
expectedAssignmentsInPlanning.add(user3Assignments.get(0));
expectedAssignmentsInPlanning.add(planningUserAssignments.get(1));
expectedAssignmentsInPlanning.add(planningUserAssignments.get(2));
expectedAssignmentsInPlanning.add(planningUserAssignments.get(3));
expectedAssignmentsInPlanning.add(planningUserAssignments.get(4));
assertItemsForAssignments(planningItems, expectedAssignmentsInPlanning);
}
use of org.kie.kogito.taskassigning.core.model.TaskAssigningSolution in project kogito-apps by kiegroup.
the class AddUserProblemFactChangeTest method setUp.
@BeforeEach
void setUp() {
user = new User(USER_ID);
workingSolution = new TaskAssigningSolution("1", new ArrayList<>(), new ArrayList<>());
change = new AddUserProblemFactChange(user);
}
use of org.kie.kogito.taskassigning.core.model.TaskAssigningSolution in project kogito-apps by kiegroup.
the class AssignTaskProblemFactChangeTest method setUp.
@BeforeEach
void setUp() {
solution = new TaskAssigningSolution("1", new ArrayList<>(), new ArrayList<>());
lenient().when(scoreDirector.getWorkingSolution()).thenReturn(solution);
}
use of org.kie.kogito.taskassigning.core.model.TaskAssigningSolution in project kogito-apps by kiegroup.
the class AbstractExecutableProblemFactChangeTest method executeSequentialChanges.
protected TaskAssigningSolution executeSequentialChanges(TaskAssigningSolution solution, List<? extends ProgrammedProblemFactChange> changes) {
Solver<TaskAssigningSolution> solver = createDaemonSolver();
// store the first solution that was produced by the solver for knowing how things looked like at the very
// beginning before any change was produced.
final TaskAssigningSolution[] initialSolution = { null };
final AtomicInteger lastExecutedChangeId = new AtomicInteger(-1);
final Semaphore programNextChange = new Semaphore(0);
final Semaphore allChangesWereProduced = new Semaphore(0);
// prepare the list of changes to program
List<ProgrammedProblemFactChange> programmedChanges = new ArrayList<>(changes);
List<ProgrammedProblemFactChange> scheduledChanges = new ArrayList<>();
int totalProgrammedChanges = programmedChanges.size();
int[] pendingChanges = { programmedChanges.size() };
solver.addEventListener(event -> {
if (initialSolution[0] == null) {
// store the first produced solution for knowing how things looked like at the very beginning.
initialSolution[0] = event.getNewBestSolution();
// let the problem fact changes start being produced.
programNextChange.release();
} else if (event.isEveryProblemFactChangeProcessed() && !scheduledChanges.isEmpty()) {
ProgrammedProblemFactChange programmedChange = scheduledChanges.get(scheduledChanges.size() - 1);
if (lastExecutedChangeId.compareAndSet(programmedChange.getId(), -1)) {
programmedChange.setSolutionAfterChange(event.getNewBestSolution());
if (pendingChanges[0] > 0) {
// let the Programmed changes producer produce next change
programNextChange.release();
} else {
solver.terminateEarly();
allChangesWereProduced.release();
}
}
}
});
// Programmed changes producer Thread.
CompletableFuture.runAsync(() -> {
boolean hasMoreChanges = true;
while (hasMoreChanges) {
try {
// wait until next problem fact change can be added to the solver.
// by construction the lock is only released when no problem fact change is in progress.
programNextChange.acquire();
ProgrammedProblemFactChange programmedChange = programmedChanges.remove(0);
hasMoreChanges = !programmedChanges.isEmpty();
pendingChanges[0] = programmedChanges.size();
scheduledChanges.add(programmedChange);
solver.addProblemFactChange(scoreDirector -> {
lastExecutedChangeId.set(programmedChange.getId());
programmedChange.getChange().doChange(scoreDirector);
});
} catch (InterruptedException e) {
LOGGER.error("It looks like the test Future was interrupted.", e);
}
}
try {
// wait until the solver listener has processed all the changes.
allChangesWereProduced.acquire();
} catch (InterruptedException e) {
LOGGER.error("It looks like the test Future was interrupted while waiting to finish.", e);
}
});
solver.solve(solution);
assertThat(programmedChanges.isEmpty()).isTrue();
assertThat(scheduledChanges.size()).isEqualTo(totalProgrammedChanges);
assertThat(pendingChanges[0]).isZero();
return initialSolution[0];
}
Aggregations