Canon/Canon.Tests/Utils/StringSourceReaderTests.cs
jackfiled 4b6635796c refeat: ILexer接口适配 (#38)
Co-authored-by: Huaps <1183155719@qq.com>
Co-authored-by: duqoo <92306417+duqoo@users.noreply.github.com>
Reviewed-on: PostGuard/Canon#38
2024-04-18 16:34:32 +08:00

72 lines
1.9 KiB
C#

using Canon.Core.Abstractions;
namespace Canon.Tests.Utils;
public class StringSourceReaderTests
{
[Fact]
public void LineFeedTest()
{
ISourceReader reader = new StringSourceReader("program Main;\nbegin\nend.\n");
reader.MoveNext();
CheckLine(reader, "program Main;", 1);
reader.MoveNext();
CheckLine(reader, "begin", 2);
reader.MoveNext();
CheckLine(reader, "end.", 3);
}
[Fact]
public void CarriageReturnLineFeedTest()
{
ISourceReader reader = new StringSourceReader("program Main;\r\nbegin\r\nend.\r\n");
reader.MoveNext();
CheckLine(reader, "program Main;", 1);
reader.MoveNext();
reader.MoveNext();
CheckLine(reader, "begin", 2);
reader.MoveNext();
reader.MoveNext();
CheckLine(reader, "end.", 3);
}
[Fact]
public void RetractTest()
{
ISourceReader reader = new StringSourceReader("test");
reader.MoveNext();
Assert.Equal('t', reader.Current);
Assert.True(reader.MoveNext());
Assert.Equal('e', reader.Current);
Assert.True(reader.Retract());
Assert.Equal('t', reader.Current);
Assert.False(reader.Retract());
}
[Fact]
public void PeekTest()
{
ISourceReader reader = new StringSourceReader("peek");
reader.MoveNext();
Assert.Equal('p', reader.Current);
Assert.True(reader.TryPeekChar(out char? c));
Assert.Equal('e', c);
Assert.Equal('p', reader.Current);
}
private static void CheckLine(ISourceReader reader, string line, uint lineNumber)
{
foreach ((char value, uint index) in line.WithIndex())
{
Assert.Equal(value, reader.Current);
Assert.Equal(lineNumber, reader.Line);
Assert.Equal(index + 1, reader.Pos);
reader.MoveNext();
}
}
}