[INTL] Implement String.prototype.localeCompare in ECMA-402
[WebKit-https.git] / LayoutTests / js / script-tests / string-localeCompare.js
1 description("This test checks the behavior of String.prototype.localeCompare as described in the ECMAScript Internationalization API Specification (ECMA-402 2.0).");
2
3 shouldBe("String.prototype.localeCompare.length", "1");
4 shouldBeFalse("Object.getOwnPropertyDescriptor(String.prototype, 'localeCompare').enumerable");
5 shouldBeTrue("Object.getOwnPropertyDescriptor(String.prototype, 'localeCompare').configurable");
6 shouldBeTrue("Object.getOwnPropertyDescriptor(String.prototype, 'localeCompare').writable");
7
8 // Test RequireObjectCoercible.
9 shouldThrow("String.prototype.localeCompare.call()", "'TypeError: String.prototype.localeCompare requires that |this| not be undefined'");
10 shouldThrow("String.prototype.localeCompare.call(undefined)", "'TypeError: String.prototype.localeCompare requires that |this| not be undefined'");
11 shouldThrow("String.prototype.localeCompare.call(null)", "'TypeError: String.prototype.localeCompare requires that |this| not be null'");
12 shouldNotThrow("String.prototype.localeCompare.call({}, '')");
13 shouldNotThrow("String.prototype.localeCompare.call([], '')");
14 shouldNotThrow("String.prototype.localeCompare.call(NaN, '')");
15 shouldNotThrow("String.prototype.localeCompare.call(5, '')");
16 shouldNotThrow("String.prototype.localeCompare.call('', '')");
17 shouldNotThrow("String.prototype.localeCompare.call(() => {}, '')");
18
19 // Test toString fails.
20 shouldThrow("''.localeCompare.call({ toString() { throw 'thisFail' } }, '')", "'thisFail'");
21 shouldThrow("''.localeCompare({ toString() { throw 'thatFail' } })", "'thatFail'");
22 shouldNotThrow("''.localeCompare()");
23 shouldNotThrow("''.localeCompare(null)");
24
25 // Basic support.
26 shouldBeTrue('"a".localeCompare("aa") < 0');
27 shouldBeTrue('"a".localeCompare("b") < 0');
28
29 shouldBeTrue('"a".localeCompare("a") === 0');
30 shouldBeTrue('"a\u0308\u0323".localeCompare("a\u0323\u0308") === 0');
31
32 shouldBeTrue('"aa".localeCompare("a") > 0');
33 shouldBeTrue('"b".localeCompare("a") > 0');
34
35 // Uses Intl.Collator.
36 shouldThrow("'a'.localeCompare('b', '$')", "'RangeError: invalid language tag: $'");
37 shouldThrow("'a'.localeCompare('b', 'en', {usage: 'Sort'})", '\'RangeError: usage must be either "sort" or "search"\'');
38
39 shouldBe("'ä'.localeCompare('z', 'en')", "-1");
40 shouldBe("'ä'.localeCompare('z', 'sv')", "1");
41
42 shouldBe("'a'.localeCompare('b', 'en', { sensitivity:'base' })", "-1");
43 shouldBe("'a'.localeCompare('ä', 'en', { sensitivity:'base' })", "0");
44 shouldBe("'a'.localeCompare('A', 'en', { sensitivity:'base' })", "0");
45 shouldBe("'a'.localeCompare('ⓐ', 'en', { sensitivity:'base' })", "0");
46
47 shouldBe("'a'.localeCompare('b', 'en', { sensitivity:'accent' })", "-1");
48 shouldBe("'a'.localeCompare('ä', 'en', { sensitivity:'accent' })", "-1");
49 shouldBe("'a'.localeCompare('A', 'en', { sensitivity:'accent' })", "0");
50 shouldBe("'a'.localeCompare('ⓐ', 'en', { sensitivity:'accent' })", "0");
51
52 shouldBe("'a'.localeCompare('b', 'en', { sensitivity:'case' })", "-1");
53 shouldBe("'a'.localeCompare('ä', 'en', { sensitivity:'case' })", "0");
54 shouldBe("'a'.localeCompare('A', 'en', { sensitivity:'case' })", "-1");
55 shouldBe("'a'.localeCompare('ⓐ', 'en', { sensitivity:'case' })", "0");
56
57 shouldBe("'a'.localeCompare('b', 'en', { sensitivity:'variant' })", "-1");
58 shouldBe("'a'.localeCompare('ä', 'en', { sensitivity:'variant' })", "-1");
59 shouldBe("'a'.localeCompare('A', 'en', { sensitivity:'variant' })", "-1");
60 shouldBe("'a'.localeCompare('ⓐ', 'en', { sensitivity:'variant' })", "-1");
61
62 shouldBe("'1'.localeCompare('2', 'en', { numeric:false })", "-1");
63 shouldBe("'2'.localeCompare('10', 'en', { numeric:false })", "1");
64 shouldBe("'01'.localeCompare('1', 'en', { numeric:false })", "-1");
65 shouldBe("'๑'.localeCompare('๒', 'en', { numeric:false })", "-1");
66 shouldBe("'๒'.localeCompare('๑๐', 'en', { numeric:false })", "1");
67 shouldBe("'๐๑'.localeCompare('๑', 'en', { numeric:false })", "-1");
68
69 shouldBe("'1'.localeCompare('2', 'en', { numeric:true })", "-1");
70 shouldBe("'2'.localeCompare('10', 'en', { numeric:true })", "-1");
71 shouldBe("'01'.localeCompare('1', 'en', { numeric:true })", "0");
72 shouldBe("'๑'.localeCompare('๒', 'en', { numeric:true })", "-1");
73 shouldBe("'๒'.localeCompare('๑๐', 'en', { numeric:true })", "-1");
74 shouldBe("'๐๑'.localeCompare('๑', 'en', { numeric:true })", "0");
75