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