Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/jdk/java/util/Locale/Bug7069824.java
41149 views
1
/*
2
* Copyright (c) 2014, 2020, 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 7069824 8042360 8032842 8175539 8210443 8242010
27
* @summary Verify implementation for Locale matching.
28
* @run testng/othervm Bug7069824
29
*/
30
31
import java.util.*;
32
import java.util.Locale.*;
33
import static java.util.Locale.FilteringMode.*;
34
import static java.util.Locale.LanguageRange.*;
35
import static org.testng.Assert.*;
36
37
import org.testng.annotations.DataProvider;
38
import org.testng.annotations.Test;
39
40
public class Bug7069824 {
41
42
@DataProvider(name = "LRConstructorData")
43
Object[][] LRConstructorData() {
44
return new Object[][] {
45
// Range, Weight
46
{"elvish", MAX_WEIGHT},
47
{"de-DE", MAX_WEIGHT},
48
{"de-Latn-DE-1996", MAX_WEIGHT},
49
{"zh-Hant-CN-x-private1-private2", MAX_WEIGHT},
50
{"ar", 0.8},
51
{"en-US", 0.5},
52
{"sr-Latn-BA", 0},
53
{"ja", 1},
54
};
55
}
56
57
@DataProvider(name = "LRConstructorNPEData")
58
Object[][] LRConstructorNPEData() {
59
return new Object[][] {
60
// Range, Weight
61
{null, MAX_WEIGHT},
62
{null, 0.8},
63
};
64
}
65
66
@DataProvider(name = "LRConstructorIAEData")
67
Object[][] LRConstructorIAEData() {
68
return new Object[][] {
69
// Range, Weight
70
{"ja", -0.8},
71
{"Elvish", 3.0},
72
{"-ja", MAX_WEIGHT},
73
{"ja--JP", MAX_WEIGHT},
74
{"en-US-", MAX_WEIGHT},
75
{"a4r", MAX_WEIGHT},
76
{"ar*", MAX_WEIGHT},
77
{"ar-*EG", MAX_WEIGHT},
78
{"abcdefghijklmn", MAX_WEIGHT},
79
{"ja-J=", MAX_WEIGHT},
80
{"ja-opqrstuvwxyz", MAX_WEIGHT},
81
{"zh_CN", MAX_WEIGHT},
82
{"1996-de-Latn", MAX_WEIGHT},
83
// Testcase for 8042360
84
{"en-Latn-1234567890", MAX_WEIGHT},
85
};
86
}
87
88
@DataProvider(name = "LRParseData")
89
Object[][] LRParseData() {
90
return new Object[][] {
91
// Ranges, Expected result
92
{"Accept-Language: fr-FX, de-DE;q=0.5, fr-tp-x-FOO;q=0.1, "
93
+ "en-X-tp;q=0.6, en-FR;q=0.7, de-de;q=0.8, iw;q=0.4, "
94
+ "he;q=0.4, de-de;q=0.5, ja, in-tpp, in-tp;q=0.2",
95
List.of(new LanguageRange("fr-fx", 1.0),
96
new LanguageRange("fr-fr", 1.0),
97
new LanguageRange("ja", 1.0),
98
new LanguageRange("in-tpp", 1.0),
99
new LanguageRange("id-tpp", 1.0),
100
new LanguageRange("en-fr", 0.7),
101
new LanguageRange("en-fx", 0.7),
102
new LanguageRange("en-x-tp", 0.6),
103
new LanguageRange("de-de", 0.5),
104
new LanguageRange("de-dd", 0.5),
105
new LanguageRange("iw", 0.4),
106
new LanguageRange("he", 0.4),
107
new LanguageRange("in-tp", 0.2),
108
new LanguageRange("id-tl", 0.2),
109
new LanguageRange("id-tp", 0.2),
110
new LanguageRange("in-tl", 0.2),
111
new LanguageRange("fr-tp-x-foo", 0.1),
112
new LanguageRange("fr-tl-x-foo", 0.1))},
113
{"Accept-Language: hak-CN;q=0.8, no-bok-NO;q=0.9, no-nyn, cmn-CN;q=0.1",
114
List.of(new LanguageRange("no-nyn", 1.0),
115
new LanguageRange("nn", 1.0),
116
new LanguageRange("no-bok-no", 0.9),
117
new LanguageRange("nb-no", 0.9),
118
new LanguageRange("hak-CN", 0.8),
119
new LanguageRange("zh-hakka-CN", 0.8),
120
new LanguageRange("i-hak-CN", 0.8),
121
new LanguageRange("zh-hak-CN", 0.8),
122
new LanguageRange("cmn-CN", 0.1),
123
new LanguageRange("zh-guoyu-CN", 0.1),
124
new LanguageRange("zh-cmn-CN", 0.1))},
125
{"Accept-Language: rki;q=0.4, no-bok-NO;q=0.9, ccq;q=0.5",
126
List.of(new LanguageRange("no-bok-no", 0.9),
127
new LanguageRange("nb-no", 0.9),
128
new LanguageRange("rki", 0.4),
129
new LanguageRange("ybd", 0.4),
130
new LanguageRange("ccq", 0.4))},
131
};
132
}
133
134
@DataProvider(name = "LRParseIAEData")
135
Object[][] LRParseIAEData() {
136
return new Object[][] {
137
// Ranges
138
{""},
139
{"ja;q=3"},
140
};
141
}
142
143
@DataProvider(name = "LRMapEquivalentsData")
144
Object[][] LRMapEquivalentsData() {
145
return new Object[][] {
146
// Ranges, Map, Expected result
147
{LanguageRange.parse("zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4"),
148
new HashMap<>(),
149
LanguageRange.parse("zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4")},
150
{LanguageRange.parse("zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4"),
151
null,
152
LanguageRange.parse("zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4")},
153
{LanguageRange.parse("zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4"),
154
new LinkedHashMap<String, List<String>>() {
155
{
156
put("ja", List.of("ja", "ja-Hira"));
157
put("zh", List.of("zh-Hans", "zh-Hans-CN", "zh-CN"));
158
put("zh-TW", List.of("zh-TW", "zh-Hant"));
159
put("es", null);
160
put("en", List.of());
161
put("zh-HK", List.of("de"));
162
}
163
},
164
List.of(new LanguageRange("zh-hans", 1.0),
165
new LanguageRange("zh-hans-cn", 1.0),
166
new LanguageRange("zh-cn", 1.0),
167
new LanguageRange("de", 1.0),
168
new LanguageRange("ar", 0.9),
169
new LanguageRange("zh-tw", 0.8),
170
new LanguageRange("zh-hant", 0.8),
171
new LanguageRange("ja-jp", 0.2),
172
new LanguageRange("ja-hira-jp", 0.2))},
173
};
174
}
175
176
@DataProvider(name = "LFilterData")
177
Object[][] LFilterData() {
178
return new Object[][] {
179
// Range, LanguageTags, FilteringMode, Expected locales
180
{"ja-JP, fr-FR", "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP",
181
EXTENDED_FILTERING, "ja-JP-hepburn, ja-Latn-JP"},
182
{"ja-*-JP, fr-FR", "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP",
183
EXTENDED_FILTERING, "ja-JP-hepburn, ja-Latn-JP"},
184
{"ja-*-JP, fr-FR, de-de;q=0.2", "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP",
185
AUTOSELECT_FILTERING, "ja-JP-hepburn, ja-Latn-JP, de-DE"},
186
{"ja-JP, fr-FR, de-de;q=0.2", "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP",
187
AUTOSELECT_FILTERING, "ja-JP-hepburn, de-DE"},
188
{"en;q=0.2, ja-*-JP, fr-JP", "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP",
189
IGNORE_EXTENDED_RANGES, "en"},
190
{"en;q=0.2, ja-*-JP, fr-JP", "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP",
191
MAP_EXTENDED_RANGES, "ja-JP-hepburn, en"},
192
{"en;q=0.2, ja-JP, fr-JP", "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP",
193
REJECT_EXTENDED_RANGES, "ja-JP-hepburn, en"},
194
{"en;q=0.2, ja-*-JP, fr-JP", "", REJECT_EXTENDED_RANGES, ""},
195
};
196
}
197
198
@DataProvider(name = "LFilterNPEData")
199
Object[][] LFilterNPEData() {
200
return new Object[][] {
201
// Range, LanguageTags, FilteringMode
202
{"en;q=0.2, ja-*-JP, fr-JP", null, REJECT_EXTENDED_RANGES},
203
{null, "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP", REJECT_EXTENDED_RANGES},
204
};
205
}
206
207
@DataProvider(name = "LFilterTagsData")
208
Object[][] LFilterTagsData() {
209
return new Object[][] {
210
// Range, LanguageTags, FilteringMode, Expected language tags
211
{"en;q=0.2, *;q=0.6, ja", "de-DE, en, ja-JP-hepburn, fr-JP, he",
212
null, "de-DE, en, ja-JP-hepburn, fr-JP, he"},
213
{"en;q=0.2, ja-JP, fr-JP", "de-DE, en, ja-JP-hepburn, fr, he",
214
null, "ja-JP-hepburn, en"},
215
{"en;q=0.2, ja-JP, fr-JP, iw", "de-DE, he, en, ja-JP-hepburn, fr, he-IL",
216
null, "ja-JP-hepburn, he, he-IL, en"},
217
{"en;q=0.2, ja-JP, fr-JP, he", "de-DE, en, ja-JP-hepburn, fr, iw-IL",
218
null, "ja-JP-hepburn, iw-IL, en"},
219
{"de-DE", "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
220
+ "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva",
221
MAP_EXTENDED_RANGES, "de-DE, de-DE-x-goethe"},
222
{"de-DE", "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
223
+ "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva",
224
EXTENDED_FILTERING,
225
"de-DE, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
226
+ "de-Latn-DE-1996, de-Deva-DE"},
227
{"de-*-DE", "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
228
+ "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva",
229
EXTENDED_FILTERING,
230
"de-DE, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
231
+ "de-Latn-DE-1996, de-Deva-DE"},
232
};
233
}
234
235
@DataProvider(name = "LLookupData")
236
Object[][] LLookupData() {
237
return new Object[][] {
238
// Range, LanguageTags, Expected locale
239
{"en;q=0.2, *-JP;q=0.6, iw", "de-DE, en, ja-JP-hepburn, fr-JP, he", "he"},
240
{"en;q=0.2, *-JP;q=0.6, iw", "de-DE, he-IL, en, iw", "he"},
241
{"en;q=0.2, ja-*-JP-x-foo;q=0.6, iw", "de-DE, fr, en, ja-Latn-JP", "ja-Latn-JP"},
242
};
243
}
244
245
@DataProvider(name = "LLookupTagData")
246
Object[][] LLookupTagData() {
247
return new Object[][] {
248
// Range, LanguageTags, Expected language tag
249
{"en, *", "es, de, ja-JP", null},
250
{"en;q=0.2, *-JP", "de-DE, en, ja-JP-hepburn, fr-JP, en-JP", "fr-JP"},
251
{"en;q=0.2, ar-MO, iw", "de-DE, he, fr-JP", "he"},
252
{"en;q=0.2, ar-MO, he", "de-DE, iw, fr-JP", "iw"},
253
{"de-DE-1996;q=0.8, en;q=0.2, iw;q=0.9, zh-Hans-CN;q=0.7", "de-DE, zh-CN, he, iw, fr-JP", "iw"},
254
{"de-DE-1996;q=0.8, en;q=0.2, he;q=0.9, zh-Hans-CN;q=0.7", "de-DE, zh-CN, he, iw, fr-JP", "he"},
255
};
256
}
257
258
@Test
259
public void testLRConstants() {
260
assertEquals(MIN_WEIGHT, 0.0, " MIN_WEIGHT should be 0.0 but got "
261
+ MIN_WEIGHT);
262
assertEquals(MAX_WEIGHT, 1.0, " MAX_WEIGHT should be 1.0 but got "
263
+ MAX_WEIGHT);
264
}
265
266
@Test(dataProvider = "LRConstructorData")
267
public void testLRConstructors(String range, double weight) {
268
LanguageRange lr;
269
if (weight == MAX_WEIGHT) {
270
lr = new LanguageRange(range);
271
} else {
272
lr = new LanguageRange(range, weight);
273
}
274
assertEquals(lr.getRange(), range.toLowerCase(Locale.ROOT),
275
" LR.getRange() returned unexpected value. Expected: "
276
+ range.toLowerCase(Locale.ROOT) + ", got: " + lr.getRange());
277
assertEquals(lr.getWeight(), weight,
278
" LR.getWeight() returned unexpected value. Expected: "
279
+ weight + ", got: " + lr.getWeight());
280
}
281
282
@Test(dataProvider = "LRConstructorNPEData", expectedExceptions = NullPointerException.class)
283
public void testLRConstructorNPE(String range, double weight) {
284
if (weight == MAX_WEIGHT) {
285
new LanguageRange(range);
286
} else {
287
new LanguageRange(range, weight);
288
}
289
}
290
291
@Test(dataProvider = "LRConstructorIAEData", expectedExceptions = IllegalArgumentException.class)
292
public void testLRConstructorIAE(String range, double weight) {
293
if (weight == MAX_WEIGHT) {
294
new LanguageRange(range);
295
} else {
296
new LanguageRange(range, weight);
297
}
298
}
299
300
@Test
301
public void testLREquals() {
302
LanguageRange lr1 = new LanguageRange("ja", 1.0);
303
LanguageRange lr2 = new LanguageRange("ja");
304
LanguageRange lr3 = new LanguageRange("ja", 0.1);
305
LanguageRange lr4 = new LanguageRange("en", 1.0);
306
307
assertEquals(lr1, lr2, " LR(ja, 1.0).equals(LR(ja)) should return true.");
308
assertNotEquals(lr1, lr3, " LR(ja, 1.0).equals(LR(ja, 0.1)) should return false.");
309
assertNotEquals(lr1, lr4, " LR(ja, 1.0).equals(LR(en, 1.0)) should return false.");
310
assertNotNull(lr1, " LR(ja, 1.0).equals(null) should return false.");
311
assertNotEquals(lr1, "", " LR(ja, 1.0).equals(\"\") should return false.");
312
}
313
314
@Test(dataProvider = "LRParseData")
315
public void testLRParse(String ranges, List<LanguageRange> expected) {
316
assertEquals(LanguageRange.parse(ranges), expected,
317
" LR.parse(" + ranges + ") test failed.");
318
}
319
320
@Test(expectedExceptions = NullPointerException.class)
321
public void testLRParseNPE() {
322
LanguageRange.parse(null);
323
}
324
325
@Test(dataProvider = "LRParseIAEData", expectedExceptions = IllegalArgumentException.class)
326
public void testLRParseIAE(String ranges) {
327
LanguageRange.parse(ranges);
328
}
329
330
@Test(dataProvider = "LRMapEquivalentsData")
331
public void testLRMapEquivalents(List<Locale.LanguageRange> priorityList,
332
Map<String,List<String>> map, List<LanguageRange> expected) {
333
assertEquals(LanguageRange.mapEquivalents(priorityList, map), expected,
334
" LR.mapEquivalents() test failed.");
335
}
336
337
@Test(expectedExceptions = NullPointerException.class)
338
public void testLRMapEquivalentsNPE() {
339
LanguageRange.mapEquivalents(null, Map.of("ja", List.of("ja", "ja-Hira")));
340
}
341
342
@Test(dataProvider = "LFilterData")
343
public void testLFilter(String ranges, String tags, FilteringMode mode, String expectedLocales) {
344
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
345
List<Locale> tagList = generateLocales(tags);
346
String actualLocales =
347
showLocales(Locale.filter(priorityList, tagList, mode));
348
assertEquals(actualLocales, expectedLocales, showErrorMessage(" L.Filter(" + mode + ")",
349
ranges, tags, expectedLocales, actualLocales));
350
}
351
352
@Test(dataProvider = "LFilterNPEData", expectedExceptions = NullPointerException.class)
353
public void testLFilterNPE(String ranges, String tags, FilteringMode mode) {
354
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
355
List<Locale> tagList = generateLocales(tags);
356
showLocales(Locale.filter(priorityList, tagList, mode));
357
}
358
359
@Test(expectedExceptions = IllegalArgumentException.class)
360
public void testLFilterIAE() {
361
String ranges = "en;q=0.2, ja-*-JP, fr-JP";
362
String tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
363
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
364
List<Locale> tagList = generateLocales(tags);
365
showLocales(Locale.filter(priorityList, tagList, REJECT_EXTENDED_RANGES));
366
}
367
368
@Test(dataProvider = "LFilterTagsData")
369
public void testLFilterTags(String ranges, String tags, FilteringMode mode, String expectedTags) {
370
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
371
List<String> tagList = generateLanguageTags(tags);
372
String actualTags;
373
if (mode == null) {
374
actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList));
375
} else {
376
actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));
377
}
378
assertEquals(actualTags, expectedTags,
379
showErrorMessage(" L.FilterTags(" + (mode != null ? mode : "") + ")",
380
ranges, tags, expectedTags, actualTags));
381
}
382
383
@Test(dataProvider = "LLookupData")
384
public void testLLookup(String ranges, String tags, String expectedLocale) {
385
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
386
List<Locale> localeList = generateLocales(tags);
387
String actualLocale =
388
Locale.lookup(priorityList, localeList).toLanguageTag();
389
assertEquals(actualLocale, expectedLocale, showErrorMessage(" L.Lookup()",
390
ranges, tags, expectedLocale, actualLocale));
391
}
392
393
@Test(dataProvider = "LLookupTagData")
394
public void testLLookupTag(String ranges, String tags, String expectedTag) {
395
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
396
List<String> tagList = generateLanguageTags(tags);
397
String actualTag = Locale.lookupTag(priorityList, tagList);
398
assertEquals(actualTag, expectedTag, showErrorMessage(" L.LookupTag()",
399
ranges, tags, expectedTag, actualTag));
400
}
401
402
private static List<Locale> generateLocales(String tags) {
403
if (tags == null) {
404
return null;
405
}
406
407
List<Locale> localeList = new ArrayList<>();
408
if (tags.equals("")) {
409
return localeList;
410
}
411
String[] t = tags.split(", ");
412
for (String tag : t) {
413
localeList.add(Locale.forLanguageTag(tag));
414
}
415
return localeList;
416
}
417
418
private static List<String> generateLanguageTags(String tags) {
419
List<String> tagList = new ArrayList<>();
420
String[] t = tags.split(", ");
421
for (String tag : t) {
422
tagList.add(tag);
423
}
424
return tagList;
425
}
426
427
private static String showLanguageTags(List<String> tags) {
428
StringBuilder sb = new StringBuilder();
429
430
Iterator<String> itr = tags.iterator();
431
if (itr.hasNext()) {
432
sb.append(itr.next());
433
}
434
while (itr.hasNext()) {
435
sb.append(", ");
436
sb.append(itr.next());
437
}
438
439
return sb.toString().trim();
440
}
441
442
private static String showLocales(List<Locale> locales) {
443
StringBuilder sb = new StringBuilder();
444
445
Iterator<Locale> itr = locales.iterator();
446
if (itr.hasNext()) {
447
sb.append(itr.next().toLanguageTag());
448
}
449
while (itr.hasNext()) {
450
sb.append(", ");
451
sb.append(itr.next().toLanguageTag());
452
}
453
454
return sb.toString().trim();
455
}
456
457
private static String showErrorMessage(String methodName,
458
String priorityList,
459
String tags,
460
String expectedTags,
461
String actualTags) {
462
return "Incorrect " + methodName + " result."
463
+ " Priority list : " + priorityList
464
+ " Language tags : " + tags
465
+ " Expected value : " + expectedTags
466
+ " Actual value : " + actualTags;
467
}
468
}
469
470