bc63bd620c083ae75bd0b617c1cb83f939e2d0f6
[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 class DerivedCollator extends Intl.Collator {}
15 shouldBeType("new DerivedCollator", "DerivedCollator");
16 shouldBeType("new DerivedCollator", "Intl.Collator");
17 shouldBe("new DerivedCollator().compare('a', 'b')", "-1");
18 shouldBe("Object.getPrototypeOf(new DerivedCollator)", "DerivedCollator.prototype");
19 shouldBe("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
41 // 10.3 Properties of the Intl.Collator Prototype Object
42
43 // The value of Intl.Collator.prototype.constructor is %Collator%.
44 shouldBe("Intl.Collator.prototype.constructor", "Intl.Collator");
45
46 // 10.3.3 Intl.Collator.prototype.compare
47
48 // This named accessor property returns a function that compares two strings according to the sort order of this Collator object.
49 shouldBeType("Intl.Collator.prototype.compare", "Function");
50
51 // The value of the [[Get]] attribute is a function
52 shouldBeType("Object.getOwnPropertyDescriptor(Intl.Collator.prototype, 'compare').get", "Function");
53
54 // The value of the [[Set]] attribute is undefined.
55 shouldBe("Object.getOwnPropertyDescriptor(Intl.Collator.prototype, 'compare').set", "undefined");
56
57 // Match Firefox where unspecifed.
58 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.Collator.prototype, 'compare').enumerable");
59 shouldBeTrue("Object.getOwnPropertyDescriptor(Intl.Collator.prototype, 'compare').configurable");
60
61 // The value of F’s length property is 2.
62 shouldBe("Intl.Collator.prototype.compare.length", "2");
63
64 // Throws on non-Collator this.
65 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'");
66
67 // The compare function is unique per instance.
68 shouldBeTrue("Intl.Collator.prototype.compare !== Intl.Collator().compare");
69 shouldBeTrue("new Intl.Collator().compare !== new Intl.Collator().compare");
70
71 // 10.3.4 Collator Compare Functions
72
73 // 1. Let collator be the this value.
74 // 2. Assert: Type(collator) is Object and collator has an [[initializedCollator]] internal slot whose value is true.
75 // This should not be reachable, since compare is bound to an initialized collator.
76
77 // 3. If x is not provided, let x be undefined.
78 // 4. If y is not provided, let y be undefined.
79 // 5. Let X be ToString(x).
80 // 6. ReturnIfAbrupt(X).
81 var badCalls = 0;
82 shouldThrow("Intl.Collator.prototype.compare({ toString() { throw Error('6') } }, { toString() { ++badCalls; return ''; } })", "'Error: 6'");
83 shouldBe("badCalls", "0");
84
85 // 7. Let Y be ToString(y).
86 // 8. ReturnIfAbrupt(Y).
87 shouldThrow("Intl.Collator.prototype.compare('a', { toString() { throw Error('8') } })", "'Error: 8'");
88
89 // Compare is bound, so calling with alternate "this" has no effect.
90 shouldBe("Intl.Collator.prototype.compare.call(null, 'a', 'b')", "-1");
91 shouldBe("Intl.Collator.prototype.compare.call(Intl.Collator('en', { sensitivity:'base' }), 'A', 'a')", "-1");
92 shouldBe("Intl.Collator.prototype.compare.call(5, 'a', 'b')", "-1");
93 shouldBe("new Intl.Collator().compare.call(null, 'a', 'b')", "-1");
94 shouldBe("new Intl.Collator().compare.call(Intl.Collator('en', { sensitivity:'base' }), 'A', 'a')", "-1");
95 shouldBe("new Intl.Collator().compare.call(5, 'a', 'b')", "-1");
96
97 // 10.3.5 Intl.Collator.prototype.resolvedOptions ()
98
99 shouldBe("Intl.Collator.prototype.resolvedOptions.length", "0");
100
101 // Returns a new object whose properties and attributes are set as if constructed by an object literal.
102 shouldBeType("Intl.Collator.prototype.resolvedOptions()", "Object");
103
104 // Returns a new object each time.
105 shouldBeFalse("Intl.Collator.prototype.resolvedOptions() === Intl.Collator.prototype.resolvedOptions()");
106
107 // Throws on non-Collator this.
108 shouldThrow("Intl.Collator.prototype.resolvedOptions.call(5)", "'TypeError: Intl.Collator.prototype.resolvedOptions called on value that\\'s not an object initialized as a Collator'");
109