blob: 8e727dcbd452549ffb07cb6cc1615ddba761a352 [file] [log] [blame]
/*
* Copyright (c) 2016, 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.
*
* 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 8159943 8154797
* @modules java.base/sun.util.locale.provider
* java.base/sun.util.resources
* jdk.localedata
* @summary Test for checking consistency between CLDR and COMPAT locale data
* for java.time.
*/
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
import sun.util.locale.provider.LocaleProviderAdapter.Type;
import sun.util.locale.provider.LocaleProviderAdapter;
public class JavaTimeSupplementaryTest {
// COMPAT-to-CLDR locale mapping
private static final Map<Locale, Locale> LOCALEMAP;
static {
LOCALEMAP = new HashMap<>();
LOCALEMAP.put(new Locale("hi", "IN"), new Locale("hi"));
LOCALEMAP.put(new Locale("no", "NO", "NY"), new Locale("nn", "NO"));
LOCALEMAP.put(new Locale("no"), new Locale("nb"));
LOCALEMAP.put(Locale.TAIWAN, Locale.forLanguageTag("zh-Hant"));
LOCALEMAP.put(new Locale("zh", "HK"), Locale.forLanguageTag("zh-Hant-HK"));
LOCALEMAP.put(new Locale("zh", "SG"), Locale.forLanguageTag("zh-Hans-SG"));
LOCALEMAP.put(new Locale("sr", "BA"), Locale.forLanguageTag("sr-Cyrl-BA"));
}
private static final String[] PREFIXES = {
"Quarter",
"java.time.",
"calendarname.",
"field.",
"islamic.",
"roc.",
"timezone."
};
// All available locales for the COMPAT FormatData resource bundles
static final List<Locale> COMPAT_LOCALES
= Arrays.asList(LocaleProviderAdapter.forJRE()
.getDateFormatSymbolsProvider().getAvailableLocales());
static int errors;
public static void main(String... args) {
for (Locale locale : COMPAT_LOCALES) {
ResourceBundle compat
= LocaleProviderAdapter.forJRE()
.getLocaleResources(locale).getJavaTimeFormatData();
if (!compat.getLocale().equals(locale)) {
continue;
}
Locale cldrLocale = toCldrLocale(locale);
ResourceBundle cldr
= LocaleProviderAdapter.forType(Type.CLDR)
.getLocaleResources(locale).getJavaTimeFormatData();
if (!cldr.getLocale().equals(cldrLocale)) {
continue;
}
compareResources(compat, cldr);
}
if (errors > 0) {
throw new RuntimeException(errors + " failure(s)");
}
}
private static Locale toCldrLocale(Locale compatLocale) {
Locale loc = LOCALEMAP.get(compatLocale);
return loc != null ? loc: compatLocale;
}
private static void compareResources(ResourceBundle compat, ResourceBundle cldr) {
Set<String> supplementalKeys = getSupplementalKeys(compat);
for (String key : supplementalKeys) {
Object compatData = compat.getObject(key);
String cldrKey = toCldrKey(key);
Object cldrData = cldr.containsKey(cldrKey) ? cldr.getObject(cldrKey) : null;
if (!Objects.deepEquals(compatData, cldrData)) {
// OK if key is for the Buddhist or Japanese calendars which had been
// supported before java.time, or if key is "java.time.short.Eras" due
// to legacy era names.
if (!(key.contains("buddhist") || key.contains("japanese")
|| key.equals("java.time.short.Eras"))) {
errors++;
System.out.print("Failure: ");
}
System.out.println("diff: " + compat.getLocale().toLanguageTag() + "\n"
+ " COMPAT: " + key + " -> " + toString(compatData) + "\n"
+ " CLDR: " + cldrKey + " -> " + toString(cldrData));
}
}
}
private static Set<String> getSupplementalKeys(ResourceBundle rb) {
// Collect keys starting with any of PREFIXES
Set<String> keys = rb.keySet().stream()
.filter(k -> Arrays.stream(PREFIXES).anyMatch(p -> k.startsWith(p)))
.collect(Collectors.toCollection(TreeSet::new));
return keys;
}
/**
* Removes "java.time." prefix where it's unused in CLDR.
*/
private static String toCldrKey(String key) {
if (key.contains("short.Eras")) {
key = key.replace("short.", "");
}
if (key.startsWith("java.time.") && key.endsWith(".Eras")) {
return key.substring("java.time.".length());
}
return key;
}
private static String toString(Object data) {
if (data instanceof String[]) {
return Arrays.toString((String[]) data);
}
return data.toString();
}
}