// 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); })();