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