1 /* 2 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 8040211 8191404 8203872 27 * @summary Checks the IANA language subtag registry data update 28 * (LSR Revision: 2018-04-23) with Locale and Locale.LanguageRange 29 * class methods. 30 * @run main Bug8040211 31 */ 32 33 import java.util.ArrayList; 34 import java.util.Iterator; 35 import java.util.Locale; 36 import java.util.List; 37 import java.util.Locale.LanguageRange; 38 import java.util.Locale.FilteringMode; 39 import static java.util.Locale.FilteringMode.EXTENDED_FILTERING; 40 41 public class Bug8040211 { 42 43 static boolean err = false; 44 45 public static void main(String[] args) { 46 testLanguageRange(); 47 testLocale(); 48 49 if (err) { 50 throw new RuntimeException("Failed."); 51 } 52 } 53 54 private static void testLanguageRange() { 55 System.out.println("Test LanguageRange class parse method..."); 56 test_parse(); 57 } 58 59 private static void testLocale() { 60 System.out.println("Test Locale class methods..."); 61 test_filter(); 62 test_filterTags(); 63 test_lookup(); 64 test_lookupTag(); 65 } 66 67 private static void test_parse() { 68 boolean error = false; 69 String str = "Accept-Language: aam, adp, aue, bcg, cqu, ema," 70 + " en-gb-oed, gti, kdz, koj, kwq, kxe, lii, lmm, mtm, ngv," 71 + " oyb, phr, pub, suj, taj;q=0.9, ar-hyw;q=0.8, yug;q=0.5, gfx;q=0.4"; 72 ArrayList<LanguageRange> expected = new ArrayList<>(); 73 expected.add(new LanguageRange("aam", 1.0)); 74 expected.add(new LanguageRange("aas", 1.0)); 75 expected.add(new LanguageRange("adp", 1.0)); 76 expected.add(new LanguageRange("dz", 1.0)); 77 expected.add(new LanguageRange("aue", 1.0)); 78 expected.add(new LanguageRange("ktz", 1.0)); 79 expected.add(new LanguageRange("bcg", 1.0)); 80 expected.add(new LanguageRange("bgm", 1.0)); 81 expected.add(new LanguageRange("cqu", 1.0)); 82 expected.add(new LanguageRange("quh", 1.0)); 83 expected.add(new LanguageRange("ema", 1.0)); 84 expected.add(new LanguageRange("uok", 1.0)); 85 expected.add(new LanguageRange("en-gb-oed", 1.0)); 86 expected.add(new LanguageRange("en-gb-oxendict", 1.0)); 87 expected.add(new LanguageRange("gti", 1.0)); 88 expected.add(new LanguageRange("nyc", 1.0)); 89 expected.add(new LanguageRange("kdz", 1.0)); 90 expected.add(new LanguageRange("ncp", 1.0)); 91 expected.add(new LanguageRange("koj", 1.0)); 92 expected.add(new LanguageRange("kwv", 1.0)); 93 expected.add(new LanguageRange("kwq", 1.0)); 94 expected.add(new LanguageRange("yam", 1.0)); 95 expected.add(new LanguageRange("kxe", 1.0)); 96 expected.add(new LanguageRange("tvd", 1.0)); 97 expected.add(new LanguageRange("lii", 1.0)); 98 expected.add(new LanguageRange("raq", 1.0)); 99 expected.add(new LanguageRange("lmm", 1.0)); 100 expected.add(new LanguageRange("rmx", 1.0)); 101 expected.add(new LanguageRange("mtm", 1.0)); 102 expected.add(new LanguageRange("ymt", 1.0)); 103 expected.add(new LanguageRange("ngv", 1.0)); 104 expected.add(new LanguageRange("nnx", 1.0)); 105 expected.add(new LanguageRange("oyb", 1.0)); 106 expected.add(new LanguageRange("thx", 1.0)); 107 expected.add(new LanguageRange("skk", 1.0)); 108 expected.add(new LanguageRange("jeg", 1.0)); 109 expected.add(new LanguageRange("phr", 1.0)); 110 expected.add(new LanguageRange("pmu", 1.0)); 111 expected.add(new LanguageRange("pub", 1.0)); 112 expected.add(new LanguageRange("puz", 1.0)); 113 expected.add(new LanguageRange("suj", 1.0)); 114 expected.add(new LanguageRange("xsj", 1.0)); 115 expected.add(new LanguageRange("taj", 0.9)); 116 expected.add(new LanguageRange("tsf", 0.9)); 117 expected.add(new LanguageRange("ar-hyw", 0.8)); 118 expected.add(new LanguageRange("ar-arevmda", 0.8)); 119 expected.add(new LanguageRange("yug", 0.5)); 120 expected.add(new LanguageRange("yuu", 0.5)); 121 expected.add(new LanguageRange("gfx", 0.4)); 122 expected.add(new LanguageRange("oun", 0.4)); 123 expected.add(new LanguageRange("mwj", 0.4)); 124 expected.add(new LanguageRange("vaj", 0.4)); 125 List<LanguageRange> got = LanguageRange.parse(str); 126 if (!areEqual(expected, got)) { 127 error = true; 128 System.err.println(" language parse() test failed."); 129 } 130 131 if (error) { 132 err = true; 133 System.err.println(" test_parse() failed."); 134 } else { 135 System.out.println(" test_parse() passed."); 136 } 137 138 } 139 140 private static boolean areEqual(List<LanguageRange> expected, 141 List<LanguageRange> got) { 142 boolean error = false; 143 144 int expectedSize = expected.size(); 145 int actualSize = got.size(); 146 147 if (expectedSize != actualSize) { 148 error = true; 149 150 System.err.println(" Expected size=" + expectedSize); 151 for (LanguageRange lr : expected) { 152 System.err.println(" range=" + lr.getRange() 153 + ", weight=" + lr.getWeight()); 154 } 155 156 System.out.println(" Actual size=" + actualSize); 157 for (LanguageRange lr : got) { 158 System.err.println(" range=" + lr.getRange() 159 + ", weight=" + lr.getWeight()); 160 } 161 } else { 162 for (int i = 0; i < expectedSize; i++) { 163 LanguageRange lr1 = expected.get(i); 164 LanguageRange lr2 = got.get(i); 165 166 if (!lr1.getRange().equals(lr2.getRange()) 167 || lr1.getWeight() != lr2.getWeight()) { 168 error = true; 169 System.err.println(" " + i + ": Expected: range=" + lr1.getRange() 170 + ", weight=" + lr1.getWeight()); 171 System.err.println(" " + i + ": Actual: range=" + lr2.getRange() 172 + ", weight=" + lr2.getWeight()); 173 } 174 } 175 } 176 177 return !error; 178 } 179 180 private static void test_filter() { 181 boolean error = false; 182 183 String ranges = "mtm-RU, en-gb-oed, coy, ar-HY"; 184 String tags = "de-DE, en, mtm-RU, ymt-RU, en-gb-oxendict, ja-JP, pij, nts, ar-arevela"; 185 FilteringMode mode = EXTENDED_FILTERING; 186 187 List<LanguageRange> priorityList = LanguageRange.parse(ranges); 188 List<Locale> tagList = generateLocales(tags); 189 String actualLocales 190 = showLocales(Locale.filter(priorityList, tagList, mode)); 191 String expectedLocales = "mtm-RU, ymt-RU, en-GB-oxendict, nts, pij, ar-arevela"; 192 193 if (!expectedLocales.equals(actualLocales)) { 194 error = true; 195 showErrorMessage("#1 filter(" + mode + ")", 196 ranges, tags, expectedLocales, actualLocales); 197 } 198 199 ranges = "phr-*-IN, ja-JP"; 200 tags = "en, pmu-Guru-IN, ja-Latn-JP, iw"; 201 mode = EXTENDED_FILTERING; 202 203 priorityList = LanguageRange.parse(ranges); 204 tagList = generateLocales(tags); 205 actualLocales = showLocales(Locale.filter(priorityList, tagList, mode)); 206 expectedLocales = "pmu-Guru-IN, ja-Latn-JP"; 207 208 if (!expectedLocales.equals(actualLocales)) { 209 error = true; 210 showErrorMessage("#2 filter(" + mode + ")", 211 ranges, tags, expectedLocales, actualLocales); 212 } 213 214 if (error) { 215 err = true; 216 System.out.println(" test_filter() failed."); 217 } else { 218 System.out.println(" test_filter() passed."); 219 } 220 } 221 222 private static void test_filterTags() { 223 boolean error = false; 224 225 String ranges = "gti;q=0.2, gfx, kzj"; 226 String tags = "de-DE, gti, he, nyc, mwj, vaj, ktr, dtp"; 227 228 List<LanguageRange> priorityList = LanguageRange.parse(ranges); 229 List<String> tagList = generateLanguageTags(tags); 230 String actualTags 231 = showLanguageTags(Locale.filterTags(priorityList, tagList)); 232 String expectedTags = "mwj, vaj, ktr, dtp, gti, nyc"; 233 234 if (!expectedTags.equals(actualTags)) { 235 error = true; 236 showErrorMessage("filterTags()", 237 ranges, tags, expectedTags, actualTags); 238 } 239 240 if (error) { 241 err = true; 242 System.out.println(" test_filterTags() failed."); 243 } else { 244 System.out.println(" test_filterTags() passed."); 245 } 246 } 247 248 private static void test_lookup() { 249 boolean error = false; 250 251 String ranges = "en;q=0.2, yam, rmx;q=0.9"; 252 String tags = "de-DE, en, kwq, lmm"; 253 List<LanguageRange> priorityList = LanguageRange.parse(ranges); 254 List<Locale> localeList = generateLocales(tags); 255 String actualLocale 256 = Locale.lookup(priorityList, localeList).toLanguageTag(); 257 String expectedLocale = "kwq"; 258 259 if (!expectedLocale.equals(actualLocale)) { 260 error = true; 261 showErrorMessage("lookup()", ranges, tags, expectedLocale, actualLocale); 262 } 263 264 if (error) { 265 err = true; 266 System.out.println(" test_lookup() failed."); 267 } else { 268 System.out.println(" test_lookup() passed."); 269 } 270 } 271 272 private static void test_lookupTag() { 273 boolean error = false; 274 275 String ranges = "en, tsf;q=0.2"; 276 String tags = "es, ja-JP, taj"; 277 List<LanguageRange> priorityList = LanguageRange.parse(ranges); 278 List<String> tagList = generateLanguageTags(tags); 279 String actualTag = Locale.lookupTag(priorityList, tagList); 280 String expectedTag = "taj"; 281 282 if (!expectedTag.equals(actualTag)) { 283 error = true; 284 showErrorMessage("lookupTag()", ranges, tags, expectedTag, actualTag); 285 } 286 287 if (error) { 288 err = true; 289 System.out.println(" test_lookupTag() failed."); 290 } else { 291 System.out.println(" test_lookupTag() passed."); 292 } 293 } 294 295 private static List<Locale> generateLocales(String tags) { 296 if (tags == null) { 297 return null; 298 } 299 300 List<Locale> localeList = new ArrayList<>(); 301 if (tags.equals("")) { 302 return localeList; 303 } 304 String[] t = tags.split(", "); 305 for (String tag : t) { 306 localeList.add(Locale.forLanguageTag(tag)); 307 } 308 return localeList; 309 } 310 311 private static List<String> generateLanguageTags(String tags) { 312 List<String> tagList = new ArrayList<>(); 313 String[] t = tags.split(", "); 314 for (String tag : t) { 315 tagList.add(tag); 316 } 317 return tagList; 318 } 319 320 private static String showLanguageTags(List<String> tags) { 321 StringBuilder sb = new StringBuilder(); 322 323 Iterator<String> itr = tags.iterator(); 324 if (itr.hasNext()) { 325 sb.append(itr.next()); 326 } 327 while (itr.hasNext()) { 328 sb.append(", "); 329 sb.append(itr.next()); 330 } 331 332 return sb.toString().trim(); 333 } 334 335 private static String showLocales(List<Locale> locales) { 336 StringBuilder sb = new StringBuilder(); 337 338 java.util.Iterator<Locale> itr = locales.iterator(); 339 if (itr.hasNext()) { 340 sb.append(itr.next().toLanguageTag()); 341 } 342 while (itr.hasNext()) { 343 sb.append(", "); 344 sb.append(itr.next().toLanguageTag()); 345 } 346 347 return sb.toString().trim(); 348 } 349 350 private static void showErrorMessage(String methodName, 351 String priorityList, 352 String tags, 353 String expectedTags, 354 String actualTags) { 355 System.out.println("\nIncorrect " + methodName + " result."); 356 System.out.println(" Priority list : " + priorityList); 357 System.out.println(" Language tags : " + tags); 358 System.out.println(" Expected value : " + expectedTags); 359 System.out.println(" Actual value : " + actualTags); 360 } 361 362 } 363