1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html#License
3/*
4******************************************************************************
5* Copyright (C) 2007-2011, International Business Machines Corporation and   *
6* others. All Rights Reserved.                                               *
7******************************************************************************
8*/
9
10// Copyright 2007 Google Inc.  All Rights Reserved.
11
12package com.ibm.icu.dev.test.duration;
13
14import org.junit.Test;
15import org.junit.runner.RunWith;
16import org.junit.runners.JUnit4;
17
18import com.ibm.icu.dev.test.TestFmwk;
19import com.ibm.icu.impl.duration.BasicPeriodFormatterService;
20import com.ibm.icu.impl.duration.Period;
21import com.ibm.icu.impl.duration.PeriodBuilder;
22import com.ibm.icu.impl.duration.PeriodBuilderFactory;
23import com.ibm.icu.impl.duration.TimeUnit;
24import com.ibm.icu.impl.duration.TimeUnitConstants;
25
26@RunWith(JUnit4.class)
27public class PeriodBuilderFactoryTest extends TestFmwk implements TimeUnitConstants {
28    private PeriodBuilderFactory pbf;
29
30    private static final long[] approxDurations = {
31      36525L*24*60*60*10, 3045*24*60*60*10L, 7*24*60*60*1000L, 24*60*60*1000L,
32      60*60*1000L, 60*1000L, 1000L, 1L
33    };
34
35    @Test
36    public void testSetAvailableUnitRange() {
37        // sanity check, make sure by default all units are set
38        pbf = BasicPeriodFormatterService.getInstance().newPeriodBuilderFactory();
39        pbf.setLocale("en"); // in en locale, all units always available
40        PeriodBuilder b = pbf.getSingleUnitBuilder();
41        for (TimeUnit unit = YEAR; unit != null; unit = unit.smaller()) {
42            Period p = b.create((long)(approxDurations[unit.ordinal()]*2.5));
43            assertTrue(null, p.isSet(unit));
44        }
45
46        pbf.setAvailableUnitRange(MINUTE, MONTH);
47        // units that are not available are never set
48        b = pbf.getSingleUnitBuilder();
49        for (TimeUnit unit = YEAR; unit != null; unit = unit.smaller()) {
50            Period p = b.create((long)(approxDurations[unit.ordinal()]*2.5));
51            assertEquals(null, p.isSet(unit), unit.ordinal() >= MONTH.ordinal() && unit.ordinal() <= MINUTE.ordinal());
52        }
53
54        // fixed unit builder returns null when unit is not available
55        for (TimeUnit unit = YEAR; unit != null; unit = unit.smaller()) {
56            b = pbf.getFixedUnitBuilder(unit);
57            if (unit.ordinal() >= MONTH.ordinal() && unit.ordinal() <= MINUTE.ordinal()) {
58                assertNotNull(null, b);
59            } else {
60                assertNull(null, b);
61            }
62        }
63
64        // can't set empty range
65        try {
66            pbf.setAvailableUnitRange(MONTH, MINUTE);
67            fail("set empty range");
68        } catch (IllegalArgumentException e) {
69            // pass
70        }
71    }
72
73    @Test
74    public void testSetUnitIsAvailable() {
75        pbf = BasicPeriodFormatterService.getInstance().newPeriodBuilderFactory();
76        pbf.setAvailableUnitRange(MONTH, MONTH);
77        assertNotNull(null, pbf.getSingleUnitBuilder());
78        assertNotNull(null, pbf.getOneOrTwoUnitBuilder());
79        assertNotNull(null, pbf.getMultiUnitBuilder(2));
80
81        // now no units are available, make sure we can't generate a builder
82        pbf.setUnitIsAvailable(MONTH, false);
83        assertNull(null, pbf.getSingleUnitBuilder());
84        assertNull(null, pbf.getOneOrTwoUnitBuilder());
85        assertNull(null, pbf.getMultiUnitBuilder(2));
86
87        pbf.setUnitIsAvailable(DAY, true);
88        assertNotNull(null, pbf.getSingleUnitBuilder());
89        assertNotNull(null, pbf.getOneOrTwoUnitBuilder());
90        assertNotNull(null, pbf.getMultiUnitBuilder(2));
91    }
92
93    @Test
94    public void testBuilderFactoryPeriodConstruction() {
95        // see ticket #8307
96        pbf = BasicPeriodFormatterService.getInstance().newPeriodBuilderFactory();
97        pbf.setAvailableUnitRange(SECOND, DAY);
98        PeriodBuilder pb = pbf.getOneOrTwoUnitBuilder();
99        long H1M35S30M100 = 100 + 1000 * (30 + 35 * 60 + 1 * 60 * 60);
100        Period p = pb.create(H1M35S30M100);
101        assertEquals("hours", 1.0f, p.getCount(HOUR));
102        assertEquals("minutes", 35.501f, p.getCount(MINUTE));
103        assertFalse("seconds", p.isSet(SECOND));
104
105        pb = pbf.getMultiUnitBuilder(3);
106        p = pb.create(H1M35S30M100);
107        assertEquals("hours", 1.0f, p.getCount(HOUR));
108        assertEquals("minutes", 35f, p.getCount(MINUTE));
109        assertEquals("seconds", 30.1f, p.getCount(SECOND));
110        assertFalse("millis", p.isSet(MILLISECOND));
111    }
112}
113