From f7f0ac62500f8445e55265146d07709ba98b9c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Thu, 12 Nov 2009 17:12:09 +0100 Subject: [PATCH] ItEr34S12CUCreacionUnidadesPlanificacionItEr33S14: Adding support for unscheduling --- .../orders/entities/SchedulingState.java | 24 +++++++ .../orders/entities/SchedulingStateTest.java | 72 +++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/SchedulingState.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/SchedulingState.java index 5a9def7cd..1171f21b2 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/SchedulingState.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/SchedulingState.java @@ -185,6 +185,30 @@ public class SchedulingState { } } + public boolean canBeUnscheduled() { + return getType() == Type.SCHEDULING_POINT; + } + + public void unschedule() { + if (!canBeUnscheduled()) { + throw new IllegalStateException("it can't be unscheduled"); + } + setType(Type.NO_SCHEDULED); + markDescendantsAsNoScheduled(); + } + + private void markDescendantsAsNoScheduled() { + for (SchedulingState each : children) { + each.ancestorUnscheduled(); + each.markDescendantsAsNoScheduled(); + } + } + + private void ancestorUnscheduled() { + Validate.isTrue(type == Type.SCHEDULED_SUBELEMENT); + setType(Type.NO_SCHEDULED); + } + private void setType(Type type) { if (this.type == type) { return; diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/SchedulingStateTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/SchedulingStateTest.java index c64853c68..7da71ae89 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/SchedulingStateTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/SchedulingStateTest.java @@ -242,6 +242,63 @@ public class SchedulingStateTest { assertThat(childB.getParent(), nullValue()); } + @Test + public void aNotScheduledElementCantBeUnScheduled(){ + assertFalse(root.canBeUnscheduled()); + } + + @Test + public void aCompletelyScheduledElementCanBeUnScheduled() { + root.schedule(); + assertTrue(root.canBeUnscheduled()); + } + + @Test + public void callingUnscheduleIfYouCantScheduleThrowsException() { + for (SchedulingState each : all()) { + try { + each.unschedule(); + fail("unscheduling " + each + " must send exception"); + } catch (IllegalStateException e) { + // ok + } + } + } + + @Test + public void scheduledSubelementsCantBeUnScheduled() { + root.schedule(); + assertThat(allRootDescendants(), each(not(canBeUnsheduled()))); + } + + @Test + public void afterUnschedulingAllDescendantsAreNoScheduled() { + root.schedule(); + root.unschedule(); + assertThat(allRootDescendants(), each(hasType(Type.NO_SCHEDULED))); + } + + @Test + public void afterUnSchedulingItsNotScheduled() { + root.schedule(); + root.unschedule(); + assertThat(root, hasType(Type.NO_SCHEDULED)); + } + + @Test + public void theChangeOfTypeIsNotified() { + root.schedule(); + final boolean[] typeChanged = { false }; + childA.addTypeChangeListener(new ITypeChangedListener() { + @Override + public void typeChanged(Type newType) { + typeChanged[0] = true; + } + }); + root.unschedule(); + assertTrue(typeChanged[0]); + } + abstract static class SchedulingStateMatcher extends BaseMatcher { @Override @@ -303,4 +360,19 @@ public class SchedulingStateTest { }; } + private Matcher canBeUnsheduled() { + return new SchedulingStateMatcher() { + + @Override + protected boolean matches(SchedulingState schedulingState) { + return schedulingState.canBeUnscheduled(); + } + + @Override + public void describeTo(Description description) { + description.appendText("cannot be scheduled"); + } + }; + } + }