package net.sourceforge.ganttproject.test.task.dependency; import biz.ganttproject.core.time.CalendarFactory; import biz.ganttproject.core.time.TimeDuration; import biz.ganttproject.core.time.impl.GregorianTimeUnitStack; import net.sourceforge.ganttproject.test.task.TaskTestCase; import net.sourceforge.ganttproject.task.TaskManager; import net.sourceforge.ganttproject.task.Task; import net.sourceforge.ganttproject.task.dependency.TaskDependencyConstraint; import net.sourceforge.ganttproject.task.dependency.TaskDependency; import net.sourceforge.ganttproject.task.dependency.constraint.FinishStartConstraintImpl; /** * Created by IntelliJ IDEA. User: bard */ public class TestRecalculateTaskScheduleAlgorithm extends TaskTestCase { public void testFinishStartDependenciesOnMovingEndDateForward() throws Exception { TaskManager taskManager = getTaskManager(); Task task1 = taskManager.createTask(); task1.setStart(CalendarFactory.createGanttCalendar(2000, 01, 01)); task1.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 1)); Task task2 = taskManager.createTask(); task2.setStart(CalendarFactory.createGanttCalendar(2000, 01, 02)); task2.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 1)); Task task3 = taskManager.createTask(); task3.setStart(CalendarFactory.createGanttCalendar(2000, 01, 03)); task3.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 1)); // System.err.println("task3 end="+task3.getEnd()); taskManager.getDependencyCollection().createDependency(task3, task2, new FinishStartConstraintImpl()); taskManager.getDependencyCollection().createDependency(task2, task1, new FinishStartConstraintImpl()); task1.setEnd(CalendarFactory.createGanttCalendar(2000, 01, 03)); taskManager.getAlgorithmCollection().getScheduler().run(); assertEquals("Unexpected value of end of task=" + task3, CalendarFactory.createGanttCalendar(2000, 01, 05), task3.getEnd()); } public void testFinishStartConstraintOnMovingEndDateBackward() throws Exception { TaskManager taskManager = getTaskManager(); Task task1 = taskManager.createTask(); task1.setStart(CalendarFactory.createGanttCalendar(2000, 01, 01)); task1.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 3)); Task task2 = taskManager.createTask(); task2.setStart(CalendarFactory.createGanttCalendar(2000, 01, 01)); task2.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 2)); Task task3 = taskManager.createTask(); task3.setStart(CalendarFactory.createGanttCalendar(2000, 01, 04)); task3.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 1)); taskManager.getDependencyCollection().createDependency(task3, task1, new FinishStartConstraintImpl()); taskManager.getDependencyCollection().createDependency(task3, task2, new FinishStartConstraintImpl()); // Now the task schedule is the following: // task1 xxx // task3 x // task2 xx // Decrease length of task1 task1.setEnd(CalendarFactory.createGanttCalendar(2000, 01, 03)); // And expect: // task1 xx // task3 x // task2 xx taskManager.getAlgorithmCollection().getScheduler().run(); assertEquals("Unexpected value of start of task=" + task3, CalendarFactory.createGanttCalendar(2000, 01, 03), task3.getStart()); // Decrease length of task1 again task1.setEnd(CalendarFactory.createGanttCalendar(2000, 01, 02)); // Now we expect: // task1 x // task3 x // task2 xx // because task3 also depends on task2 with "finish-start" constraint taskManager.getAlgorithmCollection().getScheduler().run(); assertEquals("Unexpected value of start of task=" + task3, CalendarFactory.createGanttCalendar(2000, 01, 03), task3.getStart()); } public void testFinishFinishConstraintOnMovingEndDateForward() throws Exception { TaskManager taskManager = getTaskManager(); Task task1 = taskManager.createTask(); task1.setStart((CalendarFactory.createGanttCalendar(2000, 01, 01))); task1.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 1)); Task task2 = taskManager.createTask(); task2.setStart((CalendarFactory.createGanttCalendar(2000, 01, 01))); task2.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 3)); // Now we have: // task1 x // task2 xxx // Create dependency task2->task1 with "finish-finish" constraint. // This means that task2 can't finish earlier than task1 finishes TaskDependency dep = taskManager .getDependencyCollection() .createDependency(task2, task1, new FinishStartConstraintImpl()); dep.setConstraint(taskManager.createConstraint(TaskDependencyConstraint.Type.finishfinish)); // Increase the length of task1. task1.setEnd(CalendarFactory.createGanttCalendar(2000, 01, 05)); taskManager.getAlgorithmCollection().getScheduler().run(); // We expect that task2 will be shifted forward in time: // task1 xxxxx // task2 xxx assertEquals("Unexpected end of task=" + task2, CalendarFactory.createGanttCalendar(2000, 01, 05), task2.getEnd()); } public void testStartStartConstraintOnMovingStartDateForward() throws Exception { TaskManager taskManager = getTaskManager(); Task task1 = taskManager.createTask(); task1.setStart((CalendarFactory.createGanttCalendar(2000, 01, 01))); task1.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 3)); Task task2 = taskManager.createTask(); task2.setStart((CalendarFactory.createGanttCalendar(2000, 01, 02))); task2.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 1)); // Now we have: // task1 xxx____ // task2 _x_____ // Create dependency task2->task1 with "start-start" constraint. // This means that task2 can't start earlier than task1 starts TaskDependency dep = taskManager .getDependencyCollection() .createDependency(task2, task1, new FinishStartConstraintImpl()); dep.setConstraint(taskManager.createConstraint(TaskDependencyConstraint.Type.startstart)); // Shift task1 forward in time. TimeDuration task1Duration = task1.getDuration(); task1.setStart(CalendarFactory.createGanttCalendar(2000, 01, 04)); task1.setDuration(task1Duration); taskManager.getAlgorithmCollection().getScheduler().run(); // We expect that task2 will also be shifted forward in time: // task1 ___xxx___ // task2 ___x_____ assertEquals("Unexpected start of task=" + task2, CalendarFactory.createGanttCalendar(2000, 01, 04), task2.getStart()); } public void testStartFinishConstraintOnMovingStartDateForward() throws Exception { TaskManager taskManager = getTaskManager(); Task task1 = taskManager.createTask(); task1.setStart((CalendarFactory.createGanttCalendar(2000, 01, 01))); task1.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 3)); // Task task2 = taskManager.createTask(); task2.setStart((CalendarFactory.createGanttCalendar(2000, 01, 01))); task2.setDuration(taskManager.createLength(GregorianTimeUnitStack.DAY, 2)); // // now we have: // task1 xxx____ // task2 xx_____ // // create dependency task2->task1 with "start-finish" constraint. It // means that // task2 can't finish earlier than task1 starts TaskDependency dep = taskManager .getDependencyCollection() .createDependency(task2, task1, new FinishStartConstraintImpl()); dep.setConstraint(taskManager.createConstraint(TaskDependencyConstraint.Type.startfinish)); // // shift task1 forward. We expect that task2 will also be shifted // forward // // task1 ___xxx___ // task2 _xx______ TimeDuration task1Duration = task1.getDuration(); task1.setStart(CalendarFactory.createGanttCalendar(2000, 01, 04)); task1.setDuration(task1Duration); // taskManager.getAlgorithmCollection().getScheduler().run(); assertEquals("Unexpected end of task=" + task2, CalendarFactory.createGanttCalendar(2000, 01, 04), task2.getEnd()); } }