OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 // Flags: --harmony-templates |
| 6 |
| 7 (function testStringRawArity() { |
| 8 assertEquals(1, String.raw.length); |
| 9 })(); |
| 10 |
| 11 |
| 12 (function testStringRawCallSiteToObject() { |
| 13 assertThrows("String.raw()", TypeError); |
| 14 })(); |
| 15 |
| 16 |
| 17 (function testStringRawCallSiteRawToObject() { |
| 18 assertThrows("String.raw([])", TypeError); |
| 19 })(); |
| 20 |
| 21 |
| 22 (function testStringRawUndefinedLength() { |
| 23 var callSiteObj = []; |
| 24 callSiteObj.raw = {}; |
| 25 assertEquals("", String.raw(callSiteObj)); |
| 26 |
| 27 callSiteObj.raw = { lengt: 0 }; |
| 28 assertEquals("", String.raw(callSiteObj)); |
| 29 })(); |
| 30 |
| 31 |
| 32 (function testStringRawZeroLength() { |
| 33 var callSiteObj = []; |
| 34 callSiteObj.raw = { length: 0 }; |
| 35 assertEquals("", String.raw(callSiteObj)); |
| 36 assertEquals("", String.raw(callSiteObj, "a", "b", "c")); |
| 37 |
| 38 callSiteObj.raw = []; |
| 39 assertEquals("", String.raw(callSiteObj)); |
| 40 assertEquals("", String.raw(callSiteObj, "a", "b", "c")); |
| 41 })(); |
| 42 |
| 43 |
| 44 (function testStringRawNegativeLength() { |
| 45 var callSiteObj = []; |
| 46 callSiteObj.raw = { length: -85 }; |
| 47 assertEquals("", String.raw(callSiteObj)); |
| 48 assertEquals("", String.raw(callSiteObj, "a", "b", "c")); |
| 49 |
| 50 callSiteObj.raw = []; |
| 51 assertEquals("", String.raw(callSiteObj)); |
| 52 assertEquals("", String.raw(callSiteObj, "a", "b", "c")); |
| 53 })(); |
| 54 |
| 55 |
| 56 (function testStringRawNaNLength() { |
| 57 var callSiteObj = []; |
| 58 callSiteObj.raw = { length: NaN }; |
| 59 assertEquals("", String.raw(callSiteObj)); |
| 60 assertEquals("", String.raw(callSiteObj, "a", "b", "c")); |
| 61 |
| 62 callSiteObj.raw = []; |
| 63 assertEquals("", String.raw(callSiteObj)); |
| 64 assertEquals("", String.raw(callSiteObj, "a", "b", "c")); |
| 65 })(); |
| 66 |
| 67 |
| 68 (function testStringRawBasic() { |
| 69 var callSiteObj = []; |
| 70 callSiteObj.raw = ["a"]; |
| 71 assertEquals("a", String.raw(callSiteObj)); |
| 72 })(); |
| 73 |
| 74 |
| 75 (function testStringRawNoSubst() { |
| 76 var callSiteObj = []; |
| 77 callSiteObj.raw = ["a", "b"]; |
| 78 assertEquals("ab", String.raw(callSiteObj)); |
| 79 })(); |
| 80 |
| 81 |
| 82 (function testStringRawSubst() { |
| 83 var callSiteObj = []; |
| 84 callSiteObj.raw = ["a", "b"]; |
| 85 assertEquals("a!b", String.raw(callSiteObj, "!")); |
| 86 |
| 87 callSiteObj.raw = ["a", "b", "c"]; |
| 88 assertEquals("abc", String.raw(callSiteObj)); |
| 89 |
| 90 callSiteObj.raw = ["a", "b", "c"]; |
| 91 assertEquals("a!bc", String.raw(callSiteObj, "!")); |
| 92 |
| 93 callSiteObj.raw = ["a", "b", "c"]; |
| 94 assertEquals("a!b?c", String.raw(callSiteObj, "!", "?")); |
| 95 |
| 96 callSiteObj.raw = ["\n", "\r\n", "\r"]; |
| 97 assertEquals("\nx\r\ny\r", String.raw(callSiteObj, "x", "y")); |
| 98 |
| 99 callSiteObj.raw = ["\n", "\r\n", "\r"]; |
| 100 assertEquals("\n\r\r\r\n\n\r", String.raw(callSiteObj, "\r\r", "\n")); |
| 101 })(); |
| 102 |
| 103 |
| 104 (function testStringRawArrayLikeSubst() { |
| 105 var callSiteObj = []; |
| 106 callSiteObj.raw = {"length": 2, "0": "a", "1": "b", "2": "c"}; |
| 107 assertEquals("axb", String.raw(callSiteObj, "x", "y")); |
| 108 |
| 109 callSiteObj.raw = {"length": 4, "0": "a", "1": "b", "2": "c"}; |
| 110 assertEquals("axbycundefined", String.raw(callSiteObj, "x", "y")); |
| 111 })(); |
| 112 |
| 113 |
| 114 (function testStringRawAccessors() { |
| 115 var callSiteObj = {}; |
| 116 callSiteObj.raw = {}; |
| 117 Object.defineProperties(callSiteObj, { |
| 118 "length": { |
| 119 get: function() { assertUnreachable(); }, |
| 120 set: function(v) { assertUnreachable(); } |
| 121 }, |
| 122 "0": { |
| 123 get: function() { assertUnreachable(); }, |
| 124 set: function(v) { assertUnreachable(); } |
| 125 }, |
| 126 "1": { |
| 127 get: function() { assertUnreachable(); }, |
| 128 set: function(v) { assertUnreachable(); } |
| 129 } |
| 130 }); |
| 131 Object.defineProperties(callSiteObj.raw, { |
| 132 "length": { |
| 133 get: function() { return 2; }, |
| 134 set: function(v) { assertUnreachable(); } |
| 135 }, |
| 136 "0": { |
| 137 get: function() { return "getter values"; }, |
| 138 set: function(v) { assertUnreachable(); } |
| 139 }, |
| 140 "1": { |
| 141 get: function() { return "are nice"; }, |
| 142 set: function(v) { assertUnreachable(); } |
| 143 } |
| 144 }); |
| 145 assertEquals("getter values are nice", String.raw(callSiteObj, " ")); |
| 146 })(); |
| 147 |
| 148 |
| 149 (function testStringRawHoleyArray() { |
| 150 var callSiteObj = []; |
| 151 callSiteObj.raw = ["1."]; |
| 152 callSiteObj.raw[2] = ".2"; |
| 153 assertEquals("1.undefined.2", String.raw(callSiteObj)); |
| 154 })(); |
| 155 |
| 156 |
| 157 (function testStringRawAccessorThrows() { |
| 158 var callSiteObj = []; |
| 159 callSiteObj.raw = [1]; |
| 160 function MyError() {} |
| 161 Object.defineProperty(callSiteObj.raw, "0", { |
| 162 get: function() { throw new MyError(); } |
| 163 }); |
| 164 assertThrows(function() { String.raw(callSiteObj); }, MyError); |
| 165 })(); |
| 166 |
| 167 |
| 168 (function testStringRawToStringSafe() { |
| 169 var callSiteObj = []; |
| 170 callSiteObj.raw = [null, undefined, 1, "str", true, false, NaN, Infinity, {}]; |
| 171 assertEquals("nullundefined1strtruefalseNaNInfinity[object Object]", |
| 172 String.raw(callSiteObj)); |
| 173 |
| 174 callSiteObj.raw = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; |
| 175 assertEquals("0null1undefined213str4true5false6NaN7Infinity8[object Object]9", |
| 176 String.raw(callSiteObj, null, void 0, 1, "str", true, false, |
| 177 NaN, Infinity, {})); |
| 178 })(); |
| 179 |
| 180 |
| 181 (function testStringRawToStringSymbolThrows() { |
| 182 var callSiteObj = []; |
| 183 callSiteObj.raw = [Symbol("foo")]; |
| 184 assertThrows(function() { |
| 185 String.raw(callSiteObj); |
| 186 }, TypeError); |
| 187 |
| 188 callSiteObj.raw = ["1", "2"]; |
| 189 assertThrows(function() { |
| 190 String.raw(callSiteObj, Symbol("foo")); |
| 191 }, TypeError); |
| 192 })(); |
| 193 |
| 194 |
| 195 (function testStringRawToStringThrows() { |
| 196 var callSiteObj = []; |
| 197 var thrower = {}; |
| 198 function MyError() {} |
| 199 thrower.toString = function() { |
| 200 throw new MyError(); |
| 201 } |
| 202 |
| 203 callSiteObj.raw = [thrower]; |
| 204 assertThrows(function() { |
| 205 String.raw(callSiteObj); |
| 206 }, MyError); |
| 207 |
| 208 callSiteObj.raw = ["1", "2"]; |
| 209 assertThrows(function() { |
| 210 String.raw(callSiteObj, thrower); |
| 211 }, MyError); |
| 212 })(); |
| 213 |
| 214 |
| 215 (function testStringRawToStringValueOfThrows() { |
| 216 var callSiteObj = []; |
| 217 var thrower = {}; |
| 218 function MyError() {} |
| 219 thrower.toString = null; |
| 220 thrower.valueOf = function() { |
| 221 throw new MyError(); |
| 222 } |
| 223 |
| 224 callSiteObj.raw = [thrower]; |
| 225 assertThrows(function() { |
| 226 String.raw(callSiteObj); |
| 227 }, MyError); |
| 228 |
| 229 callSiteObj.raw = ["1", "2"]; |
| 230 assertThrows(function() { |
| 231 String.raw(callSiteObj, thrower); |
| 232 }, MyError); |
| 233 })(); |
| 234 |
| 235 |
| 236 (function testStringRawOrder() { |
| 237 var order = []; |
| 238 var callSiteObj = []; |
| 239 callSiteObj.raw = {}; |
| 240 function arg(v) { |
| 241 var result = {}; |
| 242 result.toString = null; |
| 243 result.valueOf = function() { order.push("arg" + v); return v; } |
| 244 return result; |
| 245 } |
| 246 |
| 247 Object.defineProperty(callSiteObj.raw, "length", { |
| 248 get: function() { order.push("length"); return 3; } |
| 249 }); |
| 250 [1, 3, 5].forEach(function(v, i) { |
| 251 Object.defineProperty(callSiteObj.raw, i, { |
| 252 get: function() { order.push("raw" + v); return v; } |
| 253 }); |
| 254 }); |
| 255 |
| 256 assertEquals("12345", String.raw(callSiteObj, arg(2), arg(4), arg(6))); |
| 257 assertEquals(["length", "raw1", "arg2", "raw3", "arg4", "raw5"], order); |
| 258 })(); |
OLD | NEW |