LibRegex: Convert LibRegex tests to use StringView in place of C-strings

A subsequent commit will add tests that require a string containing only
"\0". As a C-string, this will be interpreted as the null terminator. To
make the diff for that commit easier to grok, this commit converts all
tests to use StringView without any other functional changes.
This commit is contained in:
Timothy Flynn 2021-08-14 23:28:06 -04:00 committed by Linus Groh
parent 0c8f2f5aca
commit 83ca8c7e38
Notes: sideshowbarker 2024-07-18 05:40:45 +09:00

View file

@ -478,71 +478,71 @@ TEST_CASE(simple_period_end_benchmark)
TEST_CASE(ECMA262_parse)
{
struct _test {
const char* pattern;
StringView pattern;
regex::Error expected_error { regex::Error::NoError };
regex::ECMAScriptFlags flags {};
};
constexpr _test tests[] {
{ "^hello.$" },
{ "^(hello.)$" },
{ "^h{0,1}ello.$" },
{ "^hello\\W$" },
{ "^hell\\w.$" },
{ "^hell\\x6f1$" }, // ^hello1$
{ "^hel(?:l\\w).$" },
{ "^hel(?<LO>l\\w).$" },
{ "^[-a-zA-Z\\w\\s]+$" },
{ "\\bhello\\B" },
{ "^[\\w+/_-]+[=]{0,2}$" }, // #4189
{ "^(?:[^<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)" }, // #4189
{ "\\/" }, // #4189
{ ",/=-:" }, // #4243
{ "\\x" }, // Even invalid escapes are allowed if ~unicode.
{ "\\x1" }, // Even invalid escapes are allowed if ~unicode.
{ "\\x1", regex::Error::InvalidPattern, regex::ECMAScriptFlags::Unicode },
{ "\\x11" },
{ "\\x11", regex::Error::NoError, regex::ECMAScriptFlags::Unicode },
{ "\\", regex::Error::InvalidTrailingEscape },
{ "(?", regex::Error::InvalidCaptureGroup },
{ "\\u1234", regex::Error::NoError, regex::ECMAScriptFlags::Unicode },
{ "[\\u1234]", regex::Error::NoError, regex::ECMAScriptFlags::Unicode },
{ "\\u1", regex::Error::InvalidPattern, regex::ECMAScriptFlags::Unicode },
{ "[\\u1]", regex::Error::InvalidPattern, regex::ECMAScriptFlags::Unicode },
{ ",(?", regex::Error::InvalidCaptureGroup }, // #4583
{ "{1}", regex::Error::InvalidPattern },
{ "{1,2}", regex::Error::InvalidPattern },
{ "\\uxxxx", regex::Error::NoError },
{ "\\uxxxx", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\ud83d", regex::Error::NoError, ECMAScriptFlags::Unicode },
{ "\\ud83d\\uxxxx", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\u{0}", regex::Error::NoError, ECMAScriptFlags::Unicode },
{ "\\u{10ffff}", regex::Error::NoError, ECMAScriptFlags::Unicode },
{ "\\u{10ffff", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\u{10ffffx", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\u{110000}", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\p", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\p{", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\p{}", regex::Error::InvalidNameForProperty, ECMAScriptFlags::Unicode },
{ "\\p{AsCiI}", regex::Error::InvalidNameForProperty, ECMAScriptFlags::Unicode },
{ "\\p{hello friends}", regex::Error::InvalidNameForProperty, ECMAScriptFlags::Unicode },
{ "\\p{Prepended_Concatenation_Mark}", regex::Error::InvalidNameForProperty, ECMAScriptFlags::Unicode },
{ "\\p{ASCII}", regex::Error::NoError, ECMAScriptFlags::Unicode },
{ "\\\\p{1}", regex::Error::NoError, ECMAScriptFlags::Unicode },
{ "\\\\p{AsCiI}", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\\\p{ASCII}", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\c", regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "\\c", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "[\\c]", regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "[\\c]", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\c`", regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "\\c`", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "[\\c`]", regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "[\\c`]", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\A", regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "\\A", regex::Error::InvalidCharacterClass, ECMAScriptFlags::Unicode },
{ "[\\A]", regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "[\\A]", regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "^hello.$"sv },
{ "^(hello.)$"sv },
{ "^h{0,1}ello.$"sv },
{ "^hello\\W$"sv },
{ "^hell\\w.$"sv },
{ "^hell\\x6f1$"sv }, // ^hello1$
{ "^hel(?:l\\w).$"sv },
{ "^hel(?<LO>l\\w).$"sv },
{ "^[-a-zA-Z\\w\\s]+$"sv },
{ "\\bhello\\B"sv },
{ "^[\\w+/_-]+[=]{0,2}$"sv }, // #4189
{ "^(?:[^<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)"sv }, // #4189
{ "\\/"sv }, // #4189
{ ",/=-:"sv }, // #4243
{ "\\x"sv }, // Even invalid escapes are allowed if ~unicode.
{ "\\x1"sv }, // Even invalid escapes are allowed if ~unicode.
{ "\\x1"sv, regex::Error::InvalidPattern, regex::ECMAScriptFlags::Unicode },
{ "\\x11"sv },
{ "\\x11"sv, regex::Error::NoError, regex::ECMAScriptFlags::Unicode },
{ "\\"sv, regex::Error::InvalidTrailingEscape },
{ "(?"sv, regex::Error::InvalidCaptureGroup },
{ "\\u1234"sv, regex::Error::NoError, regex::ECMAScriptFlags::Unicode },
{ "[\\u1234]"sv, regex::Error::NoError, regex::ECMAScriptFlags::Unicode },
{ "\\u1"sv, regex::Error::InvalidPattern, regex::ECMAScriptFlags::Unicode },
{ "[\\u1]"sv, regex::Error::InvalidPattern, regex::ECMAScriptFlags::Unicode },
{ ",(?"sv, regex::Error::InvalidCaptureGroup }, // #4583
{ "{1}"sv, regex::Error::InvalidPattern },
{ "{1,2}"sv, regex::Error::InvalidPattern },
{ "\\uxxxx"sv, regex::Error::NoError },
{ "\\uxxxx"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\ud83d"sv, regex::Error::NoError, ECMAScriptFlags::Unicode },
{ "\\ud83d\\uxxxx"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\u{0}"sv, regex::Error::NoError, ECMAScriptFlags::Unicode },
{ "\\u{10ffff}"sv, regex::Error::NoError, ECMAScriptFlags::Unicode },
{ "\\u{10ffff"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\u{10ffffx"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\u{110000}"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\p"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\p{"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\p{}"sv, regex::Error::InvalidNameForProperty, ECMAScriptFlags::Unicode },
{ "\\p{AsCiI}"sv, regex::Error::InvalidNameForProperty, ECMAScriptFlags::Unicode },
{ "\\p{hello friends}"sv, regex::Error::InvalidNameForProperty, ECMAScriptFlags::Unicode },
{ "\\p{Prepended_Concatenation_Mark}"sv, regex::Error::InvalidNameForProperty, ECMAScriptFlags::Unicode },
{ "\\p{ASCII}"sv, regex::Error::NoError, ECMAScriptFlags::Unicode },
{ "\\\\p{1}"sv, regex::Error::NoError, ECMAScriptFlags::Unicode },
{ "\\\\p{AsCiI}"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\\\p{ASCII}"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\c"sv, regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "\\c"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "[\\c]"sv, regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "[\\c]"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\c`"sv, regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "\\c`"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "[\\c`]"sv, regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "[\\c`]"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
{ "\\A"sv, regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "\\A"sv, regex::Error::InvalidCharacterClass, ECMAScriptFlags::Unicode },
{ "[\\A]"sv, regex::Error::NoError, ECMAScriptFlags::BrowserExtended },
{ "[\\A]"sv, regex::Error::InvalidPattern, ECMAScriptFlags::Unicode },
};
for (auto& test : tests) {
@ -562,50 +562,50 @@ TEST_CASE(ECMA262_parse)
TEST_CASE(ECMA262_match)
{
struct _test {
const char* pattern;
const char* subject;
StringView pattern;
StringView subject;
bool matches { true };
ECMAScriptFlags options {};
};
// clang-format off
constexpr _test tests[] {
{ "^hello.$", "hello1" },
{ "^(hello.)$", "hello1" },
{ "^h{0,1}ello.$", "ello1" },
{ "^hello\\W$", "hello!" },
{ "^hell\\w.$", "hellx!" },
{ "^hell\\x6f1$", "hello1" },
{ "^hel(?<LO>l.)1$", "hello1" },
{ "^hel(?<LO>l.)1*\\k<LO>.$", "hello1lo1" },
{ "^[-a-z1-3\\s]+$", "hell2 o1" },
{ "^[\\0-\\x1f]$", "\n" },
{ .pattern = "\\bhello\\B", .subject = "hello1", .options = ECMAScriptFlags::Global },
{ "\\b.*\\b", "hello1" },
{ "[^\\D\\S]{2}", "1 " },
{ "bar(?=f.)foo", "barfoo" },
{ "bar(?=foo)bar", "barbar", false },
{ "bar(?!foo)bar", "barbar", true },
{ "bar(?!bar)bar", "barbar", false },
{ "bar.*(?<=foo)", "barbar", false },
{ "bar.*(?<!foo)", "barbar", true },
{ "((...)X)+", "fooXbarXbazX", true },
{ "(?:)", "", true },
{ "\\^", "^" },
{ "^hello.$"sv, "hello1"sv },
{ "^(hello.)$"sv, "hello1"sv },
{ "^h{0,1}ello.$"sv, "ello1"sv },
{ "^hello\\W$"sv, "hello!"sv },
{ "^hell\\w.$"sv, "hellx!"sv },
{ "^hell\\x6f1$"sv, "hello1"sv },
{ "^hel(?<LO>l.)1$"sv, "hello1"sv },
{ "^hel(?<LO>l.)1*\\k<LO>.$"sv, "hello1lo1"sv },
{ "^[-a-z1-3\\s]+$"sv, "hell2 o1"sv },
{ "^[\\0-\\x1f]$"sv, "\n"sv },
{ .pattern = "\\bhello\\B"sv, .subject = "hello1"sv, .options = ECMAScriptFlags::Global },
{ "\\b.*\\b"sv, "hello1"sv },
{ "[^\\D\\S]{2}"sv, "1 "sv },
{ "bar(?=f.)foo"sv, "barfoo"sv },
{ "bar(?=foo)bar"sv, "barbar"sv, false },
{ "bar(?!foo)bar"sv, "barbar"sv, true },
{ "bar(?!bar)bar"sv, "barbar"sv, false },
{ "bar.*(?<=foo)"sv, "barbar"sv, false },
{ "bar.*(?<!foo)"sv, "barbar"sv, true },
{ "((...)X)+"sv, "fooXbarXbazX"sv, true },
{ "(?:)"sv, ""sv, true },
{ "\\^"sv, "^"sv },
// ECMA262, B.1.4. Regular Expression Pattern extensions for browsers
{ "{", "{", true, ECMAScriptFlags::BrowserExtended },
{ "\\5", "\5", true, ECMAScriptFlags::BrowserExtended },
{ "\\05", "\5", true, ECMAScriptFlags::BrowserExtended },
{ "\\455", "\45""5", true, ECMAScriptFlags::BrowserExtended },
{ "\\314", "\314", true, ECMAScriptFlags::BrowserExtended },
{ "\\c", "\\c", true, ECMAScriptFlags::BrowserExtended },
{ "\\cf", "\06", true, ECMAScriptFlags::BrowserExtended },
{ "\\c1", "\\c1", true, ECMAScriptFlags::BrowserExtended },
{ "[\\c1]", "\x11", true, ECMAScriptFlags::BrowserExtended },
{ "[\\w-\\d]", "-", true, ECMAScriptFlags::BrowserExtended },
{ "^(?:^^\\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|,|-=|->|\\/|\\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\\^=|\\^\\^|\\^\\^=|{|\\||\\|=|\\|\\||\\|\\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*(\\/(?=[^*/])(?:[^/[\\\\]|\\\\[\\S\\s]|\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*(?:]|$))+\\/)",
"return /xx/", true, ECMAScriptFlags::BrowserExtended
{ "{"sv, "{"sv, true, ECMAScriptFlags::BrowserExtended },
{ "\\5"sv, "\5"sv, true, ECMAScriptFlags::BrowserExtended },
{ "\\05"sv, "\5"sv, true, ECMAScriptFlags::BrowserExtended },
{ "\\455"sv, "\45""5"sv, true, ECMAScriptFlags::BrowserExtended },
{ "\\314"sv, "\314"sv, true, ECMAScriptFlags::BrowserExtended },
{ "\\c"sv, "\\c"sv, true, ECMAScriptFlags::BrowserExtended },
{ "\\cf"sv, "\06"sv, true, ECMAScriptFlags::BrowserExtended },
{ "\\c1"sv, "\\c1"sv, true, ECMAScriptFlags::BrowserExtended },
{ "[\\c1]"sv, "\x11"sv, true, ECMAScriptFlags::BrowserExtended },
{ "[\\w-\\d]"sv, "-"sv, true, ECMAScriptFlags::BrowserExtended },
{ "^(?:^^\\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|,|-=|->|\\/|\\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\\^=|\\^\\^|\\^\\^=|{|\\||\\|=|\\|\\||\\|\\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*(\\/(?=[^*/])(?:[^/[\\\\]|\\\\[\\S\\s]|\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*(?:]|$))+\\/)"sv,
"return /xx/"sv, true, ECMAScriptFlags::BrowserExtended
}, // #5517, appears to be matching JS expressions that involve regular expressions...
{ "a{2,}", "aaaa" }, // #5518
{ "a{2,}"sv, "aaaa"sv }, // #5518
};
// clang-format on
@ -627,21 +627,21 @@ TEST_CASE(ECMA262_match)
TEST_CASE(ECMA262_unicode_match)
{
struct _test {
char const* pattern;
char const* subject;
StringView pattern;
StringView subject;
bool matches { true };
ECMAScriptFlags options {};
};
_test tests[] {
{ "\\ud83d", "😀", true },
{ "\\ud83d", "😀", false, ECMAScriptFlags::Unicode },
{ "\\ude00", "😀", true },
{ "\\ude00", "😀", false, ECMAScriptFlags::Unicode },
{ "\\ud83d\\ude00", "😀", true },
{ "\\ud83d\\ude00", "😀", true, ECMAScriptFlags::Unicode },
{ "\\u{1f600}", "😀", true, ECMAScriptFlags::Unicode },
{ "\\ud83d\\ud83d", "\xed\xa0\xbd\xed\xa0\xbd", true },
{ "\\ud83d\\ud83d", "\xed\xa0\xbd\xed\xa0\xbd", true, ECMAScriptFlags::Unicode },
{ "\\ud83d"sv, "😀"sv, true },
{ "\\ud83d"sv, "😀"sv, false, ECMAScriptFlags::Unicode },
{ "\\ude00"sv, "😀"sv, true },
{ "\\ude00"sv, "😀"sv, false, ECMAScriptFlags::Unicode },
{ "\\ud83d\\ude00"sv, "😀"sv, true },
{ "\\ud83d\\ude00"sv, "😀"sv, true, ECMAScriptFlags::Unicode },
{ "\\u{1f600}"sv, "😀"sv, true, ECMAScriptFlags::Unicode },
{ "\\ud83d\\ud83d"sv, "\xed\xa0\xbd\xed\xa0\xbd"sv, true },
{ "\\ud83d\\ud83d"sv, "\xed\xa0\xbd\xed\xa0\xbd"sv, true, ECMAScriptFlags::Unicode },
};
for (auto& test : tests) {
@ -667,56 +667,56 @@ TEST_CASE(ECMA262_unicode_match)
TEST_CASE(ECMA262_property_match)
{
struct _test {
char const* pattern;
char const* subject;
StringView pattern;
StringView subject;
bool matches { true };
ECMAScriptFlags options {};
};
constexpr _test tests[] {
{ "\\p{ASCII}", "a", false },
{ "\\p{ASCII}", "p{ASCII}", true },
{ "\\p{ASCII}", "a", true, ECMAScriptFlags::Unicode },
{ "\\p{ASCII}", "😀", false, ECMAScriptFlags::Unicode },
{ "\\P{ASCII}", "a", false, ECMAScriptFlags::Unicode },
{ "\\P{ASCII}", "😀", true, ECMAScriptFlags::Unicode },
{ "\\p{ASCII_Hex_Digit}", "1", true, ECMAScriptFlags::Unicode },
{ "\\p{ASCII_Hex_Digit}", "a", true, ECMAScriptFlags::Unicode },
{ "\\p{ASCII_Hex_Digit}", "x", false, ECMAScriptFlags::Unicode },
{ "\\P{ASCII_Hex_Digit}", "1", false, ECMAScriptFlags::Unicode },
{ "\\P{ASCII_Hex_Digit}", "a", false, ECMAScriptFlags::Unicode },
{ "\\P{ASCII_Hex_Digit}", "x", true, ECMAScriptFlags::Unicode },
{ "\\p{Any}", "\xcd\xb8", true, ECMAScriptFlags::Unicode }, // U+0378, which is an unassigned code point.
{ "\\P{Any}", "\xcd\xb8", false, ECMAScriptFlags::Unicode }, // U+0378, which is an unassigned code point.
{ "\\p{Assigned}", "\xcd\xb8", false, ECMAScriptFlags::Unicode }, // U+0378, which is an unassigned code point.
{ "\\P{Assigned}", "\xcd\xb8", true, ECMAScriptFlags::Unicode }, // U+0378, which is an unassigned code point.
{ "\\p{Lu}", "a", false, ECMAScriptFlags::Unicode },
{ "\\p{Lu}", "A", true, ECMAScriptFlags::Unicode },
{ "\\p{Lu}", "9", false, ECMAScriptFlags::Unicode },
{ "\\p{Cased_Letter}", "a", true, ECMAScriptFlags::Unicode },
{ "\\p{Cased_Letter}", "A", true, ECMAScriptFlags::Unicode },
{ "\\p{Cased_Letter}", "9", false, ECMAScriptFlags::Unicode },
{ "\\P{Cased_Letter}", "a", false, ECMAScriptFlags::Unicode },
{ "\\P{Cased_Letter}", "A", false, ECMAScriptFlags::Unicode },
{ "\\P{Cased_Letter}", "9", true, ECMAScriptFlags::Unicode },
{ "\\p{General_Category=Cased_Letter}", "a", true, ECMAScriptFlags::Unicode },
{ "\\p{General_Category=Cased_Letter}", "A", true, ECMAScriptFlags::Unicode },
{ "\\p{General_Category=Cased_Letter}", "9", false, ECMAScriptFlags::Unicode },
{ "\\p{gc=Cased_Letter}", "a", true, ECMAScriptFlags::Unicode },
{ "\\p{gc=Cased_Letter}", "A", true, ECMAScriptFlags::Unicode },
{ "\\p{gc=Cased_Letter}", "9", false, ECMAScriptFlags::Unicode },
{ "\\p{Script=Latin}", "a", true, ECMAScriptFlags::Unicode },
{ "\\p{Script=Latin}", "A", true, ECMAScriptFlags::Unicode },
{ "\\p{Script=Latin}", "9", false, ECMAScriptFlags::Unicode },
{ "\\p{sc=Latin}", "a", true, ECMAScriptFlags::Unicode },
{ "\\p{sc=Latin}", "A", true, ECMAScriptFlags::Unicode },
{ "\\p{sc=Latin}", "9", false, ECMAScriptFlags::Unicode },
{ "\\p{Script_Extensions=Deva}", "a", false, ECMAScriptFlags::Unicode },
{ "\\p{Script_Extensions=Beng}", "\xe1\xb3\x95", true, ECMAScriptFlags::Unicode }, // U+01CD5
{ "\\p{Script_Extensions=Deva}", "\xe1\xb3\x95", true, ECMAScriptFlags::Unicode }, // U+01CD5
{ "\\p{scx=Deva}", "a", false, ECMAScriptFlags::Unicode },
{ "\\p{scx=Beng}", "\xe1\xb3\x95", true, ECMAScriptFlags::Unicode }, // U+01CD5
{ "\\p{scx=Deva}", "\xe1\xb3\x95", true, ECMAScriptFlags::Unicode }, // U+01CD5
{ "\\p{ASCII}"sv, "a"sv, false },
{ "\\p{ASCII}"sv, "p{ASCII}"sv, true },
{ "\\p{ASCII}"sv, "a"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{ASCII}"sv, "😀"sv, false, ECMAScriptFlags::Unicode },
{ "\\P{ASCII}"sv, "a"sv, false, ECMAScriptFlags::Unicode },
{ "\\P{ASCII}"sv, "😀"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{ASCII_Hex_Digit}"sv, "1"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{ASCII_Hex_Digit}"sv, "a"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{ASCII_Hex_Digit}"sv, "x"sv, false, ECMAScriptFlags::Unicode },
{ "\\P{ASCII_Hex_Digit}"sv, "1"sv, false, ECMAScriptFlags::Unicode },
{ "\\P{ASCII_Hex_Digit}"sv, "a"sv, false, ECMAScriptFlags::Unicode },
{ "\\P{ASCII_Hex_Digit}"sv, "x"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{Any}"sv, "\xcd\xb8"sv, true, ECMAScriptFlags::Unicode }, // U+0378, which is an unassigned code point.
{ "\\P{Any}"sv, "\xcd\xb8"sv, false, ECMAScriptFlags::Unicode }, // U+0378, which is an unassigned code point.
{ "\\p{Assigned}"sv, "\xcd\xb8"sv, false, ECMAScriptFlags::Unicode }, // U+0378, which is an unassigned code point.
{ "\\P{Assigned}"sv, "\xcd\xb8"sv, true, ECMAScriptFlags::Unicode }, // U+0378, which is an unassigned code point.
{ "\\p{Lu}"sv, "a"sv, false, ECMAScriptFlags::Unicode },
{ "\\p{Lu}"sv, "A"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{Lu}"sv, "9"sv, false, ECMAScriptFlags::Unicode },
{ "\\p{Cased_Letter}"sv, "a"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{Cased_Letter}"sv, "A"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{Cased_Letter}"sv, "9"sv, false, ECMAScriptFlags::Unicode },
{ "\\P{Cased_Letter}"sv, "a"sv, false, ECMAScriptFlags::Unicode },
{ "\\P{Cased_Letter}"sv, "A"sv, false, ECMAScriptFlags::Unicode },
{ "\\P{Cased_Letter}"sv, "9"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{General_Category=Cased_Letter}"sv, "a"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{General_Category=Cased_Letter}"sv, "A"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{General_Category=Cased_Letter}"sv, "9"sv, false, ECMAScriptFlags::Unicode },
{ "\\p{gc=Cased_Letter}"sv, "a"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{gc=Cased_Letter}"sv, "A"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{gc=Cased_Letter}"sv, "9"sv, false, ECMAScriptFlags::Unicode },
{ "\\p{Script=Latin}"sv, "a"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{Script=Latin}"sv, "A"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{Script=Latin}"sv, "9"sv, false, ECMAScriptFlags::Unicode },
{ "\\p{sc=Latin}"sv, "a"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{sc=Latin}"sv, "A"sv, true, ECMAScriptFlags::Unicode },
{ "\\p{sc=Latin}"sv, "9"sv, false, ECMAScriptFlags::Unicode },
{ "\\p{Script_Extensions=Deva}"sv, "a"sv, false, ECMAScriptFlags::Unicode },
{ "\\p{Script_Extensions=Beng}"sv, "\xe1\xb3\x95"sv, true, ECMAScriptFlags::Unicode }, // U+01CD5
{ "\\p{Script_Extensions=Deva}"sv, "\xe1\xb3\x95"sv, true, ECMAScriptFlags::Unicode }, // U+01CD5
{ "\\p{scx=Deva}"sv, "a"sv, false, ECMAScriptFlags::Unicode },
{ "\\p{scx=Beng}"sv, "\xe1\xb3\x95"sv, true, ECMAScriptFlags::Unicode }, // U+01CD5
{ "\\p{scx=Deva}"sv, "\xe1\xb3\x95"sv, true, ECMAScriptFlags::Unicode }, // U+01CD5
};
for (auto& test : tests) {
@ -742,19 +742,19 @@ TEST_CASE(ECMA262_property_match)
TEST_CASE(replace)
{
struct _test {
const char* pattern;
const char* replacement;
const char* subject;
const char* expected;
StringView pattern;
StringView replacement;
StringView subject;
StringView expected;
ECMAScriptFlags options {};
};
constexpr _test tests[] {
{ "foo(.+)", "aaa", "test", "test" },
{ "foo(.+)", "test\\1", "foobar", "testbar" },
{ "foo(.+)", "\\2\\1", "foobar", "\\2bar" },
{ "foo(.+)", "\\\\\\1", "foobar", "\\bar" },
{ "foo(.)", "a\\1", "fooxfooy", "axay", ECMAScriptFlags::Multiline },
{ "foo(.+)"sv, "aaa"sv, "test"sv, "test"sv },
{ "foo(.+)"sv, "test\\1"sv, "foobar"sv, "testbar"sv },
{ "foo(.+)"sv, "\\2\\1"sv, "foobar"sv, "\\2bar"sv },
{ "foo(.+)"sv, "\\\\\\1"sv, "foobar"sv, "\\bar"sv },
{ "foo(.)"sv, "a\\1"sv, "fooxfooy"sv, "axay"sv, ECMAScriptFlags::Multiline },
};
for (auto& test : tests) {