diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workingday/EffortDuration.java b/navalplanner-business/src/main/java/org/navalplanner/business/workingday/EffortDuration.java index e63797c76..21f5e3f2a 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workingday/EffortDuration.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workingday/EffortDuration.java @@ -20,6 +20,8 @@ package org.navalplanner.business.workingday; +import java.util.EnumMap; + import org.apache.commons.lang.Validate; public class EffortDuration { @@ -28,6 +30,10 @@ public class EffortDuration { public enum Granularity { HOURS(3600), MINUTES(60), SECONDS(1); + static Granularity[] fromMoreCoarseToLessCoarse() { + return Granularity.values(); + } + private final int secondsPerUnit; private Granularity(int secondsPerUnit) { @@ -104,4 +110,17 @@ public class EffortDuration { return getSeconds(); } + public EnumMap decompose() { + EnumMap result = new EnumMap( + Granularity.class); + int remainder = seconds; + for (Granularity each : Granularity.fromMoreCoarseToLessCoarse()) { + int value = each.convertFromSeconds(remainder); + remainder -= value * each.toSeconds(1); + result.put(each, value); + } + assert remainder == 0; + return result; + } + } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/workingday/EffortDurationTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/workingday/EffortDurationTest.java index fd0f37d02..8be1fc636 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/workingday/EffortDurationTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/workingday/EffortDurationTest.java @@ -26,6 +26,8 @@ import static org.junit.Assert.fail; import static org.navalplanner.business.workingday.EffortDuration.hours; import static org.navalplanner.business.workingday.EffortDuration.minutes; +import java.util.EnumMap; + import org.junit.Test; import org.navalplanner.business.workingday.EffortDuration; import org.navalplanner.business.workingday.EffortDuration.Granularity; @@ -93,4 +95,22 @@ public class EffortDurationTest { equalTo(ninetyMinutes.hashCode())); } + @Test + public void anEffortDurationCanBeDecomposedIntoElements() { + EffortDuration duration = hours(1).and(90, Granularity.MINUTES); + EnumMap values = duration.decompose(); + assertThat(values.get(Granularity.HOURS), equalTo(2)); + assertThat(values.get(Granularity.MINUTES), equalTo(30)); + assertThat(values.get(Granularity.SECONDS), equalTo(0)); + } + + @Test + public void anEmptyDurationHasZeroElements(){ + EffortDuration duration = EffortDuration.zero(); + EnumMap values = duration.decompose(); + assertThat(values.get(Granularity.HOURS), equalTo(0)); + assertThat(values.get(Granularity.MINUTES), equalTo(0)); + assertThat(values.get(Granularity.SECONDS), equalTo(0)); + } + }