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