Source code
Revision control
Copy as Markdown
Other Tools
// Tests for String.prototype builtins with custom regexp symbols on
// the regular expression object itself.
// Custom re[@@match].
function testMatch() {
var s = "foobar";
var re = /abc.+/;
var count = 0;
for (var i = 0; i < 200; i++) {
s.match(re);
if (i === 150) {
re[Symbol.match] = function() {
count++;
return null;
};
}
}
assertEq(count, 49);
}
testMatch();
// Custom re[@@matchAll].
function testMatchAll() {
var s = "foobar";
var re = /abc.+/g;
var count = 0;
for (var i = 0; i < 200; i++) {
s.matchAll(re);
if (i === 150) {
re[Symbol.matchAll] = function() {
count++;
return null;
};
}
}
assertEq(count, 49);
}
testMatchAll();
// Custom re[@@replace] for replace.
function testReplace() {
var s = "foobar";
var re = /abc.+/;
var count = 0;
for (var i = 0; i < 200; i++) {
s.replace(re, "");
if (i === 150) {
re[Symbol.replace] = function() {
count++;
return "";
};
}
}
assertEq(count, 49);
}
testReplace();
// Custom re[@@replace] for replaceAll.
function testReplaceAll() {
var s = "foobar";
var re = /abc.+/g;
var count = 0;
for (var i = 0; i < 200; i++) {
s.replaceAll(re, "");
if (i === 150) {
re[Symbol.replace] = function() {
count++;
return "";
};
}
}
assertEq(count, 49);
}
testReplaceAll();
// Custom re[@@search].
function testSearch() {
var s = "foobar";
var re = /abc.+/g;
var count = 0;
for (var i = 0; i < 200; i++) {
s.search(re);
if (i === 150) {
re[Symbol.search] = function() {
count++;
return -1;
};
}
}
assertEq(count, 49);
}
testSearch();
// Custom re[@@split].
function testSplit() {
var s = "foobar";
var re = /abc.+/;
var count = 0;
for (var i = 0; i < 200; i++) {
s.split(re);
if (i === 150) {
re[Symbol.split] = function() {
count++;
return [];
};
}
}
assertEq(count, 49);
}
testSplit();
// RegExp.prototype fuse must still be intact.
assertEq(getFuseState().OptimizeRegExpPrototypeFuse.intact, true);