test/java/time/tck/java/time/chrono/TCKChronology.java

Print this page




  47  *
  48  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  49  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  50  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  51  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  52  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  53  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  54  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  55  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  56  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  57  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  58  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  59  */
  60 package tck.java.time.chrono;
  61 
  62 import static org.testng.Assert.assertEquals;
  63 import static org.testng.Assert.assertNotNull;
  64 import static org.testng.Assert.assertSame;
  65 import static org.testng.Assert.assertTrue;
  66 

  67 import java.io.ByteArrayInputStream;
  68 import java.io.ByteArrayOutputStream;
  69 import java.io.ObjectInputStream;
  70 import java.io.ObjectOutputStream;


  71 import java.time.DateTimeException;
  72 import java.time.chrono.ChronoLocalDate;
  73 import java.time.chrono.Chronology;
  74 import java.time.chrono.HijrahChronology;

  75 import java.time.chrono.IsoChronology;

  76 import java.time.chrono.JapaneseChronology;

  77 import java.time.chrono.MinguoChronology;

  78 import java.time.chrono.ThaiBuddhistChronology;


  79 import java.time.temporal.ChronoField;
  80 import java.util.Locale;
  81 import java.util.Set;
  82 
  83 import org.testng.annotations.DataProvider;
  84 import org.testng.annotations.Test;
  85 
  86 /**
  87  * Test Chronology class.
  88  */
  89 @Test
  90 public class TCKChronology {
  91 
  92     //-----------------------------------------------------------------------
  93     // regular data factory for ID and calendarType of available calendars
  94     //-----------------------------------------------------------------------
  95     @DataProvider(name = "calendarNameAndType")
  96     Object[][] data_of_calendars() {
  97         return new Object[][] {
  98                     {"Hijrah-umalqura", "islamic-umalqura"},


 116         Chronology chrono = Chronology.of(chronoId);
 117         assertNotNull(chrono, "Required calendar not found by ID: " + chronoId);
 118         chrono = Chronology.of(calendarSystemType);
 119         assertNotNull(chrono, "Required calendar not found by type: " + chronoId);
 120         Set<Chronology> cals = Chronology.getAvailableChronologies();
 121         assertTrue(cals.contains(chrono), "Required calendar not found in set of available calendars");
 122     }
 123 
 124     @Test
 125     public void test_calendar_list() {
 126         Set<Chronology> chronos = Chronology.getAvailableChronologies();
 127         assertNotNull(chronos, "Required list of calendars must be non-null");
 128         for (Chronology chrono : chronos) {
 129             Chronology lookup = Chronology.of(chrono.getId());
 130             assertNotNull(lookup, "Required calendar not found: " + chrono);
 131         }
 132         assertEquals(chronos.size() >= data_of_calendars().length, true, "Chronology.getAvailableChronologies().size = " + chronos.size()
 133                 + ", expected >= " + data_of_calendars().length);
 134     }
 135 




















 136     /**
 137      * Compute the number of days from the Epoch and compute the date from the number of days.
 138      */
 139     @Test(dataProvider = "calendarNameAndType")
 140     public void test_epoch(String name, String alias) {
 141         Chronology chrono = Chronology.of(name); // a chronology. In practice this is rarely hardcoded
 142         ChronoLocalDate<?> date1 = chrono.dateNow();
 143         long epoch1 = date1.getLong(ChronoField.EPOCH_DAY);
 144         ChronoLocalDate<?> date2 = date1.with(ChronoField.EPOCH_DAY, epoch1);
 145         assertEquals(date1, date2, "Date from epoch day is not same date: " + date1 + " != " + date2);
 146         long epoch2 = date1.getLong(ChronoField.EPOCH_DAY);
 147         assertEquals(epoch1, epoch2, "Epoch day not the same: " + epoch1 + " != " + epoch2);
 148     }
 149 
 150     @Test(dataProvider = "calendarNameAndType")
 151     public void test_dateEpochDay(String name, String alias) {
 152         Chronology chrono = Chronology.of(name);
 153         ChronoLocalDate<?> date = chrono.dateNow();
 154         long epochDay = date.getLong(ChronoField.EPOCH_DAY);
 155         ChronoLocalDate<?> test = chrono.dateEpochDay(epochDay);
 156         assertEquals(test, date);
 157     }
 158 
 159     //-----------------------------------------------------------------------
 160     // locale based lookup
 161     //-----------------------------------------------------------------------
 162     @DataProvider(name = "calendarsystemtype")
 163     Object[][] data_CalendarType() {
 164         return new Object[][] {
 165             {HijrahChronology.INSTANCE, "islamic-umalqura"},
 166             {IsoChronology.INSTANCE, "iso8601"},
 167             {JapaneseChronology.INSTANCE, "japanese"},
 168             {MinguoChronology.INSTANCE, "roc"},
 169             {ThaiBuddhistChronology.INSTANCE, "buddhist"},
 170         };
 171     }
 172 
 173     @Test(dataProvider = "calendarsystemtype")
 174     public void test_getCalendarType(Chronology chrono, String calendarType) {
 175         String type = calendarType;
 176         assertEquals(chrono.getCalendarType(), type);
 177     }
 178 
 179     @Test(dataProvider = "calendarsystemtype")
 180     public void test_lookupLocale(Chronology chrono, String calendarType) {
 181         Locale.Builder builder = new Locale.Builder().setLanguage("en").setRegion("CA");
 182         builder.setUnicodeLocaleKeyword("ca", calendarType);
 183         Locale locale = builder.build();
 184         assertEquals(Chronology.ofLocale(locale), chrono);
 185     }
 186 































































































 187     /**
 188      * Test lookup by calendarType of each chronology.
 189      * Verify that the calendar can be found by {@link java.time.chrono.Chronology#ofLocale}.
 190      */
 191     @Test
 192     public void test_ofLocaleByType() {
 193         // Test that all available chronologies can be successfully found using ofLocale
 194         Set<Chronology> chronos = Chronology.getAvailableChronologies();
 195         for (Chronology chrono : chronos) {
 196             Locale.Builder builder = new Locale.Builder().setLanguage("en").setRegion("CA");
 197             builder.setUnicodeLocaleKeyword("ca", chrono.getCalendarType());
 198             Locale locale = builder.build();
 199             assertEquals(Chronology.ofLocale(locale), chrono, "Lookup by type");
 200         }
 201     }
 202 
 203     @Test(expectedExceptions=DateTimeException.class)
 204     public void test_lookupLocale() {
 205         Locale.Builder builder = new Locale.Builder().setLanguage("en").setRegion("CA");
 206         builder.setUnicodeLocaleKeyword("ca", "xxx");




  47  *
  48  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  49  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  50  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  51  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  52  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  53  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  54  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  55  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  56  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  57  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  58  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  59  */
  60 package tck.java.time.chrono;
  61 
  62 import static org.testng.Assert.assertEquals;
  63 import static org.testng.Assert.assertNotNull;
  64 import static org.testng.Assert.assertSame;
  65 import static org.testng.Assert.assertTrue;
  66 
  67 import java.util.Locale;
  68 import java.io.ByteArrayInputStream;
  69 import java.io.ByteArrayOutputStream;
  70 import java.io.ObjectInputStream;
  71 import java.io.ObjectOutputStream;
  72 import java.time.ZoneId;
  73 import java.time.Clock;
  74 import java.time.DateTimeException;
  75 import java.time.chrono.ChronoLocalDate;
  76 import java.time.chrono.Chronology;
  77 import java.time.chrono.HijrahChronology;
  78 import java.time.chrono.HijrahEra;
  79 import java.time.chrono.IsoChronology;
  80 import java.time.chrono.IsoEra;
  81 import java.time.chrono.JapaneseChronology;
  82 import java.time.chrono.JapaneseEra;
  83 import java.time.chrono.MinguoChronology;
  84 import java.time.chrono.MinguoEra;
  85 import java.time.chrono.ThaiBuddhistChronology;
  86 import java.time.chrono.ThaiBuddhistEra;
  87 import java.time.format.TextStyle;
  88 import java.time.temporal.ChronoField;
  89 import java.util.Locale;
  90 import java.util.Set;
  91 
  92 import org.testng.annotations.DataProvider;
  93 import org.testng.annotations.Test;
  94 
  95 /**
  96  * Test Chronology class.
  97  */
  98 @Test
  99 public class TCKChronology {
 100 
 101     //-----------------------------------------------------------------------
 102     // regular data factory for ID and calendarType of available calendars
 103     //-----------------------------------------------------------------------
 104     @DataProvider(name = "calendarNameAndType")
 105     Object[][] data_of_calendars() {
 106         return new Object[][] {
 107                     {"Hijrah-umalqura", "islamic-umalqura"},


 125         Chronology chrono = Chronology.of(chronoId);
 126         assertNotNull(chrono, "Required calendar not found by ID: " + chronoId);
 127         chrono = Chronology.of(calendarSystemType);
 128         assertNotNull(chrono, "Required calendar not found by type: " + chronoId);
 129         Set<Chronology> cals = Chronology.getAvailableChronologies();
 130         assertTrue(cals.contains(chrono), "Required calendar not found in set of available calendars");
 131     }
 132 
 133     @Test
 134     public void test_calendar_list() {
 135         Set<Chronology> chronos = Chronology.getAvailableChronologies();
 136         assertNotNull(chronos, "Required list of calendars must be non-null");
 137         for (Chronology chrono : chronos) {
 138             Chronology lookup = Chronology.of(chrono.getId());
 139             assertNotNull(lookup, "Required calendar not found: " + chrono);
 140         }
 141         assertEquals(chronos.size() >= data_of_calendars().length, true, "Chronology.getAvailableChronologies().size = " + chronos.size()
 142                 + ", expected >= " + data_of_calendars().length);
 143     }
 144 
 145     //-----------------------------------------------------------------------
 146     // getDisplayName()
 147     //-----------------------------------------------------------------------
 148     @DataProvider(name = "calendarDisplayName")
 149     Object[][] data_of_calendarDisplayNames() {
 150         return new Object[][] {
 151                     {"Hijrah", "Hijrah-umalqura"},
 152                     {"ISO", "ISO"},
 153                     {"Japanese", "Japanese Calendar"},
 154                     {"Minguo", "Minguo Calendar"},
 155                     {"ThaiBuddhist", "Buddhist Calendar"},
 156                 };
 157     }
 158 
 159     @Test(dataProvider = "calendarDisplayName")
 160     public void test_getDisplayName(String chronoId, String calendarDisplayName) {
 161         Chronology chrono = Chronology.of(chronoId);
 162         assertEquals(chrono.getDisplayName(TextStyle.FULL, Locale.ENGLISH), calendarDisplayName);
 163     }
 164 
 165     /**
 166      * Compute the number of days from the Epoch and compute the date from the number of days.
 167      */
 168     @Test(dataProvider = "calendarNameAndType")
 169     public void test_epoch(String name, String alias) {
 170         Chronology chrono = Chronology.of(name); // a chronology. In practice this is rarely hardcoded
 171         ChronoLocalDate date1 = chrono.dateNow();
 172         long epoch1 = date1.getLong(ChronoField.EPOCH_DAY);
 173         ChronoLocalDate date2 = date1.with(ChronoField.EPOCH_DAY, epoch1);
 174         assertEquals(date1, date2, "Date from epoch day is not same date: " + date1 + " != " + date2);
 175         long epoch2 = date1.getLong(ChronoField.EPOCH_DAY);
 176         assertEquals(epoch1, epoch2, "Epoch day not the same: " + epoch1 + " != " + epoch2);
 177     }
 178 
 179     @Test(dataProvider = "calendarNameAndType")
 180     public void test_dateEpochDay(String name, String alias) {
 181         Chronology chrono = Chronology.of(name);
 182         ChronoLocalDate date = chrono.dateNow();
 183         long epochDay = date.getLong(ChronoField.EPOCH_DAY);
 184         ChronoLocalDate test = chrono.dateEpochDay(epochDay);
 185         assertEquals(test, date);
 186     }
 187 
 188     //-----------------------------------------------------------------------
 189     // locale based lookup
 190     //-----------------------------------------------------------------------
 191     @DataProvider(name = "calendarsystemtype")
 192     Object[][] data_CalendarType() {
 193         return new Object[][] {
 194             {HijrahChronology.INSTANCE, "islamic-umalqura"},
 195             {IsoChronology.INSTANCE, "iso8601"},
 196             {JapaneseChronology.INSTANCE, "japanese"},
 197             {MinguoChronology.INSTANCE, "roc"},
 198             {ThaiBuddhistChronology.INSTANCE, "buddhist"},
 199         };
 200     }
 201 
 202     @Test(dataProvider = "calendarsystemtype")
 203     public void test_getCalendarType(Chronology chrono, String calendarType) {
 204         String type = calendarType;
 205         assertEquals(chrono.getCalendarType(), type);
 206     }
 207 
 208     @Test(dataProvider = "calendarsystemtype")
 209     public void test_lookupLocale(Chronology chrono, String calendarType) {
 210         Locale.Builder builder = new Locale.Builder().setLanguage("en").setRegion("CA");
 211         builder.setUnicodeLocaleKeyword("ca", calendarType);
 212         Locale locale = builder.build();
 213         assertEquals(Chronology.ofLocale(locale), chrono);
 214     }
 215 
 216     //-----------------------------------------------------------------------
 217     // dateNow()
 218     //-----------------------------------------------------------------------
 219     @Test
 220     public void test_MinguoChronology_dateNow() {
 221         ZoneId zoneId_paris = ZoneId.of("Europe/Paris");
 222         Clock clock = Clock.system(zoneId_paris);
 223 
 224         Chronology chrono = Chronology.of("Minguo");
 225         assertEquals(chrono.dateNow(), MinguoChronology.INSTANCE.dateNow());
 226         assertEquals(chrono.dateNow(zoneId_paris), MinguoChronology.INSTANCE.dateNow(zoneId_paris));
 227         assertEquals(chrono.dateNow(clock), MinguoChronology.INSTANCE.dateNow(clock));
 228     }
 229 
 230     @Test
 231     public void test_IsoChronology_dateNow() {
 232         ZoneId zoneId_paris = ZoneId.of("Europe/Paris");
 233         Clock clock = Clock.system(zoneId_paris);
 234 
 235         Chronology chrono = Chronology.of("ISO");
 236         assertEquals(chrono.dateNow(), IsoChronology.INSTANCE.dateNow());
 237         assertEquals(chrono.dateNow(zoneId_paris), IsoChronology.INSTANCE.dateNow(zoneId_paris));
 238         assertEquals(chrono.dateNow(clock), IsoChronology.INSTANCE.dateNow(clock));
 239     }
 240 
 241     @Test
 242     public void test_JapaneseChronology_dateNow() {
 243         ZoneId zoneId_paris = ZoneId.of("Europe/Paris");
 244         Clock clock = Clock.system(zoneId_paris);
 245 
 246         Chronology chrono = Chronology.of("Japanese");
 247         assertEquals(chrono.dateNow(), JapaneseChronology.INSTANCE.dateNow());
 248         assertEquals(chrono.dateNow(zoneId_paris), JapaneseChronology.INSTANCE.dateNow(zoneId_paris));
 249         assertEquals(chrono.dateNow(clock), JapaneseChronology.INSTANCE.dateNow(clock));
 250     }
 251 
 252     @Test
 253     public void test_ThaiBuddhistChronology_dateNow() {
 254         ZoneId zoneId_paris = ZoneId.of("Europe/Paris");
 255         Clock clock = Clock.system(zoneId_paris);
 256 
 257         Chronology chrono = Chronology.of("ThaiBuddhist");
 258         assertEquals(chrono.dateNow(), ThaiBuddhistChronology.INSTANCE.dateNow());
 259         assertEquals(chrono.dateNow(zoneId_paris), ThaiBuddhistChronology.INSTANCE.dateNow(zoneId_paris));
 260         assertEquals(chrono.dateNow(clock), ThaiBuddhistChronology.INSTANCE.dateNow(clock));
 261     }
 262 
 263     //-----------------------------------------------------------------------
 264     // dateYearDay() and date()
 265     //-----------------------------------------------------------------------
 266     @Test
 267     public void test_HijrahChronology_dateYearDay() {
 268         Chronology chrono = Chronology.of("Hijrah");
 269         ChronoLocalDate date1 = chrono.dateYearDay(HijrahEra.AH, 1434, 178);
 270         ChronoLocalDate date2 = chrono.date(HijrahEra.AH, 1434, 7, 1);
 271         assertEquals(date1, HijrahChronology.INSTANCE.dateYearDay(HijrahEra.AH, 1434, 178));
 272         assertEquals(date2, HijrahChronology.INSTANCE.dateYearDay(HijrahEra.AH, 1434, 178));
 273     }
 274 
 275     @Test
 276     public void test_MinguoChronology_dateYearDay() {
 277         Chronology chrono = Chronology.of("Minguo");
 278         ChronoLocalDate date1 = chrono.dateYearDay(MinguoEra.ROC, 5, 60);
 279         ChronoLocalDate date2 = chrono.date(MinguoEra.ROC, 5, 2, 29);
 280         assertEquals(date1, MinguoChronology.INSTANCE.dateYearDay(MinguoEra.ROC, 5, 60));
 281         assertEquals(date2, MinguoChronology.INSTANCE.dateYearDay(MinguoEra.ROC, 5, 60));
 282     }
 283 
 284     @Test
 285     public void test_IsoChronology_dateYearDay() {
 286         Chronology chrono = Chronology.of("ISO");
 287         ChronoLocalDate date1 = chrono.dateYearDay(IsoEra.CE, 5, 60);
 288         ChronoLocalDate date2 = chrono.date(IsoEra.CE, 5, 3, 1);
 289         assertEquals(date1, IsoChronology.INSTANCE.dateYearDay(IsoEra.CE, 5, 60));
 290         assertEquals(date2, IsoChronology.INSTANCE.dateYearDay(IsoEra.CE, 5, 60));
 291     }
 292 
 293     @Test
 294     public void test_JapaneseChronology_dateYearDay() {
 295         Chronology chrono = Chronology.of("Japanese");
 296         ChronoLocalDate date1 = chrono.dateYearDay(JapaneseEra.HEISEI, 8, 60);
 297         ChronoLocalDate date2 = chrono.date(JapaneseEra.HEISEI, 8, 2, 29);
 298         assertEquals(date1, JapaneseChronology.INSTANCE.dateYearDay(JapaneseEra.HEISEI, 8, 60));
 299         assertEquals(date2, JapaneseChronology.INSTANCE.dateYearDay(JapaneseEra.HEISEI, 8, 60));
 300     }
 301 
 302     @Test
 303     public void test_ThaiBuddhistChronology_dateYearDay() {
 304         Chronology chrono = Chronology.of("ThaiBuddhist");
 305         ChronoLocalDate date1 = chrono.dateYearDay(ThaiBuddhistEra.BE, 2459, 60);
 306         ChronoLocalDate date2 = chrono.date(ThaiBuddhistEra.BE, 2459, 2, 29);
 307         assertEquals(date1, ThaiBuddhistChronology.INSTANCE.dateYearDay(ThaiBuddhistEra.BE, 2459, 60));
 308         assertEquals(date2, ThaiBuddhistChronology.INSTANCE.dateYearDay(ThaiBuddhistEra.BE, 2459, 60));
 309     }
 310 
 311     /**
 312      * Test lookup by calendarType of each chronology.
 313      * Verify that the calendar can be found by {@link java.time.chrono.Chronology#ofLocale}.
 314      */
 315     @Test
 316     public void test_ofLocaleByType() {
 317         // Test that all available chronologies can be successfully found using ofLocale
 318         Set<Chronology> chronos = Chronology.getAvailableChronologies();
 319         for (Chronology chrono : chronos) {
 320             Locale.Builder builder = new Locale.Builder().setLanguage("en").setRegion("CA");
 321             builder.setUnicodeLocaleKeyword("ca", chrono.getCalendarType());
 322             Locale locale = builder.build();
 323             assertEquals(Chronology.ofLocale(locale), chrono, "Lookup by type");
 324         }
 325     }
 326 
 327     @Test(expectedExceptions=DateTimeException.class)
 328     public void test_lookupLocale() {
 329         Locale.Builder builder = new Locale.Builder().setLanguage("en").setRegion("CA");
 330         builder.setUnicodeLocaleKeyword("ca", "xxx");