From 3652768a7228198cab789bb82c5f34af9ecb98b8 Mon Sep 17 00:00:00 2001 From: Travis Keep Date: Thu, 28 Mar 2013 22:51:46 +0000 Subject: [PATCH] ICU-10017 Add test to insure that TimePeriod.forAmounts() throws IllegalArgumentException when necessary. X-SVN-Rev: 33476 --- .../core/src/com/ibm/icu/util/TimePeriod.java | 18 ++++++++++++- .../ibm/icu/dev/test/format/TimeUnitTest.java | 25 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/TimePeriod.java b/icu4j/main/classes/core/src/com/ibm/icu/util/TimePeriod.java index 5bac6f6dc7b..55b8689a76d 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/util/TimePeriod.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/util/TimePeriod.java @@ -73,7 +73,23 @@ public final class TimePeriod implements Iterable { fields[index] = new TimeUnitAmount(tua.getNumber().doubleValue(), tua.getTimeUnit()); size++; } - return new TimePeriod(fields, size, computeHash(fields)); + if (size == 0) { + throw new IllegalArgumentException( + "There must be at least one TimeUnitAmount."); + } + TimePeriod result = new TimePeriod(fields, size, computeHash(fields)); + boolean fractionalFieldEncountered = false; + for (TimeUnitAmount tua : result) { + if (fractionalFieldEncountered) { + throw new IllegalArgumentException( + "Only the smallest time unit can have a fractional amount."); + } + double value = tua.getNumber().doubleValue(); + if (value != Math.floor(value)) { + fractionalFieldEncountered = true; + } + } + return result; } /** diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/TimeUnitTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/TimeUnitTest.java index 63bce453087..090b01a6ee1 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/TimeUnitTest.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/TimeUnitTest.java @@ -373,6 +373,31 @@ public class TimeUnitTest extends TestFmwk { verifyFormatPeriod("en NUMERIC", tuf, numericData); } + public void TestTimePeriodForAmounts() { + try { + TimePeriod.forAmounts( + new TimeUnitAmount(3.0, TimeUnit.HOUR), + new TimeUnitAmount(5.0, TimeUnit.HOUR)); + errln("Expected IllegalArgumentException on duplicate TimeUnits."); + } catch (IllegalArgumentException e) { + // expected + } + try { + TimePeriod.forAmounts(); + errln("Expected IllegalArgumentException on missing TimeUnitAmounts."); + } catch (IllegalArgumentException e) { + // expected + } + try { + TimePeriod.forAmounts( + new TimeUnitAmount(3.5, TimeUnit.HOUR), + new TimeUnitAmount(5.0, TimeUnit.MINUTE)); + errln("Expected IllegalArgumentException. Only smallest time unit can have a fractional amount."); + } catch (IllegalArgumentException e) { + // expected + } + } + private void verifyFormatPeriod(String desc, TimeUnitFormat tuf, Object[][] testData) { StringBuilder builder = new StringBuilder(); boolean failure = false; -- 2.40.0