blob: 6313d8b0f7d3cf4f6199ca427be5ee754dd23e11 [file] [log] [blame]
/*
* Copyright (c) 2014, 2017, 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 7069824 8042360 8032842 8175539
* @summary Verify implementation for Locale matching.
* @run main Bug7069824
*/
import java.util.*;
import java.util.Locale.*;
import static java.util.Locale.FilteringMode.*;
import static java.util.Locale.LanguageRange.*;
public class Bug7069824 {
static boolean err = false;
public static void main(String[] args) {
testLanguageRange();
testLocale();
if (err) {
throw new RuntimeException("Failed.");
}
}
private static void testLanguageRange() {
System.out.println("Test LanguageRange class...");
testConstants();
testConstructors();
testMethods();
}
private static void testLocale() {
System.out.println("Test Locale class...");
test_filter();
test_filterTags();
test_lookup();
test_lookupTag();
}
private static void testConstants() {
boolean error = false;
if (MIN_WEIGHT != 0.0) {
error = true;
System.err.println(" MIN_WEIGHT should be 0.0 but got "
+ MIN_WEIGHT);
}
if (MAX_WEIGHT != 1.0) {
error = true;
System.err.println(" MAX_WEIGHT should be 1.0 but got "
+ MAX_WEIGHT);
}
if (error) {
err = true;
System.err.println(" testConstants() failed.");
} else {
System.out.println(" testConstants() passed.");
}
}
private static void testConstructors() {
boolean error = false;
LanguageRange lr;
String range;
double weight;
// Testcase for 8042360
range = "en-Latn-1234567890";
try {
lr = new LanguageRange(range);
error = true;
System.err.println(" IAE should be thrown for LanguageRange("
+ range + ").");
}
catch (IllegalArgumentException ex) {
}
range = null;
try {
lr = new LanguageRange(range);
error = true;
System.err.println(" NPE should be thrown for LanguageRange("
+ range + ").");
}
catch (NullPointerException ex) {
}
range = null;
weight = 0.8;
try {
lr = new LanguageRange(range, weight);
error = true;
System.err.println(" NPE should be thrown for LanguageRange("
+ range + ", " + weight + ").");
}
catch (NullPointerException ex) {
}
range = "elvish";
try {
lr = new LanguageRange(range);
}
catch (Exception ex) {
error = true;
System.err.println(" " + ex
+ " should not be thrown for LanguageRange(" + range + ").");
}
range = "de-DE";
try {
lr = new LanguageRange(range);
}
catch (Exception ex) {
error = true;
System.err.println(" " + ex
+ " should not be thrown for LanguageRange(" + range + ").");
}
range = "ar";
weight = 0.8;
try {
lr = new LanguageRange(range, weight);
}
catch (Exception ex) {
error = true;
System.err.println(" " + ex
+ " should not be thrown for LanguageRange(" + range + ", "
+ weight + ").");
}
range = "ja";
weight = -0.8;
try {
lr = new LanguageRange(range, weight);
error = true;
System.err.println(" IAE should be thrown for LanguageRange("
+ range + ", " + weight + ").");
}
catch (IllegalArgumentException ex) {
}
range = "Elvish";
weight = 3.0;
try {
lr = new LanguageRange(range, weight);
error = true;
System.err.println(" IAE should be thrown for LanguageRange("
+ range + ", " + weight + ").");
}
catch (IllegalArgumentException ex) {
}
String[] illformedRanges = {"-ja", "ja--JP", "en-US-", "a4r", "ar*",
"ar-*EG", "", "abcdefghijklmn", "ja-J=", "ja-opqrstuvwxyz"};
for (String r : illformedRanges) {
try {
lr = new LanguageRange(r);
error = true;
System.err.println(" IAE should be thrown for LanguageRange("
+ r + ").");
}
catch (IllegalArgumentException ex) {
}
}
if (error) {
err = true;
System.err.println(" testConstructors() failed.");
} else {
System.out.println(" testConstructors() passed.");
}
}
private static void testMethods() {
test_getRange();
test_getWeight();
test_equals();
test_parse();
test_mapEquivalents();
}
private static void test_getRange() {
boolean error = false;
String range = "ja";
double weight = 0.5;
LanguageRange lr = new LanguageRange(range, weight);
if (!lr.getRange().equals(range)) {
error = true;
System.err.println(" LanguageRange.getRange() returned unexpected value. Expected: "
+ range + ", got: " + lr.getRange());
}
range = "en-US";
weight = 0.5;
lr = new LanguageRange(range, weight);
if (!lr.getRange().equals(range.toLowerCase())) {
error = true;
System.err.println(" LanguageRange.getRange() returned unexpected value. Expected: "
+ range + ", got: " + lr.getRange());
}
if (error) {
err = true;
System.err.println(" test_getRange() failed.");
} else {
System.out.println(" test_getRange() passed.");
}
}
private static void test_getWeight() {
boolean error = false;
String range = "ja";
double weight = 0.5;
LanguageRange lr = new LanguageRange(range, weight);
if (lr.getWeight() != weight) {
error = true;
System.err.println(" LanguageRange.getWeight() returned unexpected value. Expected: "
+ weight + ", got: " + lr.getWeight());
}
range = "ja";
weight = MAX_WEIGHT; // default
lr = new LanguageRange(range);
if (!lr.getRange().equals(range) || lr.getWeight() != MAX_WEIGHT) {
error = true;
System.err.println(" LanguageRange.getWeight() returned unexpected value. Expected: "
+ weight + ", got: " + lr.getWeight());
}
if (error) {
err = true;
System.err.println(" test_getWeight() failed.");
} else {
System.out.println(" test_getWeight() passed.");
}
}
private static void test_equals() {
boolean error = false;
LanguageRange lr1 = new LanguageRange("ja", 1.0);
LanguageRange lr2 = new LanguageRange("ja");
LanguageRange lr3 = new LanguageRange("ja", 0.1);
LanguageRange lr4 = new LanguageRange("en", 1.0);
if (!lr1.equals(lr2)) {
error = true;
System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(ja)) should return true.");
}
if (lr1.equals(lr3)) {
error = true;
System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(ja, 0.1)) should return false.");
}
if (lr1.equals(lr4)) {
error = true;
System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(en, 1.0)) should return false.");
}
if (lr1.equals(null)) {
error = true;
System.err.println(" LanguageRange(LR(ja, 1.0)).equals(null) should return false.");
}
if (lr1.equals("")) {
error = true;
System.err.println(" LanguageRange(LR(ja, 1.0)).equals(\"\") should return false.");
}
if (error) {
err = true;
System.err.println(" test_equals() failed.");
} else {
System.out.println(" test_equals() passed.");
}
}
private static void test_parse() {
boolean error = false;
List<LanguageRange> list;
String str = null;
try {
list = LanguageRange.parse(str);
error = true;
System.err.println(" NPE should be thrown for parse("
+ str + ").");
}
catch (NullPointerException ex) {
}
str = "";
try {
list = LanguageRange.parse("");
error = true;
System.err.println(" IAE should be thrown for parse("
+ str + ").");
}
catch (IllegalArgumentException ex) {
}
str = "ja;q=3";
try {
list = LanguageRange.parse(str);
error = true;
System.err.println("IAE should be thrown for parse("
+ str + ").");
}
catch (IllegalArgumentException ex) {
}
str = "Accept-Language: fr-FX,de-DE;q=0.5, fr-tp-x-FOO;q=0.1,"
+ "en-X-tp;q=0.6,en-FR;q=.7,de-de;q=0.8, iw;q=0.4, "
+ "he;q=0.4, de-de;q=0.5,ja, in-tpp, in-tp;q=0.2";
ArrayList<LanguageRange> expected = new ArrayList<>();
expected.add(new LanguageRange("fr-fx", 1.0));
expected.add(new LanguageRange("fr-fr", 1.0));
expected.add(new LanguageRange("ja", 1.0));
expected.add(new LanguageRange("in-tpp", 1.0));
expected.add(new LanguageRange("id-tpp", 1.0));
expected.add(new LanguageRange("en-fr", 0.7));
expected.add(new LanguageRange("en-fx", 0.7));
expected.add(new LanguageRange("en-x-tp", 0.6));
expected.add(new LanguageRange("de-de", 0.5));
expected.add(new LanguageRange("de-dd", 0.5));
expected.add(new LanguageRange("iw", 0.4));
expected.add(new LanguageRange("he", 0.4));
expected.add(new LanguageRange("in-tp", 0.2));
expected.add(new LanguageRange("id-tl", 0.2));
expected.add(new LanguageRange("id-tp", 0.2));
expected.add(new LanguageRange("in-tl", 0.2));
expected.add(new LanguageRange("fr-tp-x-foo", 0.1));
expected.add(new LanguageRange("fr-tl-x-foo", 0.1));
List<LanguageRange> got = LanguageRange.parse(str);
if (!areEqual(expected, got)) {
error = true;
System.err.println(" #1 parse() test failed.");
}
str = "Accept-Language: hak-CN;q=0.8, no-bok-NO;q=0.9, no-nyn, cmn-CN;q=0.1";
expected = new ArrayList<>();
expected.add(new LanguageRange("no-nyn", 1.0));
expected.add(new LanguageRange("nn", 1.0));
expected.add(new LanguageRange("no-bok-no", 0.9));
expected.add(new LanguageRange("nb-no", 0.9));
expected.add(new LanguageRange("hak-CN", 0.8));
expected.add(new LanguageRange("zh-hakka-CN", 0.8));
expected.add(new LanguageRange("i-hak-CN", 0.8));
expected.add(new LanguageRange("cmn-CN", 0.1));
expected.add(new LanguageRange("zh-cmn-CN", 0.1));
expected.add(new LanguageRange("zh-guoyu-CN", 0.1));
got = LanguageRange.parse(str);
if (!areEqual(expected, got)) {
error = true;
System.err.println(" #2 parse() test failed.");
}
str = "Accept-Language: rki;q=0.4, no-bok-NO;q=0.9, ccq;q=0.5";
expected = new ArrayList<>();
expected.add(new LanguageRange("no-bok-no", 0.9));
expected.add(new LanguageRange("nb-no", 0.9));
expected.add(new LanguageRange("rki", 0.4));
expected.add(new LanguageRange("ybd", 0.4));
expected.add(new LanguageRange("ccq", 0.4));
got = LanguageRange.parse(str);
if (!areEqual(expected, got)) {
error = true;
System.err.println(" #3 parse() test failed.");
}
if (error) {
err = true;
System.err.println(" test_parse() failed.");
} else {
System.out.println(" test_parse() passed.");
}
}
private static boolean areEqual(List<LanguageRange> expected,
List<LanguageRange> got) {
boolean error = false;
int expectedSize = expected.size();
int actualSize = got.size();
if (expectedSize != actualSize) {
error = true;
System.err.println(" Expected size=" + expectedSize);
for (LanguageRange lr : expected) {
System.err.println(" range=" + lr.getRange()
+ ", weight=" + lr.getWeight());
}
System.out.println(" Actual size=" + actualSize);
for (LanguageRange lr : got) {
System.err.println(" range=" + lr.getRange()
+ ", weight=" + lr.getWeight());
}
} else {
for (int i = 0; i < expectedSize; i++) {
LanguageRange lr1 = expected.get(i);
LanguageRange lr2 = got.get(i);
if (!lr1.getRange().equals(lr2.getRange())
|| lr1.getWeight() != lr2.getWeight()) {
error = true;
System.err.println(" " + i + ": Expected: range=" + lr1.getRange()
+ ", weight=" + lr1.getWeight());
System.err.println(" " + i + ": Actual: range=" + lr2.getRange()
+ ", weight=" + lr2.getWeight());
}
}
}
return !error;
}
private static void test_mapEquivalents() {
boolean error = false;
String ranges = "zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4";
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
HashMap<String, List<String>> map = null;
try {
List<LanguageRange> list =
LanguageRange.mapEquivalents(priorityList, null);
}
catch (Exception ex) {
error = true;
System.err.println(ex
+ " should not be thrown for mapEquivalents(priorityList, null).");
}
map = new HashMap<>();
try {
List<LanguageRange> list =
LanguageRange.mapEquivalents(priorityList, map);
}
catch (Exception ex) {
error = true;
System.err.println(ex
+ " should not be thrown for mapEquivalents(priorityList, empty map).");
}
ArrayList<String> equivalentList = new ArrayList<>();
equivalentList.add("ja");
equivalentList.add("ja-Hira");
map.put("ja", equivalentList);
try {
List<LanguageRange> list = LanguageRange.mapEquivalents(null, map);
error = true;
System.err.println("NPE should be thrown for mapEquivalents(null, map).");
}
catch (NullPointerException ex) {
}
map = new LinkedHashMap<>();
ArrayList<String> equivalentList1 = new ArrayList<>();
equivalentList1.add("ja");
equivalentList1.add("ja-Hira");
map.put("ja", equivalentList1);
ArrayList<String> equivalentList2 = new ArrayList<>();
equivalentList2.add("zh-Hans");
equivalentList2.add("zh-Hans-CN");
equivalentList2.add("zh-CN");
map.put("zh", equivalentList2);
ArrayList<String> equivalentList3 = new ArrayList<>();
equivalentList3.add("zh-TW");
equivalentList3.add("zh-Hant");
map.put("zh-TW", equivalentList3);
map.put("es", null);
ArrayList<String> equivalentList4 = new ArrayList<>();
map.put("en", equivalentList4);
ArrayList<String> equivalentList5 = new ArrayList<>();
equivalentList5.add("de");
map.put("zh-HK", equivalentList5);
ArrayList<LanguageRange> expected = new ArrayList<>();
expected.add(new LanguageRange("zh-hans", 1.0));
expected.add(new LanguageRange("zh-hans-cn", 1.0));
expected.add(new LanguageRange("zh-cn", 1.0));
expected.add(new LanguageRange("de", 1.0));
expected.add(new LanguageRange("ar", 0.9));
expected.add(new LanguageRange("zh-tw", 0.8));
expected.add(new LanguageRange("zh-hant", 0.8));
expected.add(new LanguageRange("ja-jp", 0.2));
expected.add(new LanguageRange("ja-hira-jp", 0.2));
List<LanguageRange> got =
LanguageRange.mapEquivalents(priorityList, map);
if (!areEqual(expected, got)) {
error = true;
}
if (error) {
err = true;
System.err.println(" test_mapEquivalents() failed.");
} else {
System.out.println(" test_mapEquivalents() passed.");
}
}
private static void test_filter() {
boolean error = false;
String ranges = "ja-JP, fr-FR";
String tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
FilteringMode mode = EXTENDED_FILTERING;
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
List<Locale> tagList = generateLocales(tags);
String actualLocales =
showLocales(Locale.filter(priorityList, tagList, mode));
String expectedLocales = "ja-JP-hepburn, ja-Latn-JP";
if (!expectedLocales.equals(actualLocales)) {
error = true;
showErrorMessage("#1 filter(" + mode + ")",
ranges, tags, expectedLocales, actualLocales);
}
ranges = "ja-*-JP, fr-FR";
tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
mode = EXTENDED_FILTERING;
priorityList = LanguageRange.parse(ranges);
tagList = generateLocales(tags);
actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
expectedLocales = "ja-JP-hepburn, ja-Latn-JP";
if (!expectedLocales.equals(actualLocales)) {
error = true;
showErrorMessage("#2 filter(" + mode + ")",
ranges, tags, expectedLocales, actualLocales);
}
ranges = "ja-*-JP, fr-FR, de-de;q=0.2";
tags = "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP";
mode = AUTOSELECT_FILTERING;
priorityList = LanguageRange.parse(ranges);
tagList = generateLocales(tags);
actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
expectedLocales = "ja-JP-hepburn, ja-Latn-JP, de-DE";
if (!expectedLocales.equals(actualLocales)) {
error = true;
showErrorMessage("#3 filter(" + mode + ")",
ranges, tags,expectedLocales, actualLocales);
}
ranges = "ja-JP, fr-FR, de-de;q=0.2";
tags = "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP";
mode = AUTOSELECT_FILTERING;
priorityList = LanguageRange.parse(ranges);
tagList = generateLocales(tags);
actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
expectedLocales = "ja-JP-hepburn, de-DE";
if (!expectedLocales.equals(actualLocales)) {
error = true;
showErrorMessage("#4 filter(" + mode + ")",
ranges, tags, expectedLocales, actualLocales);
}
ranges = "en;q=0.2, ja-*-JP, fr-JP";
tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
mode = IGNORE_EXTENDED_RANGES;
priorityList = LanguageRange.parse(ranges);
tagList = generateLocales(tags);
actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
expectedLocales = "en";
if (!expectedLocales.equals(actualLocales)) {
error = true;
showErrorMessage("#5 filter(" + mode + ")",
ranges, tags, expectedLocales, actualLocales);
}
ranges = "en;q=0.2, ja-*-JP, fr-JP";
tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
mode = MAP_EXTENDED_RANGES;
priorityList = LanguageRange.parse(ranges);
tagList = generateLocales(tags);
actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
expectedLocales = "ja-JP-hepburn, en";
if (!expectedLocales.equals(actualLocales)) {
error = true;
showErrorMessage("#6 filter(" + mode + ")",
ranges, tags, expectedLocales, actualLocales);
}
ranges = "en;q=0.2, ja-JP, fr-JP";
tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
mode = REJECT_EXTENDED_RANGES;
priorityList = LanguageRange.parse(ranges);
tagList = generateLocales(tags);
actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
expectedLocales = "ja-JP-hepburn, en";
if (!expectedLocales.equals(actualLocales)) {
error = true;
showErrorMessage("#7 filter(" + mode + ")",
ranges, tags, expectedLocales, actualLocales);
}
ranges = "en;q=0.2, ja-*-JP, fr-JP";
tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
mode = REJECT_EXTENDED_RANGES;
priorityList = LanguageRange.parse(ranges);
tagList = generateLocales(tags);
try {
actualLocales =
showLocales(Locale.filter(priorityList, tagList, mode));
error = true;
System.out.println("IAE should be thrown for filter("
+ mode + ").");
}
catch (IllegalArgumentException ex) {
}
ranges = "en;q=0.2, ja-*-JP, fr-JP";
tags = null;
mode = REJECT_EXTENDED_RANGES;
priorityList = LanguageRange.parse(ranges);
tagList = generateLocales(tags);
try {
actualLocales =
showLocales(Locale.filter(priorityList, tagList, mode));
error = true;
System.out.println("NPE should be thrown for filter(tags=null).");
}
catch (NullPointerException ex) {
}
ranges = null;
tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
mode = REJECT_EXTENDED_RANGES;
try {
priorityList = LanguageRange.parse(ranges);
tagList = generateLocales(tags);
actualLocales =
showLocales(Locale.filter(priorityList, tagList, mode));
error = true;
System.out.println("NPE should be thrown for filter(ranges=null).");
}
catch (NullPointerException ex) {
}
ranges = "en;q=0.2, ja-*-JP, fr-JP";
tags = "";
mode = REJECT_EXTENDED_RANGES;
priorityList = LanguageRange.parse(ranges);
tagList = generateLocales(tags);
try {
actualLocales =
showLocales(Locale.filter(priorityList, tagList, mode));
}
catch (Exception ex) {
error = true;
System.out.println(ex
+ " should not be thrown for filter(" + ranges + ", \"\").");
}
if (error) {
err = true;
System.out.println(" test_filter() failed.");
} else {
System.out.println(" test_filter() passed.");
}
}
private static void test_filterTags() {
boolean error = false;
String ranges = "en;q=0.2, *;q=0.6, ja";
String tags = "de-DE, en, ja-JP-hepburn, fr-JP, he";
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
List<String> tagList = generateLanguageTags(tags);
String actualTags =
showLanguageTags(Locale.filterTags(priorityList, tagList));
String expectedTags = tags;
if (!expectedTags.equals(actualTags)) {
error = true;
showErrorMessage("#1 filterTags()",
ranges, tags, expectedTags, actualTags);
}
ranges = "en;q=0.2, ja-JP, fr-JP";
tags = "de-DE, en, ja-JP-hepburn, fr, he";
priorityList = LanguageRange.parse(ranges);
tagList = generateLanguageTags(tags);
actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList));
expectedTags = "ja-JP-hepburn, en";
if (!expectedTags.equals(actualTags)) {
error = true;
showErrorMessage("#2 filterTags()",
ranges, tags, expectedTags, actualTags);
}
ranges = "de-DE";
tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+ "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";
FilteringMode mode = MAP_EXTENDED_RANGES;
priorityList = LanguageRange.parse(ranges);
tagList = generateLanguageTags(tags);
actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));
expectedTags = "de-DE, de-DE-x-goethe";
if (!expectedTags.equals(actualTags)) {
error = true;
showErrorMessage("#3 filterTags(" + mode + ")",
ranges, tags, expectedTags, actualTags);
}
ranges = "de-DE";
tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+ "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";
mode = EXTENDED_FILTERING;
priorityList = LanguageRange.parse(ranges);
tagList = generateLanguageTags(tags);
actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));
expectedTags = "de-DE, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+ "de-Latn-DE-1996, de-Deva-DE";
if (!expectedTags.equals(actualTags)) {
error = true;
showErrorMessage("#4 filterTags(" + mode + ")",
ranges, tags, expectedTags, actualTags);
}
ranges = "de-*-DE";
tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+ "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";
mode = EXTENDED_FILTERING;
priorityList = LanguageRange.parse(ranges);
tagList = generateLanguageTags(tags);
actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));
expectedTags = "de-DE, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+ "de-Latn-DE-1996, de-Deva-DE";
if (!expectedTags.equals(actualTags)) {
error = true;
showErrorMessage("#5 filterTags(" + mode + ")",
ranges, tags, expectedTags, actualTags);
}
if (error) {
err = true;
System.out.println(" test_filterTags() failed.");
} else {
System.out.println(" test_filterTags() passed.");
}
}
private static void test_lookup() {
boolean error = false;
String ranges = "en;q=0.2, *-JP;q=0.6, iw";
String tags = "de-DE, en, ja-JP-hepburn, fr-JP, he";
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
List<Locale> localeList = generateLocales(tags);
String actualLocale =
Locale.lookup(priorityList, localeList).toLanguageTag();
String expectedLocale ="he";
if (!expectedLocale.equals(actualLocale)) {
error = true;
showErrorMessage("#1 lookup()", ranges, tags, expectedLocale, actualLocale);
}
ranges = "en;q=0.2, *-JP;q=0.6, iw";
tags = "de-DE, he-IL, en, iw";
priorityList = LanguageRange.parse(ranges);
localeList = generateLocales(tags);
actualLocale = Locale.lookup(priorityList, localeList).toLanguageTag();
expectedLocale = "he";
if (!expectedLocale.equals(actualLocale)) {
error = true;
showErrorMessage("#2 lookup()", ranges, tags, expectedLocale, actualLocale);
}
ranges = "en;q=0.2, ja-*-JP-x-foo;q=0.6, iw";
tags = "de-DE, fr, en, ja-Latn-JP";
priorityList = LanguageRange.parse(ranges);
localeList = generateLocales(tags);
actualLocale = Locale.lookup(priorityList, localeList).toLanguageTag();
expectedLocale = "ja-Latn-JP";
if (!expectedLocale.equals(actualLocale)) {
error = true;
showErrorMessage("#3 lookup()", ranges, tags, expectedLocale, actualLocale);
}
if (error) {
err = true;
System.out.println(" test_lookup() failed.");
} else {
System.out.println(" test_lookup() passed.");
}
}
private static void test_lookupTag() {
boolean error = false;
String ranges = "en, *";
String tags = "es, de, ja-JP";
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
List<String> tagList = generateLanguageTags(tags);
String actualTag = Locale.lookupTag(priorityList, tagList);
String expectedTag = null;
if (actualTag != null) {
error = true;
showErrorMessage("#1 lookupTag()", ranges, tags, expectedTag, actualTag);
}
ranges= "en;q=0.2, *-JP";
tags = "de-DE, en, ja-JP-hepburn, fr-JP, en-JP";
priorityList = LanguageRange.parse(ranges);
tagList = generateLanguageTags(tags);
actualTag = Locale.lookupTag(priorityList, tagList);
expectedTag = "fr-JP";
if (!expectedTag.equals(actualTag)) {
error = true;
showErrorMessage("#2 lookupTag()", ranges, tags, expectedTag, actualTag);
}
ranges = "en;q=0.2, ar-MO, iw";
tags = "de-DE, he, fr-JP";
priorityList = LanguageRange.parse(ranges);
tagList = generateLanguageTags(tags);
actualTag = Locale.lookupTag(priorityList, tagList);
expectedTag = "he";
if (!expectedTag.equals(actualTag)) {
error = true;
showErrorMessage("#3 lookupTag()", ranges, tags, expectedTag, actualTag);
}
ranges = "en;q=0.2, ar-MO, he";
tags = "de-DE, iw, fr-JP";
priorityList = LanguageRange.parse(ranges);
tagList = generateLanguageTags(tags);
actualTag = Locale.lookupTag(priorityList, tagList);
expectedTag = "iw";
if (!expectedTag.equals(actualTag)) {
error = true;
showErrorMessage("#4 lookupTag()", ranges, tags, expectedTag, actualTag);
}
if (error) {
err = true;
System.out.println(" test_lookupTag() failed.");
} else {
System.out.println(" test_lookupTag() passed.");
}
}
private static List<Locale> generateLocales(String tags) {
if (tags == null) {
return null;
}
List<Locale> localeList = new ArrayList<>();
if (tags.equals("")) {
return localeList;
}
String[] t = tags.split(", ");
for (String tag : t) {
localeList.add(Locale.forLanguageTag(tag));
}
return localeList;
}
private static List<String> generateLanguageTags(String tags) {
List<String> tagList = new ArrayList<>();
String[] t = tags.split(", ");
for (String tag : t) {
tagList.add(tag);
}
return tagList;
}
private static String showPriorityList(List<LanguageRange> priorityList) {
StringBuilder sb = new StringBuilder();
Iterator<LanguageRange> itr = priorityList.iterator();
LanguageRange lr;
if (itr.hasNext()) {
lr = itr.next();
sb.append(lr.getRange());
sb.append(";q=");
sb.append(lr.getWeight());
}
while (itr.hasNext()) {
sb.append(", ");
lr = itr.next();
sb.append(lr.getRange());
sb.append(";q=");
sb.append(lr.getWeight());
}
return sb.toString();
}
private static String showLanguageTags(List<String> tags) {
StringBuilder sb = new StringBuilder();
Iterator<String> itr = tags.iterator();
if (itr.hasNext()) {
sb.append(itr.next());
}
while (itr.hasNext()) {
sb.append(", ");
sb.append(itr.next());
}
return sb.toString().trim();
}
private static String showLocales(List<Locale> locales) {
StringBuilder sb = new StringBuilder();
Iterator<Locale> itr = locales.iterator();
if (itr.hasNext()) {
sb.append(itr.next().toLanguageTag());
}
while (itr.hasNext()) {
sb.append(", ");
sb.append(itr.next().toLanguageTag());
}
return sb.toString().trim();
}
private static void showErrorMessage(String methodName,
String priorityList,
String tags,
String expectedTags,
String actualTags) {
System.out.println("\nIncorrect " + methodName + " result.");
System.out.println(" Priority list : " + priorityList);
System.out.println(" Language tags : " + tags);
System.out.println(" Expected value : " + expectedTags);
System.out.println(" Actual value : " + actualTags);
}
}