diff --git a/src/Ramstack.Parsing/Parser.Return.cs b/src/Ramstack.Parsing/Parser.Return.cs index 8aaf35f..0543930 100644 --- a/src/Ramstack.Parsing/Parser.Return.cs +++ b/src/Ramstack.Parsing/Parser.Return.cs @@ -25,6 +25,8 @@ private sealed class ReturnParser(T returnValue) : Parser /// public override bool TryParse(ref ParseContext context, [NotNullWhen(true)] out T? value) { + context.Advance(0); + value = returnValue!; return true; } diff --git a/tests/Ramstack.Parsing.Tests/ParsersTests.Return.cs b/tests/Ramstack.Parsing.Tests/ParsersTests.Return.cs new file mode 100644 index 0000000..f587c5f --- /dev/null +++ b/tests/Ramstack.Parsing.Tests/ParsersTests.Return.cs @@ -0,0 +1,24 @@ +using static Ramstack.Parsing.Parser; + +namespace Ramstack.Parsing; + +partial class ParsersTests +{ + [Test] + public void Return_MatchedSegment_IsEmpty() + { + Assert.That(Return(42).Map(m => (m.Index, m.Length)).Parse("").Value, Is.EqualTo((0, 0))); + Assert.That(Return(42).Map(m => m.ToString()).Parse("").Value, Is.Empty); + Assert.That(Return(42).Text().Parse("abc").Value, Is.Empty); + } + + [Test] + public void Return_AfterMatch_DoesNotReuseStaleMatchedSegment() + { + var text = L("abc").Then(Return(42).Text()); + Assert.That(text.Parse("abc").Value, Is.Empty); + + var segment = L("abc").Then(Return(42).Map(m => (m.Index, m.Length))); + Assert.That(segment.Parse("abc").Value, Is.EqualTo((3, 0))); + } +}