blob: c8ff65064767dd6087e2c60181131ad2394242f3 [file] [log] [blame]
/*
******************************************************************************
* Copyright (C) 2007-2011, International Business Machines Corporation and *
* others. All Rights Reserved. *
******************************************************************************
*/
// Copyright 2007 Google Inc. All Rights Reserved.
package com.ibm.icu.dev.test.duration;
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.impl.duration.BasicPeriodFormatterService;
import com.ibm.icu.impl.duration.Period;
import com.ibm.icu.impl.duration.PeriodBuilder;
import com.ibm.icu.impl.duration.PeriodBuilderFactory;
import com.ibm.icu.impl.duration.TimeUnit;
import com.ibm.icu.impl.duration.TimeUnitConstants;
public class PeriodBuilderFactoryTest extends TestFmwk implements TimeUnitConstants {
private PeriodBuilderFactory pbf;
private static final long[] approxDurations = {
36525L*24*60*60*10, 3045*24*60*60*10L, 7*24*60*60*1000L, 24*60*60*1000L,
60*60*1000L, 60*1000L, 1000L, 1L
};
/**
* Invoke the tests.
*/
public static void main(String[] args) {
new PeriodBuilderFactoryTest().run(args);
}
public void testSetAvailableUnitRange() {
// sanity check, make sure by default all units are set
pbf = BasicPeriodFormatterService.getInstance().newPeriodBuilderFactory();
pbf.setLocale("en"); // in en locale, all units always available
PeriodBuilder b = pbf.getSingleUnitBuilder();
for (TimeUnit unit = YEAR; unit != null; unit = unit.smaller()) {
Period p = b.create((long)(approxDurations[unit.ordinal()]*2.5));
assertTrue(null, p.isSet(unit));
}
pbf.setAvailableUnitRange(MINUTE, MONTH);
// units that are not available are never set
b = pbf.getSingleUnitBuilder();
for (TimeUnit unit = YEAR; unit != null; unit = unit.smaller()) {
Period p = b.create((long)(approxDurations[unit.ordinal()]*2.5));
assertEquals(null, p.isSet(unit), unit.ordinal() >= MONTH.ordinal() && unit.ordinal() <= MINUTE.ordinal());
}
// fixed unit builder returns null when unit is not available
for (TimeUnit unit = YEAR; unit != null; unit = unit.smaller()) {
b = pbf.getFixedUnitBuilder(unit);
if (unit.ordinal() >= MONTH.ordinal() && unit.ordinal() <= MINUTE.ordinal()) {
assertNotNull(null, b);
} else {
assertNull(null, b);
}
}
// can't set empty range
try {
pbf.setAvailableUnitRange(MONTH, MINUTE);
fail("set empty range");
} catch (IllegalArgumentException e) {
// pass
}
}
public void testSetUnitIsAvailable() {
pbf = BasicPeriodFormatterService.getInstance().newPeriodBuilderFactory();
pbf.setAvailableUnitRange(MONTH, MONTH);
assertNotNull(null, pbf.getSingleUnitBuilder());
assertNotNull(null, pbf.getOneOrTwoUnitBuilder());
assertNotNull(null, pbf.getMultiUnitBuilder(2));
// now no units are available, make sure we can't generate a builder
pbf.setUnitIsAvailable(MONTH, false);
assertNull(null, pbf.getSingleUnitBuilder());
assertNull(null, pbf.getOneOrTwoUnitBuilder());
assertNull(null, pbf.getMultiUnitBuilder(2));
pbf.setUnitIsAvailable(DAY, true);
assertNotNull(null, pbf.getSingleUnitBuilder());
assertNotNull(null, pbf.getOneOrTwoUnitBuilder());
assertNotNull(null, pbf.getMultiUnitBuilder(2));
}
public void testBuilderFactoryPeriodConstruction() {
// see ticket #8307
pbf = BasicPeriodFormatterService.getInstance().newPeriodBuilderFactory();
pbf.setAvailableUnitRange(SECOND, DAY);
PeriodBuilder pb = pbf.getOneOrTwoUnitBuilder();
long H1M35S30M100 = 100 + 1000 * (30 + 35 * 60 + 1 * 60 * 60);
Period p = pb.create(H1M35S30M100);
assertEquals("hours", 1.0f, p.getCount(HOUR));
assertEquals("minutes", 35.501f, p.getCount(MINUTE));
assertFalse("seconds", p.isSet(SECOND));
pb = pbf.getMultiUnitBuilder(3);
p = pb.create(H1M35S30M100);
assertEquals("hours", 1.0f, p.getCount(HOUR));
assertEquals("minutes", 35f, p.getCount(MINUTE));
assertEquals("seconds", 30.1f, p.getCount(SECOND));
assertFalse("millis", p.isSet(MILLISECOND));
}
}