From 597989de0640b03ad1f000a0d0e8b586fdeb9ec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Wed, 18 Aug 2010 17:42:42 +0200 Subject: [PATCH] Add method decomposing an EffortDuration into its elements FEA: ItEr60S19TimeUnitDataType --- .../business/workingday/EffortDuration.java | 19 ++++++++++++++++++ .../test/workingday/EffortDurationTest.java | 20 +++++++++++++++++++ 2 files changed, 39 insertions(+) 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)); + } + }