From 08306eba0b589254594977f8e53784cf3fd79702 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 6 Sep 2010 13:04:22 +0200 Subject: [PATCH] Add method for rounding to hours FEA: ItEr60S19TimeUnitDataType --- .../business/workingday/EffortDuration.java | 35 +++++++++++++++++++ .../test/workingday/EffortDurationTest.java | 22 ++++++++++++ 2 files changed, 57 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 bcdd5441e..038c0235b 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 @@ -198,4 +198,39 @@ public class EffortDuration implements Comparable { return result; } + /** + *

+ * Converts this duration in a number of hours. Uses a typical half up + * round, so for example one hour and half is converted to two hours. There + * is an exception though, when the duration is less than one hour and is + * not zero it's returned one. This is handy for avoiding infinite loops in + * some algorithms; when all code is converted to use {@link EffortDuration + * Effort Durations} this will no longer be necessary. + *

+ * So there are three cases: + * + * + * @return an integer number of hours + */ + public int roundToHours() { + if (this.isZero()) { + return 0; + } + return Math.max(1, roundHalfUpToHours(this.decompose())); + } + + private static int roundHalfUpToHours( + EnumMap components) { + int seconds = components.get(Granularity.SECONDS); + int minutes = components.get(Granularity.MINUTES) + + (seconds < 30 ? 0 : 1); + int hours = components.get(Granularity.HOURS) + (minutes < 30 ? 0 : 1); + return hours; + } + } 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 e1fef0434..85bdb5859 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 @@ -188,4 +188,26 @@ public class EffortDurationTest { equalTo(new BigDecimal("1.0003"))); } + @Test + public void theDurationCanBeRoundedToIntegerHours() { + assertThat(hours(0).roundToHours(), equalTo(0)); + assertThat(hours(1).roundToHours(), equalTo(1)); + assertThat(hours(2).roundToHours(), equalTo(2)); + } + + @Test + public void theTypeOfRoundDoneIsHalfUpWhenTheHoursAreAtLeastOne() { + assertThat(hours(1).and(20, Granularity.MINUTES).roundToHours(), + equalTo(1)); + assertThat(hours(1).and(30, Granularity.MINUTES).roundToHours(), + equalTo(2)); + } + + @Test + public void ifDurationNotZeroIsAlwaysRoundedToAtLeastOne() { + assertThat(seconds(1).roundToHours(), equalTo(1)); + assertThat(minutes(29).roundToHours(), equalTo(1)); + assertThat(minutes(30).roundToHours(), equalTo(1)); + } + }