From dcee214251cc7b5c59ca37dda76243a1f507934c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 25 Jan 2010 00:55:11 +0100 Subject: [PATCH] ItEr44S16CUAsignacionRecursosEspecificosAPlanificacionItEr37S10: Not adding last interval with remaining load. Checking instead last strech has all the load accumulated. --- .../planner/entities/StretchesFunction.java | 18 +++---- .../entities/StretchesFunctionTest.java | 51 +++++++++---------- 2 files changed, 29 insertions(+), 40 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/StretchesFunction.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/StretchesFunction.java index 03e640cf0..ba1b4d823 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/StretchesFunction.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/StretchesFunction.java @@ -92,7 +92,7 @@ public class StretchesFunction extends AssignmentFunction { LocalDate end) { Validate.notNull(loadProportion); Validate.isTrue(loadProportion.signum() >= 0); - Validate.isTrue(start != null || end != null); + Validate.notNull(end); this.loadProportion = loadProportion.setScale(2, RoundingMode.HALF_UP); this.start = start; @@ -115,10 +115,6 @@ public class StretchesFunction extends AssignmentFunction { return start; } - public boolean hasNoEnd() { - return end == null; - } - public int getHoursFor(int totalHours) { return loadProportion.multiply(new BigDecimal(totalHours)) .intValue(); @@ -128,16 +124,12 @@ public class StretchesFunction extends AssignmentFunction { return hasNoStart() ? allocationStart : start; } - public LocalDate getEndFor(LocalDate allocationEnd) { - return hasNoEnd() ? allocationEnd : end; - } - private void apply(ResourceAllocation resourceAllocation, LocalDate startInclusive, LocalDate endExclusive, int intervalHours) { resourceAllocation.withPreviousAssociatedResources() .onInterval(getStartFor(startInclusive), - getEndFor(endExclusive)) + getEnd()) .allocateHours(intervalHours); } @@ -340,13 +332,15 @@ public class StretchesFunction extends AssignmentFunction { previous = strechDate; } BigDecimal left = calculateLeftFor(sumOfProportions); - result.add(new Interval(left, previous, null)); + if (!left.equals(BigDecimal.ZERO)) { + throw new IllegalStateException("the streches must sum the 100%"); + } return result; } private BigDecimal calculateLeftFor(BigDecimal sumOfProportions) { BigDecimal left = BigDecimal.ONE.subtract(sumOfProportions); - left = left.signum() < 0 ? BigDecimal.ZERO : left; + left = left.signum() <= 0 ? BigDecimal.ZERO : left; return left; } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/StretchesFunctionTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/StretchesFunctionTest.java index ffe1f6d81..9b3ff3684 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/StretchesFunctionTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/StretchesFunctionTest.java @@ -177,12 +177,19 @@ public class StretchesFunctionTest { assertTrue(stretchesFunction.getIntervalsDefinedByStreches().isEmpty()); } - @Test - public void oneStrechImpliesTwoIntervals() { + @Test(expected = IllegalStateException.class) + public void theLastStrechMustHaveAllTheLoad() { givenStretchesFunction(); - givenStretchAsChild(new LocalDate().plusMonths(1), new BigDecimal(0.5)); + givenStretchAsChild(new LocalDate().plusMonths(1), new BigDecimal(0.6)); + stretchesFunction.getIntervalsDefinedByStreches(); + } + + @Test + public void oneStrechImpliesOneInterval() { + givenStretchesFunction(); + givenStretchAsChild(new LocalDate().plusMonths(1), new BigDecimal(1)); assertThat(stretchesFunction.getIntervalsDefinedByStreches().size(), - equalTo(2)); + equalTo(1)); } @Test @@ -191,6 +198,7 @@ public class StretchesFunctionTest { LocalDate strechDate = new LocalDate().plusMonths(1); BigDecimal amountOfWorkProportion = new BigDecimal(0.5).setScale(2); givenStretchAsChild(strechDate, amountOfWorkProportion); + givenStretchAsChild(new LocalDate().plusMonths(2), new BigDecimal(1.0)); Interval firstInterval = stretchesFunction .getIntervalsDefinedByStreches().get(0); assertThat(firstInterval.getEnd(), equalTo(strechDate)); @@ -204,33 +212,35 @@ public class StretchesFunctionTest { givenStretchesFunction(); LocalDate strechDate = new LocalDate().plusMonths(1); givenStretchAsChild(strechDate, new BigDecimal(0.5)); + givenStretchAsChild(strechDate.plusDays(20), new BigDecimal(1)); Interval lastInterval = stretchesFunction .getIntervalsDefinedByStreches().get(1); assertThat(lastInterval.getStart(), equalTo(strechDate)); } @Test - public void aIntervalInTheMiddleHasStartAndEnd() { + public void aIntervalInTheMiddleHasStart() { givenStretchesFunction(); LocalDate start = new LocalDate().plusMonths(1); givenStretchAsChild(start, new BigDecimal(0.5)); LocalDate middleEnd = start.plusMonths(2); givenStretchAsChild(middleEnd, new BigDecimal(0.6)); + givenStretchAsChild(middleEnd.plusDays(10), new BigDecimal(1)); Interval middle = stretchesFunction.getIntervalsDefinedByStreches().get( 1); assertFalse(middle.hasNoStart()); - assertFalse(middle.hasNoEnd()); assertThat(middle.getStart(), equalTo(start)); assertThat(middle.getEnd(), equalTo(middleEnd)); } @Test - public void eachIntervalAccumulatesAllTheLoads() { + public void eachIntervalHasTheCorrespondingLoadForThatInterval() { givenStretchesFunction(); LocalDate start = new LocalDate().plusMonths(1); givenStretchAsChild(start, new BigDecimal(0.5)); LocalDate middleEnd = start.plusMonths(2); givenStretchAsChild(middleEnd, new BigDecimal(0.8)); + givenStretchAsChild(middleEnd.plusDays(10), new BigDecimal(1)); Interval first = stretchesFunction.getIntervalsDefinedByStreches().get( 0); Interval middle = stretchesFunction.getIntervalsDefinedByStreches() @@ -245,20 +255,6 @@ public class StretchesFunctionTest { .setScale(2, RoundingMode.HALF_EVEN))); } - @Test - public void theLastIntervalHasTheRemainingLoad() { - givenStretchesFunction(); - LocalDate start = new LocalDate().plusMonths(1); - givenStretchAsChild(start, new BigDecimal(0.3)); - givenStretchAsChild(start.plusMonths(2), new BigDecimal(0.5)); - givenStretchAsChild(start.plusMonths(3), new BigDecimal(0.7)); - Interval lastInterval = stretchesFunction - .getIntervalsDefinedByStreches().get(3); - BigDecimal expectedRemaining = new BigDecimal(0.3).setScale(2, - RoundingMode.HALF_UP); - assertThat(lastInterval.getLoadProportion(), equalTo(expectedRemaining)); - } - @Test public void ifTheIntervalStartIsNullReturnsThePassedStartDate() { LocalDate end = new LocalDate().plusMonths(1); @@ -267,18 +263,17 @@ public class StretchesFunctionTest { assertThat(interval.getStartFor(now), equalTo(now)); } - @Test - public void ifTheIntervalEndIsNullReturnsThePassedStartDate() { + @Test(expected = IllegalArgumentException.class) + public void endDateCannotBeNull() { LocalDate start = new LocalDate().plusMonths(1); - Interval interval = new Interval(new BigDecimal(0.3), start, null); - LocalDate now = new LocalDate(); - assertThat(interval.getEndFor(now), equalTo(now)); + new Interval(new BigDecimal(0.3), start, null); } @Test public void ifTheIntervalStartIsNotNullReturnsItsStartDate() { LocalDate start = new LocalDate().plusMonths(1); - Interval interval = new Interval(new BigDecimal(0.3), start, null); + Interval interval = new Interval(new BigDecimal(0.3), start, start + .plusDays(20)); assertThat(interval.getStartFor(new LocalDate()), equalTo(start)); } @@ -287,7 +282,7 @@ public class StretchesFunctionTest { LocalDate start = new LocalDate().plusMonths(1); LocalDate end = new LocalDate().plusMonths(2); Interval interval = new Interval(new BigDecimal(0.3), start, end); - assertThat(interval.getEndFor(new LocalDate()), equalTo(end)); + assertThat(interval.getEnd(), equalTo(end)); } }