|  | // Copyright 2014 the V8 project authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | (function testStringRawArity() { | 
|  | assertEquals(1, String.raw.length); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawCallSiteToObject() { | 
|  | assertThrows("String.raw()", TypeError); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawCallSiteRawToObject() { | 
|  | assertThrows("String.raw([])", TypeError); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawUndefinedLength() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = {}; | 
|  | assertEquals("", String.raw(callSiteObj)); | 
|  |  | 
|  | callSiteObj.raw = { lengt: 0 }; | 
|  | assertEquals("", String.raw(callSiteObj)); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawZeroLength() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = { length: 0 }; | 
|  | assertEquals("", String.raw(callSiteObj)); | 
|  | assertEquals("", String.raw(callSiteObj, "a", "b", "c")); | 
|  |  | 
|  | callSiteObj.raw = []; | 
|  | assertEquals("", String.raw(callSiteObj)); | 
|  | assertEquals("", String.raw(callSiteObj, "a", "b", "c")); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawNegativeLength() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = { length: -85 }; | 
|  | assertEquals("", String.raw(callSiteObj)); | 
|  | assertEquals("", String.raw(callSiteObj, "a", "b", "c")); | 
|  |  | 
|  | callSiteObj.raw = []; | 
|  | assertEquals("", String.raw(callSiteObj)); | 
|  | assertEquals("", String.raw(callSiteObj, "a", "b", "c")); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawNaNLength() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = { length: NaN }; | 
|  | assertEquals("", String.raw(callSiteObj)); | 
|  | assertEquals("", String.raw(callSiteObj, "a", "b", "c")); | 
|  |  | 
|  | callSiteObj.raw = []; | 
|  | assertEquals("", String.raw(callSiteObj)); | 
|  | assertEquals("", String.raw(callSiteObj, "a", "b", "c")); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawBasic() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = ["a"]; | 
|  | assertEquals("a", String.raw(callSiteObj)); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawNoSubst() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = ["a", "b"]; | 
|  | assertEquals("ab", String.raw(callSiteObj)); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawSubst() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = ["a", "b"]; | 
|  | assertEquals("a!b", String.raw(callSiteObj, "!")); | 
|  |  | 
|  | callSiteObj.raw = ["a", "b", "c"]; | 
|  | assertEquals("abc", String.raw(callSiteObj)); | 
|  |  | 
|  | callSiteObj.raw = ["a", "b", "c"]; | 
|  | assertEquals("a!bc", String.raw(callSiteObj, "!")); | 
|  |  | 
|  | callSiteObj.raw = ["a", "b", "c"]; | 
|  | assertEquals("a!b?c", String.raw(callSiteObj, "!", "?")); | 
|  |  | 
|  | callSiteObj.raw = ["\n", "\r\n", "\r"]; | 
|  | assertEquals("\nx\r\ny\r", String.raw(callSiteObj, "x", "y")); | 
|  |  | 
|  | callSiteObj.raw = ["\n", "\r\n", "\r"]; | 
|  | assertEquals("\n\r\r\r\n\n\r", String.raw(callSiteObj, "\r\r", "\n")); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawArrayLikeSubst() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = {"length": 2, "0": "a", "1": "b", "2": "c"}; | 
|  | assertEquals("axb", String.raw(callSiteObj, "x", "y")); | 
|  |  | 
|  | callSiteObj.raw = {"length": 4, "0": "a", "1": "b", "2": "c"}; | 
|  | assertEquals("axbycundefined", String.raw(callSiteObj, "x", "y")); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawAccessors() { | 
|  | var callSiteObj = {}; | 
|  | callSiteObj.raw = {}; | 
|  | Object.defineProperties(callSiteObj, { | 
|  | "length": { | 
|  | get: function() { assertUnreachable(); }, | 
|  | set: function(v) { assertUnreachable(); } | 
|  | }, | 
|  | "0": { | 
|  | get: function() { assertUnreachable(); }, | 
|  | set: function(v) { assertUnreachable(); } | 
|  | }, | 
|  | "1": { | 
|  | get: function() { assertUnreachable(); }, | 
|  | set: function(v) { assertUnreachable(); } | 
|  | } | 
|  | }); | 
|  | Object.defineProperties(callSiteObj.raw, { | 
|  | "length": { | 
|  | get: function() { return 2; }, | 
|  | set: function(v) { assertUnreachable(); } | 
|  | }, | 
|  | "0": { | 
|  | get: function() { return "getter values"; }, | 
|  | set: function(v) { assertUnreachable(); } | 
|  | }, | 
|  | "1": { | 
|  | get: function() { return "are nice"; }, | 
|  | set: function(v) { assertUnreachable(); } | 
|  | } | 
|  | }); | 
|  | assertEquals("getter values are nice", String.raw(callSiteObj, " ")); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawHoleyArray() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = ["1."]; | 
|  | callSiteObj.raw[2] = ".2"; | 
|  | assertEquals("1.undefined.2", String.raw(callSiteObj)); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawAccessorThrows() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = [1]; | 
|  | function MyError() {} | 
|  | Object.defineProperty(callSiteObj.raw, "0", { | 
|  | get: function() { throw new MyError(); } | 
|  | }); | 
|  | assertThrows(function() { String.raw(callSiteObj); }, MyError); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawToStringSafe() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = [null, undefined, 1, "str", true, false, NaN, Infinity, {}]; | 
|  | assertEquals("nullundefined1strtruefalseNaNInfinity[object Object]", | 
|  | String.raw(callSiteObj)); | 
|  |  | 
|  | callSiteObj.raw = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; | 
|  | assertEquals("0null1undefined213str4true5false6NaN7Infinity8[object Object]9", | 
|  | String.raw(callSiteObj, null, void 0, 1, "str", true, false, | 
|  | NaN, Infinity, {})); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawToStringSymbolThrows() { | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = [Symbol("foo")]; | 
|  | assertThrows(function() { | 
|  | String.raw(callSiteObj); | 
|  | }, TypeError); | 
|  |  | 
|  | callSiteObj.raw = ["1", "2"]; | 
|  | assertThrows(function() { | 
|  | String.raw(callSiteObj, Symbol("foo")); | 
|  | }, TypeError); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawToStringThrows() { | 
|  | var callSiteObj = []; | 
|  | var thrower = {}; | 
|  | function MyError() {} | 
|  | thrower.toString = function() { | 
|  | throw new MyError(); | 
|  | } | 
|  |  | 
|  | callSiteObj.raw = [thrower]; | 
|  | assertThrows(function() { | 
|  | String.raw(callSiteObj); | 
|  | }, MyError); | 
|  |  | 
|  | callSiteObj.raw = ["1", "2"]; | 
|  | assertThrows(function() { | 
|  | String.raw(callSiteObj, thrower); | 
|  | }, MyError); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawToStringValueOfThrows() { | 
|  | var callSiteObj = []; | 
|  | var thrower = {}; | 
|  | function MyError() {} | 
|  | thrower.toString = null; | 
|  | thrower.valueOf = function() { | 
|  | throw new MyError(); | 
|  | } | 
|  |  | 
|  | callSiteObj.raw = [thrower]; | 
|  | assertThrows(function() { | 
|  | String.raw(callSiteObj); | 
|  | }, MyError); | 
|  |  | 
|  | callSiteObj.raw = ["1", "2"]; | 
|  | assertThrows(function() { | 
|  | String.raw(callSiteObj, thrower); | 
|  | }, MyError); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawOrder() { | 
|  | var order = []; | 
|  | var callSiteObj = []; | 
|  | callSiteObj.raw = {}; | 
|  | function arg(v) { | 
|  | var result = {}; | 
|  | result.toString = null; | 
|  | result.valueOf = function() { order.push("arg" + v); return v; } | 
|  | return result; | 
|  | } | 
|  |  | 
|  | Object.defineProperty(callSiteObj.raw, "length", { | 
|  | get: function() { order.push("length"); return 3; } | 
|  | }); | 
|  | [1, 3, 5].forEach(function(v, i) { | 
|  | Object.defineProperty(callSiteObj.raw, i, { | 
|  | get: function() { order.push("raw" + v); return v; } | 
|  | }); | 
|  | }); | 
|  |  | 
|  | assertEquals("12345", String.raw(callSiteObj, arg(2), arg(4), arg(6))); | 
|  | assertEquals(["length", "raw1", "arg2", "raw3", "arg4", "raw5"], order); | 
|  | })(); | 
|  |  | 
|  |  | 
|  | (function testStringRawToStringSubstitutionsOrder() { | 
|  | var subs = []; | 
|  | var log = []; | 
|  | function stringify(toString) { | 
|  | var valueOf = "_" + toString + "_"; | 
|  | return { | 
|  | toString: function() { return toString; }, | 
|  | valueOf: function() { return valueOf; } | 
|  | }; | 
|  | } | 
|  | function getter(name, value) { | 
|  | return { | 
|  | get: function() { | 
|  | log.push("get" + name); | 
|  | return value; | 
|  | }, | 
|  | set: function(v) { | 
|  | log.push("set" + name); | 
|  | } | 
|  | }; | 
|  | } | 
|  | Object.defineProperties(subs, { | 
|  | 0: getter(0, stringify("a")), | 
|  | 1: getter(1, stringify("b")), | 
|  | 2: getter(2, stringify("c")) | 
|  | }); | 
|  |  | 
|  | assertEquals("-a-b-c-", String.raw`-${subs[0]}-${subs[1]}-${subs[2]}-`); | 
|  | assertArrayEquals(["get0", "get1", "get2"], log); | 
|  |  | 
|  | log.length = 0; | 
|  | assertEquals("-a-", String.raw`-${subs[0]}-`); | 
|  | assertArrayEquals(["get0"], log); | 
|  | })(); |