Source code
Revision control
Copy as Markdown
Other Tools
var BUGNUMBER = 1135377;
var summary = "Implement RegExp unicode flag -- lead and trail patterns in RegExpUnicodeEscapeSequence.";
print(BUGNUMBER + ": " + summary);
// ==== standalone ====
assertEqArray(/\uD83D\uDC38/u.exec("\u{1F438}"),
["\u{1F438}"]);
// no unicode flag
assertEqArray(/\uD83D\uDC38/.exec("\u{1F438}"),
["\u{1F438}"]);
// RegExp constructor
assertEqArray(new RegExp("\\uD83D\\uDC38", "u").exec("\u{1F438}"),
["\u{1F438}"]);
// RegExp constructor, no unicode flag
assertEqArray(new RegExp("\\uD83D\\uDC38", "").exec("\u{1F438}"),
["\u{1F438}"]);
// ==== ? ====
assertEqArray(/\uD83D\uDC38?/u.exec("\u{1F438}"),
["\u{1F438}"]);
assertEqArray(/\uD83D\uDC38?/u.exec(""),
[""]);
// lead-only target
assertEqArray(/\uD83D\uDC38?/u.exec("\uD83D"),
[""]);
// no unicode flag
assertEqArray(/\uD83D\uDC38?/.exec("\u{1F438}"),
["\u{1F438}"]);
assertEq(/\uD83D\uDC38?/.exec(""),
null);
assertEqArray(/\uD83D\uDC38?/.exec("\uD83D"),
["\uD83D"]);
// RegExp constructor
assertEqArray(new RegExp("\\uD83D\\uDC38?", "u").exec("\u{1F438}"),
["\u{1F438}"]);
assertEqArray(new RegExp("\\uD83D\\uDC38?", "u").exec(""),
[""]);
assertEqArray(new RegExp("\\uD83D\\uDC38?", "u").exec("\uD83D"),
[""]);
// RegExp constructor, no unicode flag
assertEqArray(new RegExp("\\uD83D\\uDC38?", "").exec("\u{1F438}"),
["\u{1F438}"]);
assertEq(new RegExp("\\uD83D\\uDC38?", "").exec(""),
null);
assertEqArray(new RegExp("\\uD83D\\uDC38?", "").exec("\uD83D"),
["\uD83D"]);
// ==== + ====
assertEqArray(/\uD83D\uDC38+/u.exec("\u{1F438}"),
["\u{1F438}"]);
assertEqArray(/\uD83D\uDC38+/u.exec("\u{1F438}\u{1F438}"),
["\u{1F438}\u{1F438}"]);
assertEq(/\uD83D\uDC38+/u.exec(""),
null);
// lead-only target
assertEq(/\uD83D\uDC38+/u.exec("\uD83D"),
null);
assertEqArray(/\uD83D\uDC38+/u.exec("\uD83D\uDC38\uDC38"),
["\uD83D\uDC38"]);
// no unicode flag
assertEqArray(/\uD83D\uDC38+/.exec("\u{1F438}"),
["\u{1F438}"]);
assertEqArray(/\uD83D\uDC38+/.exec("\u{1F438}\u{1F438}"),
["\u{1F438}"]);
assertEq(/\uD83D\uDC38+/.exec("\uD83D"),
null);
assertEqArray(/\uD83D\uDC38+/.exec("\uD83D\uDC38\uDC38"),
["\uD83D\uDC38\uDC38"]);
assertEq(/\uD83D\uDC38+/.exec(""),
null);
// ==== * ====
assertEqArray(/\uD83D\uDC38*/u.exec("\u{1F438}"),
["\u{1F438}"]);
assertEqArray(/\uD83D\uDC38*/u.exec("\u{1F438}\u{1F438}"),
["\u{1F438}\u{1F438}"]);
assertEqArray(/\uD83D\uDC38*/u.exec(""),
[""]);
// lead-only target
assertEqArray(/\uD83D\uDC38*/u.exec("\uD83D"),
[""]);
assertEqArray(/\uD83D\uDC38*/u.exec("\uD83D\uDC38\uDC38"),
["\uD83D\uDC38"]);
// no unicode flag
assertEqArray(/\uD83D\uDC38*/.exec("\u{1F438}"),
["\u{1F438}"]);
assertEqArray(/\uD83D\uDC38*/.exec("\u{1F438}\u{1F438}"),
["\u{1F438}"]);
assertEqArray(/\uD83D\uDC38*/.exec("\uD83D"),
["\uD83D"]);
assertEqArray(/\uD83D\uDC38*/.exec("\uD83D\uDC38\uDC38"),
["\uD83D\uDC38\uDC38"]);
assertEq(/\uD83D\uDC38*/.exec(""),
null);
// ==== 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\u3042\u3042"]);
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\u3042\u3042"]);
assertEqArray(/\uD83DA*/u.exec("\uD83D"),
["\uD83D"]);
assertEqArray(/\uD83DA*/u.exec("\uD83DA"),
["\uD83DA"]);
assertEqArray(/\uD83DA*/u.exec("\uD83DAA"),
["\uD83DAA"]);
// ==== 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);