replace-global-lambda.js (1592B)
1 "use strict"; 2 3 function testNoCaptureGroups() { 4 var s = "a..bb.cba."; 5 for (var i = 0; i < 20; i++) { 6 var log = ""; 7 var res = s.replace(/a|b/g, function(...args) { 8 assertEq(this, undefined); 9 assertEq(args.length, 3); 10 assertEq(args[2], s); 11 log += "(" + args[0] + args[1] + ")"; 12 return "X"; 13 }); 14 assertEq(res, "X..XX.cXX."); 15 assertEq(log, "(a0)(b3)(b4)(b7)(a8)"); 16 } 17 } 18 testNoCaptureGroups(); 19 20 function testCaptureGroups() { 21 var s = "a..bb.cba."; 22 for (var i = 0; i < 20; i++) { 23 var log = ""; 24 var res = s.replace(/(a)|(b)/g, function(...args) { 25 assertEq(this, undefined); 26 assertEq(args.length, 5); 27 assertEq(args[4], s); 28 log += "(" + args[0] + args[1] + args[2] + args[3] + ")"; 29 return "X"; 30 }); 31 assertEq(res, "X..XX.cXX."); 32 assertEq(log, "(aaundefined0)(bundefinedb3)(bundefinedb4)(bundefinedb7)(aaundefined8)"); 33 } 34 } 35 testCaptureGroups(); 36 37 // Calling RegExp#compile in the callback has no effect, because |replace| will 38 // create a new RegExp object from the original source/flags if this happens. 39 function testCaptureGroupsChanging() { 40 var s = "a..bb.cba."; 41 for (var i = 0; i < 20; i++) { 42 var log = ""; 43 var re = /a|b/g; 44 var res = s.replace(re, function(...args) { 45 assertEq(this, undefined); 46 assertEq(args.length, 3); 47 assertEq(args[2], s); 48 log += "(" + args[0] + args[1] + ")"; 49 re.compile("(a)|(b)", "g"); 50 return "X"; 51 }); 52 assertEq(res, "X..XX.cXX."); 53 assertEq(log, "(a0)(b3)(b4)(b7)(a8)"); 54 } 55 } 56 testCaptureGroupsChanging();