Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/util/Locale/Bug8040211.java
38813 views
/*1* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test25* @bug 8040211 8191404 8203872 8222980 822543526* @summary Checks the IANA language subtag registry data update27* (LSR Revision: 2019-09-16) with Locale and Locale.LanguageRange28* class methods.29* @run main Bug804021130*/3132import java.util.ArrayList;33import java.util.Arrays;34import java.util.Collections;35import java.util.Iterator;36import java.util.Locale;37import java.util.List;38import java.util.Locale.LanguageRange;39import java.util.Locale.FilteringMode;40import static java.util.Locale.FilteringMode.EXTENDED_FILTERING;4142public class Bug8040211 {4344static boolean err = false;4546private static final String ACCEPT_LANGUAGE =47"Accept-Language: aam, adp, aog, aue, bcg, cey, cqu, dif, ema,"48+ " en-gb-oed, gti, kdz, koj, kwq, kxe, lii, lmm, lsn, lsv, lvi, mtm,"49+ " ngv, nns, oyb, phr, pnd, pub, snz, suj, szy,taj, tjj, tjp, tvx,"50+ " uss, uth, wkr;q=0.9, ar-hyw;q=0.8, yug;q=0.5, gfx;q=0.4";51private static final List<LanguageRange> EXPECTED_RANGE_LIST = Collections.unmodifiableList(52Arrays.asList(new LanguageRange[] {53new LanguageRange("aam", 1.0),54new LanguageRange("aas", 1.0),55new LanguageRange("adp", 1.0),56new LanguageRange("dz", 1.0),57new LanguageRange("aog", 1.0),58new LanguageRange("myd", 1.0),59new LanguageRange("aue", 1.0),60new LanguageRange("ktz", 1.0),61new LanguageRange("bcg", 1.0),62new LanguageRange("bgm", 1.0),63new LanguageRange("cey", 1.0),64new LanguageRange("cqu", 1.0),65new LanguageRange("quh", 1.0),66new LanguageRange("dif", 1.0),67new LanguageRange("dit", 1.0),68new LanguageRange("ema", 1.0),69new LanguageRange("uok", 1.0),70new LanguageRange("en-gb-oed", 1.0),71new LanguageRange("en-gb-oxendict", 1.0),72new LanguageRange("gti", 1.0),73new LanguageRange("nyc", 1.0),74new LanguageRange("kdz", 1.0),75new LanguageRange("ncp", 1.0),76new LanguageRange("koj", 1.0),77new LanguageRange("kwv", 1.0),78new LanguageRange("kwq", 1.0),79new LanguageRange("yam", 1.0),80new LanguageRange("kxe", 1.0),81new LanguageRange("tvd", 1.0),82new LanguageRange("lii", 1.0),83new LanguageRange("raq", 1.0),84new LanguageRange("lmm", 1.0),85new LanguageRange("rmx", 1.0),86new LanguageRange("lsn", 1.0),87new LanguageRange("lsv", 1.0),88new LanguageRange("lvi", 1.0),89new LanguageRange("mtm", 1.0),90new LanguageRange("ymt", 1.0),91new LanguageRange("ngv", 1.0),92new LanguageRange("nnx", 1.0),93new LanguageRange("nns", 1.0),94new LanguageRange("nbr", 1.0),95new LanguageRange("oyb", 1.0),96new LanguageRange("thx", 1.0),97new LanguageRange("skk", 1.0),98new LanguageRange("jeg", 1.0),99new LanguageRange("phr", 1.0),100new LanguageRange("pmu", 1.0),101new LanguageRange("pnd", 1.0),102new LanguageRange("pub", 1.0),103new LanguageRange("puz", 1.0),104new LanguageRange("snz", 1.0),105new LanguageRange("asd", 1.0),106new LanguageRange("suj", 1.0),107new LanguageRange("szy", 1.0),108new LanguageRange("taj", 1.0),109new LanguageRange("tsf", 1.0),110new LanguageRange("tjj", 1.0),111new LanguageRange("tjp", 1.0),112new LanguageRange("tvx", 1.0),113new LanguageRange("uss", 1.0),114new LanguageRange("uth", 1.0),115new LanguageRange("wkr", 0.9),116new LanguageRange("ar-hyw", 0.8),117new LanguageRange("yug", 0.5),118new LanguageRange("yuu", 0.5),119new LanguageRange("gfx", 0.4),120new LanguageRange("oun", 0.4),121new LanguageRange("mwj", 0.4),122new LanguageRange("vaj", 0.4)123}));124125public static void main(String[] args) {126testLanguageRange();127testLocale();128129if (err) {130throw new RuntimeException("Failed.");131}132}133134private static void testLanguageRange() {135System.out.println("Test LanguageRange class parse method...");136test_parse();137}138139private static void testLocale() {140System.out.println("Test Locale class methods...");141test_filter();142test_filterTags();143test_lookup();144test_lookupTag();145}146147private static void test_parse() {148boolean error = false;149List<LanguageRange> got = LanguageRange.parse(ACCEPT_LANGUAGE);150if (!areEqual(EXPECTED_RANGE_LIST, got)) {151error = true;152System.err.println(" language parse() test failed.");153}154155if (error) {156err = true;157System.out.println(" test_parse() failed.");158} else {159System.out.println(" test_parse() passed.");160}161162}163164private static boolean areEqual(List<LanguageRange> expected,165List<LanguageRange> got) {166boolean error = false;167168int expectedSize = expected.size();169int actualSize = got.size();170171if (expectedSize != actualSize) {172error = true;173174System.err.println(" Expected size=" + expectedSize);175for (LanguageRange lr : expected) {176System.err.println(" range=" + lr.getRange()177+ ", weight=" + lr.getWeight());178}179180System.err.println(" Actual size=" + actualSize);181for (LanguageRange lr : got) {182System.err.println(" range=" + lr.getRange()183+ ", weight=" + lr.getWeight());184}185} else {186for (int i = 0; i < expectedSize; i++) {187LanguageRange lr1 = expected.get(i);188LanguageRange lr2 = got.get(i);189190if (!lr1.getRange().equals(lr2.getRange())191|| lr1.getWeight() != lr2.getWeight()) {192error = true;193System.err.println(" " + i + ": Expected: range=" + lr1.getRange()194+ ", weight=" + lr1.getWeight());195System.err.println(" " + i + ": Actual: range=" + lr2.getRange()196+ ", weight=" + lr2.getWeight());197}198}199}200201return !error;202}203204private static void test_filter() {205boolean error = false;206207String ranges = "mtm-RU, en-gb-oed, coy, ar-HY";208String tags = "de-DE, en, mtm-RU, ymt-RU, en-gb-oxendict, ja-JP, pij, nts, ar-arevela";209FilteringMode mode = EXTENDED_FILTERING;210211List<LanguageRange> priorityList = LanguageRange.parse(ranges);212List<Locale> tagList = generateLocales(tags);213String actualLocales214= showLocales(Locale.filter(priorityList, tagList, mode));215String expectedLocales = "mtm-RU, ymt-RU, en-GB-oxendict, nts, pij";216217if (!expectedLocales.equals(actualLocales)) {218error = true;219showErrorMessage("#1 filter(" + mode + ")",220ranges, tags, expectedLocales, actualLocales);221}222223ranges = "phr-*-IN, ja-JP";224tags = "en, pmu-Guru-IN, ja-Latn-JP, iw";225mode = EXTENDED_FILTERING;226227priorityList = LanguageRange.parse(ranges);228tagList = generateLocales(tags);229actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));230expectedLocales = "pmu-Guru-IN, ja-Latn-JP";231232if (!expectedLocales.equals(actualLocales)) {233error = true;234showErrorMessage("#2 filter(" + mode + ")",235ranges, tags, expectedLocales, actualLocales);236}237238if (error) {239err = true;240System.out.println(" test_filter() failed.");241} else {242System.out.println(" test_filter() passed.");243}244}245246private static void test_filterTags() {247boolean error = false;248249String ranges = "gti;q=0.2, gfx, kzj";250String tags = "de-DE, gti, he, nyc, mwj, vaj, ktr, dtp";251252List<LanguageRange> priorityList = LanguageRange.parse(ranges);253List<String> tagList = generateLanguageTags(tags);254String actualTags255= showLanguageTags(Locale.filterTags(priorityList, tagList));256String expectedTags = "mwj, vaj, ktr, dtp, gti, nyc";257258if (!expectedTags.equals(actualTags)) {259error = true;260showErrorMessage("filterTags()",261ranges, tags, expectedTags, actualTags);262}263264if (error) {265err = true;266System.out.println(" test_filterTags() failed.");267} else {268System.out.println(" test_filterTags() passed.");269}270}271272private static void test_lookup() {273boolean error = false;274275String ranges = "en;q=0.2, yam, rmx;q=0.9";276String tags = "de-DE, en, kwq, lmm";277List<LanguageRange> priorityList = LanguageRange.parse(ranges);278List<Locale> localeList = generateLocales(tags);279String actualLocale280= Locale.lookup(priorityList, localeList).toLanguageTag();281String expectedLocale = "kwq";282283if (!expectedLocale.equals(actualLocale)) {284error = true;285showErrorMessage("lookup()", ranges, tags, expectedLocale, actualLocale);286}287288if (error) {289err = true;290System.out.println(" test_lookup() failed.");291} else {292System.out.println(" test_lookup() passed.");293}294}295296private static void test_lookupTag() {297boolean error = false;298299String ranges = "en, tsf;q=0.2";300String tags = "es, ja-JP, taj";301List<LanguageRange> priorityList = LanguageRange.parse(ranges);302List<String> tagList = generateLanguageTags(tags);303String actualTag = Locale.lookupTag(priorityList, tagList);304String expectedTag = "taj";305306if (!expectedTag.equals(actualTag)) {307error = true;308showErrorMessage("lookupTag()", ranges, tags, expectedTag, actualTag);309}310311if (error) {312err = true;313System.out.println(" test_lookupTag() failed.");314} else {315System.out.println(" test_lookupTag() passed.");316}317}318319private static List<Locale> generateLocales(String tags) {320if (tags == null) {321return null;322}323324List<Locale> localeList = new ArrayList<>();325if (tags.equals("")) {326return localeList;327}328String[] t = tags.split(", ");329for (String tag : t) {330localeList.add(Locale.forLanguageTag(tag));331}332return localeList;333}334335private static List<String> generateLanguageTags(String tags) {336List<String> tagList = new ArrayList<>();337String[] t = tags.split(", ");338for (String tag : t) {339tagList.add(tag);340}341return tagList;342}343344private static String showLanguageTags(List<String> tags) {345StringBuilder sb = new StringBuilder();346347Iterator<String> itr = tags.iterator();348if (itr.hasNext()) {349sb.append(itr.next());350}351while (itr.hasNext()) {352sb.append(", ");353sb.append(itr.next());354}355356return sb.toString().trim();357}358359private static String showLocales(List<Locale> locales) {360StringBuilder sb = new StringBuilder();361362java.util.Iterator<Locale> itr = locales.iterator();363if (itr.hasNext()) {364sb.append(itr.next().toLanguageTag());365}366while (itr.hasNext()) {367sb.append(", ");368sb.append(itr.next().toLanguageTag());369}370371return sb.toString().trim();372}373374private static void showErrorMessage(String methodName,375String priorityList,376String tags,377String expectedTags,378String actualTags) {379System.err.println("\nIncorrect " + methodName + " result.");380System.err.println(" Priority list : " + priorityList);381System.err.println(" Language tags : " + tags);382System.err.println(" Expected value : " + expectedTags);383System.err.println(" Actual value : " + actualTags);384}385386}387388389390