1 /*
   2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  *
  26  * @test
  27  * @bug 8176841
  28  * @summary Tests Calendar class deals with Unicode extensions
  29  *      correctly.
  30  * @modules jdk.localedata
  31  * @run testng/othervm CalendarTests
  32  */
  33 
  34 import static org.testng.Assert.assertEquals;
  35 
  36 import java.text.DateFormat;
  37 import java.util.Calendar;
  38 import java.util.Locale;
  39 import java.util.TimeZone;
  40 
  41 import org.testng.annotations.AfterTest;
  42 import org.testng.annotations.BeforeTest;
  43 import org.testng.annotations.DataProvider;
  44 import org.testng.annotations.Test;
  45 
  46 /**
  47  * Test Calendar with BCP47 U extensions
  48  */
  49 @Test
  50 public class CalendarTests {
  51     private static TimeZone defaultTZ;
  52 
  53     private static final TimeZone ASIATOKYO = TimeZone.getTimeZone("Asia/Tokyo");
  54     private static final TimeZone AMLA = TimeZone.getTimeZone("America/Los_Angeles");
  55 
  56     private static final Locale JPTYO = Locale.forLanguageTag("en-u-tz-jptyo");
  57     private static final Locale USLAX = Locale.forLanguageTag("en-u-tz-uslax");
  58 
  59     private static final Locale FW_SUN = Locale.forLanguageTag("en-US-u-fw-sun");
  60     private static final Locale FW_MON = Locale.forLanguageTag("en-US-u-fw-mon");
  61     private static final Locale FW_TUE = Locale.forLanguageTag("en-US-u-fw-tue");
  62     private static final Locale FW_WED = Locale.forLanguageTag("en-US-u-fw-wed");
  63     private static final Locale FW_THU = Locale.forLanguageTag("en-US-u-fw-thu");
  64     private static final Locale FW_FRI = Locale.forLanguageTag("en-US-u-fw-fri");
  65     private static final Locale FW_SAT = Locale.forLanguageTag("en-US-u-fw-sat");
  66 
  67     @BeforeTest
  68     public void beforeTest() {
  69         defaultTZ = TimeZone.getDefault();
  70         TimeZone.setDefault(AMLA);
  71     }
  72 
  73     @AfterTest
  74     public void afterTest() {
  75         TimeZone.setDefault(defaultTZ);
  76     }
  77 
  78     @DataProvider(name="tz")
  79     Object[][] tz() {
  80         return new Object[][] {
  81             // Locale, Expected Zone,
  82             {JPTYO, ASIATOKYO},
  83             {USLAX, AMLA},
  84 
  85             // invalid
  86             {Locale.forLanguageTag("en-US-u-tz-jpzzz"), AMLA}
  87         };
  88     }
  89 
  90     @DataProvider(name="firstDayOfWeek")
  91     Object[][] firstDayOfWeek () {
  92         return new Object[][] {
  93             // Locale, Expected DayOfWeek,
  94             {Locale.US, Calendar.SUNDAY},
  95             {FW_SUN, Calendar.SUNDAY},
  96             {FW_MON, Calendar.MONDAY},
  97             {FW_TUE, Calendar.TUESDAY},
  98             {FW_WED, Calendar.WEDNESDAY},
  99             {FW_THU, Calendar.THURSDAY},
 100             {FW_FRI, Calendar.FRIDAY},
 101             {FW_SAT, Calendar.SATURDAY},
 102 
 103             // invalid case
 104             {Locale.forLanguageTag("en-US-u-fw-xxx"), Calendar.SUNDAY},
 105 
 106             // region override
 107             {Locale.forLanguageTag("en-US-u-rg-gbzzzz"), Calendar.MONDAY},
 108             {Locale.forLanguageTag("zh-CN-u-rg-eszzzz"), Calendar.MONDAY},
 109 
 110             // "fw" and "rg".
 111             {Locale.forLanguageTag("en-US-u-fw-wed-rg-gbzzzz"), Calendar.WEDNESDAY},
 112             {Locale.forLanguageTag("en-US-u-fw-xxx-rg-gbzzzz"), Calendar.MONDAY},
 113             {Locale.forLanguageTag("en-US-u-fw-xxx-rg-zzzz"), Calendar.SUNDAY},
 114         };
 115     }
 116 
 117     @DataProvider(name="minDaysInFirstWeek")
 118     Object[][] minDaysInFrstWeek () {
 119         return new Object[][] {
 120             // Locale, Expected minDay,
 121             {Locale.US, 1},
 122 
 123             // region override
 124             {Locale.forLanguageTag("en-US-u-rg-gbzzzz"), 4},
 125             {Locale.forLanguageTag("zh-CN-u-rg-eszzzz"), 4},
 126         };
 127     }
 128 
 129     @Test(dataProvider="tz")
 130     public void test_tz(Locale locale, TimeZone zoneExpected) {
 131         DateFormat df = DateFormat.getTimeInstance(DateFormat.FULL, locale);
 132         assertEquals(df.getTimeZone(), zoneExpected);
 133 
 134         Calendar c = Calendar.getInstance(locale);
 135         assertEquals(c.getTimeZone(), zoneExpected);
 136 
 137         c = new Calendar.Builder().setLocale(locale).build();
 138         assertEquals(c.getTimeZone(), zoneExpected);
 139     }
 140 
 141     @Test(dataProvider="firstDayOfWeek")
 142     public void test_firstDayOfWeek(Locale locale, int dowExpected) {
 143         Calendar c = Calendar.getInstance(locale);
 144         assertEquals(c.getFirstDayOfWeek(), dowExpected);
 145 
 146         c = new Calendar.Builder().setLocale(locale).build();
 147         assertEquals(c.getFirstDayOfWeek(), dowExpected);
 148     }
 149 
 150     @Test(dataProvider="minDaysInFirstWeek")
 151     public void test_minDaysInFirstWeek(Locale locale, int minDaysExpected) {
 152         Calendar c = Calendar.getInstance(locale);
 153         assertEquals(c.getMinimalDaysInFirstWeek(), minDaysExpected);
 154 
 155         c = new Calendar.Builder().setLocale(locale).build();
 156         assertEquals(c.getMinimalDaysInFirstWeek(), minDaysExpected);
 157     }
 158 }