Home | History | Annotate | Download | only in duration
      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