summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/Intl/duplicate-variants.js
blob: 5d07a9b10903a9b84e1900c4a0737c7b5431bcb9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// |reftest| skip-if(!this.hasOwnProperty("Intl"))

// RFC 5646 section 2.1
// variant       = 5*8alphanum         ; registered variants
//               / (DIGIT 3alphanum)

// Duplicate variants are forbidden.
assertEqArray(Intl.getCanonicalLocales("de-1996"), ["de-1996"]);
assertThrowsInstanceOf(() => Intl.getCanonicalLocales("de-1996-1996"), RangeError);

// Multiple different variants are allowed.
assertEqArray(Intl.getCanonicalLocales("sl-rozaj-solba"), ["sl-rozaj-solba"]);

// Variants can have the same prefix.
assertEqArray(Intl.getCanonicalLocales("zh-Latn-pinyin-pinyin2"), ["zh-Latn-pinyin-pinyin2"]);

// Values in extension sequences are not counted as variants.
assertEqArray(Intl.getCanonicalLocales("en-u-kf-false-kn-false"), ["en-u-kf-false-kn-false"]);

// Also test duplicates in Unicode extension keywords and attributes.
// From https://tools.ietf.org/html/rfc6067#section-2.1
//
//    An 'attribute' is a subtag with a length of three to eight
//    characters following the singleton and preceding any 'keyword'
//    sequences.  No attributes were defined at the time of this
//    document's publication.
//
//    A 'keyword' is a sequence of subtags consisting of a 'key' subtag,
//    followed by zero or more 'type' subtags (so a 'key' might appear
//    alone and not be accompanied by a 'type' subtag).  A 'key' MUST
//    NOT appear more than once in a language tag's extension string.
//
//    ...
//
//    Only the first occurrence of an attribute or key conveys meaning in a
//    language tag.  When interpreting tags containing the Unicode locale
//    extension, duplicate attributes or keywords are ignored in the
//    following way: ignore any attribute that has already appeared in the
//    tag and ignore any keyword whose key has already occurred in the tag.
//
// The duplicates itself are removed in CanonicalizeUnicodeLocaleId, step 2-3.
assertEqArray(Intl.getCanonicalLocales("en-u-kn-false-kn-false"), ["en-u-kn-false"]);
assertEqArray(Intl.getCanonicalLocales("en-u-attr1-attr2-attr2"), ["en-u-attr1-attr2"]);

if (typeof reportCompare === "function")
    reportCompare(0, 0);