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 12 package com.ibm.icu.dev.test.duration; 13 14 import org.junit.Test; 15 import org.junit.runner.RunWith; 16 import org.junit.runners.JUnit4; 17 18 import com.ibm.icu.dev.test.TestFmwk; 19 import com.ibm.icu.impl.duration.BasicPeriodFormatterService; 20 import com.ibm.icu.impl.duration.Period; 21 import com.ibm.icu.impl.duration.PeriodBuilder; 22 import com.ibm.icu.impl.duration.PeriodBuilderFactory; 23 import com.ibm.icu.impl.duration.TimeUnit; 24 import com.ibm.icu.impl.duration.TimeUnitConstants; 25 26 @RunWith(JUnit4.class) 27 public 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