[INTL] Implement supportedLocalesOf on Intl Constructors
[WebKit.git] / LayoutTests / js / script-tests / intl-collator.js
1 description("This test checks the behavior of Intl.Collator as described in the ECMAScript Internationalization API Specification (ECMA-402 2.0).");
2
3 // 10.1 The Intl.Collator Constructor
4
5 // The Intl.Collator constructor is a standard built-in property of the Intl object.
6 shouldBeType("Intl.Collator", "Function");
7
8 // 10.1.2 Intl.Collator([ locales [, options]])
9 shouldBeType("Intl.Collator()", "Intl.Collator");
10 shouldBeType("Intl.Collator.call({})", "Intl.Collator");
11 shouldBeType("new Intl.Collator()", "Intl.Collator");
12
13 // Subclassable
14 var classPrefix = "class DerivedCollator extends Intl.Collator {};";
15 shouldBeTrue(classPrefix + "(new DerivedCollator) instanceof DerivedCollator");
16 shouldBeTrue(classPrefix + "(new DerivedCollator) instanceof Intl.Collator");
17 shouldBeTrue(classPrefix + "new DerivedCollator().compare('a', 'b') === -1");
18 shouldBeTrue(classPrefix + "Object.getPrototypeOf(new DerivedCollator) === DerivedCollator.prototype");
19 shouldBeTrue(classPrefix + "Object.getPrototypeOf(Object.getPrototypeOf(new DerivedCollator)) === Intl.Collator.prototype");
20
21 // 10.2 Properties of the Intl.Collator Constructor
22
23 // length property (whose value is 0)
24 shouldBe("Intl.Collator.length", "0");
25
26 // 10.2.1 Intl.Collator.prototype
27
28 // This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
29 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.Collator, 'prototype').writable");
30 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.Collator, 'prototype').enumerable");
31 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.Collator, 'prototype').configurable");
32
33 // 10.2.2 Intl.Collator.supportedLocalesOf (locales [, options ])
34
35 // The value of the length property of the supportedLocalesOf method is 1.
36 shouldBe("Intl.Collator.supportedLocalesOf.length", "1");
37
38 // Returns SupportedLocales.
39 shouldBeType("Intl.Collator.supportedLocalesOf()", "Array");
40 // Doesn't care about `this`.
41 shouldBe("Intl.Collator.supportedLocalesOf.call(null, 'en')", "[ 'en' ]");
42 shouldBe("Intl.Collator.supportedLocalesOf.call({}, 'en')", "[ 'en' ]");
43 shouldBe("Intl.Collator.supportedLocalesOf.call(1, 'en')", "[ 'en' ]");
44 // Ignores non-object, non-string list.
45 shouldBe("Intl.Collator.supportedLocalesOf(9)", "[]");
46 // Makes an array of tags.
47 shouldBe("Intl.Collator.supportedLocalesOf('en')", "[ 'en' ]");
48 // Handles array-like objects with holes.
49 shouldBe("Intl.Collator.supportedLocalesOf({ length: 4, 1: 'en', 0: 'es', 3: 'de' })", "[ 'es', 'en', 'de' ]");
50 // Deduplicates tags.
51 shouldBe("Intl.Collator.supportedLocalesOf([ 'en', 'pt', 'en', 'es' ])", "[ 'en', 'pt', 'es' ]");
52 // Canonicalizes tags.
53 shouldBe("Intl.Collator.supportedLocalesOf('En-laTn-us-variant2-variant1-1abc-U-ko-tRue-A-aa-aaa-x-RESERVED')", "[ 'en-Latn-US-variant2-variant1-1abc-a-aa-aaa-u-ko-true-x-reserved' ]");
54 // Replaces outdated tags.
55 shouldBe("Intl.Collator.supportedLocalesOf('no-bok')", "[ 'nb' ]");
56 // Doesn't throw, but ignores private tags.
57 shouldBe("Intl.Collator.supportedLocalesOf('x-some-thing')", "[]");
58 // Throws on problems with length, get, or toString.
59 shouldThrow("Intl.Collator.supportedLocalesOf(Object.create(null, { length: { get() { throw Error('a') } } }))", "'Error: a'");
60 shouldThrow("Intl.Collator.supportedLocalesOf(Object.create(null, { length: { value: 1 }, 0: { get() { throw Error('b') } } }))", "'Error: b'");
61 shouldThrow("Intl.Collator.supportedLocalesOf([ { toString() { throw Error('c') } } ])", "'Error: c'");
62 // Throws on bad tags.
63 shouldThrow("Intl.Collator.supportedLocalesOf([ 5 ])", "'TypeError: locale value must be a string or object'");
64 shouldThrow("Intl.Collator.supportedLocalesOf('')", "'RangeError: invalid language tag: '");
65 shouldThrow("Intl.Collator.supportedLocalesOf('a')", "'RangeError: invalid language tag: a'");
66 shouldThrow("Intl.Collator.supportedLocalesOf('abcdefghij')", "'RangeError: invalid language tag: abcdefghij'");
67 shouldThrow("Intl.Collator.supportedLocalesOf('#$')", "'RangeError: invalid language tag: #$'");
68 shouldThrow("Intl.Collator.supportedLocalesOf('en-@-abc')", "'RangeError: invalid language tag: en-@-abc'");
69 shouldThrow("Intl.Collator.supportedLocalesOf('en-u')", "'RangeError: invalid language tag: en-u'");
70 shouldThrow("Intl.Collator.supportedLocalesOf('en-u-kn-true-u-ko-true')", "'RangeError: invalid language tag: en-u-kn-true-u-ko-true'");
71 shouldThrow("Intl.Collator.supportedLocalesOf('en-x')", "'RangeError: invalid language tag: en-x'");
72 shouldThrow("Intl.Collator.supportedLocalesOf('en-*')", "'RangeError: invalid language tag: en-*'");
73 shouldThrow("Intl.Collator.supportedLocalesOf('en-')", "'RangeError: invalid language tag: en-'");
74 shouldThrow("Intl.Collator.supportedLocalesOf('en--US')", "'RangeError: invalid language tag: en--US'");
75
76 // 10.3 Properties of the Intl.Collator Prototype Object
77
78 // The value of Intl.Collator.prototype.constructor is %Collator%.
79 shouldBe("Intl.Collator.prototype.constructor", "Intl.Collator");
80
81 // 10.3.3 Intl.Collator.prototype.compare
82
83 // This named accessor property returns a function that compares two strings according to the sort order of this Collator object.
84 shouldBeType("Intl.Collator.prototype.compare", "Function");
85
86 // The value of the [[Get]] attribute is a function
87 shouldBeType("Object.getOwnPropertyDescriptor(Intl.Collator.prototype, 'compare').get", "Function");
88
89 // The value of the [[Set]] attribute is undefined.
90 shouldBe("Object.getOwnPropertyDescriptor(Intl.Collator.prototype, 'compare').set", "undefined");
91
92 // Match Firefox where unspecifed.
93 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.Collator.prototype, 'compare').enumerable");
94 shouldBeTrue("Object.getOwnPropertyDescriptor(Intl.Collator.prototype, 'compare').configurable");
95
96 // The value of F’s length property is 2.
97 shouldBe("Intl.Collator.prototype.compare.length", "2");
98
99 // Throws on non-Collator this.
100 shouldThrow("Object.defineProperty({}, 'compare', Object.getOwnPropertyDescriptor(Intl.Collator.prototype, 'compare')).compare", "'TypeError: Intl.Collator.prototype.compare called on value that\\'s not an object initialized as a Collator'");
101
102 // The compare function is unique per instance.
103 shouldBeTrue("Intl.Collator.prototype.compare !== Intl.Collator().compare");
104 shouldBeTrue("new Intl.Collator().compare !== new Intl.Collator().compare");
105
106 // 10.3.4 Collator Compare Functions
107
108 // 1. Let collator be the this value.
109 // 2. Assert: Type(collator) is Object and collator has an [[initializedCollator]] internal slot whose value is true.
110 // This should not be reachable, since compare is bound to an initialized collator.
111
112 // 3. If x is not provided, let x be undefined.
113 // 4. If y is not provided, let y be undefined.
114 // 5. Let X be ToString(x).
115 // 6. ReturnIfAbrupt(X).
116 var badCalls = 0;
117 shouldThrow("Intl.Collator.prototype.compare({ toString() { throw Error('6') } }, { toString() { ++badCalls; return ''; } })", "'Error: 6'");
118 shouldBe("badCalls", "0");
119
120 // 7. Let Y be ToString(y).
121 // 8. ReturnIfAbrupt(Y).
122 shouldThrow("Intl.Collator.prototype.compare('a', { toString() { throw Error('8') } })", "'Error: 8'");
123
124 // Compare is bound, so calling with alternate "this" has no effect.
125 shouldBe("Intl.Collator.prototype.compare.call(null, 'a', 'b')", "-1");
126 shouldBe("Intl.Collator.prototype.compare.call(Intl.Collator('en', { sensitivity:'base' }), 'A', 'a')", "-1");
127 shouldBe("Intl.Collator.prototype.compare.call(5, 'a', 'b')", "-1");
128 shouldBe("new Intl.Collator().compare.call(null, 'a', 'b')", "-1");
129 shouldBe("new Intl.Collator().compare.call(Intl.Collator('en', { sensitivity:'base' }), 'A', 'a')", "-1");
130 shouldBe("new Intl.Collator().compare.call(5, 'a', 'b')", "-1");
131
132 // 10.3.5 Intl.Collator.prototype.resolvedOptions ()
133
134 shouldBe("Intl.Collator.prototype.resolvedOptions.length", "0");
135
136 // Returns a new object whose properties and attributes are set as if constructed by an object literal.
137 shouldBeType("Intl.Collator.prototype.resolvedOptions()", "Object");
138
139 // Returns a new object each time.
140 shouldBeFalse("Intl.Collator.prototype.resolvedOptions() === Intl.Collator.prototype.resolvedOptions()");
141
142 // Throws on non-Collator this.
143 shouldThrow("Intl.Collator.prototype.resolvedOptions.call(5)", "'TypeError: Intl.Collator.prototype.resolvedOptions called on value that\\'s not an object initialized as a Collator'");
144