Source code

Revision control

Copy as Markdown

Other Tools

var BUGNUMBER = 1135377;
var summary = "Implement RegExp unicode flag -- lead and trail pattern in RegExpUnicodeEscapeSequence in CharacterClass.";
print(BUGNUMBER + ": " + summary);
// ==== standalone ====
assertEqArray(/[\uD83D\uDC38]/u.exec("\uD83D\uDC38"),
["\uD83D\uDC38"]);
assertEq(/[\uD83D\uDC38]/u.exec("\uD83D"),
null);
assertEq(/[\uD83D\uDC38]/u.exec("\uDC38"),
null);
// no unicode flag
assertEqArray(/[\uD83D\uDC38]/.exec("\uD83D\uDC38"),
["\uD83D"]);
assertEqArray(/[\uD83D\uDC38]/.exec("\uD83D"),
["\uD83D"]);
assertEqArray(/[\uD83D\uDC38]/.exec("\uDC38"),
["\uDC38"]);
// RegExp constructor
assertEqArray(new RegExp("[\uD83D\uDC38]", "u").exec("\uD83D\uDC38"),
["\uD83D\uDC38"]);
assertEq(new RegExp("[\uD83D\uDC38]", "u").exec("\uD83D"),
null);
assertEq(new RegExp("[\uD83D\uDC38]", "u").exec("\uDC38"),
null);
// RegExp constructor, no unicode flag
assertEqArray(new RegExp("[\uD83D\uDC38]", "").exec("\uD83D\uDC38"),
["\uD83D"]);
assertEqArray(new RegExp("[\uD83D\uDC38]", "").exec("\uD83D"),
["\uD83D"]);
assertEqArray(new RegExp("[\uD83D\uDC38]", "").exec("\uDC38"),
["\uDC38"]);
// ==== lead-only ====
// match only non-surrogate pair
assertEqArray(/[\uD83D]/u.exec("\uD83D\uDBFF"),
["\uD83D"]);
assertEq(/[\uD83D]/u.exec("\uD83D\uDC00"),
null);
assertEq(/[\uD83D]/u.exec("\uD83D\uDFFF"),
null);
assertEqArray(/[\uD83D]/u.exec("\uD83D\uE000"),
["\uD83D"]);
// match before non-tail char
assertEqArray(/[\uD83D]/u.exec("\uD83D"),
["\uD83D"]);
assertEqArray(/[\uD83D]/u.exec("\uD83DA"),
["\uD83D"]);
// no unicode flag
assertEqArray(/[\uD83D]/.exec("\uD83D\uDBFF"),
["\uD83D"]);
assertEqArray(/[\uD83D]/.exec("\uD83D\uDC00"),
["\uD83D"]);
assertEqArray(/[\uD83D]/.exec("\uD83D\uDFFF"),
["\uD83D"]);
assertEqArray(/[\uD83D]/.exec("\uD83D\uE000"),
["\uD83D"]);
assertEqArray(/[\uD83D]/.exec("\uD83D"),
["\uD83D"]);
assertEqArray(/[\uD83D]/.exec("\uD83DA"),
["\uD83D"]);
// ==== trail-only ====
// match only non-surrogate pair
assertEqArray(/[\uDC38]/u.exec("\uD7FF\uDC38"),
["\uDC38"]);
assertEq(/[\uDC38]/u.exec("\uD800\uDC38"),
null);
assertEq(/[\uDC38]/u.exec("\uDBFF\uDC38"),
null);
assertEqArray(/[\uDC38]/u.exec("\uDC00\uDC38"),
["\uDC38"]);
// match after non-lead char
assertEqArray(/[\uDC38]/u.exec("\uDC38"),
["\uDC38"]);
assertEqArray(/[\uDC38]/u.exec("A\uDC38"),
["\uDC38"]);
// no unicode flag
assertEqArray(/[\uDC38]/.exec("\uD7FF\uDC38"),
["\uDC38"]);
assertEqArray(/[\uDC38]/.exec("\uD800\uDC38"),
["\uDC38"]);
assertEqArray(/[\uDC38]/.exec("\uDBFF\uDC38"),
["\uDC38"]);
assertEqArray(/[\uDC38]/.exec("\uDC00\uDC38"),
["\uDC38"]);
assertEqArray(/[\uDC38]/.exec("\uDC38"),
["\uDC38"]);
assertEqArray(/[\uDC38]/.exec("A\uDC38"),
["\uDC38"]);
// ==== invalid trail ====
assertEqArray(/[\uD83D\u3042]*/u.exec("\uD83D"),
["\uD83D"]);
assertEqArray(/[\uD83D\u3042]*/u.exec("\uD83D\u3042"),
["\uD83D\u3042"]);
assertEqArray(/[\uD83D\u3042]*/u.exec("\uD83D\u3042\u3042\uD83D"),
["\uD83D\u3042\u3042\uD83D"]);
assertEqArray(/[\uD83D\u{3042}]*/u.exec("\uD83D"),
["\uD83D"]);
assertEqArray(/[\uD83D\u{3042}]*/u.exec("\uD83D\u3042"),
["\uD83D\u3042"]);
assertEqArray(/[\uD83D\u{3042}]*/u.exec("\uD83D\u3042\u3042\uD83D"),
["\uD83D\u3042\u3042\uD83D"]);
assertEqArray(/[\uD83DA]*/u.exec("\uD83D"),
["\uD83D"]);
assertEqArray(/[\uD83DA]*/u.exec("\uD83DA"),
["\uD83DA"]);
assertEqArray(/[\uD83DA]*/u.exec("\uD83DAA\uD83D"),
["\uD83DAA\uD83D"]);
// ==== wrong patterns ====
assertThrowsInstanceOf(() => eval(`/[\\u]/u`), SyntaxError);
assertThrowsInstanceOf(() => eval(`/[\\u0]/u`), SyntaxError);
assertThrowsInstanceOf(() => eval(`/[\\u00]/u`), SyntaxError);
assertThrowsInstanceOf(() => eval(`/[\\u000]/u`), SyntaxError);
assertThrowsInstanceOf(() => eval(`/[\\u000G]/u`), SyntaxError);
assertThrowsInstanceOf(() => eval(`/[\\u0.00]/u`), SyntaxError);
assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u]/u`), SyntaxError);
assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u0]/u`), SyntaxError);
assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u00]/u`), SyntaxError);
assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u000]/u`), SyntaxError);
assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u000G]/u`), SyntaxError);
assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u0.00]/u`), SyntaxError);
if (typeof reportCompare === "function")
reportCompare(true, true);