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