1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copyright 2014 the V8 project authors. All rights reserved.
2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Use of this source code is governed by a BSD-style license that can be
3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// found in the LICENSE file.
4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawArity() {
6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals(1, String.raw.length);
7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawCallSiteToObject() {
11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertThrows("String.raw()", TypeError);
12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawCallSiteRawToObject() {
16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertThrows("String.raw([])", TypeError);
17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawUndefinedLength() {
21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = {};
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj));
24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = { lengt: 0 };
26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj));
27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawZeroLength() {
31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = { length: 0 };
33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj));
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj, "a", "b", "c"));
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = [];
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj));
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj, "a", "b", "c"));
39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawNegativeLength() {
43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = { length: -85 };
45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj));
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj, "a", "b", "c"));
47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = [];
49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj));
50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj, "a", "b", "c"));
51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
53958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawNaNLength() {
55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = { length: NaN };
57958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj));
58958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj, "a", "b", "c"));
59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = [];
61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj));
62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("", String.raw(callSiteObj, "a", "b", "c"));
63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawBasic() {
67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
68958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["a"];
69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("a", String.raw(callSiteObj));
70958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
73958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawNoSubst() {
74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
75958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["a", "b"];
76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("ab", String.raw(callSiteObj));
77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
79958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawSubst() {
81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["a", "b"];
83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("a!b", String.raw(callSiteObj, "!"));
84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["a", "b", "c"];
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("abc", String.raw(callSiteObj));
87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["a", "b", "c"];
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("a!bc", String.raw(callSiteObj, "!"));
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["a", "b", "c"];
92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("a!b?c", String.raw(callSiteObj, "!", "?"));
93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["\n", "\r\n", "\r"];
95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("\nx\r\ny\r", String.raw(callSiteObj, "x", "y"));
96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
97958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["\n", "\r\n", "\r"];
98958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("\n\r\r\r\n\n\r", String.raw(callSiteObj, "\r\r", "\n"));
99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawArrayLikeSubst() {
103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = {"length": 2, "0": "a", "1": "b", "2": "c"};
105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("axb", String.raw(callSiteObj, "x", "y"));
106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = {"length": 4, "0": "a", "1": "b", "2": "c"};
108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("axbycundefined", String.raw(callSiteObj, "x", "y"));
109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawAccessors() {
113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = {};
114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = {};
115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Object.defineProperties(callSiteObj, {
116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    "length": {
117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      get: function() { assertUnreachable(); },
118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      set: function(v) { assertUnreachable(); }
119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    },
120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    "0": {
121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      get: function() { assertUnreachable(); },
122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      set: function(v) { assertUnreachable(); }
123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    },
124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    "1": {
125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      get: function() { assertUnreachable(); },
126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      set: function(v) { assertUnreachable(); }
127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  });
129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Object.defineProperties(callSiteObj.raw, {
130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    "length": {
131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      get: function() { return 2; },
132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      set: function(v) { assertUnreachable(); }
133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    },
134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    "0": {
135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      get: function() { return "getter values"; },
136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      set: function(v) { assertUnreachable(); }
137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    },
138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    "1": {
139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      get: function() { return "are nice"; },
140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      set: function(v) { assertUnreachable(); }
141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  });
143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("getter values are nice", String.raw(callSiteObj, " "));
144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawHoleyArray() {
148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["1."];
150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw[2] = ".2";
151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("1.undefined.2", String.raw(callSiteObj));
152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawAccessorThrows() {
156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = [1];
158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  function MyError() {}
159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Object.defineProperty(callSiteObj.raw, "0", {
160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    get: function() { throw new MyError(); }
161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  });
162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertThrows(function() { String.raw(callSiteObj); }, MyError);
163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawToStringSafe() {
167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = [null, undefined, 1, "str", true, false, NaN, Infinity, {}];
169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("nullundefined1strtruefalseNaNInfinity[object Object]",
170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier               String.raw(callSiteObj));
171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("0null1undefined213str4true5false6NaN7Infinity8[object Object]9",
174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier               String.raw(callSiteObj, null, void 0, 1, "str", true, false,
175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier               NaN, Infinity, {}));
176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawToStringSymbolThrows() {
180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = [Symbol("foo")];
182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertThrows(function() {
183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    String.raw(callSiteObj);
184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }, TypeError);
185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["1", "2"];
187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertThrows(function() {
188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    String.raw(callSiteObj, Symbol("foo"));
189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }, TypeError);
190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawToStringThrows() {
194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var thrower = {};
196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  function MyError() {}
197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  thrower.toString = function() {
198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    throw new MyError();
199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = [thrower];
202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertThrows(function() {
203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    String.raw(callSiteObj);
204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }, MyError);
205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["1", "2"];
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertThrows(function() {
208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    String.raw(callSiteObj, thrower);
209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }, MyError);
210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawToStringValueOfThrows() {
214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var thrower = {};
216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  function MyError() {}
217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  thrower.toString = null;
218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  thrower.valueOf = function() {
219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    throw new MyError();
220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = [thrower];
223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertThrows(function() {
224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    String.raw(callSiteObj);
225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }, MyError);
226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = ["1", "2"];
228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertThrows(function() {
229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    String.raw(callSiteObj, thrower);
230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }, MyError);
231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier(function testStringRawOrder() {
235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var order = [];
236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var callSiteObj = [];
237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  callSiteObj.raw = {};
238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  function arg(v) {
239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    var result = {};
240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    result.toString = null;
241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    result.valueOf = function() { order.push("arg" + v); return v; }
242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return result;
243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Object.defineProperty(callSiteObj.raw, "length", {
246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    get: function() { order.push("length"); return 3; }
247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  });
248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  [1, 3, 5].forEach(function(v, i) {
249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Object.defineProperty(callSiteObj.raw, i, {
250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      get: function() { order.push("raw" + v); return v; }
251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    });
252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  });
253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals("12345", String.raw(callSiteObj, arg(2), arg(4), arg(6)));
255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals(["length", "raw1", "arg2", "raw3", "arg4", "raw5"], order);
256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier})();
257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function testStringRawToStringSubstitutionsOrder() {
260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  var subs = [];
261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  var log = [];
262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function stringify(toString) {
263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    var valueOf = "_" + toString + "_";
264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return {
265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      toString: function() { return toString; },
266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      valueOf: function() { return valueOf; }
267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    };
268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function getter(name, value) {
270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return {
271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      get: function() {
272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        log.push("get" + name);
273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return value;
274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      },
275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      set: function(v) {
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        log.push("set" + name);
277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    };
279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object.defineProperties(subs, {
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    0: getter(0, stringify("a")),
282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    1: getter(1, stringify("b")),
283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    2: getter(2, stringify("c"))
284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  });
285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertEquals("-a-b-c-", String.raw`-${subs[0]}-${subs[1]}-${subs[2]}-`);
287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertArrayEquals(["get0", "get1", "get2"], log);
288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  log.length = 0;
290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertEquals("-a-", String.raw`-${subs[0]}-`);
291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertArrayEquals(["get0"], log);
292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch})();
293