var BUGNUMBER = 1135377; var summary = "Implement RegExp unicode flag -- braced pattern in RegExpUnicodeEscapeSequence in CharacterClass."; print(BUGNUMBER + ": " + summary); // ==== standalone ==== assertEqArray(/[\u{41}]/u.exec("ABC"), ["A"]); assertEqArray(/[\u{1F438}]/u.exec("\u{1F438}"), ["\u{1F438}"]); assertEq(/[\u{1F438}]/u.exec("\uD83D"), null); assertEq(/[\u{1F438}]/u.exec("\uDC38"), null); assertEqArray(/[\u{0}]/u.exec("\u{0}"), ["\u{0}"]); assertEqArray(/[\u{10FFFF}]/u.exec("\u{10FFFF}"), ["\u{10FFFF}"]); assertEqArray(/[\u{10ffff}]/u.exec("\u{10FFFF}"), ["\u{10FFFF}"]); // leading 0 assertEqArray(/[\u{0000000000000000000000}]/u.exec("\u{0}"), ["\u{0}"]); assertEqArray(/[\u{000000000000000010FFFF}]/u.exec("\u{10FFFF}"), ["\u{10FFFF}"]); // RegExp constructor assertEqArray(new RegExp("[\\u{0}]", "u").exec("\u{0}"), ["\u{0}"]); assertEqArray(new RegExp("[\\u{41}]", "u").exec("ABC"), ["A"]); assertEqArray(new RegExp("[\\u{1F438}]", "u").exec("\u{1F438}"), ["\u{1F438}"]); assertEqArray(new RegExp("[\\u{10FFFF}]", "u").exec("\u{10FFFF}"), ["\u{10FFFF}"]); assertEqArray(new RegExp("[\\u{0000000000000000}]", "u").exec("\u{0}"), ["\u{0}"]); assertEqArray(eval(`/[\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}]/u`).exec("\u{1234}"), ["\u{1234}"]); assertEqArray(new RegExp(`[\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}]`, "u").exec("\u{1234}"), ["\u{1234}"]); // ==== BMP + non-BMP ==== assertEqArray(/[A\u{1F438}]/u.exec("A\u{1F438}"), ["A"]); assertEqArray(/[A\u{1F438}]/u.exec("\u{1F438}A"), ["\u{1F438}"]); // lead-only target assertEqArray(/[A\u{1F438}]/u.exec("\uD83DA"), ["A"]); assertEq(/[A\u{1F438}]/u.exec("\uD83D"), null); // + assertEqArray(/[A\u{1F438}]+/u.exec("\u{1F438}A\u{1F438}A"), ["\u{1F438}A\u{1F438}A"]); // trail surrogate + lead surrogate assertEqArray(/[A\u{1F438}]+/u.exec("\uD83D\uDC38A\uDC38\uD83DA"), ["\uD83D\uDC38A"]); // ==== non-BMP + non-BMP ==== assertEqArray(/[\u{1F418}\u{1F438}]/u.exec("\u{1F418}\u{1F438}"), ["\u{1F418}"]); assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\u{1F418}\u{1F438}"), ["\u{1F418}\u{1F438}"]); assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\u{1F418}\uDC38\uD83D"), ["\u{1F418}"]); assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\uD83D\u{1F438}"), ["\u{1F438}"]); assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\u{1F438}\uD83D"), ["\u{1F438}"]); // trail surrogate + lead surrogate assertEq(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\uDC38\uD83D\uD83D"), null); // ==== non-BMP + non-BMP range (from_lead == to_lead) ==== assertEqArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F418}"), ["\u{1F418}"]); assertEqArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F438}"), ["\u{1F438}"]); assertEqArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F427}"), ["\u{1F427}"]); assertEq(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F417}"), null); assertEq(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F439}"), null); // ==== non-BMP + non-BMP range (from_lead + 1 == to_lead) ==== assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDD7C"), ["\uD83C\uDD7C"]); assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\u{1F438}"), ["\u{1F438}"]); assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDF99"), ["\uD83C\uDF99"]); assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDC00"), ["\uD83D\uDC00"]); assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDD7B"), null); assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uE000"), null); assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDB99"), null); assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDC39"), null); // ==== non-BMP + non-BMP range (from_lead + 2 == to_lead) ==== assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDD7C"), ["\uD83C\uDD7C"]); assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC29"), ["\uD83E\uDC29"]); assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDF99"), ["\uD83C\uDF99"]); assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDC00"), ["\uD83D\uDC00"]); assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDF99"), ["\uD83D\uDF99"]); assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC00"), ["\uD83E\uDC00"]); assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDD7B"), null); assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uE000"), null); assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDB99"), null); assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uE000"), null); assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDB99"), null); assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC30"), null); // ==== non-BMP + non-BMP range (other) ==== assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uDD64"), ["\uD834\uDD64"]); assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\u{1F438}"), ["\u{1F438}"]); assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD836\uDF99"), ["\uD836\uDF99"]); assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD838\uDC00"), ["\uD838\uDC00"]); assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uDD63"), null); assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD83D\uDC39"), null); assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uE000"), null); assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD835\uDB99"), null); assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD83C\uE000"), null); assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD83D\uDB99"), null); // ==== BMP + non-BMP range ==== assertEqArray(/[\u{42}-\u{1F438}]/u.exec("B"), ["B"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("C"), ["C"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uFFFF"), ["\uFFFF"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD800\uDC00"), ["\uD800\uDC00"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD800"), ["\uD800"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDBFF"), ["\uDBFF"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDC00"), ["\uDC00"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDFFF"), ["\uDFFF"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D"), ["\uD83D"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDC38"), ["\uDC38"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDBFF"), ["\uD83D"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC00"), ["\uD83D\uDC00"]); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC38"), ["\uD83D\uDC38"]); assertEq(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC39"), null); assertEq(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDFFF"), null); assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uE000"), ["\uD83D"]); assertEq(/[\u{42}-\u{1F438}]/u.exec("A"), null); // ==== wrong patterns ==== assertThrowsInstanceOf(() => eval(`/[\\u{-1}]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{0.0}]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{G}]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{}]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{{]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{110000}]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{00110000}]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{100000000000000000000000000000}]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{ FFFF}]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{FFFF }]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{FF FF}]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{F F F F}]/u`), SyntaxError); assertThrowsInstanceOf(() => eval(`/[\\u{100000001}]/u`), SyntaxError); if (typeof reportCompare === "function") reportCompare(true, true);