Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/util/Locale/Bug7069824.java
38813 views
/*1* Copyright (c) 2014, 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 7069824 804236026* @summary Verify implementation for Locale matching.27* @run main Bug706982428*/2930import java.util.*;31import java.util.Locale.*;32import static java.util.Locale.FilteringMode.*;33import static java.util.Locale.LanguageRange.*;3435public class Bug7069824 {3637static boolean err = false;3839public static void main(String[] args) {40testLanguageRange();41testLocale();4243if (err) {44throw new RuntimeException("Failed.");45}46}4748private static void testLanguageRange() {49System.out.println("Test LanguageRange class...");50testConstants();51testConstructors();52testMethods();53}5455private static void testLocale() {56System.out.println("Test Locale class...");57test_filter();58test_filterTags();59test_lookup();60test_lookupTag();61}6263private static void testConstants() {64boolean error = false;6566if (MIN_WEIGHT != 0.0) {67error = true;68System.err.println(" MIN_WEIGHT should be 0.0 but got "69+ MIN_WEIGHT);70}7172if (MAX_WEIGHT != 1.0) {73error = true;74System.err.println(" MAX_WEIGHT should be 1.0 but got "75+ MAX_WEIGHT);76}7778if (error) {79err = true;80System.err.println(" testConstants() failed.");81} else {82System.out.println(" testConstants() passed.");83}84}8586private static void testConstructors() {87boolean error = false;8889LanguageRange lr;90String range;91double weight;9293// Testcase for 804236094range = "en-Latn-1234567890";95try {96lr = new LanguageRange(range);97error = true;98System.err.println(" IAE should be thrown for LanguageRange("99+ range + ").");100}101catch (IllegalArgumentException ex) {102}103104range = null;105try {106lr = new LanguageRange(range);107error = true;108System.err.println(" NPE should be thrown for LanguageRange("109+ range + ").");110}111catch (NullPointerException ex) {112}113114range = null;115weight = 0.8;116try {117lr = new LanguageRange(range, weight);118error = true;119System.err.println(" NPE should be thrown for LanguageRange("120+ range + ", " + weight + ").");121}122catch (NullPointerException ex) {123}124125range = "elvish";126try {127lr = new LanguageRange(range);128}129catch (Exception ex) {130error = true;131System.err.println(" " + ex132+ " should not be thrown for LanguageRange(" + range + ").");133}134135range = "de-DE";136try {137lr = new LanguageRange(range);138}139catch (Exception ex) {140error = true;141System.err.println(" " + ex142+ " should not be thrown for LanguageRange(" + range + ").");143}144145range = "ar";146weight = 0.8;147try {148lr = new LanguageRange(range, weight);149}150catch (Exception ex) {151error = true;152System.err.println(" " + ex153+ " should not be thrown for LanguageRange(" + range + ", "154+ weight + ").");155}156157range = "ja";158weight = -0.8;159try {160lr = new LanguageRange(range, weight);161error = true;162System.err.println(" IAE should be thrown for LanguageRange("163+ range + ", " + weight + ").");164}165catch (IllegalArgumentException ex) {166}167168range = "Elvish";169weight = 3.0;170try {171lr = new LanguageRange(range, weight);172error = true;173System.err.println(" IAE should be thrown for LanguageRange("174+ range + ", " + weight + ").");175}176catch (IllegalArgumentException ex) {177}178179String[] illformedRanges = {"-ja", "ja--JP", "en-US-", "a4r", "ar*",180"ar-*EG", "", "abcdefghijklmn", "ja-J=", "ja-opqrstuvwxyz"};181for (String r : illformedRanges) {182try {183lr = new LanguageRange(r);184error = true;185System.err.println(" IAE should be thrown for LanguageRange("186+ r + ").");187}188catch (IllegalArgumentException ex) {189}190}191192193if (error) {194err = true;195System.err.println(" testConstructors() failed.");196} else {197System.out.println(" testConstructors() passed.");198}199}200201private static void testMethods() {202test_getRange();203test_getWeight();204test_equals();205test_parse();206test_mapEquivalents();207}208209private static void test_getRange() {210boolean error = false;211212String range = "ja";213double weight = 0.5;214LanguageRange lr = new LanguageRange(range, weight);215if (!lr.getRange().equals(range)) {216error = true;217System.err.println(" LanguageRange.getRange() returned unexpected value. Expected: "218+ range + ", got: " + lr.getRange());219}220221range = "en-US";222weight = 0.5;223lr = new LanguageRange(range, weight);224if (!lr.getRange().equals(range.toLowerCase())) {225error = true;226System.err.println(" LanguageRange.getRange() returned unexpected value. Expected: "227+ range + ", got: " + lr.getRange());228}229230if (error) {231err = true;232System.err.println(" test_getRange() failed.");233} else {234System.out.println(" test_getRange() passed.");235}236}237238private static void test_getWeight() {239boolean error = false;240241String range = "ja";242double weight = 0.5;243LanguageRange lr = new LanguageRange(range, weight);244if (lr.getWeight() != weight) {245error = true;246System.err.println(" LanguageRange.getWeight() returned unexpected value. Expected: "247+ weight + ", got: " + lr.getWeight());248}249250range = "ja";251weight = MAX_WEIGHT; // default252lr = new LanguageRange(range);253if (!lr.getRange().equals(range) || lr.getWeight() != MAX_WEIGHT) {254error = true;255System.err.println(" LanguageRange.getWeight() returned unexpected value. Expected: "256+ weight + ", got: " + lr.getWeight());257}258259if (error) {260err = true;261System.err.println(" test_getWeight() failed.");262} else {263System.out.println(" test_getWeight() passed.");264}265}266267private static void test_equals() {268boolean error = false;269270LanguageRange lr1 = new LanguageRange("ja", 1.0);271LanguageRange lr2 = new LanguageRange("ja");272LanguageRange lr3 = new LanguageRange("ja", 0.1);273LanguageRange lr4 = new LanguageRange("en", 1.0);274275if (!lr1.equals(lr2)) {276error = true;277System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(ja)) should return true.");278}279280if (lr1.equals(lr3)) {281error = true;282System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(ja, 0.1)) should return false.");283}284285if (lr1.equals(lr4)) {286error = true;287System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(en, 1.0)) should return false.");288}289290if (lr1.equals(null)) {291error = true;292System.err.println(" LanguageRange(LR(ja, 1.0)).equals(null) should return false.");293}294295if (lr1.equals("")) {296error = true;297System.err.println(" LanguageRange(LR(ja, 1.0)).equals(\"\") should return false.");298299}300301if (error) {302err = true;303System.err.println(" test_equals() failed.");304} else {305System.out.println(" test_equals() passed.");306}307}308309private static void test_parse() {310boolean error = false;311312List<LanguageRange> list;313String str = null;314try {315list = LanguageRange.parse(str);316error = true;317System.err.println(" NPE should be thrown for parse("318+ str + ").");319}320catch (NullPointerException ex) {321}322323str = "";324try {325list = LanguageRange.parse("");326error = true;327System.err.println(" IAE should be thrown for parse("328+ str + ").");329}330catch (IllegalArgumentException ex) {331}332333str = "ja;q=3";334try {335list = LanguageRange.parse(str);336error = true;337System.err.println("IAE should be thrown for parse("338+ str + ").");339}340catch (IllegalArgumentException ex) {341}342343str = "Accept-Language: fr-FX,de-DE;q=0.5, fr-tp-x-FOO;q=0.1,"344+ "en-X-tp;q=0.6,en-FR;q=.7,de-de;q=0.8, iw;q=0.4, "345+ "he;q=0.4, de-de;q=0.5,ja, in-tpp, in-tp;q=0.2";346ArrayList<LanguageRange> expected = new ArrayList<>();347expected.add(new LanguageRange("fr-fx", 1.0));348expected.add(new LanguageRange("fr-fr", 1.0));349expected.add(new LanguageRange("ja", 1.0));350expected.add(new LanguageRange("in-tpp", 1.0));351expected.add(new LanguageRange("id-tpp", 1.0));352expected.add(new LanguageRange("en-fr", 0.7));353expected.add(new LanguageRange("en-fx", 0.7));354expected.add(new LanguageRange("en-x-tp", 0.6));355expected.add(new LanguageRange("de-de", 0.5));356expected.add(new LanguageRange("de-dd", 0.5));357expected.add(new LanguageRange("iw", 0.4));358expected.add(new LanguageRange("he", 0.4));359expected.add(new LanguageRange("in-tp", 0.2));360expected.add(new LanguageRange("id-tl", 0.2));361expected.add(new LanguageRange("id-tp", 0.2));362expected.add(new LanguageRange("in-tl", 0.2));363expected.add(new LanguageRange("fr-tp-x-foo", 0.1));364expected.add(new LanguageRange("fr-tl-x-foo", 0.1));365List<LanguageRange> got = LanguageRange.parse(str);366if (!areEqual(expected, got)) {367error = true;368System.err.println(" #1 parse() test failed.");369}370371str = "Accept-Language: hak-CN;q=0.8, no-bok-NO;q=0.9, no-nyn, cmn-CN;q=0.1";372expected = new ArrayList<>();373expected.add(new LanguageRange("no-nyn", 1.0));374expected.add(new LanguageRange("nn", 1.0));375expected.add(new LanguageRange("no-bok-no", 0.9));376expected.add(new LanguageRange("nb-no", 0.9));377expected.add(new LanguageRange("hak-CN", 0.8));378expected.add(new LanguageRange("zh-hakka-CN", 0.8));379expected.add(new LanguageRange("i-hak-CN", 0.8));380expected.add(new LanguageRange("cmn-CN", 0.1));381expected.add(new LanguageRange("zh-cmn-CN", 0.1));382expected.add(new LanguageRange("zh-guoyu-CN", 0.1));383got = LanguageRange.parse(str);384if (!areEqual(expected, got)) {385error = true;386System.err.println(" #2 parse() test failed.");387}388389str = "Accept-Language: rki;q=0.4, no-bok-NO;q=0.9, ccq;q=0.5";390expected = new ArrayList<>();391expected.add(new LanguageRange("no-bok-no", 0.9));392expected.add(new LanguageRange("nb-no", 0.9));393expected.add(new LanguageRange("rki", 0.4));394expected.add(new LanguageRange("ybd", 0.4));395expected.add(new LanguageRange("ccq", 0.4));396got = LanguageRange.parse(str);397if (!areEqual(expected, got)) {398error = true;399System.err.println(" #3 parse() test failed.");400}401402if (error) {403err = true;404System.err.println(" test_parse() failed.");405} else {406System.out.println(" test_parse() passed.");407}408}409410private static boolean areEqual(List<LanguageRange> expected,411List<LanguageRange> got) {412boolean error = false;413414int expectedSize = expected.size();415int actualSize = got.size();416417if (expectedSize != actualSize) {418error = true;419420System.err.println(" Expected size=" + expectedSize);421for (LanguageRange lr : expected) {422System.err.println(" range=" + lr.getRange()423+ ", weight=" + lr.getWeight());424}425426System.out.println(" Actual size=" + actualSize);427for (LanguageRange lr : got) {428System.err.println(" range=" + lr.getRange()429+ ", weight=" + lr.getWeight());430}431} else {432for (int i = 0; i < expectedSize; i++) {433LanguageRange lr1 = expected.get(i);434LanguageRange lr2 = got.get(i);435436if (!lr1.getRange().equals(lr2.getRange())437|| lr1.getWeight() != lr2.getWeight()) {438error = true;439System.err.println(" " + i + ": Expected: range=" + lr1.getRange()440+ ", weight=" + lr1.getWeight());441System.err.println(" " + i + ": Actual: range=" + lr2.getRange()442+ ", weight=" + lr2.getWeight());443}444}445}446447return !error;448}449450private static void test_mapEquivalents() {451boolean error = false;452453String ranges = "zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4";454List<LanguageRange> priorityList = LanguageRange.parse(ranges);455HashMap<String, List<String>> map = null;456457try {458List<LanguageRange> list =459LanguageRange.mapEquivalents(priorityList, null);460}461catch (Exception ex) {462error = true;463System.err.println(ex464+ " should not be thrown for mapEquivalents(priorityList, null).");465}466467map = new HashMap<>();468try {469List<LanguageRange> list =470LanguageRange.mapEquivalents(priorityList, map);471}472catch (Exception ex) {473error = true;474System.err.println(ex475+ " should not be thrown for mapEquivalents(priorityList, empty map).");476}477478ArrayList<String> equivalentList = new ArrayList<>();479equivalentList.add("ja");480equivalentList.add("ja-Hira");481map.put("ja", equivalentList);482try {483List<LanguageRange> list = LanguageRange.mapEquivalents(null, map);484error = true;485System.err.println("NPE should be thrown for mapEquivalents(null, map).");486}487catch (NullPointerException ex) {488}489490map = new LinkedHashMap<>();491ArrayList<String> equivalentList1 = new ArrayList<>();492equivalentList1.add("ja");493equivalentList1.add("ja-Hira");494map.put("ja", equivalentList1);495ArrayList<String> equivalentList2 = new ArrayList<>();496equivalentList2.add("zh-Hans");497equivalentList2.add("zh-Hans-CN");498equivalentList2.add("zh-CN");499map.put("zh", equivalentList2);500ArrayList<String> equivalentList3 = new ArrayList<>();501equivalentList3.add("zh-TW");502equivalentList3.add("zh-Hant");503map.put("zh-TW", equivalentList3);504map.put("es", null);505ArrayList<String> equivalentList4 = new ArrayList<>();506map.put("en", equivalentList4);507ArrayList<String> equivalentList5 = new ArrayList<>();508equivalentList5.add("de");509map.put("zh-HK", equivalentList5);510511ArrayList<LanguageRange> expected = new ArrayList<>();512expected.add(new LanguageRange("zh-hans", 1.0));513expected.add(new LanguageRange("zh-hans-cn", 1.0));514expected.add(new LanguageRange("zh-cn", 1.0));515expected.add(new LanguageRange("de", 1.0));516expected.add(new LanguageRange("ar", 0.9));517expected.add(new LanguageRange("zh-tw", 0.8));518expected.add(new LanguageRange("zh-hant", 0.8));519expected.add(new LanguageRange("ja-jp", 0.2));520expected.add(new LanguageRange("ja-hira-jp", 0.2));521List<LanguageRange> got =522LanguageRange.mapEquivalents(priorityList, map);523524if (!areEqual(expected, got)) {525error = true;526}527528if (error) {529err = true;530System.err.println(" test_mapEquivalents() failed.");531} else {532System.out.println(" test_mapEquivalents() passed.");533}534}535536private static void test_filter() {537boolean error = false;538539String ranges = "ja-JP, fr-FR";540String tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";541FilteringMode mode = EXTENDED_FILTERING;542543List<LanguageRange> priorityList = LanguageRange.parse(ranges);544List<Locale> tagList = generateLocales(tags);545String actualLocales =546showLocales(Locale.filter(priorityList, tagList, mode));547String expectedLocales = "ja-JP-hepburn, ja-Latn-JP";548549if (!expectedLocales.equals(actualLocales)) {550error = true;551showErrorMessage("#1 filter(" + mode + ")",552ranges, tags, expectedLocales, actualLocales);553}554555556ranges = "ja-*-JP, fr-FR";557tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";558mode = EXTENDED_FILTERING;559560priorityList = LanguageRange.parse(ranges);561tagList = generateLocales(tags);562actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));563expectedLocales = "ja-JP-hepburn, ja-Latn-JP";564565if (!expectedLocales.equals(actualLocales)) {566error = true;567showErrorMessage("#2 filter(" + mode + ")",568ranges, tags, expectedLocales, actualLocales);569}570571572ranges = "ja-*-JP, fr-FR, de-de;q=0.2";573tags = "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP";574mode = AUTOSELECT_FILTERING;575576priorityList = LanguageRange.parse(ranges);577tagList = generateLocales(tags);578actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));579expectedLocales = "ja-JP-hepburn, ja-Latn-JP, de-DE";580581if (!expectedLocales.equals(actualLocales)) {582error = true;583showErrorMessage("#3 filter(" + mode + ")",584ranges, tags,expectedLocales, actualLocales);585}586587ranges = "ja-JP, fr-FR, de-de;q=0.2";588tags = "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP";589mode = AUTOSELECT_FILTERING;590591priorityList = LanguageRange.parse(ranges);592tagList = generateLocales(tags);593actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));594expectedLocales = "ja-JP-hepburn, de-DE";595596if (!expectedLocales.equals(actualLocales)) {597error = true;598showErrorMessage("#4 filter(" + mode + ")",599ranges, tags, expectedLocales, actualLocales);600}601602603ranges = "en;q=0.2, ja-*-JP, fr-JP";604tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";605mode = IGNORE_EXTENDED_RANGES;606607priorityList = LanguageRange.parse(ranges);608tagList = generateLocales(tags);609actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));610expectedLocales = "en";611612if (!expectedLocales.equals(actualLocales)) {613error = true;614showErrorMessage("#5 filter(" + mode + ")",615ranges, tags, expectedLocales, actualLocales);616}617618619ranges = "en;q=0.2, ja-*-JP, fr-JP";620tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";621mode = MAP_EXTENDED_RANGES;622623priorityList = LanguageRange.parse(ranges);624tagList = generateLocales(tags);625actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));626expectedLocales = "ja-JP-hepburn, en";627628if (!expectedLocales.equals(actualLocales)) {629error = true;630showErrorMessage("#6 filter(" + mode + ")",631ranges, tags, expectedLocales, actualLocales);632}633634635ranges = "en;q=0.2, ja-JP, fr-JP";636tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";637mode = REJECT_EXTENDED_RANGES;638639priorityList = LanguageRange.parse(ranges);640tagList = generateLocales(tags);641actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));642expectedLocales = "ja-JP-hepburn, en";643644if (!expectedLocales.equals(actualLocales)) {645error = true;646showErrorMessage("#7 filter(" + mode + ")",647ranges, tags, expectedLocales, actualLocales);648}649650651ranges = "en;q=0.2, ja-*-JP, fr-JP";652tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";653mode = REJECT_EXTENDED_RANGES;654655priorityList = LanguageRange.parse(ranges);656tagList = generateLocales(tags);657try {658actualLocales =659showLocales(Locale.filter(priorityList, tagList, mode));660error = true;661System.out.println("IAE should be thrown for filter("662+ mode + ").");663}664catch (IllegalArgumentException ex) {665}666667668ranges = "en;q=0.2, ja-*-JP, fr-JP";669tags = null;670mode = REJECT_EXTENDED_RANGES;671672priorityList = LanguageRange.parse(ranges);673tagList = generateLocales(tags);674try {675actualLocales =676showLocales(Locale.filter(priorityList, tagList, mode));677error = true;678System.out.println("NPE should be thrown for filter(tags=null).");679}680catch (NullPointerException ex) {681}682683684ranges = null;685tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";686mode = REJECT_EXTENDED_RANGES;687688try {689priorityList = LanguageRange.parse(ranges);690tagList = generateLocales(tags);691actualLocales =692showLocales(Locale.filter(priorityList, tagList, mode));693error = true;694System.out.println("NPE should be thrown for filter(ranges=null).");695}696catch (NullPointerException ex) {697}698699700ranges = "en;q=0.2, ja-*-JP, fr-JP";701tags = "";702mode = REJECT_EXTENDED_RANGES;703704priorityList = LanguageRange.parse(ranges);705tagList = generateLocales(tags);706try {707actualLocales =708showLocales(Locale.filter(priorityList, tagList, mode));709}710catch (Exception ex) {711error = true;712System.out.println(ex713+ " should not be thrown for filter(" + ranges + ", \"\").");714}715716717if (error) {718err = true;719System.out.println(" test_filter() failed.");720} else {721System.out.println(" test_filter() passed.");722}723}724725private static void test_filterTags() {726boolean error = false;727728String ranges = "en;q=0.2, *;q=0.6, ja";729String tags = "de-DE, en, ja-JP-hepburn, fr-JP, he";730731List<LanguageRange> priorityList = LanguageRange.parse(ranges);732List<String> tagList = generateLanguageTags(tags);733String actualTags =734showLanguageTags(Locale.filterTags(priorityList, tagList));735String expectedTags = tags;736737if (!expectedTags.equals(actualTags)) {738error = true;739showErrorMessage("#1 filterTags()",740ranges, tags, expectedTags, actualTags);741}742743744ranges = "en;q=0.2, ja-JP, fr-JP";745tags = "de-DE, en, ja-JP-hepburn, fr, he";746priorityList = LanguageRange.parse(ranges);747tagList = generateLanguageTags(tags);748actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList));749expectedTags = "ja-jp-hepburn, en";750751if (!expectedTags.equals(actualTags)) {752error = true;753showErrorMessage("#2 filterTags()",754ranges, tags, expectedTags, actualTags);755}756757758ranges = "de-DE";759tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "760+ "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";761FilteringMode mode = MAP_EXTENDED_RANGES;762priorityList = LanguageRange.parse(ranges);763tagList = generateLanguageTags(tags);764actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));765expectedTags = "de-de, de-de-x-goethe";766767if (!expectedTags.equals(actualTags)) {768error = true;769showErrorMessage("#3 filterTags(" + mode + ")",770ranges, tags, expectedTags, actualTags);771}772773774ranges = "de-DE";775tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "776+ "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";777mode = EXTENDED_FILTERING;778priorityList = LanguageRange.parse(ranges);779tagList = generateLanguageTags(tags);780actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));781expectedTags = "de-de, de-latn-de, de-latf-de, de-de-x-goethe, "782+ "de-latn-de-1996, de-deva-de";783784if (!expectedTags.equals(actualTags)) {785error = true;786showErrorMessage("#4 filterTags(" + mode + ")",787ranges, tags, expectedTags, actualTags);788}789790791ranges = "de-*-DE";792tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "793+ "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";794mode = EXTENDED_FILTERING;795priorityList = LanguageRange.parse(ranges);796tagList = generateLanguageTags(tags);797actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));798expectedTags = "de-de, de-latn-de, de-latf-de, de-de-x-goethe, "799+ "de-latn-de-1996, de-deva-de";800801if (!expectedTags.equals(actualTags)) {802error = true;803showErrorMessage("#5 filterTags(" + mode + ")",804ranges, tags, expectedTags, actualTags);805}806807if (error) {808err = true;809System.out.println(" test_filterTags() failed.");810} else {811System.out.println(" test_filterTags() passed.");812}813}814815private static void test_lookup() {816boolean error = false;817818String ranges = "en;q=0.2, *-JP;q=0.6, iw";819String tags = "de-DE, en, ja-JP-hepburn, fr-JP, he";820List<LanguageRange> priorityList = LanguageRange.parse(ranges);821List<Locale> localeList = generateLocales(tags);822String actualLocale =823Locale.lookup(priorityList, localeList).toLanguageTag();824String expectedLocale ="he";825826if (!expectedLocale.equals(actualLocale)) {827error = true;828showErrorMessage("#1 lookup()", ranges, tags, expectedLocale, actualLocale);829}830831832ranges = "en;q=0.2, *-JP;q=0.6, iw";833tags = "de-DE, he-IL, en, iw";834priorityList = LanguageRange.parse(ranges);835localeList = generateLocales(tags);836actualLocale = Locale.lookup(priorityList, localeList).toLanguageTag();837expectedLocale = "he";838839if (!expectedLocale.equals(actualLocale)) {840error = true;841showErrorMessage("#2 lookup()", ranges, tags, expectedLocale, actualLocale);842}843844845ranges = "en;q=0.2, ja-*-JP-x-foo;q=0.6, iw";846tags = "de-DE, fr, en, ja-Latn-JP";847priorityList = LanguageRange.parse(ranges);848localeList = generateLocales(tags);849actualLocale = Locale.lookup(priorityList, localeList).toLanguageTag();850expectedLocale = "ja-Latn-JP";851852if (!expectedLocale.equals(actualLocale)) {853error = true;854showErrorMessage("#3 lookup()", ranges, tags, expectedLocale, actualLocale);855}856857if (error) {858err = true;859System.out.println(" test_lookup() failed.");860} else {861System.out.println(" test_lookup() passed.");862}863}864865private static void test_lookupTag() {866boolean error = false;867868String ranges = "en, *";869String tags = "es, de, ja-JP";870List<LanguageRange> priorityList = LanguageRange.parse(ranges);871List<String> tagList = generateLanguageTags(tags);872String actualTag = Locale.lookupTag(priorityList, tagList);873String expectedTag = null;874875if (actualTag != null) {876error = true;877showErrorMessage("#1 lookupTag()", ranges, tags, expectedTag, actualTag);878}879880881ranges= "en;q=0.2, *-JP";882tags = "de-DE, en, ja-JP-hepburn, fr-JP, en-JP";883priorityList = LanguageRange.parse(ranges);884tagList = generateLanguageTags(tags);885actualTag = Locale.lookupTag(priorityList, tagList);886expectedTag = "fr-jp";887888if (!expectedTag.equals(actualTag)) {889error = true;890showErrorMessage("#2 lookupTag()", ranges, tags, expectedTag, actualTag);891}892893894ranges = "en;q=0.2, ar-MO, iw";895tags = "de-DE, he, fr-JP";896priorityList = LanguageRange.parse(ranges);897tagList = generateLanguageTags(tags);898actualTag = Locale.lookupTag(priorityList, tagList);899expectedTag = "he";900901if (!expectedTag.equals(actualTag)) {902error = true;903showErrorMessage("#3 lookupTag()", ranges, tags, expectedTag, actualTag);904}905906907ranges = "en;q=0.2, ar-MO, he";908tags = "de-DE, iw, fr-JP";909priorityList = LanguageRange.parse(ranges);910tagList = generateLanguageTags(tags);911actualTag = Locale.lookupTag(priorityList, tagList);912expectedTag = "iw";913914if (!expectedTag.equals(actualTag)) {915error = true;916showErrorMessage("#4 lookupTag()", ranges, tags, expectedTag, actualTag);917}918919if (error) {920err = true;921System.out.println(" test_lookupTag() failed.");922} else {923System.out.println(" test_lookupTag() passed.");924}925}926927private static List<Locale> generateLocales(String tags) {928if (tags == null) {929return null;930}931932List<Locale> localeList = new ArrayList<>();933if (tags.equals("")) {934return localeList;935}936String[] t = tags.split(", ");937for (String tag : t) {938localeList.add(Locale.forLanguageTag(tag));939}940return localeList;941}942943private static List<String> generateLanguageTags(String tags) {944List<String> tagList = new ArrayList<>();945String[] t = tags.split(", ");946for (String tag : t) {947tagList.add(tag);948}949return tagList;950}951952private static String showPriorityList(List<LanguageRange> priorityList) {953StringBuilder sb = new StringBuilder();954955Iterator<LanguageRange> itr = priorityList.iterator();956LanguageRange lr;957if (itr.hasNext()) {958lr = itr.next();959sb.append(lr.getRange());960sb.append(";q=");961sb.append(lr.getWeight());962}963while (itr.hasNext()) {964sb.append(", ");965lr = itr.next();966sb.append(lr.getRange());967sb.append(";q=");968sb.append(lr.getWeight());969}970971return sb.toString();972}973974private static String showLanguageTags(List<String> tags) {975StringBuilder sb = new StringBuilder();976977Iterator<String> itr = tags.iterator();978if (itr.hasNext()) {979sb.append(itr.next());980}981while (itr.hasNext()) {982sb.append(", ");983sb.append(itr.next());984}985986return sb.toString().trim();987}988989private static String showLocales(List<Locale> locales) {990StringBuilder sb = new StringBuilder();991992Iterator<Locale> itr = locales.iterator();993if (itr.hasNext()) {994sb.append(itr.next().toLanguageTag());995}996while (itr.hasNext()) {997sb.append(", ");998sb.append(itr.next().toLanguageTag());999}10001001return sb.toString().trim();1002}10031004private static void showErrorMessage(String methodName,1005String priorityList,1006String tags,1007String expectedTags,1008String actualTags) {1009System.out.println("\nIncorrect " + methodName + " result.");1010System.out.println(" Priority list : " + priorityList);1011System.out.println(" Language tags : " + tags);1012System.out.println(" Expected value : " + expectedTags);1013System.out.println(" Actual value : " + actualTags);1014}10151016}101710181019