From 8e0cdeb72f68367271697994ae01c60dcebdea36 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Sat, 27 Nov 2021 02:23:48 +0000 Subject: [PATCH 1/7] new parser tests --- .../tests/RegexParserTests.cs | 493 +++++++++++------- .../tests/RegexParserTests.netcoreapp.cs | 17 +- 2 files changed, 315 insertions(+), 195 deletions(-) diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs index 846fcbce60fa65..5b771a724a9c75 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs @@ -12,101 +12,101 @@ public partial class RegexParserTests { [Theory] // Basic - [InlineData("", RegexOptions.None, null)] - [InlineData(" ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(" ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?#)", RegexOptions.None, null)] - [InlineData("(?# )", RegexOptions.None, null)] - [InlineData("(?#", RegexOptions.None, RegexParseError.UnterminatedComment, 3)] - [InlineData("(?# ", RegexOptions.None, RegexParseError.UnterminatedComment, 4)] - [InlineData("(?#)(?#)", RegexOptions.None, null)] - [InlineData("(?#)(?#)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?#) (?#)", RegexOptions.None, null)] - [InlineData("(?#) (?#)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"", RegexOptions.None, null)] + [InlineData(@" ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@" ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?#)", RegexOptions.None, null)] + [InlineData(@"(?# )", RegexOptions.None, null)] + [InlineData(@"(?#", RegexOptions.None, RegexParseError.UnterminatedComment, 3)] + [InlineData(@"(?# ", RegexOptions.None, RegexParseError.UnterminatedComment, 4)] + [InlineData(@"(?#)(?#)", RegexOptions.None, null)] + [InlineData(@"(?#)(?#)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?#) (?#)", RegexOptions.None, null)] + [InlineData(@"(?#) (?#)", RegexOptions.IgnorePatternWhitespace, null)] [InlineData(@"[a\p{Lu}(?#)b]", RegexOptions.None, null)] [InlineData(@"[a\0(?#)b]", RegexOptions.None, null)] [InlineData(@"[a\a(?#)b]", RegexOptions.None, null)] [InlineData(@"[a\x00(?#)b]", RegexOptions.None, null)] [InlineData(@"[a\u0000(?#)b]", RegexOptions.None, null)] [InlineData(@"[a\](?#)b]", RegexOptions.None, null)] - [InlineData("(?", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 2)] - [InlineData("(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 2)] - [InlineData("(? ", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData("(? ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData("(?i)", RegexOptions.None, null)] - [InlineData("(?im)", RegexOptions.None, null)] - [InlineData("(?im-x)", RegexOptions.None, null)] - [InlineData("(?im-x+n)", RegexOptions.None, null)] - [InlineData("(?i) ", RegexOptions.None, null)] - [InlineData("(?x) ", RegexOptions.None, null)] - [InlineData(" (?x) ", RegexOptions.None, null)] - [InlineData(" (?-x) ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(" ( (?-x) ) ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(" (?-x:) ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(" (?-x: ) ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(" (?-x: (?+x: ) ) ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?-x", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 4)] - [InlineData("(?-x ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData("(?-x :", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData("(?-x )", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData("(?-x :)", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(")", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 1)] - [InlineData("a", RegexOptions.None, null)] - [InlineData("ab", RegexOptions.None, null)] - [InlineData("a*", RegexOptions.None, null)] - [InlineData("a*?", RegexOptions.None, null)] - [InlineData("a+", RegexOptions.None, null)] - [InlineData("a+?", RegexOptions.None, null)] - [InlineData("a?", RegexOptions.None, null)] - [InlineData("a??", RegexOptions.None, null)] - [InlineData("()", RegexOptions.None, null)] - [InlineData("(a)", RegexOptions.None, null)] - [InlineData("(", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 1)] - [InlineData("(a", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 2)] - [InlineData("|", RegexOptions.None, null)] - [InlineData(" |", RegexOptions.None, null)] - [InlineData("| ", RegexOptions.None, null)] - [InlineData(" | ", RegexOptions.None, null)] - [InlineData("|", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(" |", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("| ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(" | ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("||", RegexOptions.None, null)] - [InlineData("(|)", RegexOptions.None, null)] - [InlineData("a{0}", RegexOptions.None, null)] - [InlineData("a{0,}", RegexOptions.None, null)] - [InlineData("a{0,1}", RegexOptions.None, null)] - [InlineData("a{1,0}", RegexOptions.None, RegexParseError.ReversedQuantifierRange, 6)] - [InlineData("a{0}?", RegexOptions.None, null)] - [InlineData("a{0,}?", RegexOptions.None, null)] - [InlineData("a{0,1}?", RegexOptions.None, null)] - [InlineData("a{", RegexOptions.None, null)] - [InlineData("a{0", RegexOptions.None, null)] - [InlineData("a{0,", RegexOptions.None, null)] - [InlineData("a{0,1", RegexOptions.None, null)] - [InlineData("a{0 }", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("a{0, }", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("a{0 ,}", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("a{0 ,1}", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("a{0, 1}", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("a{0,1 }", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("a* ?", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("a* ?", RegexOptions.None, null)] - [InlineData("*", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData("(*)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] - [InlineData("a**", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] - [InlineData("+", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData("(+)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] - [InlineData("a*+", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] - [InlineData("?", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData("(?)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] - [InlineData("a*??", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)] - [InlineData("{0}", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData("({0})", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] - [InlineData("a*{0}", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] - [InlineData("{0", RegexOptions.None, null)] - [InlineData("({0)", RegexOptions.None, null)] - [InlineData("a*{0", RegexOptions.None, null)] + [InlineData(@"(?", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 2)] + [InlineData(@"(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 2)] + [InlineData(@"(? ", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(? ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(?i)", RegexOptions.None, null)] + [InlineData(@"(?im)", RegexOptions.None, null)] + [InlineData(@"(?im-x)", RegexOptions.None, null)] + [InlineData(@"(?im-x+n)", RegexOptions.None, null)] + [InlineData(@"(?i) ", RegexOptions.None, null)] + [InlineData(@"(?x) ", RegexOptions.None, null)] + [InlineData(@" (?x) ", RegexOptions.None, null)] + [InlineData(@" (?-x) ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@" ( (?-x) ) ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@" (?-x:) ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@" (?-x: ) ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@" (?-x: (?+x: ) ) ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?-x", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 4)] + [InlineData(@"(?-x ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?-x :", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?-x )", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?-x :)", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@")", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 1)] + [InlineData(@"a", RegexOptions.None, null)] + [InlineData(@"ab", RegexOptions.None, null)] + [InlineData(@"a*", RegexOptions.None, null)] + [InlineData(@"a*?", RegexOptions.None, null)] + [InlineData(@"a+", RegexOptions.None, null)] + [InlineData(@"a+?", RegexOptions.None, null)] + [InlineData(@"a?", RegexOptions.None, null)] + [InlineData(@"a??", RegexOptions.None, null)] + [InlineData(@"()", RegexOptions.None, null)] + [InlineData(@"(a)", RegexOptions.None, null)] + [InlineData(@"(", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 1)] + [InlineData(@"(a", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 2)] + [InlineData(@"|", RegexOptions.None, null)] + [InlineData(@" |", RegexOptions.None, null)] + [InlineData(@"| ", RegexOptions.None, null)] + [InlineData(@" | ", RegexOptions.None, null)] + [InlineData(@"|", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@" |", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"| ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@" | ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"||", RegexOptions.None, null)] + [InlineData(@"(|)", RegexOptions.None, null)] + [InlineData(@"a{0}", RegexOptions.None, null)] + [InlineData(@"a{0,}", RegexOptions.None, null)] + [InlineData(@"a{0,1}", RegexOptions.None, null)] + [InlineData(@"a{1,0}", RegexOptions.None, RegexParseError.ReversedQuantifierRange, 6)] + [InlineData(@"a{0}?", RegexOptions.None, null)] + [InlineData(@"a{0,}?", RegexOptions.None, null)] + [InlineData(@"a{0,1}?", RegexOptions.None, null)] + [InlineData(@"a{", RegexOptions.None, null)] + [InlineData(@"a{0", RegexOptions.None, null)] + [InlineData(@"a{0,", RegexOptions.None, null)] + [InlineData(@"a{0,1", RegexOptions.None, null)] + [InlineData(@"a{0 }", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"a{0, }", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"a{0 ,}", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"a{0 ,1}", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"a{0, 1}", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"a{0,1 }", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"a* ?", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"a* ?", RegexOptions.None, null)] + [InlineData(@"*", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"(*)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] + [InlineData(@"a**", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] + [InlineData(@"+", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"(+)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] + [InlineData(@"a*+", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] + [InlineData(@"?", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"(?)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] + [InlineData(@"a*??", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)] + [InlineData(@"{0}", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"({0})", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] + [InlineData(@"a*{0}", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] + [InlineData(@"{0", RegexOptions.None, null)] + [InlineData(@"({0)", RegexOptions.None, null)] + [InlineData(@"a*{0", RegexOptions.None, null)] [InlineData(@"\w", RegexOptions.None, null)] [InlineData(@"\b\B\A\G\Z\z\w\W\s\W\s\S\d\D", RegexOptions.None, null)] [InlineData(@"\c", RegexOptions.None, RegexParseError.MissingControlCharacter, 2)] @@ -223,92 +223,92 @@ public partial class RegexParserTests [InlineData(@"(?)\'a' ", RegexOptions.None, null)] [InlineData(@"\<0' ", RegexOptions.None, null)] [InlineData(@"\'0> ", RegexOptions.None, null)] - [InlineData("\\p{Cc}", RegexOptions.None, null)] - [InlineData("\\p{ Cc }", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 4)] - [InlineData("\\p{ Cc }", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidUnicodePropertyEscape, 4)] - [InlineData("\\p {Cc}", RegexOptions.IgnorePatternWhitespace, RegexParseError.MalformedUnicodePropertyEscape, 3)] - [InlineData("\\p{xxx}", RegexOptions.None, RegexParseError.UnrecognizedUnicodeProperty, 7)] - [InlineData("\\p", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] - [InlineData("\\p{", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] - [InlineData("\\p{}", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] - [InlineData("\\p{} ", RegexOptions.None, RegexParseError.UnrecognizedUnicodeProperty, 4)] - [InlineData("\\p {} ", RegexOptions.None, RegexParseError.MalformedUnicodePropertyEscape, 3)] - [InlineData("\\p{Cc ", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 6)] - [InlineData("\\p{IsArabicPresentationForms-A}", RegexOptions.None, null)] - [InlineData("(?:)", RegexOptions.None, null)] - [InlineData("(?:a)", RegexOptions.None, null)] - [InlineData("(?:", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] - [InlineData("(?: ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] - [InlineData("(?=)", RegexOptions.None, null)] - [InlineData("(?=a)", RegexOptions.None, null)] - [InlineData("(?=", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] - [InlineData("(?= ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] - [InlineData("(?!)", RegexOptions.None, null)] - [InlineData("(?!a)", RegexOptions.None, null)] - [InlineData("(?!", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] - [InlineData("(?! ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] - [InlineData("(?>)", RegexOptions.None, null)] - [InlineData("(?>a)", RegexOptions.None, null)] - [InlineData("(?>", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] - [InlineData("(?> ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] - [InlineData("(?<=)", RegexOptions.None, null)] - [InlineData("(?<=a)", RegexOptions.None, null)] - [InlineData("(?<=", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 4)] - [InlineData("(?<= ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] - [InlineData("(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData("(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] - [InlineData("(?a", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 6)] - [InlineData("(?a)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 4)] - [InlineData("(?a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 4)] - [InlineData("(?< a>a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData("(?< a>a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData("(?< a >a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData("(?< a >a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData("(?a)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?<0>a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupOfZero, 4)] - [InlineData("(?<1>a)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?<10>a)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?<1>)", RegexOptions.None, null)] - [InlineData("(?<1> )", RegexOptions.None, null)] - [InlineData("(?<1> )", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?'a')", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?(", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 3)] - [InlineData("(?(0", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasMalformedReference, 4)] - [InlineData("(?(0)", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] - [InlineData("(?(0))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?(0)a)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?(0)a|)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?(0)a|b)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?(0)a|b|)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasTooManyConditions, 10)] - [InlineData("(?(0)a|b|c)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasTooManyConditions, 11)] - [InlineData("(?(0 )", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasMalformedReference, 5)] - [InlineData("(?(1))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasUndefinedReference, 5)] - [InlineData("(?(00))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?(a))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?)(?(a))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?)(?(a ))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?)(?( a))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?(()a()))", RegexOptions.None, null)] - [InlineData("(?((?)a(?)))", RegexOptions.None, null)] - [InlineData("(?(?'", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] - [InlineData("(?(?'x'))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] - [InlineData("(?(?#", RegexOptions.IgnorePatternWhitespace, RegexParseError.UnterminatedComment, 5)] - [InlineData("(?(?#)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasComment, 2)] - [InlineData("(?(?#))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasComment, 2)] - [InlineData("(?(?<", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData("(?(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] - [InlineData("(?(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] - [InlineData("(?(?))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] - [InlineData("(?(?<=))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?(?)", RegexOptions.None, null)] + [InlineData(@"(?>a)", RegexOptions.None, null)] + [InlineData(@"(?>", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] + [InlineData(@"(?> ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] + [InlineData(@"(?<=)", RegexOptions.None, null)] + [InlineData(@"(?<=a)", RegexOptions.None, null)] + [InlineData(@"(?<=", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 4)] + [InlineData(@"(?<= ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] + [InlineData(@"(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData(@"(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] + [InlineData(@"(?a", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 6)] + [InlineData(@"(?a)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 4)] + [InlineData(@"(?a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 4)] + [InlineData(@"(?< a>a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData(@"(?< a>a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData(@"(?< a >a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData(@"(?< a >a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData(@"(?a)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?<0>a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupOfZero, 4)] + [InlineData(@"(?<1>a)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?<10>a)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?<1>)", RegexOptions.None, null)] + [InlineData(@"(?<1> )", RegexOptions.None, null)] + [InlineData(@"(?<1> )", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?'a')", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?(", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 3)] + [InlineData(@"(?(0", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasMalformedReference, 4)] + [InlineData(@"(?(0)", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] + [InlineData(@"(?(0))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?(0)a)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?(0)a|)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?(0)a|b)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?(0)a|b|)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasTooManyConditions, 10)] + [InlineData(@"(?(0)a|b|c)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasTooManyConditions, 11)] + [InlineData(@"(?(0 )", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasMalformedReference, 5)] + [InlineData(@"(?(1))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasUndefinedReference, 5)] + [InlineData(@"(?(00))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?(a))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?)(?(a))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?)(?(a ))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?)(?( a))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?(()a()))", RegexOptions.None, null)] + [InlineData(@"(?((?)a(?)))", RegexOptions.None, null)] + [InlineData(@"(?(?'", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] + [InlineData(@"(?(?'x'))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] + [InlineData(@"(?(?#", RegexOptions.IgnorePatternWhitespace, RegexParseError.UnterminatedComment, 5)] + [InlineData(@"(?(?#)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasComment, 2)] + [InlineData(@"(?(?#))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasComment, 2)] + [InlineData(@"(?(?<", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] + [InlineData(@"(?(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] + [InlineData(@"(?(?))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] + [InlineData(@"(?(?<=))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?(?-", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 4)] + [InlineData(@"(?<", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(?>-", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 4)] // Testgroup with options - [InlineData("())", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 3)] - [InlineData("[a-z-[aeiuo]", RegexOptions.None, RegexParseError.UnterminatedBracket, 12)] - [InlineData("[a-z-[aeiuo", RegexOptions.None, RegexParseError.UnterminatedBracket, 11)] - [InlineData("[a-z-[b]", RegexOptions.None, RegexParseError.UnterminatedBracket, 8)] - [InlineData("[a-z-[b", RegexOptions.None, RegexParseError.UnterminatedBracket, 7)] - [InlineData("[b-a]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] + [InlineData(@"())", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 3)] + [InlineData(@"[a-z-[aeiuo]", RegexOptions.None, RegexParseError.UnterminatedBracket, 12)] + [InlineData(@"[a-z-[aeiuo", RegexOptions.None, RegexParseError.UnterminatedBracket, 11)] + [InlineData(@"[a-z-[b]", RegexOptions.None, RegexParseError.UnterminatedBracket, 8)] + [InlineData(@"[a-z-[b", RegexOptions.None, RegexParseError.UnterminatedBracket, 7)] + [InlineData(@"[b-a]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] [InlineData(@"[a-c]{2,1}", RegexOptions.None, RegexParseError.ReversedQuantifierRange, 10)] [InlineData(@"\d{2147483648}", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 13)] - [InlineData("[a-z-[b][", RegexOptions.None, RegexParseError.UnterminatedBracket, 9)] - [InlineData("(?()|||||)", RegexOptions.None, RegexParseError.AlternationHasTooManyConditions, 10)] - [InlineData("[^]", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] - [InlineData("??", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData("(?=*)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 4)] - [InlineData("((((((*))))))", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 7)] + [InlineData(@"[a-z-[b][", RegexOptions.None, RegexParseError.UnterminatedBracket, 9)] + [InlineData(@"(?()|||||)", RegexOptions.None, RegexParseError.AlternationHasTooManyConditions, 10)] + [InlineData(@"[^]", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"??", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"(?=*)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 4)] + [InlineData(@"((((((*))))))", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 7)] + [InlineData(@"(?Pabc", RegexOptions.None, null)] + [InlineData(@"(\b)", RegexOptions.None, null)] + [InlineData(@"[a-\b]", RegexOptions.None, null)] + [InlineData(@"\b*", RegexOptions.None, null)] + [InlineData(@"\b+", RegexOptions.None, null)] + [InlineData(@"\b?", RegexOptions.None, null)] + [InlineData(@"\x{7fffffff}", RegexOptions.None, null)] + [InlineData(@"a{1,101}", RegexOptions.None, null)] + [InlineData(@"a{1,}?", RegexOptions.None, null)] + [InlineData(@"a{1}?", RegexOptions.None, null)] + [InlineData(@"(+)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `+` operator, nothing to repeat" + [InlineData(@"(?Pabc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group name. Missing `<`\n" & "(?Pabc\n" & "^" + [InlineData(@"(?u-q)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group flag, found -q but " & "expected one of: -i, -m, -s, -U or -u" + [InlineData(@"(?uq)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group flag, found q but " & "expected one of: i, m, s, U or u" + [InlineData(@"(a)b)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid capturing group. " & "Found too many closing symbols" + [InlineData(@"(b(a)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid capturing group. " & "Found too many opening symbols" + [InlineData(@"*", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `*` operator, nothing to repeat" + [InlineData(@"?", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `?` operator, nothing to make optional" + [InlineData(@"[[:abc:]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. `abc` is not a valid name\n" & "[[:abc:]]\n" & " ^" + [InlineData(@"[[:alnum:", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. Expected [:name:]\n" & "[[:alnum:\n" & " ^" + [InlineData(@"[[:alnum]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. Expected [:name:]\n" & "[[:alnum]]\n" & " ^" + [InlineData(@"[]abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set. Missing `]`\n" & "[]abc\n" & "^" + [InlineData(@"[a-\w]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. Range can't contain " & "a character-class or assertion\n" & "[a-\\w]\n" & " ^" + [InlineData(@"[abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set. Missing `]`\n" & "[abc\n" & "^" + [InlineData(@"[d-c]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. " & "Start must be lesser than end\n" & "[d-c]\n" & " ^" + [InlineData(@"[z-[:alnum:]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. " & "Start must be lesser than end\n" & "[z-[:alnum:]]\n" & " ^" + [InlineData(@"\12", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid octal literal. Expected 3 octal digits, but found 2\n" & "\\12\n" & "^" + [InlineData(@"\12@", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid octal literal. Expected octal digit, but found @\n" & "\\12@\n" & "^" + [InlineData(@"\p11", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found 1\n" & "\\p11\n" & "^" + [InlineData(@"\pB", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found B\n" & "\\pB\n" & "^" + [InlineData(@"\p{11", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Expected `}`\n" & "\\p{11\n" & "^" + [InlineData(@"\p{11}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Expected chars in {'a'..'z', 'A'..'Z'}\n" & "\\p{11}\n" & "^" + [InlineData(@"\p{Bb}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found Bb\n" & "\\p{Bb}\n" & "^" + [InlineData(@"\u123", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected 4 hex digits, but found 3\n" & "\\u123\n" & "^" + [InlineData(@"\U123", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected 8 hex digits, but found 3\n" & "\\U123\n" & "^" + [InlineData(@"\U123@a", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\U123@a\n" & "^" + [InlineData(@"\u123@abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\u123@abc\n" & "^" + [InlineData(@"\UFFFFFFFF", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. FFFFFFFF value is too big\n" & "\\UFFFFFFFF\n" & "^" + [InlineData(@"\x{00000000A}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected at most 8 chars, found 9\n" & "\\x{00000000A}\n" & "^" + [InlineData(@"\x{2f894", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected `}`\n" & "\\x{2f894\n" & "^" + [InlineData(@"\x{61@}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\x{61@}\n" & " ^" + [InlineData(@"a(?P<>abc)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group name. Name can't be empty\n" & "a(?P<>abc)\n" & " ^" + [InlineData(@"a(?P`\n" & "abc(?P new Regex(pattern, options)); + //Assert.InRange(offset, 0, int.MaxValue); + Throws(pattern, error.Value, offset, () => new Regex(pattern, options)); return; } @@ -755,7 +862,7 @@ private static void ParsePatternFragments(string pattern, RegexOptions options) /// /// The expected parse error /// The action to invoke. - static partial void Throws(RegexParseError error, int offset, Action action); + static partial void Throws(string pattern, RegexParseError error, int offset, Action action); /// /// Checks that action succeeds or throws either a RegexParseException or an ArgumentException depending on the diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs index cc1d5f8658fe9b..749046119ace98 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs @@ -151,13 +151,23 @@ public void RegexParseException_Serializes() Assert.Equal(e.Message, e2.Message); } + static void LogActual(string pattern, RegexParseError error, int offset) + { + // [InlineData(@"[a-z-[b", RegexOptions.None, RegexParseError.UnterminatedBracket, 7)] + string s = (error == RegexParseError.Unknown) ? + @$" [InlineData(@""{pattern}"", RegexOptions.None, null)]\n" : + @$" [InlineData(@""{pattern}"", RegexOptions.None, {error.ToString()}, {offset})]\n"; + + // File.AppendAllText(@"/tmp/out.cs", s); // for updating baseline + } + /// /// Checks if action throws either a RegexParseException or an ArgumentException depending on the /// environment and the supplied error. /// /// The expected parse error /// The action to invoke. - static partial void Throws(RegexParseError error, int offset, Action action) + static partial void Throws(string pattern, RegexParseError error, int offset, Action action) { try { @@ -171,16 +181,19 @@ static partial void Throws(RegexParseError error, int offset, Action action) if (error == regexParseError) { Assert.Equal(offset, e.Offset); + LogActual(pattern, regexParseError, e.Offset); return; } + LogActual(pattern, regexParseError, e.Offset); throw new XunitException($"Expected RegexParseException with error {error} offset {offset} -> Actual error: {regexParseError} offset {e.Offset})"); } catch (Exception e) { - throw new XunitException($"Expected RegexParseException -> Actual: ({e})"); + throw new XunitException($"Expected RegexParseException for pattern '{pattern}' -> Actual: ({e})"); } + LogActual(pattern, RegexParseError.Unknown, -1); throw new XunitException($"Expected RegexParseException with error: ({error}) -> Actual: No exception thrown"); } From 87ca3188b9b89d4c27555ffe9f50f39ccb0ecd31 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Sat, 27 Nov 2021 03:05:52 +0000 Subject: [PATCH 2/7] baseline --- .../tests/RegexParserTests.cs | 916 +++--------------- .../tests/RegexParserTests.netcoreapp.cs | 136 +-- .../tests/RegexParserTests.netfx.cs | 2 +- 3 files changed, 128 insertions(+), 926 deletions(-) diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs index 5b771a724a9c75..67182a1e9af147 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs @@ -11,821 +11,137 @@ namespace System.Text.RegularExpressions.Tests public partial class RegexParserTests { [Theory] - // Basic - [InlineData(@"", RegexOptions.None, null)] - [InlineData(@" ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@" ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?#)", RegexOptions.None, null)] - [InlineData(@"(?# )", RegexOptions.None, null)] - [InlineData(@"(?#", RegexOptions.None, RegexParseError.UnterminatedComment, 3)] - [InlineData(@"(?# ", RegexOptions.None, RegexParseError.UnterminatedComment, 4)] - [InlineData(@"(?#)(?#)", RegexOptions.None, null)] - [InlineData(@"(?#)(?#)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?#) (?#)", RegexOptions.None, null)] - [InlineData(@"(?#) (?#)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"[a\p{Lu}(?#)b]", RegexOptions.None, null)] - [InlineData(@"[a\0(?#)b]", RegexOptions.None, null)] - [InlineData(@"[a\a(?#)b]", RegexOptions.None, null)] - [InlineData(@"[a\x00(?#)b]", RegexOptions.None, null)] - [InlineData(@"[a\u0000(?#)b]", RegexOptions.None, null)] - [InlineData(@"[a\](?#)b]", RegexOptions.None, null)] - [InlineData(@"(?", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 2)] - [InlineData(@"(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 2)] - [InlineData(@"(? ", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"(? ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"(?i)", RegexOptions.None, null)] - [InlineData(@"(?im)", RegexOptions.None, null)] - [InlineData(@"(?im-x)", RegexOptions.None, null)] - [InlineData(@"(?im-x+n)", RegexOptions.None, null)] - [InlineData(@"(?i) ", RegexOptions.None, null)] - [InlineData(@"(?x) ", RegexOptions.None, null)] - [InlineData(@" (?x) ", RegexOptions.None, null)] - [InlineData(@" (?-x) ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@" ( (?-x) ) ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@" (?-x:) ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@" (?-x: ) ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@" (?-x: (?+x: ) ) ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?-x", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 4)] - [InlineData(@"(?-x ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?-x :", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?-x )", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?-x :)", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@")", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 1)] - [InlineData(@"a", RegexOptions.None, null)] - [InlineData(@"ab", RegexOptions.None, null)] - [InlineData(@"a*", RegexOptions.None, null)] - [InlineData(@"a*?", RegexOptions.None, null)] - [InlineData(@"a+", RegexOptions.None, null)] - [InlineData(@"a+?", RegexOptions.None, null)] - [InlineData(@"a?", RegexOptions.None, null)] - [InlineData(@"a??", RegexOptions.None, null)] - [InlineData(@"()", RegexOptions.None, null)] - [InlineData(@"(a)", RegexOptions.None, null)] - [InlineData(@"(", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 1)] - [InlineData(@"(a", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 2)] - [InlineData(@"|", RegexOptions.None, null)] - [InlineData(@" |", RegexOptions.None, null)] - [InlineData(@"| ", RegexOptions.None, null)] - [InlineData(@" | ", RegexOptions.None, null)] - [InlineData(@"|", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@" |", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"| ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@" | ", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"||", RegexOptions.None, null)] - [InlineData(@"(|)", RegexOptions.None, null)] - [InlineData(@"a{0}", RegexOptions.None, null)] - [InlineData(@"a{0,}", RegexOptions.None, null)] - [InlineData(@"a{0,1}", RegexOptions.None, null)] - [InlineData(@"a{1,0}", RegexOptions.None, RegexParseError.ReversedQuantifierRange, 6)] - [InlineData(@"a{0}?", RegexOptions.None, null)] - [InlineData(@"a{0,}?", RegexOptions.None, null)] - [InlineData(@"a{0,1}?", RegexOptions.None, null)] - [InlineData(@"a{", RegexOptions.None, null)] - [InlineData(@"a{0", RegexOptions.None, null)] - [InlineData(@"a{0,", RegexOptions.None, null)] - [InlineData(@"a{0,1", RegexOptions.None, null)] - [InlineData(@"a{0 }", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"a{0, }", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"a{0 ,}", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"a{0 ,1}", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"a{0, 1}", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"a{0,1 }", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"a* ?", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"a* ?", RegexOptions.None, null)] - [InlineData(@"*", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"(*)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] - [InlineData(@"a**", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] - [InlineData(@"+", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"(+)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] - [InlineData(@"a*+", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] - [InlineData(@"?", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"(?)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] - [InlineData(@"a*??", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)] - [InlineData(@"{0}", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"({0})", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] - [InlineData(@"a*{0}", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] - [InlineData(@"{0", RegexOptions.None, null)] - [InlineData(@"({0)", RegexOptions.None, null)] - [InlineData(@"a*{0", RegexOptions.None, null)] - [InlineData(@"\w", RegexOptions.None, null)] - [InlineData(@"\b\B\A\G\Z\z\w\W\s\W\s\S\d\D", RegexOptions.None, null)] - [InlineData(@"\c", RegexOptions.None, RegexParseError.MissingControlCharacter, 2)] - [InlineData(@"\c<", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] - [InlineData(@"\ca", RegexOptions.None, null)] - [InlineData(@"\cA", RegexOptions.None, null)] - [InlineData(@"\c A", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] - [InlineData(@"\c(a)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] - [InlineData(@"\c>", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] - [InlineData(@"\c?", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] - [InlineData(@"\c@", RegexOptions.None, null)] - [InlineData(@"\c^", RegexOptions.None, null)] - [InlineData(@"\c_", RegexOptions.None, null)] - [InlineData(@"\c`", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] - [InlineData(@"\c{", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] - [InlineData(@"\cz", RegexOptions.None, null)] - [InlineData(@"\cZ", RegexOptions.None, null)] - [InlineData(@"\m", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"\x", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"\x ", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"\x0", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"\x0 ", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 4)] - [InlineData(@"\x00", RegexOptions.None, null)] - [InlineData(@"\x00 ", RegexOptions.None, null)] - [InlineData(@"\x000", RegexOptions.None, null)] - [InlineData(@"\xff", RegexOptions.None, null)] - [InlineData(@"\xFF", RegexOptions.None, null)] - [InlineData(@"\xfF", RegexOptions.None, null)] - [InlineData(@"\xfff", RegexOptions.None, null)] - [InlineData(@"\xgg", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] - [InlineData(@"\m ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"\u", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"\u0", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"\u00", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"\u000", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"\u0000", RegexOptions.None, null)] - [InlineData(@"\u0000 ", RegexOptions.None, null)] - [InlineData(@"\u ", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"\u0 ", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"\ugggg", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] - [InlineData(@"\0", RegexOptions.None, null)] - [InlineData(@"\0 ", RegexOptions.None, null)] - [InlineData(@"\00", RegexOptions.None, null)] - [InlineData(@"\00 ", RegexOptions.None, null)] - [InlineData(@"\000", RegexOptions.None, null)] - [InlineData(@"\000 ", RegexOptions.None, null)] - [InlineData(@"\0000", RegexOptions.None, null)] - [InlineData(@"\0000 ", RegexOptions.None, null)] - [InlineData(@"\7", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 2)] - [InlineData(@"\78", RegexOptions.None, null)] - [InlineData(@"\8", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 2)] - [InlineData(@"\40", RegexOptions.ECMAScript, null)] - [InlineData(@"\401", RegexOptions.ECMAScript, null)] - [InlineData(@"\37", RegexOptions.ECMAScript, null)] - [InlineData(@"\371", RegexOptions.ECMAScript, null)] - [InlineData(@"\0000", RegexOptions.ECMAScript, null)] - [InlineData(@"\k", RegexOptions.None, RegexParseError.MalformedNamedReference, 1)] - [InlineData(@"\k ", RegexOptions.None, RegexParseError.MalformedNamedReference, 3)] - [InlineData(@"\k<", RegexOptions.None, RegexParseError.MalformedNamedReference, 3)] - [InlineData(@"\k< ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"\k<0", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"\k<0 ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"\k<0>", RegexOptions.None, null)] - [InlineData(@"\k<0> ", RegexOptions.None, null)] - [InlineData(@"\k<00> ", RegexOptions.None, null)] - [InlineData(@"\k ", RegexOptions.None, RegexParseError.UndefinedNamedReference, 5)] - [InlineData(@"(?)\k ", RegexOptions.None, null)] - [InlineData(@"\k", RegexOptions.ECMAScript, RegexParseError.MalformedNamedReference, 1)] - [InlineData(@"\k ", RegexOptions.ECMAScript, RegexParseError.MalformedNamedReference, 3)] - [InlineData(@"\k<", RegexOptions.ECMAScript, RegexParseError.MalformedNamedReference, 3)] - [InlineData(@"\k< ", RegexOptions.ECMAScript, null)] - [InlineData(@"\k<0", RegexOptions.ECMAScript, null)] - [InlineData(@"\k<0 ", RegexOptions.ECMAScript, null)] - [InlineData(@"\k<0>", RegexOptions.ECMAScript, null)] - [InlineData(@"\k<0> ", RegexOptions.ECMAScript, null)] - [InlineData(@"\k'", RegexOptions.None, RegexParseError.MalformedNamedReference, 3)] - [InlineData(@"\k' ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"\k'0", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"\k'0 ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"\k'0'", RegexOptions.None, null)] - [InlineData(@"\k'0' ", RegexOptions.None, null)] - [InlineData(@"\k'00' ", RegexOptions.None, null)] - [InlineData(@"\k'a' ", RegexOptions.None, RegexParseError.UndefinedNamedReference, 5)] - [InlineData(@"(?)\k'a' ", RegexOptions.None, null)] - [InlineData(@"\k<0' ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"\k'0> ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"\", RegexOptions.None, RegexParseError.UnescapedEndingBackslash, 1)] - [InlineData(@"\ ", RegexOptions.None, null)] - [InlineData(@"\<", RegexOptions.None, null)] - [InlineData(@"\< ", RegexOptions.None, null)] - [InlineData(@"\<0", RegexOptions.None, null)] - [InlineData(@"\<0 ", RegexOptions.None, null)] - [InlineData(@"\<0>", RegexOptions.None, null)] - [InlineData(@"\<0> ", RegexOptions.None, null)] - [InlineData(@"\<00> ", RegexOptions.None, null)] - [InlineData(@"\ ", RegexOptions.None, RegexParseError.UndefinedNamedReference, 4)] - [InlineData(@"(?)\ ", RegexOptions.None, null)] - [InlineData(@"\", RegexOptions.ECMAScript, RegexParseError.UnescapedEndingBackslash, 1)] - [InlineData(@"\ ", RegexOptions.ECMAScript, null)] - [InlineData(@"\<", RegexOptions.ECMAScript, null)] - [InlineData(@"\< ", RegexOptions.ECMAScript, null)] - [InlineData(@"\<0", RegexOptions.ECMAScript, null)] - [InlineData(@"\<0 ", RegexOptions.ECMAScript, null)] - [InlineData(@"\<0>", RegexOptions.ECMAScript, null)] - [InlineData(@"\<0> ", RegexOptions.ECMAScript, null)] - [InlineData(@"\'", RegexOptions.None, null)] - [InlineData(@"\' ", RegexOptions.None, null)] - [InlineData(@"\'0", RegexOptions.None, null)] - [InlineData(@"\'0 ", RegexOptions.None, null)] - [InlineData(@"\'0'", RegexOptions.None, null)] - [InlineData(@"\'0' ", RegexOptions.None, null)] - [InlineData(@"\'00' ", RegexOptions.None, null)] - [InlineData(@"\'a' ", RegexOptions.None, RegexParseError.UndefinedNamedReference, 4)] - [InlineData(@"(?)\'a' ", RegexOptions.None, null)] - [InlineData(@"\<0' ", RegexOptions.None, null)] - [InlineData(@"\'0> ", RegexOptions.None, null)] - [InlineData(@"\\p{Cc}", RegexOptions.None, null)] - [InlineData(@"\\p{ Cc }", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 4)] - [InlineData(@"\\p{ Cc }", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidUnicodePropertyEscape, 4)] - [InlineData(@"\\p {Cc}", RegexOptions.IgnorePatternWhitespace, RegexParseError.MalformedUnicodePropertyEscape, 3)] - [InlineData(@"\\p{xxx}", RegexOptions.None, RegexParseError.UnrecognizedUnicodeProperty, 7)] - [InlineData(@"\\p", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] - [InlineData(@"\\p{", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] - [InlineData(@"\\p{}", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] - [InlineData(@"\\p{} ", RegexOptions.None, RegexParseError.UnrecognizedUnicodeProperty, 4)] - [InlineData(@"\\p {} ", RegexOptions.None, RegexParseError.MalformedUnicodePropertyEscape, 3)] - [InlineData(@"\\p{Cc ", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 6)] - [InlineData(@"\\p{IsArabicPresentationForms-A}", RegexOptions.None, null)] - [InlineData(@"(?:)", RegexOptions.None, null)] - [InlineData(@"(?:a)", RegexOptions.None, null)] - [InlineData(@"(?:", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] - [InlineData(@"(?: ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] - [InlineData(@"(?=)", RegexOptions.None, null)] - [InlineData(@"(?=a)", RegexOptions.None, null)] - [InlineData(@"(?=", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] - [InlineData(@"(?= ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] - [InlineData(@"(?!)", RegexOptions.None, null)] - [InlineData(@"(?!a)", RegexOptions.None, null)] - [InlineData(@"(?!", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] - [InlineData(@"(?! ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] - [InlineData(@"(?>)", RegexOptions.None, null)] - [InlineData(@"(?>a)", RegexOptions.None, null)] - [InlineData(@"(?>", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] - [InlineData(@"(?> ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] - [InlineData(@"(?<=)", RegexOptions.None, null)] - [InlineData(@"(?<=a)", RegexOptions.None, null)] - [InlineData(@"(?<=", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 4)] - [InlineData(@"(?<= ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] - [InlineData(@"(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData(@"(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] - [InlineData(@"(?a", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 6)] - [InlineData(@"(?a)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 4)] - [InlineData(@"(?a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 4)] - [InlineData(@"(?< a>a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData(@"(?< a>a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData(@"(?< a >a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData(@"(?< a >a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData(@"(?a)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?<0>a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupOfZero, 4)] - [InlineData(@"(?<1>a)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?<10>a)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?<1>)", RegexOptions.None, null)] - [InlineData(@"(?<1> )", RegexOptions.None, null)] - [InlineData(@"(?<1> )", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?'a')", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?(", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 3)] - [InlineData(@"(?(0", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasMalformedReference, 4)] - [InlineData(@"(?(0)", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] - [InlineData(@"(?(0))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?(0)a)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?(0)a|)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?(0)a|b)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?(0)a|b|)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasTooManyConditions, 10)] - [InlineData(@"(?(0)a|b|c)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasTooManyConditions, 11)] - [InlineData(@"(?(0 )", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasMalformedReference, 5)] - [InlineData(@"(?(1))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasUndefinedReference, 5)] - [InlineData(@"(?(00))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?(a))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?)(?(a))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?)(?(a ))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?)(?( a))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?(()a()))", RegexOptions.None, null)] - [InlineData(@"(?((?)a(?)))", RegexOptions.None, null)] - [InlineData(@"(?(?'", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] - [InlineData(@"(?(?'x'))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] - [InlineData(@"(?(?#", RegexOptions.IgnorePatternWhitespace, RegexParseError.UnterminatedComment, 5)] - [InlineData(@"(?(?#)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasComment, 2)] - [InlineData(@"(?(?#))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasComment, 2)] - [InlineData(@"(?(?<", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] - [InlineData(@"(?(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] - [InlineData(@"(?(?))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] - [InlineData(@"(?(?<=))", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?(?]", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 4)] - [InlineData(@"[\c>-\c<]", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 4)] - [InlineData(@"[\c>-a]", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 4)] - [InlineData(@"[a-\c>]", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 6)] - [InlineData(@"[a--]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] - [InlineData(@"[--a]", RegexOptions.None, null)] - [InlineData(@"[\--a]", RegexOptions.None, null)] - [InlineData(@"[\0-\1]", RegexOptions.None, null)] - [InlineData(@"[\1-\0]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 6)] - [InlineData(@"[\0-\01]", RegexOptions.None, null)] - [InlineData(@"[\01-\0]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] - [InlineData(@"[[:x:]-a]", RegexOptions.None, null)] - [InlineData(@"[a-[:x:]]", RegexOptions.None, null)] - [InlineData(@"[\0-\ca]", RegexOptions.None, null)] - [InlineData(@"[\ca-\0]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] - [InlineData(@"[\ca-\cA]", RegexOptions.None, null)] - [InlineData(@"[\cA-\ca]", RegexOptions.None, null)] - [InlineData(@"[\u0-\u1]", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 5)] - [InlineData(@"[\u1-\u0]", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 5)] - [InlineData(@"[\u0000-\u0000]", RegexOptions.None, null)] - [InlineData(@"[\u0000-\u0001]", RegexOptions.None, null)] - [InlineData(@"[\u0001-\u0000]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 14)] - [InlineData(@"[\u0001-a]", RegexOptions.None, null)] - [InlineData(@"[a-\u0001]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 9)] - [InlineData(@"[a-a]", RegexOptions.None, null)] - [InlineData(@"[a-A]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] - [InlineData(@"[A-a]", RegexOptions.None, null)] - [InlineData(@"[a-a]", RegexOptions.IgnoreCase, null)] - [InlineData(@"[a-A]", RegexOptions.IgnoreCase, RegexParseError.ReversedCharacterRange, 4)] - [InlineData(@"[A-a]", RegexOptions.IgnoreCase, null)] - [InlineData(@"[a-\x61]", RegexOptions.None, null)] - [InlineData(@"[\x61-a]", RegexOptions.None, null)] - [InlineData(@"[a-\x60]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] - [InlineData(@"[\x62-a]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] - [InlineData(@"[a-\x62]", RegexOptions.None, null)] - [InlineData(@"[\3-\cc]", RegexOptions.None, null)] - [InlineData(@"[\cc-\3]", RegexOptions.None, null)] - [InlineData(@"[\2-\cc]", RegexOptions.None, null)] - [InlineData(@"[\cc-\2]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] - [InlineData(@"[\4-\cc]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] - [InlineData(@"[\cc-\4]", RegexOptions.None, null)] - [InlineData(@"[\ca-\cb]", RegexOptions.None, null)] - [InlineData(@"[\ca-\cB]", RegexOptions.None, null)] - [InlineData(@"[\cA-\cb]", RegexOptions.None, null)] - [InlineData(@"[\cA-\cB]", RegexOptions.None, null)] - [InlineData(@"[\cb-\ca]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 8)] - [InlineData(@"[\cb-\cA]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 8)] - [InlineData(@"[\cB-\ca]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 8)] - [InlineData(@"[\cB-\cA]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 8)] - [InlineData(@"[\--#]", RegexOptions.None, null)] - [InlineData(@"[b-\-a]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] - [InlineData(@"[b-\-\-a]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] - [InlineData(@"()\2", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 4)] - [InlineData(@"()()\2", RegexOptions.None, null)] - [InlineData(@"()\1", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 4)] - [InlineData(@"()\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 4)] - [InlineData(@"()()\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 6)] - [InlineData(@"()()(?n)\1\2", RegexOptions.None, null)] - [InlineData(@"()(?n)()\1\2", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 12)] - [InlineData(@"(?n)()()\1\2", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 10)] - [InlineData(@"()()(?n)\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 10)] - [InlineData(@"()(?n)()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 10)] - [InlineData(@"(?n)()()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 10)] - [InlineData(@"()()(?-n)\1\2", RegexOptions.None, null)] - [InlineData(@"()(?-n)()\1\2", RegexOptions.None, null)] - [InlineData(@"(?-n)()()\1\2", RegexOptions.None, null)] - [InlineData(@"()()(?-n)\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 11)] - [InlineData(@"()(?-n)()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 13)] - [InlineData(@"(?-n)()()\1\2", RegexOptions.ExplicitCapture, null)] - [InlineData(@"()()(?n:\1\2)", RegexOptions.None, null)] - [InlineData(@"()()(?n:\1\2)", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 10)] - [InlineData(@"()()(?-n:\1\2)", RegexOptions.None, null)] - [InlineData(@"()()(?-n:\1\2)", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 11)] - [InlineData(@"(?n:)()()\1\2", RegexOptions.None, null)] - [InlineData(@"(?n:)()()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 11)] - [InlineData(@"(?-n:)()()\1\2", RegexOptions.None, null)] - [InlineData(@"(?-n:)()()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 12)] - [InlineData(@"(?n)(?-n)()()\1\2", RegexOptions.None, null)] - [InlineData(@"(?n)(?-n)()()\1\2", RegexOptions.ExplicitCapture, null)] - [InlineData(@"(?-n)(?n)()()\1\2", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 15)] - [InlineData(@"(?-n)(?n)()()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 15)] - // References - [InlineData(@"[aeiou]", RegexOptions.None, null)] - [InlineData(@"(?\w+)\s\k\W(?\w+)", RegexOptions.None, null)] - [InlineData(@"((?abc)\d+)?(?xyz)(.*)", RegexOptions.None, null)] - [InlineData(@"(\w+)\s(\1)", RegexOptions.None, null)] - [InlineData(@"\Bqu\w+", RegexOptions.None, null)] - [InlineData(@"\bare\w*\b", RegexOptions.None, null)] - [InlineData(@"\G(\w+\s?\w*),?", RegexOptions.None, null)] - [InlineData(@"\D+(?\d+)\D+(?\d+)?", RegexOptions.None, null)] - [InlineData(@"(\s\d{4}(-(\d{4}|present))?,?)+", RegexOptions.None, null)] - [InlineData(@"^((\w+(\s?)){2,}),\s(\w+\s\w+),(\s\d{4}(-(\d{4}|present))?,?)+", RegexOptions.None, null)] - [InlineData(@"^[0-9-[2468]]+$", RegexOptions.None, null)] - [InlineData(@"[a-z-[0-9]]", RegexOptions.None, null)] - [InlineData(@"[\p{IsBasicLatin}-[\x00-\x7F]]", RegexOptions.None, null)] - [InlineData(@"[\u0000-\uFFFF-[\s\p{P}\p{IsGreek}\x85]]", RegexOptions.None, null)] - [InlineData(@"[a-z-[d-w-[m-o]]]", RegexOptions.None, null)] - [InlineData(@"((\w+(\s?)){2,}", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 15)] - [InlineData(@"[a-z-[djp]]", RegexOptions.None, null)] - [InlineData(@"(\w)\1+.\b", RegexOptions.None, null)] - [InlineData(@"\d{4}\b", RegexOptions.None, null)] - [InlineData(@"\d{1,2},", RegexOptions.None, null)] - [InlineData(@"(?]*", RegexOptions.None, null)] - [InlineData(@"\b\w+(?=\sis\b)", RegexOptions.None, null)] - [InlineData(@"[a-z-[m]]", RegexOptions.None, null)] - [InlineData(@"^\D\d{1,5}\D*$", RegexOptions.None, null)] - [InlineData(@"[^0-9]", RegexOptions.None, null)] - [InlineData(@"(\p{IsGreek}+(\s)?)+", RegexOptions.None, null)] - [InlineData(@"\b(\p{IsGreek}+(\s)?)+\p{Pd}\s(\p{IsBasicLatin}+(\s)?)+", RegexOptions.None, null)] - [InlineData(@"\b.*[.?!;:](\s|\z)", RegexOptions.None, null)] - [InlineData(@"^.+", RegexOptions.None, null)] - [InlineData(@"[^o]", RegexOptions.None, null)] - [InlineData(@"\bth[^o]\w+\b", RegexOptions.None, null)] - [InlineData(@"(\P{Sc})+", RegexOptions.None, null)] - [InlineData(@"[^\p{P}\d]", RegexOptions.None, null)] - [InlineData(@"\b[A-Z]\w*\b", RegexOptions.None, null)] - [InlineData(@"\S+?", RegexOptions.None, null)] - [InlineData(@"y\s", RegexOptions.None, null)] - [InlineData(@"gr[ae]y\s\S+?[\s\p{P}]", RegexOptions.None, null)] - [InlineData(@"[\s\p{P}]", RegexOptions.None, null)] - [InlineData(@"[\p{P}\d]", RegexOptions.None, null)] - [InlineData(@"[^aeiou]", RegexOptions.None, null)] - [InlineData(@"(\w)\1", RegexOptions.None, null)] - [InlineData(@"[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}] ", RegexOptions.None, null)] - [InlineData(@"[^a-zA-Z_0-9]", RegexOptions.None, null)] - [InlineData(@"\P{Nd}", RegexOptions.None, null)] - [InlineData(@"(\(?\d{3}\)?[\s-])?", RegexOptions.None, null)] - [InlineData(@"^(\(?\d{3}\)?[\s-])?\d{3}-\d{4}$", RegexOptions.None, null)] - [InlineData(@"[0-9]", RegexOptions.None, null)] - [InlineData(@"\p{Nd}", RegexOptions.None, null)] - [InlineData(@"\b(\S+)\s?", RegexOptions.None, null)] - [InlineData(@"[^ \f\n\r\t\v]", RegexOptions.None, null)] - [InlineData(@"[^\f\n\r\t\v\x85\p{Z}]", RegexOptions.None, null)] - [InlineData(@"(\s|$)", RegexOptions.None, null)] - [InlineData(@"\b\w+(e)?s(\s|$)", RegexOptions.None, null)] - [InlineData(@"[ \f\n\r\t\v]", RegexOptions.None, null)] - [InlineData(@"(\W){1,2}", RegexOptions.None, null)] - [InlineData(@"(\w+)", RegexOptions.None, null)] - [InlineData(@"\b", RegexOptions.None, null)] - [InlineData(@"\b(\w+)(\W){1,2}", RegexOptions.None, null)] - [InlineData(@"(?>(\w)\1+).\b", RegexOptions.None, null)] - [InlineData(@"(\b(\w+)\W+)+", RegexOptions.None, null)] - [InlineData(@"\p{Sc}*(\s?\d+[.,]?\d*)\p{Sc}*", RegexOptions.None, null)] - [InlineData(@"p{Sc}*(?\s?\d+[.,]?\d*)\p{Sc}*", RegexOptions.None, null)] - [InlineData(@"^(\w+\s?)+$", RegexOptions.None, null)] - [InlineData(@"(?ix) d \w+ \s", RegexOptions.None, null)] - [InlineData(@"\bthe\w*\b", RegexOptions.None, null)] - [InlineData(@"\b(?i:t)he\w*\b", RegexOptions.None, null)] - [InlineData(@"^(\w+)\s(\d+)$", RegexOptions.None, null)] - [InlineData(@"^(\w+)\s(\d+)\r*$", RegexOptions.Multiline, null)] - [InlineData(@"(?m)^(\w+)\s(\d+)\r*$", RegexOptions.Multiline, null)] - [InlineData(@"(?s)^.+", RegexOptions.None, null)] - [InlineData(@"\b(\d{2}-)*(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b", RegexOptions.None, null)] - [InlineData(@"\b\(?((\w+),?\s?)+[\.!?]\)?", RegexOptions.None, null)] - [InlineData(@"(?n)\b\(?((?>\w+),?\s?)+[\.!?]\)?", RegexOptions.None, null)] - [InlineData(@"\b\(?(?n:(?>\w+),?\s?)+[\.!?]\)?", RegexOptions.None, null)] - [InlineData(@"\b\(?((?>\w+),?\s?)+[\.!?]\)?", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData(@"(?x)\b \(? ( (?>\w+) ,?\s? )+ [\.!?] \)? # Matches an entire sentence.", RegexOptions.None, null)] - [InlineData(@"\bb\w+\s", RegexOptions.RightToLeft, null)] - [InlineData(@"(?<=\d{1,2}\s)\w+,?\s\d{4}", RegexOptions.RightToLeft, null)] - [InlineData(@"\b(\w+\s*)+", RegexOptions.ECMAScript, null)] - [InlineData(@"((a+)(\1) ?)+", RegexOptions.ECMAScript, null)] - [InlineData(@"\b(D\w+)\s(d\w+)\b", RegexOptions.None, null)] - [InlineData(@"\b(D\w+)(?ixn) \s (d\w+) \b", RegexOptions.None, null)] - [InlineData(@"\b((?# case-sensitive comparison)D\w+)\s((?#case-insensitive comparison)d\w+)\b", RegexOptions.None, null)] - [InlineData(@"\b\(?((?>\w+),?\s?)+[\.!?]\)?", RegexOptions.None, null)] - [InlineData(@"\b(?\d{2}-)*(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b", RegexOptions.None, null)] - [InlineData(@"\b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b", RegexOptions.None, null)] - [InlineData(@"\bgr(a|e)y\b", RegexOptions.None, null)] - [InlineData(@"\b91*9*\b", RegexOptions.None, null)] - [InlineData(@"\ban+\w*?\b", RegexOptions.None, null)] - [InlineData(@"\ban?\b", RegexOptions.None, null)] - [InlineData(@"\b\d+\,\d{3}\b", RegexOptions.None, null)] - [InlineData(@"\b\d{2,}\b\D+", RegexOptions.None, null)] - [InlineData(@"(00\s){2,4}", RegexOptions.None, null)] - [InlineData(@"\b\w*?oo\w*?\b", RegexOptions.None, null)] - [InlineData(@"\b\w+?\b", RegexOptions.None, null)] - [InlineData(@"^\s*(System.)??Console.Write(Line)??\(??", RegexOptions.None, null)] - [InlineData(@"(System.)??", RegexOptions.None, null)] - [InlineData(@"\b(\w{3,}?\.){2}?\w{3,}?\b", RegexOptions.None, null)] - [InlineData(@"\b[A-Z](\w*?\s*?){1,10}[.!?]", RegexOptions.None, null)] - [InlineData(@"b.*([0-9]{4})\b", RegexOptions.None, null)] - [InlineData(@"\b.*?([0-9]{4})\b", RegexOptions.None, null)] - [InlineData(@"(a?)*", RegexOptions.None, null)] - [InlineData(@"(a\1|(?(1)\1)){0,2}", RegexOptions.None, null)] - [InlineData(@"(a\1|(?(1)\1)){2}", RegexOptions.None, null)] - [InlineData(@"(?\w)\k", RegexOptions.None, null)] - [InlineData(@"(?<2>\w)\k<2>", RegexOptions.None, null)] - [InlineData(@"(?<1>a)(?<1>\1b)*", RegexOptions.None, null)] - [InlineData(@"\b(\p{Lu}{2})(\d{2})?(\p{Lu}{2})\b", RegexOptions.None, null)] - [InlineData(@"\bgr[ae]y\b", RegexOptions.None, null)] - [InlineData(@"\b((?# case sensitive comparison)D\w+)\s(?ixn)((?#case insensitive comparison)d\w+)\b", RegexOptions.None, null)] - [InlineData(@"\{\d+(,-*\d+)*(\:\w{1,4}?)*\}(?x) # Looks for a composite format item.", RegexOptions.None, null)] - [InlineData(@"cat([a-\d]*)dog", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 9)] - [InlineData(@"\k<1", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"(?')", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData(@"(?<)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] - [InlineData(@"(?imn )", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 6)] - [InlineData(@"(?imn", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?'cat'", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 7)] - [InlineData(@"(?'", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"(?'=)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 4)] - [InlineData(@"(?'!)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 4)] - [InlineData(@"[^", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] - [InlineData(@"[cat", RegexOptions.None, RegexParseError.UnterminatedBracket, 4)] - [InlineData(@"[^cat", RegexOptions.None, RegexParseError.UnterminatedBracket, 5)] - [InlineData(@"\p{cat", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 6)] - [InlineData(@"\k", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 7)] - [InlineData(@"\P{", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] - [InlineData(@"\k<>", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] - [InlineData(@"(?(", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] - [InlineData(@"(?()|", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 5)] - [InlineData(@"?(a|b)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"?((a)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"?((a)a", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"?((a)a|", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"?((a)a|b", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"?(a)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"[a", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] - [InlineData(@"?(a:b)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"(?(?", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 4)] - [InlineData(@"(?(cat", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 6)] - [InlineData(@"(?(cat)|", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 8)] - [InlineData(@"foo(?<0>bar)", RegexOptions.None, RegexParseError.CaptureGroupOfZero, 7)] - [InlineData(@"foo(?'0'bar)", RegexOptions.None, RegexParseError.CaptureGroupOfZero, 7)] - [InlineData(@"foo(?<1bar)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 7)] - [InlineData(@"foo(?'1bar)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 7)] - [InlineData(@"\p{klsak", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 8)] - [InlineData(@"(?c:cat)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"(??e:cat)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"[a-f-[]]+", RegexOptions.None, RegexParseError.UnterminatedBracket, 9)] - [InlineData(@"[A-[]+", RegexOptions.None, RegexParseError.UnterminatedBracket, 6)] - [InlineData(@"(?(?e))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?(?a)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?r:cat)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"\x2", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"(cat) (?#cat) \s+ (?#followed by 1 or more whitespace", RegexOptions.IgnorePatternWhitespace, RegexParseError.UnterminatedComment, 56)] - [InlineData(@"cat(?(?afdcat)dog)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 8)] - [InlineData(@"cat(?(?cat)dog)", RegexOptions.None, RegexParseError.AlternationHasNamedCapture, 5)] - [InlineData(@"cat(?(?'cat'cat)dog)", RegexOptions.None, RegexParseError.AlternationHasNamedCapture, 5)] - [InlineData(@"cat(?(?#COMMENT)cat)", RegexOptions.None, RegexParseError.AlternationHasComment, 5)] - [InlineData(@"cat(?<>dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 6)] - [InlineData(@"cat(?)_*>dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 9)] - [InlineData(@"cat(?)_*>dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 9)] - [InlineData(@"cat(?)_*>dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 9)] - [InlineData(@"cat(?dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 9)] - [InlineData(@"cat(?<1dog>dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 7)] - [InlineData(@"cat(?<0>dog)", RegexOptions.None, RegexParseError.CaptureGroupOfZero, 7)] - [InlineData(@"([5-\D]*)dog", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 6)] - [InlineData(@"cat([6-\s]*)dog", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 9)] - [InlineData(@"cat([c-\S]*)", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 9)] - [InlineData(@"cat([7-\w]*)", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 9)] - [InlineData(@"cat([a-\W]*)dog", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 9)] - [InlineData(@"([f-\p{Lu}]\w*)\s([\p{Lu}]\w*)", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 6)] - [InlineData(@"(cat) (?#cat) \s+ (?#followed by 1 or more whitespace", RegexOptions.None, RegexParseError.UnterminatedComment, 56)] - [InlineData(@"([1-\P{Ll}][\p{Ll}]*)\s([\P{Ll}][\p{Ll}]*)", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 6)] - [InlineData(@"[\P]", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 3)] - [InlineData(@"([\pcat])", RegexOptions.None, RegexParseError.MalformedUnicodePropertyEscape, 5)] - [InlineData(@"([\Pcat])", RegexOptions.None, RegexParseError.MalformedUnicodePropertyEscape, 5)] - [InlineData(@"(\p{", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 3)] - [InlineData(@"(\p{Ll", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 6)] - [InlineData(@"(cat)([\o]*)(dog)", RegexOptions.None, RegexParseError.UnrecognizedEscape, 9)] - [InlineData(@"[\p]", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 3)] - [InlineData(@"(?cat)\s+(?dog)\kcat", RegexOptions.None, RegexParseError.MalformedNamedReference, 28)] - [InlineData(@"(?cat)\s+(?dog)\k", RegexOptions.None, RegexParseError.UndefinedNamedReference, 33)] - [InlineData(@"(?cat)\s+(?dog)\k<8>cat", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 30)] - [InlineData(@"^[abcd]{1}?*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 12)] - [InlineData(@"^[abcd]*+$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] - [InlineData(@"^[abcd]+*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] - [InlineData(@"^[abcd]?*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] - [InlineData(@"^[abcd]*?+$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 10)] - [InlineData(@"^[abcd]+?*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 10)] - [InlineData(@"^[abcd]{1,}?*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 13)] - [InlineData(@"^[abcd]??*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 10)] - [InlineData(@"^[abcd]+{0,5}$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] - [InlineData(@"^[abcd]?{0,5}$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] - [InlineData(@"\ua", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"^[abcd]*{0,5}$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] - [InlineData(@"^[abcd]{0,16}?*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 15)] - [InlineData(@"^[abcd]{1,}*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 12)] - [InlineData(@"(?cat)\s+(?dog)\k<8>cat", RegexOptions.ECMAScript, RegexParseError.UndefinedNumberedReference, 30)] - [InlineData(@"(?cat)\s+(?dog)\k8", RegexOptions.None, RegexParseError.MalformedNamedReference, 28)] - [InlineData(@"(?cat)\s+(?dog)\k8", RegexOptions.ECMAScript, RegexParseError.MalformedNamedReference, 28)] - [InlineData(@"(cat)(\7)", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 8)] - [InlineData(@"(cat)\s+(?<2147483648>dog)", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 21)] - [InlineData(@"(cat)\s+(?<21474836481097>dog)", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 21)] - [InlineData(@"^[abcd]{1}*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 11)] - [InlineData(@"(cat)(\c*)(dog)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 9)] - [InlineData(@"(cat)(\c *)(dog)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 9)] - [InlineData(@"(cat)(\c?*)(dog)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 9)] - [InlineData(@"(cat)(\c`*)(dog)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 9)] - [InlineData(@"(cat)(\c\|*)(dog)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 11)] - [InlineData(@"^[abcd]{0,16}*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 14)] - [InlineData(@"(cat)\c", RegexOptions.None, RegexParseError.MissingControlCharacter, 7)] - // Deep recursion - [InlineData(@"((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + -"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + -"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + -"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + -"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + -"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + -"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + -"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + -"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + -"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + -"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + -"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 1183)] - // Scan control - [InlineData(@"(cat)(\\c\0*)(dog)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 9)] - [InlineData(@"(cat)(\c\[*)(dog)", RegexOptions.None, RegexParseError.UnterminatedBracket, 17)] - // Invalid grouping constructs - [InlineData(@"(?<", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"(?>-", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 4)] - // Testgroup with options - [InlineData(@"())", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 3)] - [InlineData(@"[a-z-[aeiuo]", RegexOptions.None, RegexParseError.UnterminatedBracket, 12)] - [InlineData(@"[a-z-[aeiuo", RegexOptions.None, RegexParseError.UnterminatedBracket, 11)] - [InlineData(@"[a-z-[b]", RegexOptions.None, RegexParseError.UnterminatedBracket, 8)] - [InlineData(@"[a-z-[b", RegexOptions.None, RegexParseError.UnterminatedBracket, 7)] - [InlineData(@"[b-a]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] - [InlineData(@"[a-c]{2,1}", RegexOptions.None, RegexParseError.ReversedQuantifierRange, 10)] - [InlineData(@"\d{2147483648}", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 13)] - [InlineData(@"[a-z-[b][", RegexOptions.None, RegexParseError.UnterminatedBracket, 9)] - [InlineData(@"(?()|||||)", RegexOptions.None, RegexParseError.AlternationHasTooManyConditions, 10)] - [InlineData(@"[^]", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] - [InlineData(@"??", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"(?=*)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 4)] - [InlineData(@"((((((*))))))", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 7)] - [InlineData(@"(?Pabc", RegexOptions.None, null)] + [InlineData("?", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `?` operator, nothing to make optional" + [InlineData("?|?", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("?abc", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("(?Pabc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group name. Missing `<`\n" & "(?Pabc\n" & "^" + [InlineData("(?u-q)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group flag, found -q but " & "expected one of: -i, -m, -s, -U or -u" + [InlineData("(?uq)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group flag, found q but " & "expected one of: i, m, s, U or u" + [InlineData("(+)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `+` operator, nothing to repeat" + [InlineData("(a)b)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid capturing group. " & "Found too many closing symbols" + [InlineData("(b(a)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid capturing group. " & "Found too many opening symbols" + [InlineData("[-", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("[-a", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("[[:abc:]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. `abc` is not a valid name\n" & "[[:abc:]]\n" & " ^" + [InlineData("[[:alnum:", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. Expected [:name:]\n" & "[[:alnum:\n" & " ^" + [InlineData("[[:alnum]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. Expected [:name:]\n" & "[[:alnum]]\n" & " ^" + [InlineData("[]", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("[]a", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("[]abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set. Missing `]`\n" & "[]abc\n" & "^" + [InlineData("[\\", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("[^]", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("[^]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set. Missing `]`\n" & "[^]\n" & "^" + [InlineData("[a-", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("[a-\w]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. Range can't contain " & "a character-class or assertion\n" & "[a-\\w]\n" & " ^" + [InlineData("[a", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("[abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set. Missing `]`\n" & "[abc\n" & "^" + [InlineData("[d-c]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. " & "Start must be lesser than end\n" & "[d-c]\n" & " ^" + [InlineData("[z-[:alnum:]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. " & "Start must be lesser than end\n" & "[z-[:alnum:]]\n" & " ^" + [InlineData("{10}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid repeition range, " & "nothing to repeat" + [InlineData("*", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `*` operator, nothing to repeat" + [InlineData("*abc", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("\12", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid octal literal. Expected 3 octal digits, but found 2\n" & "\\12\n" & "^" + [InlineData("\12@", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid octal literal. Expected octal digit, but found @\n" & "\\12@\n" & "^" + [InlineData("\p{11", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Expected `}`\n" & "\\p{11\n" & "^" + [InlineData("\p{11}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Expected chars in {'a'..'z', 'A'..'Z'}\n" & "\\p{11}\n" & "^" + [InlineData("\p{Bb}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found Bb\n" & "\\p{Bb}\n" & "^" + [InlineData("\p11", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found 1\n" & "\\p11\n" & "^" + [InlineData("\pB", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found B\n" & "\\pB\n" & "^" + [InlineData("\u123", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected 4 hex digits, but found 3\n" & "\\u123\n" & "^" + [InlineData("\U123", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected 8 hex digits, but found 3\n" & "\\U123\n" & "^" + [InlineData("\U123@a", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\U123@a\n" & "^" + [InlineData("\u123@abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\u123@abc\n" & "^" + [InlineData("\UFFFFFFFF", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. FFFFFFFF value is too big\n" & "\\UFFFFFFFF\n" & "^" + [InlineData("\x{00000000A}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected at most 8 chars, found 9\n" & "\\x{00000000A}\n" & "^" + [InlineData("\x{2f894", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected `}`\n" & "\\x{2f894\n" & "^" + [InlineData("\x{61@}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\x{61@}\n" & " ^" + [InlineData("\x{FFFFFFFF}", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("+", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("+abc", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("a???", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("a??*", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("a??+", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("a?*", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("a?+", RegexOptions.None, (RegexParseError)9999, -1)] + [InlineData("a(?P<>abc)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group name. Name can't be empty\n" & "a(?P<>abc)\n" & " ^" + [InlineData("a(?P`\n" & "abc(?Pabc", RegexOptions.None, null) [InlineData(@"(\b)", RegexOptions.None, null)] [InlineData(@"[a-\b]", RegexOptions.None, null)] + [InlineData(@"\b?", RegexOptions.None, null)] [InlineData(@"\b*", RegexOptions.None, null)] [InlineData(@"\b+", RegexOptions.None, null)] - [InlineData(@"\b?", RegexOptions.None, null)] [InlineData(@"\x{7fffffff}", RegexOptions.None, null)] - [InlineData(@"a{1,101}", RegexOptions.None, null)] [InlineData(@"a{1,}?", RegexOptions.None, null)] + [InlineData(@"a{1,101}", RegexOptions.None, null)] [InlineData(@"a{1}?", RegexOptions.None, null)] - [InlineData(@"(+)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `+` operator, nothing to repeat" - [InlineData(@"(?Pabc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group name. Missing `<`\n" & "(?Pabc\n" & "^" - [InlineData(@"(?u-q)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group flag, found -q but " & "expected one of: -i, -m, -s, -U or -u" - [InlineData(@"(?uq)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group flag, found q but " & "expected one of: i, m, s, U or u" - [InlineData(@"(a)b)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid capturing group. " & "Found too many closing symbols" - [InlineData(@"(b(a)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid capturing group. " & "Found too many opening symbols" - [InlineData(@"*", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `*` operator, nothing to repeat" - [InlineData(@"?", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `?` operator, nothing to make optional" - [InlineData(@"[[:abc:]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. `abc` is not a valid name\n" & "[[:abc:]]\n" & " ^" - [InlineData(@"[[:alnum:", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. Expected [:name:]\n" & "[[:alnum:\n" & " ^" - [InlineData(@"[[:alnum]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. Expected [:name:]\n" & "[[:alnum]]\n" & " ^" - [InlineData(@"[]abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set. Missing `]`\n" & "[]abc\n" & "^" - [InlineData(@"[a-\w]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. Range can't contain " & "a character-class or assertion\n" & "[a-\\w]\n" & " ^" - [InlineData(@"[abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set. Missing `]`\n" & "[abc\n" & "^" - [InlineData(@"[d-c]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. " & "Start must be lesser than end\n" & "[d-c]\n" & " ^" - [InlineData(@"[z-[:alnum:]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. " & "Start must be lesser than end\n" & "[z-[:alnum:]]\n" & " ^" - [InlineData(@"\12", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid octal literal. Expected 3 octal digits, but found 2\n" & "\\12\n" & "^" - [InlineData(@"\12@", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid octal literal. Expected octal digit, but found @\n" & "\\12@\n" & "^" - [InlineData(@"\p11", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found 1\n" & "\\p11\n" & "^" - [InlineData(@"\pB", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found B\n" & "\\pB\n" & "^" - [InlineData(@"\p{11", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Expected `}`\n" & "\\p{11\n" & "^" - [InlineData(@"\p{11}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Expected chars in {'a'..'z', 'A'..'Z'}\n" & "\\p{11}\n" & "^" - [InlineData(@"\p{Bb}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found Bb\n" & "\\p{Bb}\n" & "^" - [InlineData(@"\u123", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected 4 hex digits, but found 3\n" & "\\u123\n" & "^" - [InlineData(@"\U123", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected 8 hex digits, but found 3\n" & "\\U123\n" & "^" - [InlineData(@"\U123@a", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\U123@a\n" & "^" - [InlineData(@"\u123@abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\u123@abc\n" & "^" - [InlineData(@"\UFFFFFFFF", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. FFFFFFFF value is too big\n" & "\\UFFFFFFFF\n" & "^" - [InlineData(@"\x{00000000A}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected at most 8 chars, found 9\n" & "\\x{00000000A}\n" & "^" - [InlineData(@"\x{2f894", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected `}`\n" & "\\x{2f894\n" & "^" - [InlineData(@"\x{61@}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\x{61@}\n" & " ^" - [InlineData(@"a(?P<>abc)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group name. Name can't be empty\n" & "a(?P<>abc)\n" & " ^" - [InlineData(@"a(?P`\n" & "abc(?P new Regex(pattern, options)); + Throws(pattern, options, error.Value, offset, () => new Regex(pattern, options)); return; } Assert.Equal(-1, offset); + LogActual(pattern, options, RegexParseError.Unknown, -1); // Nothing to assert here without having access to internals. new Regex(pattern, options); // Does not throw @@ -833,6 +149,16 @@ private static void Parse(string pattern, RegexOptions options, RegexParseError? ParsePatternFragments(pattern, options); } + private static void LogActual(string pattern, RegexOptions options, RegexParseError error, int offset) + { + // [InlineData(@"[a-z-[b", RegexOptions.None, RegexParseError.UnterminatedBracket, 7)] + string s = (error == RegexParseError.Unknown) ? + @$" [InlineData(@""{pattern}"", RegexOptions.{options.ToString()}, null)]" : + @$" [InlineData(@""{pattern}"", RegexOptions.{options.ToString()}, RegexParseError.{error.ToString()}, {offset})]"; + + File.AppendAllText(@"/tmp/out.cs", s + "\n"); // for updating baseline + } + private static void ParsePatternFragments(string pattern, RegexOptions options) { // Trim the input in various places and parse. @@ -862,7 +188,7 @@ private static void ParsePatternFragments(string pattern, RegexOptions options) /// /// The expected parse error /// The action to invoke. - static partial void Throws(string pattern, RegexParseError error, int offset, Action action); + static partial void Throws(string pattern, RegexOptions options, RegexParseError error, int offset, Action action); /// /// Checks that action succeeds or throws either a RegexParseException or an ArgumentException depending on the diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs index 749046119ace98..27ce3c4a20cad1 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs @@ -10,124 +10,10 @@ namespace System.Text.RegularExpressions.Tests { public partial class RegexParserTests { - [Theory] - - // Avoid OutOfMemoryException - [InlineData("a{2147483647}", RegexOptions.None, null)] - [InlineData("a{2147483647,}", RegexOptions.None, null)] - - [InlineData(@"(?(?N))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?(?i))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?(?I))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?(?M))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?(?s))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?(?S))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?(?x))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?(?X))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?(?n))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"(?(?m))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData("(?<-", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData("(?<-", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"^[^<>]*(((?'Open'<)[^<>]*)+((?'Close-Open'>)[^<>]*)+)*(?(Open)(?!))$", RegexOptions.None, null)] - [InlineData(@"((?'Close-Open'>)[^<>]*)+", RegexOptions.None, RegexParseError.UndefinedNamedReference, 14)] - [InlineData(@"(((?'Open'<)[^<>]*)+((?'Close-Open'>)[^<>]*)+)*", RegexOptions.None, null)] - [InlineData(@"(?'Close-Open'>)", RegexOptions.None, RegexParseError.UndefinedNamedReference, 13)] - [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?)()(?<-0>)(?<-1>)(?<-2>)(?<-3>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 34)] - [InlineData("()(?)(?<-0>)(?<-1>)(?<-2>)(?<-3>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 34)] - [InlineData("()()(?<-0>)(?<-1>)(?<-2>)(?<-3>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 30)] - [InlineData("(?)(?)(?<-1>)(?<-2>)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?<-4>)(?<4>)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?<4>)(?<-4>)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?)(?<-a>)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?<-a>)(?)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 7)] - [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 6)] - [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 5)] - [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 5)] - [InlineData("(?<-1>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 5)] - [InlineData("()(?<-1>)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?<-1>)()", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?<-00>)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?)(?)(?<-0>)(?<-1>)(?<-2>)(?<-3>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 38)] - [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)()()", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 26)] - [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)()(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 19)] - [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)()(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 26)] - [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)(?)()", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 26)] - [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)(?)(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 19)] - [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)(?)(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 26)] - [InlineData("(?)(?)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?)(?<-a>)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?<-0>)", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?<-0 >)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 5)] - [InlineData("(?<- 0 >)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 4)] - [InlineData("(?<- 0>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 4)] - [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 6)] - [InlineData("(?'-0')", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?'a-0')", RegexOptions.IgnorePatternWhitespace, null)] - [InlineData("(?<-0", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData("(?<-0)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 5)] - [InlineData("(?<-0>", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 6)] - [InlineData(@"(?cat)\w+(?dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 21)] - [InlineData(@"(?cat)\w+(?dog)", RegexOptions.None, RegexParseError.UndefinedNamedReference, 27)] - [InlineData(@"(?cat)\w+(?dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 22)] - [InlineData(@"(?cat)\w+(?dog)", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 23)] - [InlineData(@"cat(?<->dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 7)] - [InlineData("a{2147483648}", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 12)] - [InlineData("a{2147483648,}", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 12)] - [InlineData("a{0,2147483647}", RegexOptions.None, null)] - [InlineData("a{0,2147483648}", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 14)] - // Surrogate pair which is parsed as [char,char-char,char] as we operate on UTF-16 code units. - [InlineData("[\uD82F\uDCA0-\uD82F\uDCA3]", RegexOptions.IgnoreCase, RegexParseError.ReversedCharacterRange, 5)] - - // Following are borrowed from Rust regex tests ============ - // https://github.com/rust-lang/regex/blob/master/tests/noparse.rs - [InlineData(@"*", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"[A-", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] - [InlineData(@"[A", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] - [InlineData(@"[\A]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 3)] - [InlineData(@"[\z]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 3)] - [InlineData(@"(", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 1)] - [InlineData(@")", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 1)] - [InlineData(@"[a-Z]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] - [InlineData(@"(?P<>a)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"(?P)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"(?a)a", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"a{2,1}", RegexOptions.None, RegexParseError.ReversedQuantifierRange, 6)] - [InlineData(@"(?", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 2)] - [InlineData(@"\8", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 2)] - [InlineData(@"\xG0", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] - [InlineData(@"\xF", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] - [InlineData(@"\x{fffg}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] - [InlineData(@"(?a)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"(?)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] - [InlineData(@"(?P.)(?P.)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"[a-\A]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 5)] - [InlineData(@"[a-\z]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 5)] - [InlineData(@"[a-\b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] - [InlineData(@"[a-\-]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] - [InlineData(@"[a-\-b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] - [InlineData(@"[a-\-\-b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] - [InlineData(@"[a-\-\D]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] - [InlineData(@"[a-\-\-\D]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] - [InlineData(@"[a -\-\b]", RegexOptions.None, null)] - [InlineData(@"[\b]", RegexOptions.None, null)] // errors in rust: class_no_boundary - [InlineData(@"a{10000000}", RegexOptions.None, null)] // errors in rust: too_big - [InlineData(@"a{1001", RegexOptions.None, null)] // errors in rust: counted_no_close - [InlineData(@"a{-1,1}", RegexOptions.None, null)] // errors in rust: counted_nonnegative - [InlineData(@"\\", RegexOptions.None, null)] // errors in rust: unfinished_escape - [InlineData(@"(?-i-i)", RegexOptions.None, null)] // errors in rust: double_neg - [InlineData(@"(?i-)", RegexOptions.None, null)] // errors in rust: neg_empty - [InlineData(@"[a-[:lower:]]", RegexOptions.None, null)] // errors in rust: range_end_no_class + // End of Rust parser tests ============== - [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)] + public void Parse_Netcoreapp(string pattern, RegexOptions options, RegexParseError? error, int offset = -1) { Parse(pattern, options, error, offset); @@ -151,23 +37,13 @@ public void RegexParseException_Serializes() Assert.Equal(e.Message, e2.Message); } - static void LogActual(string pattern, RegexParseError error, int offset) - { - // [InlineData(@"[a-z-[b", RegexOptions.None, RegexParseError.UnterminatedBracket, 7)] - string s = (error == RegexParseError.Unknown) ? - @$" [InlineData(@""{pattern}"", RegexOptions.None, null)]\n" : - @$" [InlineData(@""{pattern}"", RegexOptions.None, {error.ToString()}, {offset})]\n"; - - // File.AppendAllText(@"/tmp/out.cs", s); // for updating baseline - } - /// /// Checks if action throws either a RegexParseException or an ArgumentException depending on the /// environment and the supplied error. /// /// The expected parse error /// The action to invoke. - static partial void Throws(string pattern, RegexParseError error, int offset, Action action) + static partial void Throws(string pattern, RegexOptions options, RegexParseError error, int offset, Action action) { try { @@ -181,11 +57,11 @@ static partial void Throws(string pattern, RegexParseError error, int offset, Ac if (error == regexParseError) { Assert.Equal(offset, e.Offset); - LogActual(pattern, regexParseError, e.Offset); + LogActual(pattern, options, regexParseError, e.Offset); return; } - LogActual(pattern, regexParseError, e.Offset); + LogActual(pattern, options, regexParseError, e.Offset); throw new XunitException($"Expected RegexParseException with error {error} offset {offset} -> Actual error: {regexParseError} offset {e.Offset})"); } catch (Exception e) @@ -193,7 +69,7 @@ static partial void Throws(string pattern, RegexParseError error, int offset, Ac throw new XunitException($"Expected RegexParseException for pattern '{pattern}' -> Actual: ({e})"); } - LogActual(pattern, RegexParseError.Unknown, -1); + LogActual(pattern, options, RegexParseError.Unknown, -1); throw new XunitException($"Expected RegexParseException with error: ({error}) -> Actual: No exception thrown"); } diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netfx.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netfx.cs index e70d29a8dd388f..b7b3d56505a3ca 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netfx.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netfx.cs @@ -16,7 +16,7 @@ public partial class RegexParserTests /// /// The expected parse error /// The action to invoke. - static partial void Throws(RegexParseError error, int offset, Action action) + static partial void Throws(string pattern, RegexOptions options, RegexParseError error, int offset, Action action) { try { From 9baa06ca35008d6462c62b33952704093e8d01bd Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Sat, 27 Nov 2021 03:27:29 +0000 Subject: [PATCH 3/7] Nim tests --- .../tests/RegexParserTests.cs | 812 +++++++++++++++--- .../tests/RegexParserTests.netcoreapp.cs | 229 ++++- 2 files changed, 922 insertions(+), 119 deletions(-) diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs index 67182a1e9af147..efa3f84192591d 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs @@ -11,125 +11,704 @@ namespace System.Text.RegularExpressions.Tests public partial class RegexParserTests { [Theory] - [InlineData("?", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `?` operator, nothing to make optional" - [InlineData("?|?", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("?abc", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("(?Pabc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group name. Missing `<`\n" & "(?Pabc\n" & "^" - [InlineData("(?u-q)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group flag, found -q but " & "expected one of: -i, -m, -s, -U or -u" - [InlineData("(?uq)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group flag, found q but " & "expected one of: i, m, s, U or u" - [InlineData("(+)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `+` operator, nothing to repeat" - [InlineData("(a)b)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid capturing group. " & "Found too many closing symbols" - [InlineData("(b(a)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid capturing group. " & "Found too many opening symbols" - [InlineData("[-", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("[-a", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("[[:abc:]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. `abc` is not a valid name\n" & "[[:abc:]]\n" & " ^" - [InlineData("[[:alnum:", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. Expected [:name:]\n" & "[[:alnum:\n" & " ^" - [InlineData("[[:alnum]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid ascii set. Expected [:name:]\n" & "[[:alnum]]\n" & " ^" - [InlineData("[]", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("[]a", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("[]abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set. Missing `]`\n" & "[]abc\n" & "^" - [InlineData("[\\", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("[^]", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("[^]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set. Missing `]`\n" & "[^]\n" & "^" - [InlineData("[a-", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("[a-\w]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. Range can't contain " & "a character-class or assertion\n" & "[a-\\w]\n" & " ^" - [InlineData("[a", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("[abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set. Missing `]`\n" & "[abc\n" & "^" - [InlineData("[d-c]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. " & "Start must be lesser than end\n" & "[d-c]\n" & " ^" - [InlineData("[z-[:alnum:]]", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid set range. " & "Start must be lesser than end\n" & "[z-[:alnum:]]\n" & " ^" - [InlineData("{10}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid repeition range, " & "nothing to repeat" - [InlineData("*", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid `*` operator, nothing to repeat" - [InlineData("*abc", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("\12", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid octal literal. Expected 3 octal digits, but found 2\n" & "\\12\n" & "^" - [InlineData("\12@", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid octal literal. Expected octal digit, but found @\n" & "\\12@\n" & "^" - [InlineData("\p{11", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Expected `}`\n" & "\\p{11\n" & "^" - [InlineData("\p{11}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Expected chars in {'a'..'z', 'A'..'Z'}\n" & "\\p{11}\n" & "^" - [InlineData("\p{Bb}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found Bb\n" & "\\p{Bb}\n" & "^" - [InlineData("\p11", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found 1\n" & "\\p11\n" & "^" - [InlineData("\pB", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode name. Found B\n" & "\\pB\n" & "^" - [InlineData("\u123", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected 4 hex digits, but found 3\n" & "\\u123\n" & "^" - [InlineData("\U123", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected 8 hex digits, but found 3\n" & "\\U123\n" & "^" - [InlineData("\U123@a", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\U123@a\n" & "^" - [InlineData("\u123@abc", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\u123@abc\n" & "^" - [InlineData("\UFFFFFFFF", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. FFFFFFFF value is too big\n" & "\\UFFFFFFFF\n" & "^" - [InlineData("\x{00000000A}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected at most 8 chars, found 9\n" & "\\x{00000000A}\n" & "^" - [InlineData("\x{2f894", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected `}`\n" & "\\x{2f894\n" & "^" - [InlineData("\x{61@}", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid unicode literal. Expected hex digit, but found @\n" & "\\x{61@}\n" & " ^" - [InlineData("\x{FFFFFFFF}", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("+", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("+abc", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("a???", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("a??*", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("a??+", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("a?*", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("a?+", RegexOptions.None, (RegexParseError)9999, -1)] - [InlineData("a(?P<>abc)", RegexOptions.None, (RegexParseError)9999, -1)] // "Invalid group name. Name can't be empty\n" & "a(?P<>abc)\n" & " ^" - [InlineData("a(?P`\n" & "abc(?Pabc", RegexOptions.None, null) - [InlineData(@"(\b)", RegexOptions.None, null)] - [InlineData(@"[a-\b]", RegexOptions.None, null)] - [InlineData(@"\b?", RegexOptions.None, null)] - [InlineData(@"\b*", RegexOptions.None, null)] - [InlineData(@"\b+", RegexOptions.None, null)] - [InlineData(@"\x{7fffffff}", RegexOptions.None, null)] - [InlineData(@"a{1,}?", RegexOptions.None, null)] - [InlineData(@"a{1,101}", RegexOptions.None, null)] - [InlineData(@"a{1}?", RegexOptions.None, null)] - + // Basic + [InlineData("", RegexOptions.None, null)] + [InlineData(" ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(" ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?#)", RegexOptions.None, null)] + [InlineData("(?# )", RegexOptions.None, null)] + [InlineData("(?#", RegexOptions.None, RegexParseError.UnterminatedComment, 3)] + [InlineData("(?# ", RegexOptions.None, RegexParseError.UnterminatedComment, 4)] + [InlineData("(?#)(?#)", RegexOptions.None, null)] + [InlineData("(?#)(?#)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?#) (?#)", RegexOptions.None, null)] + [InlineData("(?#) (?#)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"[a\p{Lu}(?#)b]", RegexOptions.None, null)] + [InlineData(@"[a\0(?#)b]", RegexOptions.None, null)] + [InlineData(@"[a\a(?#)b]", RegexOptions.None, null)] + [InlineData(@"[a\x00(?#)b]", RegexOptions.None, null)] + [InlineData(@"[a\u0000(?#)b]", RegexOptions.None, null)] + [InlineData(@"[a\](?#)b]", RegexOptions.None, null)] + [InlineData("(?", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 2)] + [InlineData("(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 2)] + [InlineData("(? ", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData("(? ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData("(?i)", RegexOptions.None, null)] + [InlineData("(?im)", RegexOptions.None, null)] + [InlineData("(?im-x)", RegexOptions.None, null)] + [InlineData("(?im-x+n)", RegexOptions.None, null)] + [InlineData("(?i) ", RegexOptions.None, null)] + [InlineData("(?x) ", RegexOptions.None, null)] + [InlineData(" (?x) ", RegexOptions.None, null)] + [InlineData(" (?-x) ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(" ( (?-x) ) ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(" (?-x:) ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(" (?-x: ) ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(" (?-x: (?+x: ) ) ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?-x", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 4)] + [InlineData("(?-x ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData("(?-x :", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData("(?-x )", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData("(?-x :)", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(")", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 1)] + [InlineData("a", RegexOptions.None, null)] + [InlineData("ab", RegexOptions.None, null)] + [InlineData("a*", RegexOptions.None, null)] + [InlineData("a*?", RegexOptions.None, null)] + [InlineData("a+", RegexOptions.None, null)] + [InlineData("a+?", RegexOptions.None, null)] + [InlineData("a?", RegexOptions.None, null)] + [InlineData("a??", RegexOptions.None, null)] + [InlineData("()", RegexOptions.None, null)] + [InlineData("(a)", RegexOptions.None, null)] + [InlineData("(", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 1)] + [InlineData("(a", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 2)] + [InlineData("|", RegexOptions.None, null)] + [InlineData(" |", RegexOptions.None, null)] + [InlineData("| ", RegexOptions.None, null)] + [InlineData(" | ", RegexOptions.None, null)] + [InlineData("|", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(" |", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("| ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(" | ", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("||", RegexOptions.None, null)] + [InlineData("(|)", RegexOptions.None, null)] + [InlineData("a{0}", RegexOptions.None, null)] + [InlineData("a{0,}", RegexOptions.None, null)] + [InlineData("a{0,1}", RegexOptions.None, null)] + [InlineData("a{1,0}", RegexOptions.None, RegexParseError.ReversedQuantifierRange, 6)] + [InlineData("a{0}?", RegexOptions.None, null)] + [InlineData("a{0,}?", RegexOptions.None, null)] + [InlineData("a{0,1}?", RegexOptions.None, null)] + [InlineData("a{", RegexOptions.None, null)] + [InlineData("a{0", RegexOptions.None, null)] + [InlineData("a{0,", RegexOptions.None, null)] + [InlineData("a{0,1", RegexOptions.None, null)] + [InlineData("a{0 }", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("a{0, }", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("a{0 ,}", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("a{0 ,1}", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("a{0, 1}", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("a{0,1 }", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("a* ?", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("a* ?", RegexOptions.None, null)] + [InlineData("*", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData("(*)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] + [InlineData("a**", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] + [InlineData("+", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData("(+)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] + [InlineData("a*+", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] + [InlineData("?", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData("(?)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] + [InlineData("a*??", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)] + [InlineData("{0}", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData("({0})", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] + [InlineData("a*{0}", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] + [InlineData("{0", RegexOptions.None, null)] + [InlineData("({0)", RegexOptions.None, null)] + [InlineData("a*{0", RegexOptions.None, null)] + [InlineData(@"\w", RegexOptions.None, null)] + [InlineData(@"\b\B\A\G\Z\z\w\W\s\W\s\S\d\D", RegexOptions.None, null)] + [InlineData(@"\c", RegexOptions.None, RegexParseError.MissingControlCharacter, 2)] + [InlineData(@"\c<", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] + [InlineData(@"\ca", RegexOptions.None, null)] + [InlineData(@"\cA", RegexOptions.None, null)] + [InlineData(@"\c A", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] + [InlineData(@"\c(a)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] + [InlineData(@"\c>", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] + [InlineData(@"\c?", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] + [InlineData(@"\c@", RegexOptions.None, null)] + [InlineData(@"\c^", RegexOptions.None, null)] + [InlineData(@"\c_", RegexOptions.None, null)] + [InlineData(@"\c`", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] + [InlineData(@"\c{", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 3)] + [InlineData(@"\cz", RegexOptions.None, null)] + [InlineData(@"\cZ", RegexOptions.None, null)] + [InlineData(@"\m", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\x", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\x ", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\x0", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\x0 ", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 4)] + [InlineData(@"\x00", RegexOptions.None, null)] + [InlineData(@"\x00 ", RegexOptions.None, null)] + [InlineData(@"\x000", RegexOptions.None, null)] + [InlineData(@"\xff", RegexOptions.None, null)] + [InlineData(@"\xFF", RegexOptions.None, null)] + [InlineData(@"\xfF", RegexOptions.None, null)] + [InlineData(@"\xfff", RegexOptions.None, null)] + [InlineData(@"\xgg", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"\m ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\u", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\u0", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\u00", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\u000", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\u0000", RegexOptions.None, null)] + [InlineData(@"\u0000 ", RegexOptions.None, null)] + [InlineData(@"\u ", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\u0 ", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\ugggg", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"\0", RegexOptions.None, null)] + [InlineData(@"\0 ", RegexOptions.None, null)] + [InlineData(@"\00", RegexOptions.None, null)] + [InlineData(@"\00 ", RegexOptions.None, null)] + [InlineData(@"\000", RegexOptions.None, null)] + [InlineData(@"\000 ", RegexOptions.None, null)] + [InlineData(@"\0000", RegexOptions.None, null)] + [InlineData(@"\0000 ", RegexOptions.None, null)] + [InlineData(@"\7", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 2)] + [InlineData(@"\78", RegexOptions.None, null)] + [InlineData(@"\8", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 2)] + [InlineData(@"\40", RegexOptions.ECMAScript, null)] + [InlineData(@"\401", RegexOptions.ECMAScript, null)] + [InlineData(@"\37", RegexOptions.ECMAScript, null)] + [InlineData(@"\371", RegexOptions.ECMAScript, null)] + [InlineData(@"\0000", RegexOptions.ECMAScript, null)] + [InlineData(@"\k", RegexOptions.None, RegexParseError.MalformedNamedReference, 1)] + [InlineData(@"\k ", RegexOptions.None, RegexParseError.MalformedNamedReference, 3)] + [InlineData(@"\k<", RegexOptions.None, RegexParseError.MalformedNamedReference, 3)] + [InlineData(@"\k< ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\k<0", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\k<0 ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\k<0>", RegexOptions.None, null)] + [InlineData(@"\k<0> ", RegexOptions.None, null)] + [InlineData(@"\k<00> ", RegexOptions.None, null)] + [InlineData(@"\k ", RegexOptions.None, RegexParseError.UndefinedNamedReference, 5)] + [InlineData(@"(?)\k ", RegexOptions.None, null)] + [InlineData(@"\k", RegexOptions.ECMAScript, RegexParseError.MalformedNamedReference, 1)] + [InlineData(@"\k ", RegexOptions.ECMAScript, RegexParseError.MalformedNamedReference, 3)] + [InlineData(@"\k<", RegexOptions.ECMAScript, RegexParseError.MalformedNamedReference, 3)] + [InlineData(@"\k< ", RegexOptions.ECMAScript, null)] + [InlineData(@"\k<0", RegexOptions.ECMAScript, null)] + [InlineData(@"\k<0 ", RegexOptions.ECMAScript, null)] + [InlineData(@"\k<0>", RegexOptions.ECMAScript, null)] + [InlineData(@"\k<0> ", RegexOptions.ECMAScript, null)] + [InlineData(@"\k'", RegexOptions.None, RegexParseError.MalformedNamedReference, 3)] + [InlineData(@"\k' ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\k'0", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\k'0 ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\k'0'", RegexOptions.None, null)] + [InlineData(@"\k'0' ", RegexOptions.None, null)] + [InlineData(@"\k'00' ", RegexOptions.None, null)] + [InlineData(@"\k'a' ", RegexOptions.None, RegexParseError.UndefinedNamedReference, 5)] + [InlineData(@"(?)\k'a' ", RegexOptions.None, null)] + [InlineData(@"\k<0' ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\k'0> ", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\", RegexOptions.None, RegexParseError.UnescapedEndingBackslash, 1)] + [InlineData(@"\ ", RegexOptions.None, null)] + [InlineData(@"\<", RegexOptions.None, null)] + [InlineData(@"\< ", RegexOptions.None, null)] + [InlineData(@"\<0", RegexOptions.None, null)] + [InlineData(@"\<0 ", RegexOptions.None, null)] + [InlineData(@"\<0>", RegexOptions.None, null)] + [InlineData(@"\<0> ", RegexOptions.None, null)] + [InlineData(@"\<00> ", RegexOptions.None, null)] + [InlineData(@"\ ", RegexOptions.None, RegexParseError.UndefinedNamedReference, 4)] + [InlineData(@"(?)\ ", RegexOptions.None, null)] + [InlineData(@"\", RegexOptions.ECMAScript, RegexParseError.UnescapedEndingBackslash, 1)] + [InlineData(@"\ ", RegexOptions.ECMAScript, null)] + [InlineData(@"\<", RegexOptions.ECMAScript, null)] + [InlineData(@"\< ", RegexOptions.ECMAScript, null)] + [InlineData(@"\<0", RegexOptions.ECMAScript, null)] + [InlineData(@"\<0 ", RegexOptions.ECMAScript, null)] + [InlineData(@"\<0>", RegexOptions.ECMAScript, null)] + [InlineData(@"\<0> ", RegexOptions.ECMAScript, null)] + [InlineData(@"\'", RegexOptions.None, null)] + [InlineData(@"\' ", RegexOptions.None, null)] + [InlineData(@"\'0", RegexOptions.None, null)] + [InlineData(@"\'0 ", RegexOptions.None, null)] + [InlineData(@"\'0'", RegexOptions.None, null)] + [InlineData(@"\'0' ", RegexOptions.None, null)] + [InlineData(@"\'00' ", RegexOptions.None, null)] + [InlineData(@"\'a' ", RegexOptions.None, RegexParseError.UndefinedNamedReference, 4)] + [InlineData(@"(?)\'a' ", RegexOptions.None, null)] + [InlineData(@"\<0' ", RegexOptions.None, null)] + [InlineData(@"\'0> ", RegexOptions.None, null)] + [InlineData("\\p{Cc}", RegexOptions.None, null)] + [InlineData("\\p{ Cc }", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 4)] + [InlineData("\\p{ Cc }", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidUnicodePropertyEscape, 4)] + [InlineData("\\p {Cc}", RegexOptions.IgnorePatternWhitespace, RegexParseError.MalformedUnicodePropertyEscape, 3)] + [InlineData("\\p{xxx}", RegexOptions.None, RegexParseError.UnrecognizedUnicodeProperty, 7)] + [InlineData("\\p", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] + [InlineData("\\p{", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] + [InlineData("\\p{}", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] + [InlineData("\\p{} ", RegexOptions.None, RegexParseError.UnrecognizedUnicodeProperty, 4)] + [InlineData("\\p {} ", RegexOptions.None, RegexParseError.MalformedUnicodePropertyEscape, 3)] + [InlineData("\\p{Cc ", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 6)] + [InlineData("\\p{IsArabicPresentationForms-A}", RegexOptions.None, null)] + [InlineData("(?:)", RegexOptions.None, null)] + [InlineData("(?:a)", RegexOptions.None, null)] + [InlineData("(?:", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] + [InlineData("(?: ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] + [InlineData("(?=)", RegexOptions.None, null)] + [InlineData("(?=a)", RegexOptions.None, null)] + [InlineData("(?=", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] + [InlineData("(?= ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] + [InlineData("(?!)", RegexOptions.None, null)] + [InlineData("(?!a)", RegexOptions.None, null)] + [InlineData("(?!", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] + [InlineData("(?! ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] + [InlineData("(?>)", RegexOptions.None, null)] + [InlineData("(?>a)", RegexOptions.None, null)] + [InlineData("(?>", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] + [InlineData("(?> ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 4)] + [InlineData("(?<=)", RegexOptions.None, null)] + [InlineData("(?<=a)", RegexOptions.None, null)] + [InlineData("(?<=", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 4)] + [InlineData("(?<= ", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] + [InlineData("(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData("(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] + [InlineData("(?a", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 6)] + [InlineData("(?a)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 4)] + [InlineData("(?a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 4)] + [InlineData("(?< a>a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData("(?< a>a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData("(?< a >a)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData("(?< a >a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData("(?a)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?<0>a)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupOfZero, 4)] + [InlineData("(?<1>a)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?<10>a)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?<1>)", RegexOptions.None, null)] + [InlineData("(?<1> )", RegexOptions.None, null)] + [InlineData("(?<1> )", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?'a')", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?(", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 3)] + [InlineData("(?(0", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasMalformedReference, 4)] + [InlineData("(?(0)", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 5)] + [InlineData("(?(0))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?(0)a)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?(0)a|)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?(0)a|b)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?(0)a|b|)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasTooManyConditions, 10)] + [InlineData("(?(0)a|b|c)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasTooManyConditions, 11)] + [InlineData("(?(0 )", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasMalformedReference, 5)] + [InlineData("(?(1))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasUndefinedReference, 5)] + [InlineData("(?(00))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?(a))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?)(?(a))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?)(?(a ))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?)(?( a))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?(()a()))", RegexOptions.None, null)] + [InlineData("(?((?)a(?)))", RegexOptions.None, null)] + [InlineData("(?(?'", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] + [InlineData("(?(?'x'))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] + [InlineData("(?(?#", RegexOptions.IgnorePatternWhitespace, RegexParseError.UnterminatedComment, 5)] + [InlineData("(?(?#)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasComment, 2)] + [InlineData("(?(?#))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasComment, 2)] + [InlineData("(?(?<", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData("(?(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] + [InlineData("(?(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] + [InlineData("(?(?))", RegexOptions.IgnorePatternWhitespace, RegexParseError.AlternationHasNamedCapture, 2)] + [InlineData("(?(?<=))", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?(?]", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 4)] + [InlineData(@"[\c>-\c<]", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 4)] + [InlineData(@"[\c>-a]", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 4)] + [InlineData(@"[a-\c>]", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 6)] + [InlineData(@"[a--]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] + [InlineData(@"[--a]", RegexOptions.None, null)] + [InlineData(@"[\--a]", RegexOptions.None, null)] + [InlineData(@"[\0-\1]", RegexOptions.None, null)] + [InlineData(@"[\1-\0]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 6)] + [InlineData(@"[\0-\01]", RegexOptions.None, null)] + [InlineData(@"[\01-\0]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] + [InlineData(@"[[:x:]-a]", RegexOptions.None, null)] + [InlineData(@"[a-[:x:]]", RegexOptions.None, null)] + [InlineData(@"[\0-\ca]", RegexOptions.None, null)] + [InlineData(@"[\ca-\0]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] + [InlineData(@"[\ca-\cA]", RegexOptions.None, null)] + [InlineData(@"[\cA-\ca]", RegexOptions.None, null)] + [InlineData(@"[\u0-\u1]", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 5)] + [InlineData(@"[\u1-\u0]", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 5)] + [InlineData(@"[\u0000-\u0000]", RegexOptions.None, null)] + [InlineData(@"[\u0000-\u0001]", RegexOptions.None, null)] + [InlineData(@"[\u0001-\u0000]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 14)] + [InlineData(@"[\u0001-a]", RegexOptions.None, null)] + [InlineData(@"[a-\u0001]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 9)] + [InlineData(@"[a-a]", RegexOptions.None, null)] + [InlineData(@"[a-A]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] + [InlineData(@"[A-a]", RegexOptions.None, null)] + [InlineData(@"[a-a]", RegexOptions.IgnoreCase, null)] + [InlineData(@"[a-A]", RegexOptions.IgnoreCase, RegexParseError.ReversedCharacterRange, 4)] + [InlineData(@"[A-a]", RegexOptions.IgnoreCase, null)] + [InlineData(@"[a-\x61]", RegexOptions.None, null)] + [InlineData(@"[\x61-a]", RegexOptions.None, null)] + [InlineData(@"[a-\x60]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] + [InlineData(@"[\x62-a]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] + [InlineData(@"[a-\x62]", RegexOptions.None, null)] + [InlineData(@"[\3-\cc]", RegexOptions.None, null)] + [InlineData(@"[\cc-\3]", RegexOptions.None, null)] + [InlineData(@"[\2-\cc]", RegexOptions.None, null)] + [InlineData(@"[\cc-\2]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] + [InlineData(@"[\4-\cc]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 7)] + [InlineData(@"[\cc-\4]", RegexOptions.None, null)] + [InlineData(@"[\ca-\cb]", RegexOptions.None, null)] + [InlineData(@"[\ca-\cB]", RegexOptions.None, null)] + [InlineData(@"[\cA-\cb]", RegexOptions.None, null)] + [InlineData(@"[\cA-\cB]", RegexOptions.None, null)] + [InlineData(@"[\cb-\ca]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 8)] + [InlineData(@"[\cb-\cA]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 8)] + [InlineData(@"[\cB-\ca]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 8)] + [InlineData(@"[\cB-\cA]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 8)] + [InlineData(@"[\--#]", RegexOptions.None, null)] + [InlineData(@"[b-\-a]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] + [InlineData(@"[b-\-\-a]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] + [InlineData(@"()\2", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 4)] + [InlineData(@"()()\2", RegexOptions.None, null)] + [InlineData(@"()\1", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 4)] + [InlineData(@"()\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 4)] + [InlineData(@"()()\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 6)] + [InlineData(@"()()(?n)\1\2", RegexOptions.None, null)] + [InlineData(@"()(?n)()\1\2", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 12)] + [InlineData(@"(?n)()()\1\2", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 10)] + [InlineData(@"()()(?n)\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 10)] + [InlineData(@"()(?n)()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 10)] + [InlineData(@"(?n)()()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 10)] + [InlineData(@"()()(?-n)\1\2", RegexOptions.None, null)] + [InlineData(@"()(?-n)()\1\2", RegexOptions.None, null)] + [InlineData(@"(?-n)()()\1\2", RegexOptions.None, null)] + [InlineData(@"()()(?-n)\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 11)] + [InlineData(@"()(?-n)()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 13)] + [InlineData(@"(?-n)()()\1\2", RegexOptions.ExplicitCapture, null)] + [InlineData(@"()()(?n:\1\2)", RegexOptions.None, null)] + [InlineData(@"()()(?n:\1\2)", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 10)] + [InlineData(@"()()(?-n:\1\2)", RegexOptions.None, null)] + [InlineData(@"()()(?-n:\1\2)", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 11)] + [InlineData(@"(?n:)()()\1\2", RegexOptions.None, null)] + [InlineData(@"(?n:)()()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 11)] + [InlineData(@"(?-n:)()()\1\2", RegexOptions.None, null)] + [InlineData(@"(?-n:)()()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 12)] + [InlineData(@"(?n)(?-n)()()\1\2", RegexOptions.None, null)] + [InlineData(@"(?n)(?-n)()()\1\2", RegexOptions.ExplicitCapture, null)] + [InlineData(@"(?-n)(?n)()()\1\2", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 15)] + [InlineData(@"(?-n)(?n)()()\1\2", RegexOptions.ExplicitCapture, RegexParseError.UndefinedNumberedReference, 15)] + // References + [InlineData(@"[aeiou]", RegexOptions.None, null)] + [InlineData(@"(?\w+)\s\k\W(?\w+)", RegexOptions.None, null)] + [InlineData(@"((?abc)\d+)?(?xyz)(.*)", RegexOptions.None, null)] + [InlineData(@"(\w+)\s(\1)", RegexOptions.None, null)] + [InlineData(@"\Bqu\w+", RegexOptions.None, null)] + [InlineData(@"\bare\w*\b", RegexOptions.None, null)] + [InlineData(@"\G(\w+\s?\w*),?", RegexOptions.None, null)] + [InlineData(@"\D+(?\d+)\D+(?\d+)?", RegexOptions.None, null)] + [InlineData(@"(\s\d{4}(-(\d{4}|present))?,?)+", RegexOptions.None, null)] + [InlineData(@"^((\w+(\s?)){2,}),\s(\w+\s\w+),(\s\d{4}(-(\d{4}|present))?,?)+", RegexOptions.None, null)] + [InlineData(@"^[0-9-[2468]]+$", RegexOptions.None, null)] + [InlineData(@"[a-z-[0-9]]", RegexOptions.None, null)] + [InlineData(@"[\p{IsBasicLatin}-[\x00-\x7F]]", RegexOptions.None, null)] + [InlineData(@"[\u0000-\uFFFF-[\s\p{P}\p{IsGreek}\x85]]", RegexOptions.None, null)] + [InlineData(@"[a-z-[d-w-[m-o]]]", RegexOptions.None, null)] + [InlineData(@"((\w+(\s?)){2,}", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 15)] + [InlineData(@"[a-z-[djp]]", RegexOptions.None, null)] + [InlineData(@"(\w)\1+.\b", RegexOptions.None, null)] + [InlineData(@"\d{4}\b", RegexOptions.None, null)] + [InlineData(@"\d{1,2},", RegexOptions.None, null)] + [InlineData(@"(?]*", RegexOptions.None, null)] + [InlineData(@"\b\w+(?=\sis\b)", RegexOptions.None, null)] + [InlineData(@"[a-z-[m]]", RegexOptions.None, null)] + [InlineData(@"^\D\d{1,5}\D*$", RegexOptions.None, null)] + [InlineData(@"[^0-9]", RegexOptions.None, null)] + [InlineData(@"(\p{IsGreek}+(\s)?)+", RegexOptions.None, null)] + [InlineData(@"\b(\p{IsGreek}+(\s)?)+\p{Pd}\s(\p{IsBasicLatin}+(\s)?)+", RegexOptions.None, null)] + [InlineData(@"\b.*[.?!;:](\s|\z)", RegexOptions.None, null)] + [InlineData(@"^.+", RegexOptions.None, null)] + [InlineData(@"[^o]", RegexOptions.None, null)] + [InlineData(@"\bth[^o]\w+\b", RegexOptions.None, null)] + [InlineData(@"(\P{Sc})+", RegexOptions.None, null)] + [InlineData(@"[^\p{P}\d]", RegexOptions.None, null)] + [InlineData(@"\b[A-Z]\w*\b", RegexOptions.None, null)] + [InlineData(@"\S+?", RegexOptions.None, null)] + [InlineData(@"y\s", RegexOptions.None, null)] + [InlineData(@"gr[ae]y\s\S+?[\s\p{P}]", RegexOptions.None, null)] + [InlineData(@"[\s\p{P}]", RegexOptions.None, null)] + [InlineData(@"[\p{P}\d]", RegexOptions.None, null)] + [InlineData(@"[^aeiou]", RegexOptions.None, null)] + [InlineData(@"(\w)\1", RegexOptions.None, null)] + [InlineData(@"[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}] ", RegexOptions.None, null)] + [InlineData(@"[^a-zA-Z_0-9]", RegexOptions.None, null)] + [InlineData(@"\P{Nd}", RegexOptions.None, null)] + [InlineData(@"(\(?\d{3}\)?[\s-])?", RegexOptions.None, null)] + [InlineData(@"^(\(?\d{3}\)?[\s-])?\d{3}-\d{4}$", RegexOptions.None, null)] + [InlineData(@"[0-9]", RegexOptions.None, null)] + [InlineData(@"\p{Nd}", RegexOptions.None, null)] + [InlineData(@"\b(\S+)\s?", RegexOptions.None, null)] + [InlineData(@"[^ \f\n\r\t\v]", RegexOptions.None, null)] + [InlineData(@"[^\f\n\r\t\v\x85\p{Z}]", RegexOptions.None, null)] + [InlineData(@"(\s|$)", RegexOptions.None, null)] + [InlineData(@"\b\w+(e)?s(\s|$)", RegexOptions.None, null)] + [InlineData(@"[ \f\n\r\t\v]", RegexOptions.None, null)] + [InlineData(@"(\W){1,2}", RegexOptions.None, null)] + [InlineData(@"(\w+)", RegexOptions.None, null)] + [InlineData(@"\b", RegexOptions.None, null)] + [InlineData(@"\b(\w+)(\W){1,2}", RegexOptions.None, null)] + [InlineData(@"(?>(\w)\1+).\b", RegexOptions.None, null)] + [InlineData(@"(\b(\w+)\W+)+", RegexOptions.None, null)] + [InlineData(@"\p{Sc}*(\s?\d+[.,]?\d*)\p{Sc}*", RegexOptions.None, null)] + [InlineData(@"p{Sc}*(?\s?\d+[.,]?\d*)\p{Sc}*", RegexOptions.None, null)] + [InlineData(@"^(\w+\s?)+$", RegexOptions.None, null)] + [InlineData(@"(?ix) d \w+ \s", RegexOptions.None, null)] + [InlineData(@"\bthe\w*\b", RegexOptions.None, null)] + [InlineData(@"\b(?i:t)he\w*\b", RegexOptions.None, null)] + [InlineData(@"^(\w+)\s(\d+)$", RegexOptions.None, null)] + [InlineData(@"^(\w+)\s(\d+)\r*$", RegexOptions.Multiline, null)] + [InlineData(@"(?m)^(\w+)\s(\d+)\r*$", RegexOptions.Multiline, null)] + [InlineData(@"(?s)^.+", RegexOptions.None, null)] + [InlineData(@"\b(\d{2}-)*(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b", RegexOptions.None, null)] + [InlineData(@"\b\(?((\w+),?\s?)+[\.!?]\)?", RegexOptions.None, null)] + [InlineData(@"(?n)\b\(?((?>\w+),?\s?)+[\.!?]\)?", RegexOptions.None, null)] + [InlineData(@"\b\(?(?n:(?>\w+),?\s?)+[\.!?]\)?", RegexOptions.None, null)] + [InlineData(@"\b\(?((?>\w+),?\s?)+[\.!?]\)?", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData(@"(?x)\b \(? ( (?>\w+) ,?\s? )+ [\.!?] \)? # Matches an entire sentence.", RegexOptions.None, null)] + [InlineData(@"\bb\w+\s", RegexOptions.RightToLeft, null)] + [InlineData(@"(?<=\d{1,2}\s)\w+,?\s\d{4}", RegexOptions.RightToLeft, null)] + [InlineData(@"\b(\w+\s*)+", RegexOptions.ECMAScript, null)] + [InlineData(@"((a+)(\1) ?)+", RegexOptions.ECMAScript, null)] + [InlineData(@"\b(D\w+)\s(d\w+)\b", RegexOptions.None, null)] + [InlineData(@"\b(D\w+)(?ixn) \s (d\w+) \b", RegexOptions.None, null)] + [InlineData(@"\b((?# case-sensitive comparison)D\w+)\s((?#case-insensitive comparison)d\w+)\b", RegexOptions.None, null)] + [InlineData(@"\b\(?((?>\w+),?\s?)+[\.!?]\)?", RegexOptions.None, null)] + [InlineData(@"\b(?\d{2}-)*(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b", RegexOptions.None, null)] + [InlineData(@"\b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b", RegexOptions.None, null)] + [InlineData(@"\bgr(a|e)y\b", RegexOptions.None, null)] + [InlineData(@"\b91*9*\b", RegexOptions.None, null)] + [InlineData(@"\ban+\w*?\b", RegexOptions.None, null)] + [InlineData(@"\ban?\b", RegexOptions.None, null)] + [InlineData(@"\b\d+\,\d{3}\b", RegexOptions.None, null)] + [InlineData(@"\b\d{2,}\b\D+", RegexOptions.None, null)] + [InlineData(@"(00\s){2,4}", RegexOptions.None, null)] + [InlineData(@"\b\w*?oo\w*?\b", RegexOptions.None, null)] + [InlineData(@"\b\w+?\b", RegexOptions.None, null)] + [InlineData(@"^\s*(System.)??Console.Write(Line)??\(??", RegexOptions.None, null)] + [InlineData(@"(System.)??", RegexOptions.None, null)] + [InlineData(@"\b(\w{3,}?\.){2}?\w{3,}?\b", RegexOptions.None, null)] + [InlineData(@"\b[A-Z](\w*?\s*?){1,10}[.!?]", RegexOptions.None, null)] + [InlineData(@"b.*([0-9]{4})\b", RegexOptions.None, null)] + [InlineData(@"\b.*?([0-9]{4})\b", RegexOptions.None, null)] + [InlineData(@"(a?)*", RegexOptions.None, null)] + [InlineData(@"(a\1|(?(1)\1)){0,2}", RegexOptions.None, null)] + [InlineData(@"(a\1|(?(1)\1)){2}", RegexOptions.None, null)] + [InlineData(@"(?\w)\k", RegexOptions.None, null)] + [InlineData(@"(?<2>\w)\k<2>", RegexOptions.None, null)] + [InlineData(@"(?<1>a)(?<1>\1b)*", RegexOptions.None, null)] + [InlineData(@"\b(\p{Lu}{2})(\d{2})?(\p{Lu}{2})\b", RegexOptions.None, null)] + [InlineData(@"\bgr[ae]y\b", RegexOptions.None, null)] + [InlineData(@"\b((?# case sensitive comparison)D\w+)\s(?ixn)((?#case insensitive comparison)d\w+)\b", RegexOptions.None, null)] + [InlineData(@"\{\d+(,-*\d+)*(\:\w{1,4}?)*\}(?x) # Looks for a composite format item.", RegexOptions.None, null)] + [InlineData(@"cat([a-\d]*)dog", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 9)] + [InlineData(@"\k<1", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"(?')", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData(@"(?<)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 3)] + [InlineData(@"(?imn )", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 6)] + [InlineData(@"(?imn", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?'cat'", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 7)] + [InlineData(@"(?'", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(?'=)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 4)] + [InlineData(@"(?'!)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 4)] + [InlineData(@"[^", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] + [InlineData(@"[cat", RegexOptions.None, RegexParseError.UnterminatedBracket, 4)] + [InlineData(@"[^cat", RegexOptions.None, RegexParseError.UnterminatedBracket, 5)] + [InlineData(@"\p{cat", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 6)] + [InlineData(@"\k", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 7)] + [InlineData(@"\P{", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] + [InlineData(@"\k<>", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"(?(", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 3)] + [InlineData(@"(?()|", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 5)] + [InlineData(@"?(a|b)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"?((a)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"?((a)a", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"?((a)a|", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"?((a)a|b", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"?(a)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"[a", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] + [InlineData(@"?(a:b)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"(?(?", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 4)] + [InlineData(@"(?(cat", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 6)] + [InlineData(@"(?(cat)|", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 8)] + [InlineData(@"foo(?<0>bar)", RegexOptions.None, RegexParseError.CaptureGroupOfZero, 7)] + [InlineData(@"foo(?'0'bar)", RegexOptions.None, RegexParseError.CaptureGroupOfZero, 7)] + [InlineData(@"foo(?<1bar)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 7)] + [InlineData(@"foo(?'1bar)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 7)] + [InlineData(@"\p{klsak", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 8)] + [InlineData(@"(?c:cat)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(??e:cat)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"[a-f-[]]+", RegexOptions.None, RegexParseError.UnterminatedBracket, 9)] + [InlineData(@"[A-[]+", RegexOptions.None, RegexParseError.UnterminatedBracket, 6)] + [InlineData(@"(?(?e))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?(?a)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?r:cat)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"\x2", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"(cat) (?#cat) \s+ (?#followed by 1 or more whitespace", RegexOptions.IgnorePatternWhitespace, RegexParseError.UnterminatedComment, 56)] + [InlineData(@"cat(?(?afdcat)dog)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 8)] + [InlineData(@"cat(?(?cat)dog)", RegexOptions.None, RegexParseError.AlternationHasNamedCapture, 5)] + [InlineData(@"cat(?(?'cat'cat)dog)", RegexOptions.None, RegexParseError.AlternationHasNamedCapture, 5)] + [InlineData(@"cat(?(?#COMMENT)cat)", RegexOptions.None, RegexParseError.AlternationHasComment, 5)] + [InlineData(@"cat(?<>dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 6)] + [InlineData(@"cat(?)_*>dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 9)] + [InlineData(@"cat(?)_*>dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 9)] + [InlineData(@"cat(?)_*>dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 9)] + [InlineData(@"cat(?dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 9)] + [InlineData(@"cat(?<1dog>dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 7)] + [InlineData(@"cat(?<0>dog)", RegexOptions.None, RegexParseError.CaptureGroupOfZero, 7)] + [InlineData(@"([5-\D]*)dog", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 6)] + [InlineData(@"cat([6-\s]*)dog", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 9)] + [InlineData(@"cat([c-\S]*)", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 9)] + [InlineData(@"cat([7-\w]*)", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 9)] + [InlineData(@"cat([a-\W]*)dog", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 9)] + [InlineData(@"([f-\p{Lu}]\w*)\s([\p{Lu}]\w*)", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 6)] + [InlineData(@"(cat) (?#cat) \s+ (?#followed by 1 or more whitespace", RegexOptions.None, RegexParseError.UnterminatedComment, 56)] + [InlineData(@"([1-\P{Ll}][\p{Ll}]*)\s([\P{Ll}][\p{Ll}]*)", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 6)] + [InlineData(@"[\P]", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 3)] + [InlineData(@"([\pcat])", RegexOptions.None, RegexParseError.MalformedUnicodePropertyEscape, 5)] + [InlineData(@"([\Pcat])", RegexOptions.None, RegexParseError.MalformedUnicodePropertyEscape, 5)] + [InlineData(@"(\p{", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 3)] + [InlineData(@"(\p{Ll", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 6)] + [InlineData(@"(cat)([\o]*)(dog)", RegexOptions.None, RegexParseError.UnrecognizedEscape, 9)] + [InlineData(@"[\p]", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 3)] + [InlineData(@"(?cat)\s+(?dog)\kcat", RegexOptions.None, RegexParseError.MalformedNamedReference, 28)] + [InlineData(@"(?cat)\s+(?dog)\k", RegexOptions.None, RegexParseError.UndefinedNamedReference, 33)] + [InlineData(@"(?cat)\s+(?dog)\k<8>cat", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 30)] + [InlineData(@"^[abcd]{1}?*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 12)] + [InlineData(@"^[abcd]*+$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] + [InlineData(@"^[abcd]+*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] + [InlineData(@"^[abcd]?*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] + [InlineData(@"^[abcd]*?+$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 10)] + [InlineData(@"^[abcd]+?*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 10)] + [InlineData(@"^[abcd]{1,}?*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 13)] + [InlineData(@"^[abcd]??*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 10)] + [InlineData(@"^[abcd]+{0,5}$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] + [InlineData(@"^[abcd]?{0,5}$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] + [InlineData(@"\ua", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"^[abcd]*{0,5}$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 9)] + [InlineData(@"^[abcd]{0,16}?*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 15)] + [InlineData(@"^[abcd]{1,}*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 12)] + [InlineData(@"(?cat)\s+(?dog)\k<8>cat", RegexOptions.ECMAScript, RegexParseError.UndefinedNumberedReference, 30)] + [InlineData(@"(?cat)\s+(?dog)\k8", RegexOptions.None, RegexParseError.MalformedNamedReference, 28)] + [InlineData(@"(?cat)\s+(?dog)\k8", RegexOptions.ECMAScript, RegexParseError.MalformedNamedReference, 28)] + [InlineData(@"(cat)(\7)", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 8)] + [InlineData(@"(cat)\s+(?<2147483648>dog)", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 21)] + [InlineData(@"(cat)\s+(?<21474836481097>dog)", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 21)] + [InlineData(@"^[abcd]{1}*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 11)] + [InlineData(@"(cat)(\c*)(dog)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 9)] + [InlineData(@"(cat)(\c *)(dog)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 9)] + [InlineData(@"(cat)(\c?*)(dog)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 9)] + [InlineData(@"(cat)(\c`*)(dog)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 9)] + [InlineData(@"(cat)(\c\|*)(dog)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 11)] + [InlineData(@"^[abcd]{0,16}*$", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 14)] + [InlineData(@"(cat)\c", RegexOptions.None, RegexParseError.MissingControlCharacter, 7)] + // Deep recursion + [InlineData(@"((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + +"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + +"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + +"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + +"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + +"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + +"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + +"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + +"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + +"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + +"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" + +"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 1183)] + // Scan control + [InlineData("(cat)(\\c\0*)(dog)", RegexOptions.None, RegexParseError.UnrecognizedControlCharacter, 9)] + [InlineData(@"(cat)(\c\[*)(dog)", RegexOptions.None, RegexParseError.UnterminatedBracket, 17)] + // Invalid grouping constructs + [InlineData("(?<", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData("(?>-", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 4)] + // Testgroup with options + [InlineData("())", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 3)] + [InlineData("[a-z-[aeiuo]", RegexOptions.None, RegexParseError.UnterminatedBracket, 12)] + [InlineData("[a-z-[aeiuo", RegexOptions.None, RegexParseError.UnterminatedBracket, 11)] + [InlineData("[a-z-[b]", RegexOptions.None, RegexParseError.UnterminatedBracket, 8)] + [InlineData("[a-z-[b", RegexOptions.None, RegexParseError.UnterminatedBracket, 7)] + [InlineData("[b-a]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] + [InlineData(@"[a-c]{2,1}", RegexOptions.None, RegexParseError.ReversedQuantifierRange, 10)] + [InlineData(@"\d{2147483648}", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 13)] + [InlineData("[a-z-[b][", RegexOptions.None, RegexParseError.UnterminatedBracket, 9)] + [InlineData("(?()|||||)", RegexOptions.None, RegexParseError.AlternationHasTooManyConditions, 10)] + [InlineData("[^]", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData("??", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData("(?=*)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 4)] + [InlineData("((((((*))))))", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 7)] public void ParseCheckOffset(string pattern, RegexOptions options, RegexParseError? error, int offset = -1) { Parse(pattern, options, error, offset); } - [Fact] - public void ParseCheckOffsetInsufficientParens() - { - Parse(new string('(', 1183), RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 1183); - } private static void Parse(string pattern, RegexOptions options, RegexParseError? error, int offset = -1) { @@ -150,13 +729,12 @@ private static void Parse(string pattern, RegexOptions options, RegexParseError? } private static void LogActual(string pattern, RegexOptions options, RegexParseError error, int offset) - { - // [InlineData(@"[a-z-[b", RegexOptions.None, RegexParseError.UnterminatedBracket, 7)] + { string s = (error == RegexParseError.Unknown) ? @$" [InlineData(@""{pattern}"", RegexOptions.{options.ToString()}, null)]" : @$" [InlineData(@""{pattern}"", RegexOptions.{options.ToString()}, RegexParseError.{error.ToString()}, {offset})]"; - File.AppendAllText(@"/tmp/out.cs", s + "\n"); // for updating baseline + // File.AppendAllText(@"/tmp/out.cs", s + "\n"); // for updating baseline } private static void ParsePatternFragments(string pattern, RegexOptions options) diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs index 27ce3c4a20cad1..cf9b69dee41cf7 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs @@ -10,10 +10,235 @@ namespace System.Text.RegularExpressions.Tests { public partial class RegexParserTests { - + [Theory] + + // Avoid OutOfMemoryException + [InlineData("a{2147483647}", RegexOptions.None, null)] + [InlineData("a{2147483647,}", RegexOptions.None, null)] + + [InlineData(@"(?(?N))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?(?i))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?(?I))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?(?M))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?(?s))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?(?S))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?(?x))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?(?X))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?(?n))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"(?(?m))", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData("(?<-", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData("(?<-", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"^[^<>]*(((?'Open'<)[^<>]*)+((?'Close-Open'>)[^<>]*)+)*(?(Open)(?!))$", RegexOptions.None, null)] + [InlineData(@"((?'Close-Open'>)[^<>]*)+", RegexOptions.None, RegexParseError.UndefinedNamedReference, 14)] + [InlineData(@"(((?'Open'<)[^<>]*)+((?'Close-Open'>)[^<>]*)+)*", RegexOptions.None, null)] + [InlineData(@"(?'Close-Open'>)", RegexOptions.None, RegexParseError.UndefinedNamedReference, 13)] + [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?)()(?<-0>)(?<-1>)(?<-2>)(?<-3>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 34)] + [InlineData("()(?)(?<-0>)(?<-1>)(?<-2>)(?<-3>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 34)] + [InlineData("()()(?<-0>)(?<-1>)(?<-2>)(?<-3>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 30)] + [InlineData("(?)(?)(?<-1>)(?<-2>)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?<-4>)(?<4>)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?<4>)(?<-4>)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?)(?<-a>)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?<-a>)(?)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 7)] + [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 6)] + [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 5)] + [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 5)] + [InlineData("(?<-1>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 5)] + [InlineData("()(?<-1>)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?<-1>)()", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?<-00>)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?)(?)(?<-0>)(?<-1>)(?<-2>)(?<-3>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 38)] + [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)()()", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 26)] + [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)()(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 19)] + [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)()(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 26)] + [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)(?)()", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 26)] + [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)(?)(?", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 19)] + [InlineData("(?<-0>)(?<-1>)(?<-2>)(?<-3>)(?)(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.UndefinedNumberedReference, 26)] + [InlineData("(?)(?)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?)(?<-a>)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?<-0>)", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?<-0 >)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 5)] + [InlineData("(?<- 0 >)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 4)] + [InlineData("(?<- 0>)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 4)] + [InlineData("(?)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 6)] + [InlineData("(?'-0')", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?'a-0')", RegexOptions.IgnorePatternWhitespace, null)] + [InlineData("(?<-0", RegexOptions.IgnorePatternWhitespace, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData("(?<-0)", RegexOptions.IgnorePatternWhitespace, RegexParseError.CaptureGroupNameInvalid, 5)] + [InlineData("(?<-0>", RegexOptions.IgnorePatternWhitespace, RegexParseError.InsufficientClosingParentheses, 6)] + [InlineData(@"(?cat)\w+(?dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 21)] + [InlineData(@"(?cat)\w+(?dog)", RegexOptions.None, RegexParseError.UndefinedNamedReference, 27)] + [InlineData(@"(?cat)\w+(?dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 22)] + [InlineData(@"(?cat)\w+(?dog)", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 23)] + [InlineData(@"cat(?<->dog)", RegexOptions.None, RegexParseError.CaptureGroupNameInvalid, 7)] + [InlineData("a{2147483648}", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 12)] + [InlineData("a{2147483648,}", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 12)] + [InlineData("a{0,2147483647}", RegexOptions.None, null)] + [InlineData("a{0,2147483648}", RegexOptions.None, RegexParseError.QuantifierOrCaptureGroupOutOfRange, 14)] + // Surrogate pair which is parsed as [char,char-char,char] as we operate on UTF-16 code units. + [InlineData("[\uD82F\uDCA0-\uD82F\uDCA3]", RegexOptions.IgnoreCase, RegexParseError.ReversedCharacterRange, 5)] + + // Following are borrowed from Rust regex tests ============ + // https://github.com/rust-lang/regex/blob/master/tests/noparse.rs + [InlineData(@"*", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"[A-", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"[A", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] + [InlineData(@"[\A]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 3)] + [InlineData(@"[\z]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 3)] + [InlineData(@"(", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 1)] + [InlineData(@")", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 1)] + [InlineData(@"[a-Z]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] + [InlineData(@"(?P<>a)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(?P)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(?a)a", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"a{2,1}", RegexOptions.None, RegexParseError.ReversedQuantifierRange, 6)] + [InlineData(@"(?", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 2)] + [InlineData(@"\8", RegexOptions.None, RegexParseError.UndefinedNumberedReference, 2)] + [InlineData(@"\xG0", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"\xF", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\x{fffg}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"(?a)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(?)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] + [InlineData(@"(?P.)(?P.)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"[a-\A]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 5)] + [InlineData(@"[a-\z]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 5)] + [InlineData(@"[a-\b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] + [InlineData(@"[a-\-]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] + [InlineData(@"[a-\-b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] + [InlineData(@"[a-\-\-b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] + [InlineData(@"[a-\-\D]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] + [InlineData(@"[a-\-\-\D]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] + [InlineData(@"[a -\-\b]", RegexOptions.None, null)] + [InlineData(@"[\b]", RegexOptions.None, null)] // errors in rust: class_no_boundary + [InlineData(@"a{10000000}", RegexOptions.None, null)] // errors in rust: too_big + [InlineData(@"a{1001", RegexOptions.None, null)] // errors in rust: counted_no_close + [InlineData(@"a{-1,1}", RegexOptions.None, null)] // errors in rust: counted_nonnegative + [InlineData(@"\\", RegexOptions.None, null)] // errors in rust: unfinished_escape + [InlineData(@"(?-i-i)", RegexOptions.None, null)] // errors in rust: double_neg + [InlineData(@"(?i-)", RegexOptions.None, null)] // errors in rust: neg_empty + [InlineData(@"[a-[:lower:]]", RegexOptions.None, null)] // errors in rust: range_end_no_class // End of Rust parser tests ============== - + // Following are borrowed from Nim tests + // https://github.com/nitely/nim-regex/blob/eeefb4f51264ff3bc3b36caf55672a74f52f5ef5/tests/tests.nim + [InlineData(@"?", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"?|?", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"?abc", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"(?Pabc", RegexOptions.None, null)] + [InlineData(@"(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(?u-q)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(?uq)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 1183)] + [InlineData(@"(\b)", RegexOptions.None, null)] + [InlineData(@"(+)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] + [InlineData(@"(a)b)", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 5)] + [InlineData(@"(b(a)", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 5)] + [InlineData(@"[-", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] + [InlineData(@"[-a", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"[[:abc:]]", RegexOptions.None, null)] // Nim: "Invalid ascii set. `abc` is not a valid name" + [InlineData(@"[[:alnum:", RegexOptions.None, RegexParseError.UnterminatedBracket, 9)] + [InlineData(@"[[:alnum]]", RegexOptions.None, null)] // Nim: "Invalid ascii set. Expected [:name:]" + [InlineData(@"[]", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] + [InlineData(@"[]a", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"[]abc", RegexOptions.None, RegexParseError.UnterminatedBracket, 5)] + [InlineData(@"[\\", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"[^]", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"[a-", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"[a-\b]", RegexOptions.None, null)] + [InlineData(@"[a-\w]", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 5)] + [InlineData(@"[a", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] + [InlineData(@"[abc", RegexOptions.None, RegexParseError.UnterminatedBracket, 4)] + [InlineData(@"[d-c]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] + [InlineData(@"[z-[:alnum:]]", RegexOptions.None, null)] // Nim: "Invalid set range. Start must be lesser than end" + [InlineData(@"{10}", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"*abc", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"\12", RegexOptions.None, null)] // Nim: "Invalid octal literal. Expected 3 octal digits, but found 2" + [InlineData(@"\12@", RegexOptions.None, null)] // Nim: "Invalid octal literal. Expected octal digit, but found @" + [InlineData(@"\b?", RegexOptions.None, null)] + [InlineData(@"\b*", RegexOptions.None, null)] + [InlineData(@"\b+", RegexOptions.None, null)] + [InlineData(@"\p{11", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 5)] + [InlineData(@"\p{11}", RegexOptions.None, RegexParseError.UnrecognizedUnicodeProperty, 6)] + [InlineData(@"\p{Bb}", RegexOptions.None, RegexParseError.UnrecognizedUnicodeProperty, 6)] + [InlineData(@"\p11", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] + [InlineData(@"\pB", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] + [InlineData(@"\u123", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\U123", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\U123@a", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\u123@abc", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 6)] + [InlineData(@"\UFFFFFFFF", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\x{00000000A}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"\x{2f894", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"\x{61@}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"\x{7fffffff}", RegexOptions.None, null)] + [InlineData(@"\x{FFFFFFFF}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"+", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"+abc", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"a???", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)] + [InlineData(@"a??*", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)] + [InlineData(@"a??+", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)] + [InlineData(@"a?*", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] + [InlineData(@"a?+", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] + [InlineData(@"a(?P<>abc)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 4)] + [InlineData(@"a(?P Date: Sat, 27 Nov 2021 03:32:31 +0000 Subject: [PATCH 4/7] typos --- .../System.Text.RegularExpressions/tests/RegexParserTests.cs | 2 +- .../tests/RegexParserTests.netcoreapp.cs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs index efa3f84192591d..cb776466b203a1 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs @@ -714,7 +714,7 @@ private static void Parse(string pattern, RegexOptions options, RegexParseError? { if (error != null) { - //Assert.InRange(offset, 0, int.MaxValue); + Assert.InRange(offset, 0, int.MaxValue); Throws(pattern, options, error.Value, offset, () => new Regex(pattern, options)); return; } diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs index cf9b69dee41cf7..8bb7b7e0f59813 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs @@ -136,7 +136,6 @@ public partial class RegexParserTests [InlineData(@"(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] [InlineData(@"(?u-q)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] [InlineData(@"(?uq)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] - [InlineData(@"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 1183)] [InlineData(@"(\b)", RegexOptions.None, null)] [InlineData(@"(+)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] [InlineData(@"(a)b)", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 5)] From e9844c8f9f88e71f6fd912f6e93f62d0b9093fc1 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Sat, 27 Nov 2021 03:41:05 +0000 Subject: [PATCH 5/7] positive cases --- .../tests/RegexParserTests.netcoreapp.cs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs index 8bb7b7e0f59813..dabcfb5d94c5cd 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs @@ -110,7 +110,7 @@ public partial class RegexParserTests [InlineData(@"(?P.)(?P.)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] [InlineData(@"[a-\A]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 5)] [InlineData(@"[a-\z]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 5)] - [InlineData(@"[a-\b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] + [InlineData(@"[a-\b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] // Nim: not an error [InlineData(@"[a-\-]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] [InlineData(@"[a-\-b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] [InlineData(@"[a-\-\-b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] @@ -132,7 +132,7 @@ public partial class RegexParserTests [InlineData(@"?", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] [InlineData(@"?|?", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] [InlineData(@"?abc", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] - [InlineData(@"(?Pabc", RegexOptions.None, null)] + [InlineData(@"(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] // Nim: not an error [InlineData(@"(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] [InlineData(@"(?u-q)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] [InlineData(@"(?uq)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] @@ -142,7 +142,7 @@ public partial class RegexParserTests [InlineData(@"(b(a)", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 5)] [InlineData(@"[-", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] [InlineData(@"[-a", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] - [InlineData(@"[[:abc:]]", RegexOptions.None, null)] // Nim: "Invalid ascii set. `abc` is not a valid name" + [InlineData(@"[[:abc:]]", RegexOptions.None, null)] // Nim: "Invalid ascii set. `abc` is not a valid name" [InlineData(@"[[:alnum:", RegexOptions.None, RegexParseError.UnterminatedBracket, 9)] [InlineData(@"[[:alnum]]", RegexOptions.None, null)] // Nim: "Invalid ascii set. Expected [:name:]" [InlineData(@"[]", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] @@ -151,12 +151,11 @@ public partial class RegexParserTests [InlineData(@"[\\", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] [InlineData(@"[^]", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] [InlineData(@"[a-", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] - [InlineData(@"[a-\b]", RegexOptions.None, null)] [InlineData(@"[a-\w]", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 5)] [InlineData(@"[a", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] [InlineData(@"[abc", RegexOptions.None, RegexParseError.UnterminatedBracket, 4)] [InlineData(@"[d-c]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] - [InlineData(@"[z-[:alnum:]]", RegexOptions.None, null)] // Nim: "Invalid set range. Start must be lesser than end" + [InlineData(@"[z-[:alnum:]]", RegexOptions.None, null)] // Nim: "Invalid set range. Start must be lesser than end" [InlineData(@"{10}", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] [InlineData(@"*abc", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] [InlineData(@"\12", RegexOptions.None, null)] // Nim: "Invalid octal literal. Expected 3 octal digits, but found 2" @@ -177,7 +176,7 @@ public partial class RegexParserTests [InlineData(@"\x{00000000A}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] [InlineData(@"\x{2f894", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] [InlineData(@"\x{61@}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] - [InlineData(@"\x{7fffffff}", RegexOptions.None, null)] + [InlineData(@"\x{7fffffff}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] // Nim: not an error (supports Unicode beyond basic multilingual plane) [InlineData(@"\x{FFFFFFFF}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] [InlineData(@"+", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] [InlineData(@"+abc", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] @@ -202,8 +201,8 @@ public partial class RegexParserTests [InlineData(@"a{1,}*", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 6)] [InlineData(@"a{1,}+", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 6)] [InlineData(@"a{1,101}", RegexOptions.None, null)] - [InlineData(@"a{1,x}", RegexOptions.None, null) // Nim error - [InlineData(@"a{1", RegexOptions.None, null) // Nim error + [InlineData(@"a{1,x}", RegexOptions.None, null)] // Nim error + [InlineData(@"a{1", RegexOptions.None, null)] // Nim error [InlineData(@"a{1}??", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 6)] [InlineData(@"a{1}?", RegexOptions.None, null)] [InlineData(@"a{1}*", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 5)] From 5a9dc84ab522129e1267494c3de20a9830d34f12 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Sat, 27 Nov 2021 02:23:48 +0000 Subject: [PATCH 6/7] new parser tests --- .../tests/RegexParserTests.cs | 15 ++- .../tests/RegexParserTests.netcoreapp.cs | 118 +++++++++++++++++- .../tests/RegexParserTests.netfx.cs | 2 +- .../tests/THIRD-PARTY-NOTICES.TXT | 27 +++- 4 files changed, 155 insertions(+), 7 deletions(-) diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs index 846fcbce60fa65..cb776466b203a1 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.cs @@ -709,16 +709,18 @@ public void ParseCheckOffset(string pattern, RegexOptions options, RegexParseErr Parse(pattern, options, error, offset); } + private static void Parse(string pattern, RegexOptions options, RegexParseError? error, int offset = -1) { if (error != null) { Assert.InRange(offset, 0, int.MaxValue); - Throws(error.Value, offset, () => new Regex(pattern, options)); + Throws(pattern, options, error.Value, offset, () => new Regex(pattern, options)); return; } Assert.Equal(-1, offset); + LogActual(pattern, options, RegexParseError.Unknown, -1); // Nothing to assert here without having access to internals. new Regex(pattern, options); // Does not throw @@ -726,6 +728,15 @@ private static void Parse(string pattern, RegexOptions options, RegexParseError? ParsePatternFragments(pattern, options); } + private static void LogActual(string pattern, RegexOptions options, RegexParseError error, int offset) + { + string s = (error == RegexParseError.Unknown) ? + @$" [InlineData(@""{pattern}"", RegexOptions.{options.ToString()}, null)]" : + @$" [InlineData(@""{pattern}"", RegexOptions.{options.ToString()}, RegexParseError.{error.ToString()}, {offset})]"; + + // File.AppendAllText(@"/tmp/out.cs", s + "\n"); // for updating baseline + } + private static void ParsePatternFragments(string pattern, RegexOptions options) { // Trim the input in various places and parse. @@ -755,7 +766,7 @@ private static void ParsePatternFragments(string pattern, RegexOptions options) /// /// The expected parse error /// The action to invoke. - static partial void Throws(RegexParseError error, int offset, Action action); + static partial void Throws(string pattern, RegexOptions options, RegexParseError error, int offset, Action action); /// /// Checks that action succeeds or throws either a RegexParseException or an ArgumentException depending on the diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs index cc1d5f8658fe9b..dabcfb5d94c5cd 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs @@ -110,7 +110,7 @@ public partial class RegexParserTests [InlineData(@"(?P.)(?P.)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] [InlineData(@"[a-\A]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 5)] [InlineData(@"[a-\z]", RegexOptions.None, RegexParseError.UnrecognizedEscape, 5)] - [InlineData(@"[a-\b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] + [InlineData(@"[a-\b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] // Nim: not an error [InlineData(@"[a-\-]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] [InlineData(@"[a-\-b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] [InlineData(@"[a-\-\-b]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 5)] @@ -127,6 +127,115 @@ public partial class RegexParserTests [InlineData(@"[a-[:lower:]]", RegexOptions.None, null)] // errors in rust: range_end_no_class // End of Rust parser tests ============== + // Following are borrowed from Nim tests + // https://github.com/nitely/nim-regex/blob/eeefb4f51264ff3bc3b36caf55672a74f52f5ef5/tests/tests.nim + [InlineData(@"?", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"?|?", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"?abc", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] // Nim: not an error + [InlineData(@"(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(?u-q)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(?uq)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 3)] + [InlineData(@"(\b)", RegexOptions.None, null)] + [InlineData(@"(+)", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 2)] + [InlineData(@"(a)b)", RegexOptions.None, RegexParseError.InsufficientOpeningParentheses, 5)] + [InlineData(@"(b(a)", RegexOptions.None, RegexParseError.InsufficientClosingParentheses, 5)] + [InlineData(@"[-", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] + [InlineData(@"[-a", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"[[:abc:]]", RegexOptions.None, null)] // Nim: "Invalid ascii set. `abc` is not a valid name" + [InlineData(@"[[:alnum:", RegexOptions.None, RegexParseError.UnterminatedBracket, 9)] + [InlineData(@"[[:alnum]]", RegexOptions.None, null)] // Nim: "Invalid ascii set. Expected [:name:]" + [InlineData(@"[]", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] + [InlineData(@"[]a", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"[]abc", RegexOptions.None, RegexParseError.UnterminatedBracket, 5)] + [InlineData(@"[\\", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"[^]", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"[a-", RegexOptions.None, RegexParseError.UnterminatedBracket, 3)] + [InlineData(@"[a-\w]", RegexOptions.None, RegexParseError.ShorthandClassInCharacterRange, 5)] + [InlineData(@"[a", RegexOptions.None, RegexParseError.UnterminatedBracket, 2)] + [InlineData(@"[abc", RegexOptions.None, RegexParseError.UnterminatedBracket, 4)] + [InlineData(@"[d-c]", RegexOptions.None, RegexParseError.ReversedCharacterRange, 4)] + [InlineData(@"[z-[:alnum:]]", RegexOptions.None, null)] // Nim: "Invalid set range. Start must be lesser than end" + [InlineData(@"{10}", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"*abc", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"\12", RegexOptions.None, null)] // Nim: "Invalid octal literal. Expected 3 octal digits, but found 2" + [InlineData(@"\12@", RegexOptions.None, null)] // Nim: "Invalid octal literal. Expected octal digit, but found @" + [InlineData(@"\b?", RegexOptions.None, null)] + [InlineData(@"\b*", RegexOptions.None, null)] + [InlineData(@"\b+", RegexOptions.None, null)] + [InlineData(@"\p{11", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 5)] + [InlineData(@"\p{11}", RegexOptions.None, RegexParseError.UnrecognizedUnicodeProperty, 6)] + [InlineData(@"\p{Bb}", RegexOptions.None, RegexParseError.UnrecognizedUnicodeProperty, 6)] + [InlineData(@"\p11", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] + [InlineData(@"\pB", RegexOptions.None, RegexParseError.InvalidUnicodePropertyEscape, 2)] + [InlineData(@"\u123", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 2)] + [InlineData(@"\U123", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\U123@a", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\u123@abc", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 6)] + [InlineData(@"\UFFFFFFFF", RegexOptions.None, RegexParseError.UnrecognizedEscape, 2)] + [InlineData(@"\x{00000000A}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"\x{2f894", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"\x{61@}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"\x{7fffffff}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] // Nim: not an error (supports Unicode beyond basic multilingual plane) + [InlineData(@"\x{FFFFFFFF}", RegexOptions.None, RegexParseError.InsufficientOrInvalidHexDigits, 3)] + [InlineData(@"+", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"+abc", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 1)] + [InlineData(@"a???", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)] + [InlineData(@"a??*", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)] + [InlineData(@"a??+", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)] + [InlineData(@"a?*", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] + [InlineData(@"a?+", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)] + [InlineData(@"a(?P<>abc)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 4)] + [InlineData(@"a(?P /// The expected parse error /// The action to invoke. - static partial void Throws(RegexParseError error, int offset, Action action) + static partial void Throws(string pattern, RegexOptions options, RegexParseError error, int offset, Action action) { try { @@ -171,16 +280,19 @@ static partial void Throws(RegexParseError error, int offset, Action action) if (error == regexParseError) { Assert.Equal(offset, e.Offset); + LogActual(pattern, options, regexParseError, e.Offset); return; } + LogActual(pattern, options, regexParseError, e.Offset); throw new XunitException($"Expected RegexParseException with error {error} offset {offset} -> Actual error: {regexParseError} offset {e.Offset})"); } catch (Exception e) { - throw new XunitException($"Expected RegexParseException -> Actual: ({e})"); + throw new XunitException($"Expected RegexParseException for pattern '{pattern}' -> Actual: ({e})"); } + LogActual(pattern, options, RegexParseError.Unknown, -1); throw new XunitException($"Expected RegexParseException with error: ({error}) -> Actual: No exception thrown"); } diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netfx.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netfx.cs index e70d29a8dd388f..b7b3d56505a3ca 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netfx.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netfx.cs @@ -16,7 +16,7 @@ public partial class RegexParserTests /// /// The expected parse error /// The action to invoke. - static partial void Throws(RegexParseError error, int offset, Action action) + static partial void Throws(string pattern, RegexOptions options, RegexParseError error, int offset, Action action) { try { diff --git a/src/libraries/System.Text.RegularExpressions/tests/THIRD-PARTY-NOTICES.TXT b/src/libraries/System.Text.RegularExpressions/tests/THIRD-PARTY-NOTICES.TXT index 8c51928cfb1e72..b5f4599ed3a336 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/THIRD-PARTY-NOTICES.TXT +++ b/src/libraries/System.Text.RegularExpressions/tests/THIRD-PARTY-NOTICES.TXT @@ -35,4 +35,29 @@ SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. \ No newline at end of file +DEALINGS IN THE SOFTWARE. + +License notice for https://github.com/nitely/nim-regex +------------------------------- + +MIT License + +Copyright (c) 2017 Esteban Castro Borsani + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file From 8e143ac4f87a2055b21f7f479a3fd7ce695bc580 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Fri, 26 Nov 2021 21:21:44 -0700 Subject: [PATCH 7/7] change to \u --- .../tests/RegexParserTests.netcoreapp.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs index dabcfb5d94c5cd..7285dffb6e8985 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/RegexParserTests.netcoreapp.cs @@ -231,9 +231,9 @@ public partial class RegexParserTests [InlineData(@"abc(?q)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 6)] [InlineData(@"abc[]", RegexOptions.None, RegexParseError.UnterminatedBracket, 5)] [InlineData(@"abc\A{10}", RegexOptions.None, null)] // Nim error: "Invalid repetition range, either char, shorthand (i.e: \\w), group, or set expected before repetition range" - [InlineData(@"弢(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] - [InlineData(@"弢aaa(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 8)] - [InlineData(@"弢弢弢(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 9)] + [InlineData(@"\uD87E\uDC94(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 5)] + [InlineData(@"\uD87E\uDC94aaa(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 8)] + [InlineData(@"\uD87E\uDC94\uD87E\uDC94\uD87E\uDC94(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 9)] // End of Nim parser tests ============== [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]