[InlineData(@"(?P<a>.)(?P<a>.)", 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)]
[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(@"(?P<abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_>abc", 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<asd)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 4)]
+ [InlineData(@"a{,}", RegexOptions.None, null)] // Nim error
+ [InlineData(@"a{,1}", RegexOptions.None, null)] // Nim error
+ [InlineData(@"a{0,101}", RegexOptions.None, null)] // Nim error: "Invalid repetition range. Expected 100 repetitions or less, but found: 101"
+ [InlineData(@"a{0,a}", RegexOptions.None, null)] // Nim error
+ [InlineData(@"a{0,bad}", RegexOptions.None, null)] // Nim error: "Invalid repetition range. Range can only contain digits"
+ [InlineData(@"a{1,,,2}", RegexOptions.None, null)] // Nim error
+ [InlineData(@"a{1,,}", RegexOptions.None, null)] // Nim error
+ [InlineData(@"a{1,,2}", RegexOptions.None, null)] // Nim error
+ [InlineData(@"a{1,", RegexOptions.None, null)] // Nim error
+ [InlineData(@"a{1,}??", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 7)]
+ [InlineData(@"a{1,}?", RegexOptions.None, null)]
+ [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}??", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 6)]
+ [InlineData(@"a{1}?", RegexOptions.None, null)]
+ [InlineData(@"a{1}*", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 5)]
+ [InlineData(@"a{1}+", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 5)]
+ [InlineData(@"a{1111111111}", RegexOptions.None, null)] // Nim error: "Invalid repetition range. Max value is 32767."
+ [InlineData(@"a{1x}", RegexOptions.None, null)] // Nim error
+ [InlineData(@"a*??", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)]
+ [InlineData(@"a*{,}", RegexOptions.None, null)] // Nim error
+ [InlineData(@"a*{0}", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)]
+ [InlineData(@"a*{1}", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)]
+ [InlineData(@"a**", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)]
+ [InlineData(@"a*****", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)]
+ [InlineData(@"a*+", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)]
+ [InlineData(@"a+??", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 4)]
+ [InlineData(@"a+*", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)]
+ [InlineData(@"a++", RegexOptions.None, RegexParseError.NestedQuantifiersNotParenthesized, 3)]
+ [InlineData(@"a|?", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 3)]
+ [InlineData(@"a|?b", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 3)]
+ [InlineData(@"a|*", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 3)]
+ [InlineData(@"a|*b", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 3)]
+ [InlineData(@"a|+", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 3)]
+ [InlineData(@"a|+b", RegexOptions.None, RegexParseError.QuantifierAfterNothing, 3)]
+ [InlineData(@"aaa(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 6)]
+ [InlineData(@"abc(?P<abc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 6)]
+ [InlineData(@"abc(?Pabc)", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 6)]
+ [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(@"\uD87E\uDC94(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 15)]
+ [InlineData(@"\uD87E\uDC94aaa(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 18)]
+ [InlineData(@"\uD87E\uDC94\uD87E\uDC94\uD87E\uDC94(?Pabc", RegexOptions.None, RegexParseError.InvalidGroupingConstruct, 39)]
+ // End of Nim parser tests ==============
+
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
public void Parse_Netcoreapp(string pattern, RegexOptions options, RegexParseError? error, int offset = -1)
{
/// </summary>
/// <param name="error">The expected parse error</param>
/// <param name="action">The action to invoke.</param>
- 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
{
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");
}