1 /* 2 * Copyright (c) 2016, 2017, 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 27 * @summary Checks the IANA language subtag registry data updation 28 * (LSR Revision: 2017-08-15) 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, koj, kwq, kxe, lii, lmm, mtm, ngv," 71 + " oyb, phr, pub, suj, taj;q=0.9, 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("koj", 1.0)); 90 expected.add(new LanguageRange("kwv", 1.0)); 91 expected.add(new LanguageRange("kwq", 1.0)); 92 expected.add(new LanguageRange("yam", 1.0)); 93 expected.add(new LanguageRange("kxe", 1.0)); 94 expected.add(new LanguageRange("tvd", 1.0)); 95 expected.add(new LanguageRange("lii", 1.0)); 96 expected.add(new LanguageRange("raq", 1.0)); 97 expected.add(new LanguageRange("lmm", 1.0)); 98 expected.add(new LanguageRange("rmx", 1.0)); 99 expected.add(new LanguageRange("mtm", 1.0)); 100 expected.add(new LanguageRange("ymt", 1.0)); 101 expected.add(new LanguageRange("ngv", 1.0)); 102 expected.add(new LanguageRange("nnx", 1.0)); 103 expected.add(new LanguageRange("oyb", 1.0)); 104 expected.add(new LanguageRange("thx", 1.0)); 105 expected.add(new LanguageRange("skk", 1.0)); 106 expected.add(new LanguageRange("jeg", 1.0)); 107 expected.add(new LanguageRange("phr", 1.0)); 108 expected.add(new LanguageRange("pmu", 1.0)); 109 expected.add(new LanguageRange("pub", 1.0)); 110 expected.add(new LanguageRange("puz", 1.0)); 111 expected.add(new LanguageRange("suj", 1.0)); 112 expected.add(new LanguageRange("xsj", 1.0)); 113 expected.add(new LanguageRange("taj", 0.9)); 114 expected.add(new LanguageRange("tsf", 0.9)); 115 expected.add(new LanguageRange("yug", 0.5)); 116 expected.add(new LanguageRange("yuu", 0.5)); 117 expected.add(new LanguageRange("gfx", 0.4)); 118 expected.add(new LanguageRange("oun", 0.4)); 119 expected.add(new LanguageRange("mwj", 0.4)); 120 expected.add(new LanguageRange("vaj", 0.4)); 121 List<LanguageRange> got = LanguageRange.parse(str); 122 if (!areEqual(expected, got)) { 123 error = true; 124 System.err.println(" language parse() test failed."); 125 } 126 127 if (error) { 128 err = true; 129 System.err.println(" test_parse() failed."); 130 } else { 131 System.out.println(" test_parse() passed."); 132 } 133 134 } 135 136 private static boolean areEqual(List<LanguageRange> expected, 137 List<LanguageRange> got) { 138 boolean error = false; 139 140 int expectedSize = expected.size(); 141 int actualSize = got.size(); 142 143 if (expectedSize != actualSize) { 144 error = true; 145 146 System.err.println(" Expected size=" + expectedSize); 147 for (LanguageRange lr : expected) { 148 System.err.println(" range=" + lr.getRange() 149 + ", weight=" + lr.getWeight()); 150 } 151 152 System.out.println(" Actual size=" + actualSize); 153 for (LanguageRange lr : got) { 154 System.err.println(" range=" + lr.getRange() 155 + ", weight=" + lr.getWeight()); 156 } 157 } else { 158 for (int i = 0; i < expectedSize; i++) { 159 LanguageRange lr1 = expected.get(i); 160 LanguageRange lr2 = got.get(i); 161 162 if (!lr1.getRange().equals(lr2.getRange()) 163 || lr1.getWeight() != lr2.getWeight()) { 164 error = true; 165 System.err.println(" " + i + ": Expected: range=" + lr1.getRange() 166 + ", weight=" + lr1.getWeight()); 167 System.err.println(" " + i + ": Actual: range=" + lr2.getRange() 168 + ", weight=" + lr2.getWeight()); 169 } 170 } 171 } 172 173 return !error; 174 } 175 176 private static void test_filter() { 177 boolean error = false; 178 179 String ranges = "mtm-RU, en-gb-oed, coy"; 180 String tags = "de-DE, en, mtm-RU, ymt-RU, en-gb-oxendict, ja-JP, pij, nts"; 181 FilteringMode mode = EXTENDED_FILTERING; 182 183 List<LanguageRange> priorityList = LanguageRange.parse(ranges); 184 List<Locale> tagList = generateLocales(tags); 185 String actualLocales 186 = showLocales(Locale.filter(priorityList, tagList, mode)); 187 String expectedLocales = "mtm-RU, ymt-RU, en-GB-oxendict, nts, pij"; 188 189 if (!expectedLocales.equals(actualLocales)) { 190 error = true; 191 showErrorMessage("#1 filter(" + mode + ")", 192 ranges, tags, expectedLocales, actualLocales); 193 } 194 195 ranges = "phr-*-IN, ja-JP"; 196 tags = "en, pmu-Guru-IN, ja-Latn-JP, iw"; 197 mode = EXTENDED_FILTERING; 198 199 priorityList = LanguageRange.parse(ranges); 200 tagList = generateLocales(tags); 201 actualLocales = showLocales(Locale.filter(priorityList, tagList, mode)); 202 expectedLocales = "pmu-Guru-IN, ja-Latn-JP"; 203 204 if (!expectedLocales.equals(actualLocales)) { 205 error = true; 206 showErrorMessage("#2 filter(" + mode + ")", 207 ranges, tags, expectedLocales, actualLocales); 208 } 209 210 if (error) { 211 err = true; 212 System.out.println(" test_filter() failed."); 213 } else { 214 System.out.println(" test_filter() passed."); 215 } 216 } 217 218 private static void test_filterTags() { 219 boolean error = false; 220 221 String ranges = "gti;q=0.2, gfx, kzj"; 222 String tags = "de-DE, gti, he, nyc, mwj, vaj, ktr, dtp"; 223 224 List<LanguageRange> priorityList = LanguageRange.parse(ranges); 225 List<String> tagList = generateLanguageTags(tags); 226 String actualTags 227 = showLanguageTags(Locale.filterTags(priorityList, tagList)); 228 String expectedTags = "mwj, vaj, ktr, dtp, gti, nyc"; 229 230 if (!expectedTags.equals(actualTags)) { 231 error = true; 232 showErrorMessage("filterTags()", 233 ranges, tags, expectedTags, actualTags); 234 } 235 236 if (error) { 237 err = true; 238 System.out.println(" test_filterTags() failed."); 239 } else { 240 System.out.println(" test_filterTags() passed."); 241 } 242 } 243 244 private static void test_lookup() { 245 boolean error = false; 246 247 String ranges = "en;q=0.2, yam, rmx;q=0.9"; 248 String tags = "de-DE, en, kwq, lmm"; 249 List<LanguageRange> priorityList = LanguageRange.parse(ranges); 250 List<Locale> localeList = generateLocales(tags); 251 String actualLocale 252 = Locale.lookup(priorityList, localeList).toLanguageTag(); 253 String expectedLocale = "kwq"; 254 255 if (!expectedLocale.equals(actualLocale)) { 256 error = true; 257 showErrorMessage("lookup()", ranges, tags, expectedLocale, actualLocale); 258 } 259 260 if (error) { 261 err = true; 262 System.out.println(" test_lookup() failed."); 263 } else { 264 System.out.println(" test_lookup() passed."); 265 } 266 } 267 268 private static void test_lookupTag() { 269 boolean error = false; 270 271 String ranges = "en, tsf;q=0.2"; 272 String tags = "es, ja-JP, taj"; 273 List<LanguageRange> priorityList = LanguageRange.parse(ranges); 274 List<String> tagList = generateLanguageTags(tags); 275 String actualTag = Locale.lookupTag(priorityList, tagList); 276 String expectedTag = "taj"; 277 278 if (!expectedTag.equals(actualTag)) { 279 error = true; 280 showErrorMessage("lookupTag()", ranges, tags, expectedTag, actualTag); 281 } 282 283 if (error) { 284 err = true; 285 System.out.println(" test_lookupTag() failed."); 286 } else { 287 System.out.println(" test_lookupTag() passed."); 288 } 289 } 290 291 private static List<Locale> generateLocales(String tags) { 292 if (tags == null) { 293 return null; 294 } 295 296 List<Locale> localeList = new ArrayList<>(); 297 if (tags.equals("")) { 298 return localeList; 299 } 300 String[] t = tags.split(", "); 301 for (String tag : t) { 302 localeList.add(Locale.forLanguageTag(tag)); 303 } 304 return localeList; 305 } 306 307 private static List<String> generateLanguageTags(String tags) { 308 List<String> tagList = new ArrayList<>(); 309 String[] t = tags.split(", "); 310 for (String tag : t) { 311 tagList.add(tag); 312 } 313 return tagList; 314 } 315 316 private static String showLanguageTags(List<String> tags) { 317 StringBuilder sb = new StringBuilder(); 318 319 Iterator<String> itr = tags.iterator(); 320 if (itr.hasNext()) { 321 sb.append(itr.next()); 322 } 323 while (itr.hasNext()) { 324 sb.append(", "); 325 sb.append(itr.next()); 326 } 327 328 return sb.toString().trim(); 329 } 330 331 private static String showLocales(List<Locale> locales) { 332 StringBuilder sb = new StringBuilder(); 333 334 java.util.Iterator<Locale> itr = locales.iterator(); 335 if (itr.hasNext()) { 336 sb.append(itr.next().toLanguageTag()); 337 } 338 while (itr.hasNext()) { 339 sb.append(", "); 340 sb.append(itr.next().toLanguageTag()); 341 } 342 343 return sb.toString().trim(); 344 } 345 346 private static void showErrorMessage(String methodName, 347 String priorityList, 348 String tags, 349 String expectedTags, 350 String actualTags) { 351 System.out.println("\nIncorrect " + methodName + " result."); 352 System.out.println(" Priority list : " + priorityList); 353 System.out.println(" Language tags : " + tags); 354 System.out.println(" Expected value : " + expectedTags); 355 System.out.println(" Actual value : " + actualTags); 356 } 357 358 } 359