diff --git a/src/Ramstack.Parsing/Parser.Repeat.cs b/src/Ramstack.Parsing/Parser.Repeat.cs index 6e177c1..b637b4c 100644 --- a/src/Ramstack.Parsing/Parser.Repeat.cs +++ b/src/Ramstack.Parsing/Parser.Repeat.cs @@ -132,7 +132,7 @@ public static Parser> Repeat(this Parser parser, int min, int max) Argument.ThrowIfNegativeOrZero(max); Argument.ThrowIfGreaterThan(min, max); - return parser is ICharClassSupport s + return typeof(T) == typeof(char) && parser is ICharClassSupport s ? (Parser>)(object)CreateRepeatParser(s.GetCharClass(), min, max) : new RepeatParser(parser, min, max); } diff --git a/tests/Ramstack.Parsing.Tests/ParsersTests.Repeat.cs b/tests/Ramstack.Parsing.Tests/ParsersTests.Repeat.cs index 5915027..ff92186 100644 --- a/tests/Ramstack.Parsing.Tests/ParsersTests.Repeat.cs +++ b/tests/Ramstack.Parsing.Tests/ParsersTests.Repeat.cs @@ -52,6 +52,19 @@ public void Repeat_5_10_Test() Assert.That(parser.Parse("aaaa").Success, Is.False); } + [Test] + public void Repeat_UnitCharParser_ReturnsUnitList() + { + var parser = L('a').Void().Repeat(2, 3); + var result = parser.Parse("aaaa"); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value, Is.EqualTo(new Unit[3])); + Assert.That(result.Length, Is.EqualTo(3)); + + Assert.That(parser.Parse("a").Success, Is.False); + } + [Test] [SuppressMessage("ReSharper", "InconsistentNaming")] public void Repeat_InfiniteLoopPrevention_ZeroLength()