1// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --harmony-strings
6
7// Tests taken from:
8// https://github.com/mathiasbynens/String.prototype.codePointAt
9
10assertEquals(String.prototype.codePointAt.length, 1);
11assertEquals(String.prototype.propertyIsEnumerable("codePointAt"), false);
12
13// String that starts with a BMP symbol
14assertEquals("abc\uD834\uDF06def".codePointAt(""), 0x61);
15assertEquals("abc\uD834\uDF06def".codePointAt("_"), 0x61);
16assertEquals("abc\uD834\uDF06def".codePointAt(), 0x61);
17assertEquals("abc\uD834\uDF06def".codePointAt(-Infinity), undefined);
18assertEquals("abc\uD834\uDF06def".codePointAt(-1), undefined);
19assertEquals("abc\uD834\uDF06def".codePointAt(-0), 0x61);
20assertEquals("abc\uD834\uDF06def".codePointAt(0), 0x61);
21assertEquals("abc\uD834\uDF06def".codePointAt(3), 0x1D306);
22assertEquals("abc\uD834\uDF06def".codePointAt(4), 0xDF06);
23assertEquals("abc\uD834\uDF06def".codePointAt(5), 0x64);
24assertEquals("abc\uD834\uDF06def".codePointAt(42), undefined);
25assertEquals("abc\uD834\uDF06def".codePointAt(Infinity), undefined);
26assertEquals("abc\uD834\uDF06def".codePointAt(Infinity), undefined);
27assertEquals("abc\uD834\uDF06def".codePointAt(NaN), 0x61);
28assertEquals("abc\uD834\uDF06def".codePointAt(false), 0x61);
29assertEquals("abc\uD834\uDF06def".codePointAt(null), 0x61);
30assertEquals("abc\uD834\uDF06def".codePointAt(undefined), 0x61);
31
32// String that starts with an astral symbol
33assertEquals("\uD834\uDF06def".codePointAt(""), 0x1D306);
34assertEquals("\uD834\uDF06def".codePointAt("1"), 0xDF06);
35assertEquals("\uD834\uDF06def".codePointAt("_"), 0x1D306);
36assertEquals("\uD834\uDF06def".codePointAt(), 0x1D306);
37assertEquals("\uD834\uDF06def".codePointAt(-1), undefined);
38assertEquals("\uD834\uDF06def".codePointAt(-0), 0x1D306);
39assertEquals("\uD834\uDF06def".codePointAt(0), 0x1D306);
40assertEquals("\uD834\uDF06def".codePointAt(1), 0xDF06);
41assertEquals("\uD834\uDF06def".codePointAt(42), undefined);
42assertEquals("\uD834\uDF06def".codePointAt(false), 0x1D306);
43assertEquals("\uD834\uDF06def".codePointAt(null), 0x1D306);
44assertEquals("\uD834\uDF06def".codePointAt(undefined), 0x1D306);
45
46// Lone high surrogates
47assertEquals("\uD834abc".codePointAt(""), 0xD834);
48assertEquals("\uD834abc".codePointAt("_"), 0xD834);
49assertEquals("\uD834abc".codePointAt(), 0xD834);
50assertEquals("\uD834abc".codePointAt(-1), undefined);
51assertEquals("\uD834abc".codePointAt(-0), 0xD834);
52assertEquals("\uD834abc".codePointAt(0), 0xD834);
53assertEquals("\uD834abc".codePointAt(false), 0xD834);
54assertEquals("\uD834abc".codePointAt(NaN), 0xD834);
55assertEquals("\uD834abc".codePointAt(null), 0xD834);
56assertEquals("\uD834abc".codePointAt(undefined), 0xD834);
57
58// Lone low surrogates
59assertEquals("\uDF06abc".codePointAt(""), 0xDF06);
60assertEquals("\uDF06abc".codePointAt("_"), 0xDF06);
61assertEquals("\uDF06abc".codePointAt(), 0xDF06);
62assertEquals("\uDF06abc".codePointAt(-1), undefined);
63assertEquals("\uDF06abc".codePointAt(-0), 0xDF06);
64assertEquals("\uDF06abc".codePointAt(0), 0xDF06);
65assertEquals("\uDF06abc".codePointAt(false), 0xDF06);
66assertEquals("\uDF06abc".codePointAt(NaN), 0xDF06);
67assertEquals("\uDF06abc".codePointAt(null), 0xDF06);
68assertEquals("\uDF06abc".codePointAt(undefined), 0xDF06);
69
70assertThrows(function() {
71  String.prototype.codePointAt.call(undefined);
72}, TypeError);
73assertThrows(function() {
74  String.prototype.codePointAt.call(undefined, 4);
75}, TypeError);
76assertThrows(function() {
77  String.prototype.codePointAt.call(null);
78}, TypeError);
79assertThrows(function() {
80  String.prototype.codePointAt.call(null, 4);
81}, TypeError);
82assertEquals(String.prototype.codePointAt.call(42, 0), 0x34);
83assertEquals(String.prototype.codePointAt.call(42, 1), 0x32);
84assertEquals(String.prototype.codePointAt.call({
85  toString: function() { return "abc"; }
86}, 2), 0x63);
87var tmp = 0;
88assertEquals(String.prototype.codePointAt.call({
89  toString: function() { ++tmp; return String(tmp); }
90}, 0), 0x31);
91assertEquals(tmp, 1);
92