mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-07 08:39:22 +00:00
Tests: Get rid of clang-format: off in the Regex tests
Should've done this a long time ago, but now is better than never.
This commit is contained in:
parent
5355710481
commit
a37315da87
Notes:
github-actions[bot]
2025-03-09 13:38:51 +00:00
Author: https://github.com/alimpfard
Commit: a37315da87
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3870
1 changed files with 44 additions and 27 deletions
|
@ -636,7 +636,6 @@ TEST_CASE(ECMA262_match)
|
||||||
bool matches { true };
|
bool matches { true };
|
||||||
ECMAScriptFlags options {};
|
ECMAScriptFlags options {};
|
||||||
};
|
};
|
||||||
// clang-format off
|
|
||||||
constexpr _test tests[] {
|
constexpr _test tests[] {
|
||||||
{ "^hello.$"sv, "hello1"sv },
|
{ "^hello.$"sv, "hello1"sv },
|
||||||
{ "^(hello.)$"sv, "hello1"sv },
|
{ "^(hello.)$"sv, "hello1"sv },
|
||||||
|
@ -677,49 +676,69 @@ TEST_CASE(ECMA262_match)
|
||||||
{ "{"sv, "{"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "{"sv, "{"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "\\5"sv, "\5"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "\\5"sv, "\5"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "\\05"sv, "\5"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "\\05"sv, "\5"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "\\455"sv, "\45""5"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "\\455"sv, "\0455"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "\\314"sv, "\314"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "\\314"sv, "\314"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "\\c"sv, "\\c"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "\\c"sv, "\\c"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "\\cf"sv, "\06"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "\\cf"sv, "\06"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "\\c1"sv, "\\c1"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "\\c1"sv, "\\c1"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "[\\c1]"sv, "\x11"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "[\\c1]"sv, "\x11"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "[\\w-\\d]"sv, "-"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,
|
// #5517, appears to be matching JS expressions that involve regular expressions...
|
||||||
"return /xx/"sv, true, ECMAScriptFlags::BrowserExtended
|
{
|
||||||
}, // #5517, appears to be matching JS expressions that involve regular expressions...
|
"^(?:^^\\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|,|-=|->|\\/|\\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\\^=|\\^\\^|\\^\\^=|{|\\||\\|=|\\|\\||\\|\\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*(\\/(?=[^*/])(?:[^/[\\\\]|\\\\[\\S\\s]|\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*(?:]|$))+\\/)"sv,
|
||||||
{ "a{2,}"sv, "aaaa"sv }, // #5518
|
"return /xx/"sv,
|
||||||
|
true,
|
||||||
|
ECMAScriptFlags::BrowserExtended,
|
||||||
|
},
|
||||||
|
// #5518
|
||||||
|
{ "a{2,}"sv, "aaaa"sv },
|
||||||
{ "\\0"sv, "\0"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "\\0"sv, "\0"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "\\0"sv, "\0"sv, true, combine_flags(ECMAScriptFlags::Unicode, ECMAScriptFlags::BrowserExtended) },
|
{ "\\0"sv, "\0"sv, true, combine_flags(ECMAScriptFlags::Unicode, ECMAScriptFlags::BrowserExtended) },
|
||||||
{ "\\01"sv, "\1"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "\\01"sv, "\1"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "[\\0]"sv, "\0"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "[\\0]"sv, "\0"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "[\\0]"sv, "\0"sv, true, combine_flags(ECMAScriptFlags::Unicode, ECMAScriptFlags::BrowserExtended) },
|
{ "[\\0]"sv, "\0"sv, true, combine_flags(ECMAScriptFlags::Unicode, ECMAScriptFlags::BrowserExtended) },
|
||||||
{ "[\\01]"sv, "\1"sv, true, ECMAScriptFlags::BrowserExtended },
|
{ "[\\01]"sv, "\1"sv, true, ECMAScriptFlags::BrowserExtended },
|
||||||
{ "(\0|a)"sv, "a"sv, true }, // #9686, Should allow null bytes in pattern
|
// #9686, Should allow null bytes in pattern
|
||||||
{ "(.*?)a(?!(a+)b\\2c)\\2(.*)"sv, "baaabaac"sv, true }, // #6042, Groups inside lookarounds may be referenced outside, but their contents appear empty if the pattern in the lookaround fails.
|
{ "(\0|a)"sv, "a"sv, true },
|
||||||
{ "a|$"sv, "x"sv, true, (ECMAScriptFlags)regex::AllFlags::Global }, // #11940, Global (not the 'g' flag) regexps should attempt to match the zero-length end of the string too.
|
// #6042, Groups inside lookarounds may be referenced outside, but their contents appear empty if the pattern in the lookaround fails.
|
||||||
{ "foo\nbar"sv, "foo\nbar"sv, true }, // #12126, ECMA262 regexp should match literal newlines without the 's' flag.
|
{ "(.*?)a(?!(a+)b\\2c)\\2(.*)"sv, "baaabaac"sv, true },
|
||||||
{ "foo[^]bar"sv, "foo\nbar"sv, true }, // #12126, ECMA262 regexp should match newline with [^].
|
// #11940, Global (not the 'g' flag) regexps should attempt to match the zero-length end of the string too.
|
||||||
{ "^[_A-Z]+$"sv, "_aA"sv, true, ECMAScriptFlags::Insensitive }, // Insensitive lookup table: characters in a range do not necessarily lie in the same range after being converted to lowercase.
|
{ "a|$"sv, "x"sv, true, (ECMAScriptFlags)regex::AllFlags::Global },
|
||||||
|
// #12126, ECMA262 regexp should match literal newlines without the 's' flag.
|
||||||
|
{ "foo\nbar"sv, "foo\nbar"sv, true },
|
||||||
|
// #12126, ECMA262 regexp should match newline with [^].
|
||||||
|
{ "foo[^]bar"sv, "foo\nbar"sv, true },
|
||||||
|
// Insensitive lookup table: characters in a range do not necessarily lie in the same range after being converted to lowercase.
|
||||||
|
{ "^[_A-Z]+$"sv, "_aA"sv, true, ECMAScriptFlags::Insensitive },
|
||||||
{ "^[a-sy-z]$"sv, "b"sv, true, ECMAScriptFlags::Insensitive },
|
{ "^[a-sy-z]$"sv, "b"sv, true, ECMAScriptFlags::Insensitive },
|
||||||
{ "^[a-sy-z]$"sv, "y"sv, true, ECMAScriptFlags::Insensitive },
|
{ "^[a-sy-z]$"sv, "y"sv, true, ECMAScriptFlags::Insensitive },
|
||||||
{ "^[a-sy-z]$"sv, "u"sv, false, ECMAScriptFlags::Insensitive },
|
{ "^[a-sy-z]$"sv, "u"sv, false, ECMAScriptFlags::Insensitive },
|
||||||
{ "."sv, "\n\r\u2028\u2029"sv, false }, // Dot should not match any of CR/LF/LS/PS in ECMA262 mode without DotAll.
|
// Dot should not match any of CR/LF/LS/PS in ECMA262 mode without DotAll.
|
||||||
{ "a$"sv, "a\r\n"sv, true, global_multiline.value() }, // $ should accept all LineTerminators in ECMA262 mode with Multiline.
|
{ "."sv, "\n\r\u2028\u2029"sv, false },
|
||||||
|
// $ should accept all LineTerminators in ECMA262 mode with Multiline.
|
||||||
|
{ "a$"sv, "a\r\n"sv, true, global_multiline.value() },
|
||||||
{ "^a"sv, "\ra"sv, true, global_multiline.value() },
|
{ "^a"sv, "\ra"sv, true, global_multiline.value() },
|
||||||
{ "^(.*?):[ \\t]*([^\\r\\n]*)$"sv, "content-length: 488\r\ncontent-type: application/json; charset=utf-8\r\n"sv, true, global_multiline.value() },
|
{ "^(.*?):[ \\t]*([^\\r\\n]*)$"sv, "content-length: 488\r\ncontent-type: application/json; charset=utf-8\r\n"sv, true, global_multiline.value() },
|
||||||
{ "^\\?((&?category=[0-9]+)?(&?shippable=1)?(&?ad_type=demand)?(&?page=[0-9]+)?(&?locations=(r|d)_[0-9]+)?)+$"sv,
|
// ladybird#968, ?+ should not loop forever. */
|
||||||
"?category=54&shippable=1&baby_age=p,0,1,3"sv, false }, // ladybird#968, ?+ should not loop forever.
|
{ "^\\?((&?category=[0-9]+)?(&?shippable=1)?(&?ad_type=demand)?(&?page=[0-9]+)?(&?locations=(r|d)_[0-9]+)?)+$"sv, "?category=54&shippable=1&baby_age=p,0,1,3"sv, false },
|
||||||
{ "([^\\s]+):\\s*([^;]+);"sv, "font-family: 'Inter';"sv, true }, // optimizer bug, blindly accepting inverted char classes [^x] as atomic rewrite opportunities.
|
// optimizer bug, blindly accepting inverted char classes [^x] as atomic rewrite opportunities.
|
||||||
{ "(a)(?=a*\\1)"sv, "aaaa"sv, true, global_multiline.value() }, // Optimizer bug, ignoring references that weren't bound in the current or past block, ladybird#2281
|
{ "([^\\s]+):\\s*([^;]+);"sv, "font-family: 'Inter';"sv, true },
|
||||||
{ "[ a](b{2})"sv, "abb"sv, true }, // Optimizer bug, wrong Repeat basic block splits.
|
// Optimizer bug, ignoring references that weren't bound in the current or past block, ladybird#2281
|
||||||
{ "^ {0,3}(([\\`\\~])\\2{2,})\\s*([\\*_]*)\\s*([^\\*_\\s]*).*$"sv, ""sv, false }, // See above.
|
{ "(a)(?=a*\\1)"sv, "aaaa"sv, true, global_multiline.value() },
|
||||||
{ "^(\\d{4}|[+-]\\d{6})(?:-?(\\d{2})(?:-?(\\d{2}))?)?(?:[ T]?(\\d{2}):?(\\d{2})(?::?(\\d{2})(?:[,.](\\d{1,}))?)?(?:(Z)|([+-])(\\d{2})(?::?(\\d{2}))?)?)?$"sv,
|
// Optimizer bug, wrong Repeat basic block splits.
|
||||||
|
{ "[ a](b{2})"sv, "abb"sv, true },
|
||||||
|
// See above.
|
||||||
|
{ "^ {0,3}(([\\`\\~])\\2{2,})\\s*([\\*_]*)\\s*([^\\*_\\s]*).*$"sv, ""sv, false },
|
||||||
|
// See above, also ladybird#2931.
|
||||||
|
{
|
||||||
|
"^(\\d{4}|[+-]\\d{6})(?:-?(\\d{2})(?:-?(\\d{2}))?)?(?:[ T]?(\\d{2}):?(\\d{2})(?::?(\\d{2})(?:[,.](\\d{1,}))?)?(?:(Z)|([+-])(\\d{2})(?::?(\\d{2}))?)?)?$"sv,
|
||||||
""sv,
|
""sv,
|
||||||
false, }, // See above, also ladybird#2931.
|
false,
|
||||||
{ "[^]*[^]"sv, "i"sv, true }, // Optimizer bug, ignoring an enabled trailing 'invert' when comparing blocks, ladybird#3421.
|
},
|
||||||
|
// Optimizer bug, ignoring an enabled trailing 'invert' when comparing blocks, ladybird#3421.
|
||||||
|
{ "[^]*[^]"sv, "i"sv, true },
|
||||||
{ "xx|...|...."sv, "cd"sv, false },
|
{ "xx|...|...."sv, "cd"sv, false },
|
||||||
};
|
};
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
for (auto& test : tests) {
|
for (auto& test : tests) {
|
||||||
Regex<ECMA262> re(test.pattern, test.options);
|
Regex<ECMA262> re(test.pattern, test.options);
|
||||||
|
@ -989,9 +1008,7 @@ TEST_CASE(extremely_long_fork_chain)
|
||||||
|
|
||||||
TEST_CASE(nullable_quantifiers)
|
TEST_CASE(nullable_quantifiers)
|
||||||
{
|
{
|
||||||
// clang-format off
|
Regex<ECMA262> re("(a?b?\x3f)*"); // Pattern (a?b??)* isn't written plain to avoid "??)", which is a trigraph.
|
||||||
Regex<ECMA262> re("(a?b?""?)*"); // Pattern (a?b??)* has to be concatenated to avoid "??)", which is a trigraph.
|
|
||||||
// clang-format on
|
|
||||||
auto result = re.match("ab"sv);
|
auto result = re.match("ab"sv);
|
||||||
EXPECT_EQ(result.matches.at(0).view, "ab"sv);
|
EXPECT_EQ(result.matches.at(0).view, "ab"sv);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue