--- /dev/null 2018-07-03 16:16:30.000000000 +0530 +++ new/test/jdk/sun/util/resources/cldr/Bug8204603.java 2018-07-03 16:16:30.000000000 +0530 @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + /* + * @test + * @bug 8204603 + * @summary Test that correct data is retrieved for zh_CN and zh_TW locales + * and CLDR provider supports all locales for which aliases exist. + * @modules java.base/sun.util.locale.provider + * jdk.localedata + * @run main Bug8204603 + */ + +import java.text.DateFormatSymbols; +import java.text.DecimalFormatSymbols; +import java.util.Calendar; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import sun.util.locale.provider.LocaleProviderAdapter; + +/** + * This test is dependent on a particular version of CLDR data. + */ +public class Bug8204603 { + + /** + * List of all locales for which CLDR provides alias Mappings. e.g alias of + * zh-HK is zh-Hant-HK + */ + private static final List ALIAS_LOCALES + = List.of(Locale.forLanguageTag("az-AZ"), Locale.forLanguageTag("bs-BA"), + Locale.forLanguageTag("ha-Latn-GH"), Locale.forLanguageTag("ha-Latn-NE"), + Locale.forLanguageTag("ha-Latn-NG"), Locale.forLanguageTag("i-lux"), + Locale.forLanguageTag("kk-Cyrl-KZ"), Locale.forLanguageTag("ks-Arab-IN"), + Locale.forLanguageTag("ky-Cyrl-KG"), Locale.forLanguageTag("lb"), + Locale.forLanguageTag("lb"), Locale.forLanguageTag("mn-Cyrl-MN"), + Locale.forLanguageTag("mo"), Locale.forLanguageTag("ms-Latn-BN"), + Locale.forLanguageTag("ms-Latn-MY"), Locale.forLanguageTag("ms-Latn-SG"), + Locale.forLanguageTag("pa-IN"), Locale.forLanguageTag("pa-PK"), + Locale.forLanguageTag("scc"), Locale.forLanguageTag("scr"), + Locale.forLanguageTag("sh"), Locale.forLanguageTag("shi-MA"), + Locale.forLanguageTag("sr-BA"), Locale.forLanguageTag("sr-RS"), + Locale.forLanguageTag("sr-XK"), Locale.forLanguageTag("tl"), + Locale.forLanguageTag("tzm-Latn-MA"), Locale.forLanguageTag("ug-Arab-CN"), + Locale.forLanguageTag("uz-AF"), Locale.forLanguageTag("uz-UZ"), + Locale.forLanguageTag("vai-LR"), Locale.forLanguageTag("vai-LR"), + Locale.forLanguageTag("yue-CN"), Locale.forLanguageTag("yue-HK"), + Locale.forLanguageTag("zh-CN"), Locale.forLanguageTag("zh-HK"), + Locale.forLanguageTag("zh-MO"), Locale.forLanguageTag("zh-SG"), + Locale.forLanguageTag("zh-TW")); + + private static final Map CALENDAR_DATA_MAP = Map.of( + Locale.forLanguageTag("zh-CN"), "\u5468\u65E5", + Locale.forLanguageTag("zh-TW"), "\u9031\u65E5"); + private static final Map NAN_DATA_MAP = Map.of( + Locale.forLanguageTag("zh-CN"), "NaN", + Locale.forLanguageTag("zh-TW"), "\u975E\u6578\u503C"); + + public static void main(String[] args) { + testCldrSupportedLocales(); + CALENDAR_DATA_MAP.forEach((k, v) -> testCalendarData(k, v)); + NAN_DATA_MAP.forEach((k, v) -> testNanData(k, v)); + } + + /** + * tests that CLDR provider should return true for alias locales. + * + */ + private static void testCldrSupportedLocales() { + LocaleProviderAdapter cldr = LocaleProviderAdapter.forType(LocaleProviderAdapter.Type.CLDR); + Set availableLocs = Set.of(cldr.getAvailableLocales()); + Set langtags = new HashSet<>(); + availableLocs.forEach(loc -> langtags.add(loc.toLanguageTag())); + ALIAS_LOCALES.stream().filter(loc -> !cldr.isSupportedProviderLocale(loc, langtags)).findAny() + .ifPresent(l -> { + throw new RuntimeException("Locale " + l + + " is not supported by CLDR locale provider"); + }); + } + + private static void testCalendarData(Locale loc, String expected) { + DateFormatSymbols dfs = DateFormatSymbols.getInstance(loc); + String[] shortDays = dfs.getShortWeekdays(); + String actual = shortDays[Calendar.SUNDAY]; + if (!actual.equals(expected)) { + throw new RuntimeException("Calendar data mismatch for locale: " + + loc + ", expected is: " + expected + ", actual is: " + actual); + } + } + + private static void testNanData(Locale loc, String expected) { + DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(loc); + String actual = dfs.getNaN(); + if (!actual.equals(expected)) { + throw new RuntimeException("NaN mismatch for locale: " + + loc + ", expected is: " + expected + ", actual is: " + actual); + } + } +}