blob: 0c18359f55051c4a00d0e1851e715a2c19221905 [file] [log] [blame]
function assert(assertion) {
if (typeof assertion != "string")
throw new Error("Invalid assertion.");
let result = eval(assertion);
if (!result)
throw new Error("Bad assertion: " + assertion);
}
let get = [];
let getSet = [];
function resetTracking()
{
get = [];
getSet = [];
}
let getProxyNullExec = new Proxy({
exec: function()
{
return null;
}
}, {
get: function(o, k)
{
get.push(k); return o[k];
}
});
resetTracking();
RegExp.prototype[Symbol.replace].call(getProxyNullExec);
assert('get == "global,exec"');
let getSetProxyNullExec = new Proxy(
{
exec: function()
{
return null;
}
}, {
get: function(o, k)
{
get.push(k);
getSet.push(k);
return o[k];
},
set: function(o, k, v)
{
getSet.push(k);
o[k] = v;
return true;
}
});
getSetProxyNullExec.global = true;
resetTracking();
RegExp.prototype[Symbol.replace].call(getSetProxyNullExec);
assert('get == "global,unicode,exec"');
assert('getSet == "global,unicode,lastIndex,exec"');
let regExpGlobal_comma = new RegExp(",", "g");
let getSetProxyMatches_comma = new Proxy(
{
exec: function(string)
{
return regExpGlobal_comma.exec(string);
}
}, {
get: function(o, k)
{
get.push(k);
getSet.push(k);
return o[k];
},
set: function(o, k, v)
{
getSet.push(k);
o[k] = v;
return true;
}
});
getSetProxyMatches_comma.global = true;
resetTracking();
let replaceResult = RegExp.prototype[Symbol.replace].call(getSetProxyMatches_comma, "John,,Doe,121 Main St.,Anytown", ":");
assert('replaceResult == "John::Doe:121 Main St.:Anytown"');
assert('get == "global,unicode,exec,exec,exec,exec,exec"');
assert('getSet == "global,unicode,lastIndex,exec,exec,exec,exec,exec"');
let regExp_phoneNumber = new RegExp("(\\d{3})(\\d{3})(\\d{4})", "");
let getSetProxyReplace_phoneNumber = new Proxy(
{
exec: function(string)
{
return regExp_phoneNumber.exec(string);
}
}, {
get: function(o, k)
{
get.push(k);
getSet.push(k);
if (k.toString() == "lastIndex")
return regExpGlobal_phoneNumber.lastIndex;
return o[k];
},
set: function(o, k, v)
{
getSet.push(k);
if (k.toString() == "lastIndex")
regExp_phoneNumber.lastIndex = v;
o[k] = v;
return true;
}
});
resetTracking();
replaceResult = RegExp.prototype[Symbol.replace].call(getSetProxyReplace_phoneNumber, "8005551212", "$1-$2-$3");
assert('replaceResult == "800-555-1212"');
assert('get == "global,exec"');
assert('getSet == "global,exec"');
let regExpGlobalUnicode_digit_nonGreedy = new RegExp("\\d{0,1}", "gu");
let getSetProxyReplaceUnicode_digit_nonGreedy = new Proxy(
{
exec: function(string)
{
return regExpGlobalUnicode_digit_nonGreedy.exec(string);
}
}, {
get: function(o, k)
{
get.push(k);
getSet.push(k);
if (k.toString() == "lastIndex")
return regExpGlobalUnicode_digit_nonGreedy.lastIndex;
return o[k];
},
set: function(o, k, v)
{
getSet.push(k);
if (k.toString() == "lastIndex")
regExpGlobalUnicode_digit_nonGreedy.lastIndex = v;
o[k] = v;
return true;
}
});
getSetProxyReplaceUnicode_digit_nonGreedy.global = true;
getSetProxyReplaceUnicode_digit_nonGreedy.unicode = true;
resetTracking();
replaceResult = RegExp.prototype[Symbol.replace].call(getSetProxyReplaceUnicode_digit_nonGreedy, "12X3\u{10400}4", "[$&]");
assert('replaceResult == "[1][2][]X[3][]\u{10400}[4][]"');
assert('get == "global,unicode,exec,exec,exec,lastIndex,exec,exec,lastIndex,exec,exec,lastIndex,exec"');
assert('getSet == "global,unicode,lastIndex,exec,exec,exec,lastIndex,lastIndex,exec,exec,lastIndex,lastIndex,exec,exec,lastIndex,lastIndex,exec"');