1/*
2******************************************************************************
3* Copyright (C) 2007-2011, International Business Machines Corporation and   *
4* others. All Rights Reserved.                                               *
5******************************************************************************
6*/
7
8// Copyright 2007 Google Inc.  All Rights Reserved.
9
10package com.ibm.icu.dev.test.duration;
11
12import com.ibm.icu.dev.test.TestFmwk;
13import com.ibm.icu.impl.duration.BasicPeriodFormatterService;
14import com.ibm.icu.impl.duration.Period;
15import com.ibm.icu.impl.duration.PeriodBuilder;
16import com.ibm.icu.impl.duration.PeriodBuilderFactory;
17import com.ibm.icu.impl.duration.TimeUnit;
18import com.ibm.icu.impl.duration.TimeUnitConstants;
19
20public class PeriodBuilderFactoryTest extends TestFmwk implements TimeUnitConstants {
21    private PeriodBuilderFactory pbf;
22
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
26    };
27
28    /**
29     * Invoke the tests.
30     */
31    public static void main(String[] args) {
32        new PeriodBuilderFactoryTest().run(args);
33    }
34
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));
43        }
44
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());
51        }
52
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);
58            } else {
59                assertNull(null, b);
60            }
61        }
62
63        // can't set empty range
64        try {
65            pbf.setAvailableUnitRange(MONTH, MINUTE);
66            fail("set empty range");
67        } catch (IllegalArgumentException e) {
68            // pass
69        }
70    }
71
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));
78
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));
84
85        pbf.setUnitIsAvailable(DAY, true);
86        assertNotNull(null, pbf.getSingleUnitBuilder());
87        assertNotNull(null, pbf.getOneOrTwoUnitBuilder());
88        assertNotNull(null, pbf.getMultiUnitBuilder(2));
89    }
90
91    public void testBuilderFactoryPeriodConstruction() {
92        // see ticket #8307
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));
101
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));
108    }
109}
110