[INTL] Implement supportedLocalesOf on Intl Constructors
[WebKit.git] / LayoutTests / js / script-tests / intl-datetimeformat.js
1 description("This test checks the behavior of Intl.DateTimeFormat as described in the ECMAScript Internationalization API Specification (ECMA-402 2.0).");
2
3 // 12.1 The Intl.DateTimeFormat Constructor
4
5 // The Intl.DateTimeFormat constructor is a standard built-in property of the Intl object.
6 shouldBeType("Intl.DateTimeFormat", "Function");
7
8 // 12.1.2 Intl.DateTimeFormat([ locales [, options]])
9 shouldBeType("Intl.DateTimeFormat()", "Intl.DateTimeFormat");
10 shouldBeType("Intl.DateTimeFormat.call({})", "Intl.DateTimeFormat");
11 shouldBeType("new Intl.DateTimeFormat()", "Intl.DateTimeFormat");
12
13 // Subclassable
14 var classPrefix = "class DerivedDateTimeFormat extends Intl.DateTimeFormat {};";
15 shouldBeTrue(classPrefix + "(new DerivedDateTimeFormat) instanceof DerivedDateTimeFormat");
16 shouldBeTrue(classPrefix + "(new DerivedDateTimeFormat) instanceof Intl.DateTimeFormat");
17 shouldBeTrue(classPrefix + "new DerivedDateTimeFormat().format(0).length > 0");
18 shouldBeTrue(classPrefix + "Object.getPrototypeOf(new DerivedDateTimeFormat) === DerivedDateTimeFormat.prototype");
19 shouldBeTrue(classPrefix + "Object.getPrototypeOf(Object.getPrototypeOf(new DerivedDateTimeFormat)) === Intl.DateTimeFormat.prototype");
20
21 // 12.2 Properties of the Intl.DateTimeFormat Constructor
22
23 // length property (whose value is 0)
24 shouldBe("Intl.DateTimeFormat.length", "0");
25
26 // 12.2.1 Intl.DateTimeFormat.prototype
27
28 // This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
29 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.DateTimeFormat, 'prototype').writable");
30 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.DateTimeFormat, 'prototype').enumerable");
31 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.DateTimeFormat, 'prototype').configurable");
32
33 // 12.2.2 Intl.DateTimeFormat.supportedLocalesOf (locales [, options ])
34
35 // The value of the length property of the supportedLocalesOf method is 1.
36 shouldBe("Intl.DateTimeFormat.supportedLocalesOf.length", "1");
37
38 // Returns SupportedLocales
39 shouldBeType("Intl.DateTimeFormat.supportedLocalesOf()", "Array");
40 // Doesn't care about `this`.
41 shouldBe("Intl.DateTimeFormat.supportedLocalesOf.call(null, 'en')", "[ 'en' ]");
42 shouldBe("Intl.DateTimeFormat.supportedLocalesOf.call({}, 'en')", "[ 'en' ]");
43 shouldBe("Intl.DateTimeFormat.supportedLocalesOf.call(1, 'en')", "[ 'en' ]");
44 // Ignores non-object, non-string list.
45 shouldBe("Intl.DateTimeFormat.supportedLocalesOf(9)", "[]");
46 // Makes an array of tags.
47 shouldBe("Intl.DateTimeFormat.supportedLocalesOf('en')", "[ 'en' ]");
48 // Handles array-like objects with holes.
49 shouldBe("Intl.DateTimeFormat.supportedLocalesOf({ length: 4, 1: 'en', 0: 'es', 3: 'de' })", "[ 'es', 'en', 'de' ]");
50 // Deduplicates tags.
51 shouldBe("Intl.DateTimeFormat.supportedLocalesOf([ 'en', 'pt', 'en', 'es' ])", "[ 'en', 'pt', 'es' ]");
52 // Canonicalizes tags.
53 shouldBe("Intl.DateTimeFormat.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.DateTimeFormat.supportedLocalesOf('no-bok')", "[ 'nb' ]");
56 // Doesn't throw, but ignores private tags.
57 shouldBe("Intl.DateTimeFormat.supportedLocalesOf('x-some-thing')", "[]");
58 // Throws on problems with length, get, or toString.
59 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf(Object.create(null, { length: { get() { throw Error('a') } } }))", "'Error: a'");
60 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf(Object.create(null, { length: { value: 1 }, 0: { get() { throw Error('b') } } }))", "'Error: b'");
61 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf([ { toString() { throw Error('c') } } ])", "'Error: c'");
62 // Throws on bad tags.
63 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf([ 5 ])", "'TypeError: locale value must be a string or object'");
64 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf('')", "'RangeError: invalid language tag: '");
65 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf('a')", "'RangeError: invalid language tag: a'");
66 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf('abcdefghij')", "'RangeError: invalid language tag: abcdefghij'");
67 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf('#$')", "'RangeError: invalid language tag: #$'");
68 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf('en-@-abc')", "'RangeError: invalid language tag: en-@-abc'");
69 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf('en-u')", "'RangeError: invalid language tag: en-u'");
70 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf('en-u-kn-true-u-ko-true')", "'RangeError: invalid language tag: en-u-kn-true-u-ko-true'");
71 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf('en-x')", "'RangeError: invalid language tag: en-x'");
72 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf('en-*')", "'RangeError: invalid language tag: en-*'");
73 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf('en-')", "'RangeError: invalid language tag: en-'");
74 shouldThrow("Intl.DateTimeFormat.supportedLocalesOf('en--US')", "'RangeError: invalid language tag: en--US'");
75
76 // 12.3 Properties of the Intl.DateTimeFormat Prototype Object
77
78 // The value of Intl.DateTimeFormat.prototype.constructor is %DateTimeFormat%.
79 shouldBe("Intl.DateTimeFormat.prototype.constructor", "Intl.DateTimeFormat");
80
81 // 12.3.3 Intl.DateTimeFormat.prototype.format
82
83 // This named accessor property returns a function that formats a date according to the effective locale and the formatting options of this DateTimeFormat object.
84 shouldBeType("Intl.DateTimeFormat.prototype.format", "Function");
85
86 // The value of the [[Get]] attribute is a function
87 shouldBeType("Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, 'format').get", "Function");
88
89 // The value of the [[Set]] attribute is undefined.
90 shouldBe("Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, 'format').set", "undefined");
91
92 // Match Firefox where unspecifed.
93 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, 'format').enumerable");
94 shouldBeTrue("Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, 'format').configurable");
95
96 // The value of F’s length property is 1.
97 shouldBe("Intl.DateTimeFormat.prototype.format.length", "1");
98
99 // Throws on non-DateTimeFormat this.
100 shouldThrow("Object.defineProperty({}, 'format', Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, 'format')).format", "'TypeError: Intl.DateTimeFormat.prototype.format called on value that\\'s not an object initialized as a DateTimeFormat'");
101
102 // The format function is unique per instance.
103 shouldBeTrue("Intl.DateTimeFormat.prototype.format !== Intl.DateTimeFormat().format");
104 shouldBeTrue("new Intl.DateTimeFormat().format !== new Intl.DateTimeFormat().format");
105
106 // 12.3.4 DateTime Format Functions
107
108 // 1. Let dtf be the this value.
109 // 2. Assert: Type(dtf) is Object and dtf has an [[initializedDateTimeFormat]] internal slot whose value is true.
110 // This should not be reachable, since format is bound to an initialized datetimeformat.
111
112 // 3. If date is not provided or is undefined, then
113 // a. Let x be %Date_now%().
114 // 4. Else
115 // a. Let x be ToNumber(date).
116 // b. ReturnIfAbrupt(x).
117 shouldThrow("Intl.DateTimeFormat.prototype.format({ valueOf() { throw Error('4b') } })", "'Error: 4b'");
118
119 // 12.3.4 FormatDateTime abstract operation
120
121 // 1. If x is not a finite Number, then throw a RangeError exception.
122 shouldThrow("Intl.DateTimeFormat.prototype.format(Infinity)", "'RangeError: date value is not finite in DateTimeFormat.format()'");
123
124 // Format is bound, so calling with alternate "this" has no effect.
125 shouldBe("Intl.DateTimeFormat.prototype.format.call(null, 0)", "Intl.DateTimeFormat().format(0)");
126 shouldBe("Intl.DateTimeFormat.prototype.format.call(Intl.DateTimeFormat('ar'), 0)", "Intl.DateTimeFormat().format(0)");
127 shouldBe("Intl.DateTimeFormat.prototype.format.call(5, 0)", "Intl.DateTimeFormat().format(0)");
128 shouldBe("new Intl.DateTimeFormat().format.call(null, 0)", "Intl.DateTimeFormat().format(0)");
129 shouldBe("new Intl.DateTimeFormat().format.call(Intl.DateTimeFormat('ar'), 0)", "Intl.DateTimeFormat().format(0)");
130 shouldBe("new Intl.DateTimeFormat().format.call(5, 0)", "Intl.DateTimeFormat().format(0)");
131
132 // 12.3.5 Intl.DateTimeFormat.prototype.resolvedOptions ()
133
134 shouldBe("Intl.DateTimeFormat.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.DateTimeFormat.prototype.resolvedOptions()", "Object");
138
139 // Returns a new object each time.
140 shouldBeFalse("Intl.DateTimeFormat.prototype.resolvedOptions() === Intl.DateTimeFormat.prototype.resolvedOptions()");
141
142 // Throws on non-DateTimeFormat this.
143 shouldThrow("Intl.DateTimeFormat.prototype.resolvedOptions.call(5)", "'TypeError: Intl.DateTimeFormat.prototype.resolvedOptions called on value that\\'s not an object initialized as a DateTimeFormat'");
144