2 ******************************************************************************
3 * Copyright (C) 2007-2011, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 ******************************************************************************
8 // Copyright 2007 Google Inc. All Rights Reserved.
10 package com.ibm.icu.dev.test.duration;
12 import com.ibm.icu.dev.test.TestFmwk;
13 import com.ibm.icu.impl.duration.BasicPeriodFormatterService;
14 import com.ibm.icu.impl.duration.Period;
15 import com.ibm.icu.impl.duration.PeriodBuilder;
16 import com.ibm.icu.impl.duration.PeriodBuilderFactory;
17 import com.ibm.icu.impl.duration.TimeUnit;
18 import com.ibm.icu.impl.duration.TimeUnitConstants;
20 public class PeriodBuilderFactoryTest extends TestFmwk implements TimeUnitConstants {
21 private PeriodBuilderFactory pbf;
23 private static final long[] approxDurations = {
24 36525L*24*60*60*10, 3045*24*60*60*10L, 7*24*60*60*1000L, 24*60*60*1000L,
25 60*60*1000L, 60*1000L, 1000L, 1L
31 public static void main(String[] args) {
32 new PeriodBuilderFactoryTest().run(args);
35 public void testSetAvailableUnitRange() {
36 // sanity check, make sure by default all units are set
37 pbf = BasicPeriodFormatterService.getInstance().newPeriodBuilderFactory();
38 pbf.setLocale("en"); // in en locale, all units always available
39 PeriodBuilder b = pbf.getSingleUnitBuilder();
40 for (TimeUnit unit = YEAR; unit != null; unit = unit.smaller()) {
41 Period p = b.create((long)(approxDurations[unit.ordinal()]*2.5));
42 assertTrue(null, p.isSet(unit));
45 pbf.setAvailableUnitRange(MINUTE, MONTH);
46 // units that are not available are never set
47 b = pbf.getSingleUnitBuilder();
48 for (TimeUnit unit = YEAR; unit != null; unit = unit.smaller()) {
49 Period p = b.create((long)(approxDurations[unit.ordinal()]*2.5));
50 assertEquals(null, p.isSet(unit), unit.ordinal() >= MONTH.ordinal() && unit.ordinal() <= MINUTE.ordinal());
53 // fixed unit builder returns null when unit is not available
54 for (TimeUnit unit = YEAR; unit != null; unit = unit.smaller()) {
55 b = pbf.getFixedUnitBuilder(unit);
56 if (unit.ordinal() >= MONTH.ordinal() && unit.ordinal() <= MINUTE.ordinal()) {
57 assertNotNull(null, b);
63 // can't set empty range
65 pbf.setAvailableUnitRange(MONTH, MINUTE);
66 fail("set empty range");
67 } catch (IllegalArgumentException e) {
72 public void testSetUnitIsAvailable() {
73 pbf = BasicPeriodFormatterService.getInstance().newPeriodBuilderFactory();
74 pbf.setAvailableUnitRange(MONTH, MONTH);
75 assertNotNull(null, pbf.getSingleUnitBuilder());
76 assertNotNull(null, pbf.getOneOrTwoUnitBuilder());
77 assertNotNull(null, pbf.getMultiUnitBuilder(2));
79 // now no units are available, make sure we can't generate a builder
80 pbf.setUnitIsAvailable(MONTH, false);
81 assertNull(null, pbf.getSingleUnitBuilder());
82 assertNull(null, pbf.getOneOrTwoUnitBuilder());
83 assertNull(null, pbf.getMultiUnitBuilder(2));
85 pbf.setUnitIsAvailable(DAY, true);
86 assertNotNull(null, pbf.getSingleUnitBuilder());
87 assertNotNull(null, pbf.getOneOrTwoUnitBuilder());
88 assertNotNull(null, pbf.getMultiUnitBuilder(2));
91 public void testBuilderFactoryPeriodConstruction() {
93 pbf = BasicPeriodFormatterService.getInstance().newPeriodBuilderFactory();
94 pbf.setAvailableUnitRange(SECOND, DAY);
95 PeriodBuilder pb = pbf.getOneOrTwoUnitBuilder();
96 long H1M35S30M100 = 100 + 1000 * (30 + 35 * 60 + 1 * 60 * 60);
97 Period p = pb.create(H1M35S30M100);
98 assertEquals("hours", 1.0f, p.getCount(HOUR));
99 assertEquals("minutes", 35.501f, p.getCount(MINUTE));
100 assertFalse("seconds", p.isSet(SECOND));
102 pb = pbf.getMultiUnitBuilder(3);
103 p = pb.create(H1M35S30M100);
104 assertEquals("hours", 1.0f, p.getCount(HOUR));
105 assertEquals("minutes", 35f, p.getCount(MINUTE));
106 assertEquals("seconds", 30.1f, p.getCount(SECOND));
107 assertFalse("millis", p.isSet(MILLISECOND));