15.5.4.11.js (9053B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 var BUGNUMBER = 392378; 6 var summary = '15.5.4.11 - String.prototype.replace'; 7 var rex, f, a, i; 8 9 reportCompare( 10 2, 11 String.prototype.replace.length, 12 "Section 1" 13 ); 14 15 reportCompare( 16 "321", 17 String.prototype.replace.call(123, "123", "321"), 18 "Section 2" 19 ); 20 21 reportCompare( 22 "ok", 23 "ok".replace(), 24 "Section 3" 25 ); 26 27 reportCompare( 28 "undefined**", 29 "***".replace("*"), 30 "Section 4" 31 ); 32 33 reportCompare( 34 "xnullz", 35 "xyz".replace("y", null), 36 "Section 5" 37 ); 38 39 reportCompare( 40 "x123", 41 "xyz".replace("yz", 123), 42 "Section 6" 43 ); 44 45 reportCompare( 46 "/x/g/x/g/x/g", 47 "xxx".replace(/x/g, /x/g), 48 "Section 7" 49 ); 50 51 reportCompare( 52 "ok", 53 "undefined".replace(undefined, "ok"), 54 "Section 8" 55 ); 56 57 reportCompare( 58 "ok", 59 "null".replace(null, "ok"), 60 "Section 9" 61 ); 62 63 reportCompare( 64 "ok", 65 "123".replace(123, "ok"), 66 "Section 10" 67 ); 68 69 reportCompare( 70 "xzyxyz", 71 "xyzxyz".replace("yz", "zy"), 72 "Section 11" 73 ); 74 75 reportCompare( 76 "ok", 77 "(xyz)".replace("(xyz)", "ok"), 78 "Section 12" 79 ); 80 81 reportCompare( 82 "*$&yzxyz", 83 "xyzxyz".replace("x", "*$$&"), 84 "Section 13" 85 ); 86 87 reportCompare( 88 "xy*z*", 89 "xyz".replace("z", "*$&*"), 90 "Section 14" 91 ); 92 93 reportCompare( 94 "xyxyzxyz", 95 "xyzxyzxyz".replace("zxy", "$`"), 96 "Section 15" 97 ); 98 99 reportCompare( 100 "zxyzxyzzxyz", 101 "xyzxyz".replace("xy", "$'xyz"), 102 "Section 16" 103 ); 104 105 reportCompare( 106 "$", 107 "xyzxyz".replace("xyzxyz", "$"), 108 "Section 17" 109 ); 110 111 reportCompare( 112 "x$0$00xyz", 113 "xyzxyz".replace("yz", "$0$00"), 114 "Section 18" 115 ); 116 117 // Result for $1/$01 .. $99 is implementation-defined if searchValue is no 118 // regular expression. $+ is a non-standard Mozilla extension. 119 120 reportCompare( 121 "$!$\"$-1$*$#$.$xyz$$", 122 "xyzxyz$$".replace("xyz", "$!$\"$-1$*$#$.$"), 123 "Section 19" 124 ); 125 126 reportCompare( 127 "$$$&$$$&$&", 128 "$$$&".replace("$$", "$$$$$$&$&$$&"), 129 "Section 20" 130 ); 131 132 reportCompare( 133 "yxx", 134 "xxx".replace(/x/, "y"), 135 "Section 21" 136 ); 137 138 reportCompare( 139 "yyy", 140 "xxx".replace(/x/g, "y"), 141 "Section 22" 142 ); 143 144 rex = /x/, rex.lastIndex = 1; 145 reportCompare( 146 "yxx1", 147 "xxx".replace(rex, "y") + rex.lastIndex, 148 "Section 23" 149 ); 150 151 rex = /x/g, rex.lastIndex = 1; 152 reportCompare( 153 "yyy0", 154 "xxx".replace(rex, "y") + rex.lastIndex, 155 "Section 24" 156 ); 157 158 rex = /y/, rex.lastIndex = 1; 159 reportCompare( 160 "xxx1", 161 "xxx".replace(rex, "y") + rex.lastIndex, 162 "Section 25" 163 ); 164 165 rex = /y/g, rex.lastIndex = 1; 166 reportCompare( 167 "xxx0", 168 "xxx".replace(rex, "y") + rex.lastIndex, 169 "Section 26" 170 ); 171 172 rex = /x?/, rex.lastIndex = 1; 173 reportCompare( 174 "(x)xx1", 175 "xxx".replace(rex, "($&)") + rex.lastIndex, 176 "Section 27" 177 ); 178 179 rex = /x?/g, rex.lastIndex = 1; 180 reportCompare( 181 "(x)(x)(x)()0", 182 "xxx".replace(rex, "($&)") + rex.lastIndex, 183 "Section 28" 184 ); 185 186 rex = /y?/, rex.lastIndex = 1; 187 reportCompare( 188 "()xxx1", 189 "xxx".replace(rex, "($&)") + rex.lastIndex, 190 "Section 29" 191 ); 192 193 rex = /y?/g, rex.lastIndex = 1; 194 reportCompare( 195 "()x()x()x()0", 196 "xxx".replace(rex, "($&)") + rex.lastIndex, 197 "Section 30" 198 ); 199 200 reportCompare( 201 "xy$0xy$zxy$zxyz$zxyz", 202 "xyzxyzxyz".replace(/zxy/, "$0$`$$$&$$$'$"), 203 "Section 31" 204 ); 205 206 reportCompare( 207 "xy$0xy$zxy$zxyz$$0xyzxy$zxy$z$z", 208 "xyzxyzxyz".replace(/zxy/g, "$0$`$$$&$$$'$"), 209 "Section 32" 210 ); 211 212 reportCompare( 213 "xyxyxyzxyxyxyz", 214 "xyzxyz".replace(/(((x)(y)()()))()()()(z)/g, "$01$2$3$04$5$6$7$8$09$10"), 215 "Section 33" 216 ); 217 218 rex = RegExp( 219 "()()()()()()()()()()" + 220 "()()()()()()()()()()" + 221 "()()()()()()()()()()" + 222 "()()()()()()()()()()" + 223 "()()()()()()()()()()" + 224 "()()()()()()()()()()" + 225 "()()()()()()()()()()" + 226 "()()()()()()()()()()" + 227 "()()()()()()()()()()" + 228 "()()()()()()()()(y)"); 229 reportCompare( 230 "x(y)z", 231 "xyz".replace(rex, "($99)"), 232 "Section 34" 233 ); 234 235 rex = RegExp( 236 "()()()()()()()()()(x)" + 237 "()()()()()()()()()()" + 238 "()()()()()()()()()()" + 239 "()()()()()()()()()()" + 240 "()()()()()()()()()()" + 241 "()()()()()()()()()()" + 242 "()()()()()()()()()()" + 243 "()()()()()()()()()()" + 244 "()()()()()()()()()()" + 245 "()()()()()()()()()(y)"); 246 reportCompare( 247 "(x0)z", 248 "xyz".replace(rex, "($100)"), 249 "Section 35" 250 ); 251 252 reportCompare( 253 "xyz(XYZ)", 254 "xyzXYZ".replace(/XYZ/g, "($&)"), 255 "Section 36" 256 ); 257 258 reportCompare( 259 "(xyz)(XYZ)", 260 "xyzXYZ".replace(/xYz/gi, "($&)"), 261 "Section 37" 262 ); 263 264 reportCompare( 265 "xyz\rxyz\n", 266 "xyz\rxyz\n".replace(/xyz$/g, "($&)"), 267 "Section 38" 268 ); 269 270 reportCompare( 271 "(xyz)\r(xyz)\n", 272 "xyz\rxyz\n".replace(/xyz$/gm, "($&)"), 273 "Section 39" 274 ); 275 276 f = function () { return "failure" }; 277 278 reportCompare( 279 "ok", 280 "ok".replace("x", f), 281 "Section 40" 282 ); 283 284 reportCompare( 285 "ok", 286 "ok".replace(/(?=k)ok/, f), 287 "Section 41" 288 ); 289 290 reportCompare( 291 "ok", 292 "ok".replace(/(?!)ok/, f), 293 "Section 42" 294 ); 295 296 reportCompare( 297 "ok", 298 "ok".replace(/ok(?!$)/, f), 299 "Section 43" 300 ); 301 302 f = function (sub, offs, str) { 303 return ["", sub, typeof sub, offs, typeof offs, str, typeof str, ""] 304 .join("|"); 305 }; 306 307 reportCompare( 308 "x|y|string|1|number|xyz|string|z", 309 "xyz".replace("y", f), 310 "Section 44" 311 ); 312 313 reportCompare( 314 "x|(y)|string|1|number|x(y)z|string|z", 315 "x(y)z".replace("(y)", f), 316 "Section 45" 317 ); 318 319 reportCompare( 320 "x|y*|string|1|number|xy*z|string|z", 321 "xy*z".replace("y*", f), 322 "Section 46" 323 ); 324 325 reportCompare( 326 "12|3|string|2|number|12345|string|45", 327 String.prototype.replace.call(1.2345e4, 3, f), 328 "Section 47" 329 ); 330 331 reportCompare( 332 "|x|string|0|number|xxx|string|xx", 333 "xxx".replace(/^x/g, f), 334 "Section 48" 335 ); 336 337 reportCompare( 338 "xx|x|string|2|number|xxx|string|", 339 "xxx".replace(/x$/g, f), 340 "Section 49" 341 ); 342 343 f = function (sub, paren, offs, str) { 344 return ["", sub, typeof sub, paren, typeof paren, offs, typeof offs, 345 str, typeof str, ""].join("|"); 346 }; 347 348 reportCompare( 349 "xy|z|string|z|string|2|number|xyz|string|", 350 "xyz".replace(/(z)/g, f), 351 "Section 50" 352 ); 353 354 reportCompare( 355 "xyz||string||string|3|number|xyz|string|", 356 "xyz".replace(/($)/g, f), 357 "Section 51" 358 ); 359 360 reportCompare( 361 "|xy|string|y|string|0|number|xyz|string|z", 362 "xyz".replace(/(?:x)(y)/g, f), 363 "Section 52" 364 ); 365 366 reportCompare( 367 "|x|string|x|string|0|number|xyz|string|yz", 368 "xyz".replace(/((?=xy)x)/g, f), 369 "Section 53" 370 ); 371 372 reportCompare( 373 "|x|string|x|string|0|number|xyz|string|yz", 374 "xyz".replace(/(x(?=y))/g, f), 375 "Section 54" 376 ); 377 378 reportCompare( 379 "x|y|string|y|string|1|number|xyz|string|z", 380 "xyz".replace(/((?!x)y)/g, f), 381 "Section 55" 382 ); 383 384 reportCompare( 385 "|x|string|x|string|0|number|xyz|string|" + 386 "|y|string||undefined|1|number|xyz|string|z", 387 "xyz".replace(/y|(x)/g, f), 388 "Section 56" 389 ); 390 391 reportCompare( 392 "xy|z|string||string|2|number|xyz|string|", 393 "xyz".replace(/(z?)z/, f), 394 "Section 57" 395 ); 396 397 reportCompare( 398 "xy|z|string||undefined|2|number|xyz|string|", 399 "xyz".replace(/(z)?z/, f), 400 "Section 58" 401 ); 402 403 reportCompare( 404 "xy|z|string||undefined|2|number|xyz|string|", 405 "xyz".replace(/(z)?\1z/, f), 406 "Section 59" 407 ); 408 409 reportCompare( 410 "xy|z|string||undefined|2|number|xyz|string|", 411 "xyz".replace(/\1(z)?z/, f), 412 "Section 60" 413 ); 414 415 reportCompare( 416 "xy|z|string||string|2|number|xyz|string|", 417 "xyz".replace(/(z?\1)z/, f), 418 "Section 61" 419 ); 420 421 f = function (sub, paren1, paren2, offs, str) { 422 return ["", sub, typeof sub, paren1, typeof paren1, paren2, typeof paren2, 423 offs, typeof offs, str, typeof str, ""].join("|"); 424 }; 425 426 reportCompare( 427 "x|y|string|y|string||undefined|1|number|xyz|string|z", 428 "xyz".replace(/(y)(\1)?/, f), 429 "Section 62" 430 ); 431 432 reportCompare( 433 "x|yy|string|y|string|y|string|1|number|xyyz|string|z", 434 "xyyz".replace(/(y)(\1)?/g, f), 435 "Section 63" 436 ); 437 438 reportCompare( 439 "x|y|string|y|string||undefined|1|number|xyyz|string|" + 440 "|y|string|y|string||undefined|2|number|xyyz|string|z", 441 "xyyz".replace(/(y)(\1)??/g, f), 442 "Section 64" 443 ); 444 445 reportCompare( 446 "x|y|string|y|string|y|string|1|number|xyz|string|z", 447 "xyz".replace(/(?=(y))(\1)?/, f), 448 "Section 65" 449 ); 450 451 reportCompare( 452 "xyy|z|string||undefined||string|3|number|xyyz|string|", 453 "xyyz".replace(/(?!(y)y)(\1)z/, f), 454 "Section 66" 455 ); 456 457 rex = RegExp( 458 "()()()()()()()()()()" + 459 "()()()()()()()()()()" + 460 "()()()()()()()()()()" + 461 "()()()()()()()()()()" + 462 "()()()()()()()()()()" + 463 "()()()()()()()()()()" + 464 "()()()()()()()()()()" + 465 "()()()()()()()()()()" + 466 "()()()()()()()()()()" + 467 "()()()()()()()()()()(z)?(y)"); 468 a = ["sub"]; 469 for (i = 1; i <= 102; ++i) 470 a[i] = "p" + i; 471 a[103] = "offs"; 472 a[104] = "str"; 473 a[105] = "return ['', sub, typeof sub, offs, typeof offs, str, typeof str, " + 474 "p100, typeof p100, p101, typeof p101, p102, typeof p102, ''].join('|');"; 475 f = Function.apply(null, a); 476 reportCompare( 477 "x|y|string|1|number|xyz|string||string||undefined|y|string|z", 478 "xyz".replace(rex, f), 479 "Section 67" 480 ); 481 482 reportCompare( 483 "undefined", 484 "".replace(/.*/g, function () {}), 485 "Section 68" 486 ); 487 488 reportCompare( 489 "nullxnullynullznull", 490 "xyz".replace(/.??/g, function () { return null; }), 491 "Section 69" 492 ); 493 494 reportCompare( 495 "111", 496 "xyz".replace(/./g, function () { return 1; }), 497 "Section 70" 498 );