ES6 class syntax should use block scoping
[WebKit.git] / LayoutTests / js / script-tests / intl-numberformat.js
1 description("This test checks the behavior of Intl.NumberFormat as described in the ECMAScript Internationalization API Specification (ECMA-402 2.0).");
2
3 // 11.1 The Intl.NumberFormat Constructor
4
5 // The Intl.NumberFormat constructor is a standard built-in property of the Intl object.
6 shouldBeType("Intl.NumberFormat", "Function");
7
8 // 11.1.2 Intl.NumberFormat([ locales [, options]])
9 shouldBeType("Intl.NumberFormat()", "Intl.NumberFormat");
10 shouldBeType("Intl.NumberFormat.call({})", "Intl.NumberFormat");
11 shouldBeType("new Intl.NumberFormat()", "Intl.NumberFormat");
12
13 // Subclassable
14 var classPrefix = "class DerivedNumberFormat extends Intl.NumberFormat {};";
15 shouldBeTrue(classPrefix + "(new DerivedNumberFormat) instanceof DerivedNumberFormat");
16 shouldBeTrue(classPrefix + "(new DerivedNumberFormat) instanceof Intl.NumberFormat");
17 shouldBeTrue(classPrefix + "new DerivedNumberFormat().format(1) === '1'");
18 shouldBeTrue(classPrefix + "Object.getPrototypeOf(new DerivedNumberFormat) === DerivedNumberFormat.prototype");
19 shouldBeTrue(classPrefix + "Object.getPrototypeOf(Object.getPrototypeOf(new DerivedNumberFormat)) === Intl.NumberFormat.prototype");
20
21 // 11.2 Properties of the Intl.NumberFormat Constructor
22
23 // length property (whose value is 0)
24 shouldBe("Intl.NumberFormat.length", "0");
25
26 // 11.2.1 Intl.NumberFormat.prototype
27
28 // This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
29 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.NumberFormat, 'prototype').writable");
30 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.NumberFormat, 'prototype').enumerable");
31 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.NumberFormat, 'prototype').configurable");
32
33 // 11.2.2 Intl.NumberFormat.supportedLocalesOf (locales [, options ])
34
35 // The value of the length property of the supportedLocalesOf method is 1.
36 shouldBe("Intl.NumberFormat.supportedLocalesOf.length", "1");
37
38 // Returns SupportedLocales
39 shouldBeType("Intl.NumberFormat.supportedLocalesOf()", "Array");
40
41 // 11.3 Properties of the Intl.NumberFormat Prototype Object
42
43 // The value of Intl.NumberFormat.prototype.constructor is %NumberFormat%.
44 shouldBe("Intl.NumberFormat.prototype.constructor", "Intl.NumberFormat");
45
46 // 11.3.3 Intl.NumberFormat.prototype.format
47
48 // This named accessor property returns a function that formats a number according to the effective locale and the formatting options of this NumberFormat object.
49 shouldBeType("Intl.NumberFormat.prototype.format", "Function");
50
51 // The value of the [[Get]] attribute is a function
52 shouldBeType("Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, 'format').get", "Function");
53
54 // The value of the [[Set]] attribute is undefined.
55 shouldBe("Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, 'format').set", "undefined");
56
57 // Match Firefox where unspecifed.
58 shouldBeFalse("Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, 'format').enumerable");
59 shouldBeTrue("Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, 'format').configurable");
60
61 // The value of F’s length property is 1.
62 shouldBe("Intl.NumberFormat.prototype.format.length", "1");
63
64 // Throws on non-NumberFormat this.
65 shouldThrow("Object.defineProperty({}, 'format', Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, 'format')).format", "'TypeError: Intl.NumberFormat.prototype.format called on value that\\'s not an object initialized as a NumberFormat'");
66
67 // The format function is unique per instance.
68 shouldBeTrue("Intl.NumberFormat.prototype.format !== Intl.NumberFormat().format");
69 shouldBeTrue("new Intl.NumberFormat().format !== new Intl.NumberFormat().format");
70
71 // 11.3.4 Format Number Functions
72
73 // 1. Let nf be the this value.
74 // 2. Assert: Type(nf) is Object and nf has an [[initializedNumberFormat]] internal slot whose value is true.
75 // This should not be reachable, since format is bound to an initialized numberformat.
76
77 // 3. If value is not provided, let value be undefined.
78 // 4. Let x be ToNumber(value).
79 // 5. ReturnIfAbrupt(x).
80 shouldThrow("Intl.NumberFormat.prototype.format({ valueOf() { throw Error('5') } })", "'Error: 5'");
81
82 // Format is bound, so calling with alternate "this" has no effect.
83 shouldBe("Intl.NumberFormat.prototype.format.call(null, 1.2)", "Intl.NumberFormat().format(1.2)");
84 shouldBe("Intl.NumberFormat.prototype.format.call(Intl.DateTimeFormat('ar'), 1.2)", "Intl.NumberFormat().format(1.2)");
85 shouldBe("Intl.NumberFormat.prototype.format.call(5, 1.2)", "Intl.NumberFormat().format(1.2)");
86 shouldBe("new Intl.NumberFormat().format.call(null, 1.2)", "Intl.NumberFormat().format(1.2)");
87 shouldBe("new Intl.NumberFormat().format.call(Intl.DateTimeFormat('ar'), 1.2)", "Intl.NumberFormat().format(1.2)");
88 shouldBe("new Intl.NumberFormat().format.call(5, 1.2)", "Intl.NumberFormat().format(1.2)");
89
90 // 11.3.5 Intl.NumberFormat.prototype.resolvedOptions ()
91
92 shouldBe("Intl.NumberFormat.prototype.resolvedOptions.length", "0");
93
94 // Returns a new object whose properties and attributes are set as if constructed by an object literal.
95 shouldBeType("Intl.NumberFormat.prototype.resolvedOptions()", "Object");
96
97 // Returns a new object each time.
98 shouldBeFalse("Intl.NumberFormat.prototype.resolvedOptions() === Intl.NumberFormat.prototype.resolvedOptions()");
99
100 // Throws on non-NumberFormat this.
101 shouldThrow("Intl.NumberFormat.prototype.resolvedOptions.call(5)", "'TypeError: Intl.NumberFormat.prototype.resolvedOptions called on value that\\'s not an object initialized as a NumberFormat'");
102