Add diagnostics tests
This commit is contained in:
parent
fe5012bd29
commit
f8096100c0
47
Parser.Tests/DiagnosticExtensions.cs
Normal file
47
Parser.Tests/DiagnosticExtensions.cs
Normal file
@ -0,0 +1,47 @@
|
||||
using System.Linq;
|
||||
|
||||
namespace Parser.Tests
|
||||
{
|
||||
public static class DiagnosticExtensions
|
||||
{
|
||||
public static bool IsEquivalentTo(this SyntaxDiagnostic[] actualSequence, params SyntaxDiagnostic[] expectedSequence)
|
||||
{
|
||||
if (actualSequence.Length != expectedSequence.Length)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var actualSorted = actualSequence.OrderBy(x => x.Position).ToArray();
|
||||
var expectedSorted = expectedSequence.OrderBy(x => x.Position).ToArray();
|
||||
for (var i = 0; i < expectedSequence.Length; i++)
|
||||
{
|
||||
var expected = expectedSequence[i];
|
||||
var actual = actualSequence[i];
|
||||
if (expected.Position != actual.Position)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (expected is MissingTokenSyntaxDiagnostic expectedMissingToken)
|
||||
{
|
||||
if (!(actual is MissingTokenSyntaxDiagnostic actualMissingToken))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (expectedMissingToken.Kind != actualMissingToken.Kind)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static MissingTokenSyntaxDiagnostic MissingToken(int position, TokenKind kind)
|
||||
{
|
||||
return new MissingTokenSyntaxDiagnostic(position, kind);
|
||||
}
|
||||
}
|
||||
}
|
@ -2,6 +2,8 @@
|
||||
|
||||
namespace Parser.Tests
|
||||
{
|
||||
using static DiagnosticExtensions;
|
||||
|
||||
public class MParserShould
|
||||
{
|
||||
private static MParser GetSut(string text)
|
||||
@ -66,7 +68,7 @@ namespace Parser.Tests
|
||||
var sut = GetSut(text);
|
||||
var actual = sut.Parse();
|
||||
var diagnostics = actual.Root.GetDiagnostics();
|
||||
Assert.Collection(actual.Diagnostics, item => Assert.Equal("Unexpected token 'SemicolonToken', expected 'IdentifierToken'.", item.Message));
|
||||
Assert.True(diagnostics.IsEquivalentTo(MissingToken(4, TokenKind.IdentifierToken)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
13
Parser/MissingTokenSyntaxDiagnostic.cs
Normal file
13
Parser/MissingTokenSyntaxDiagnostic.cs
Normal file
@ -0,0 +1,13 @@
|
||||
namespace Parser
|
||||
{
|
||||
public class MissingTokenSyntaxDiagnostic : SyntaxDiagnostic
|
||||
{
|
||||
public TokenKind Kind { get; }
|
||||
|
||||
public MissingTokenSyntaxDiagnostic(int position, TokenKind tokenKind)
|
||||
: base(position)
|
||||
{
|
||||
Kind = tokenKind;
|
||||
}
|
||||
}
|
||||
}
|
23
Parser/SyntaxDiagnostic.cs
Normal file
23
Parser/SyntaxDiagnostic.cs
Normal file
@ -0,0 +1,23 @@
|
||||
namespace Parser
|
||||
{
|
||||
public class SyntaxDiagnostic
|
||||
{
|
||||
public int Position { get; }
|
||||
|
||||
public static SyntaxDiagnostic From(Internal.TokenDiagnostic diagnostic, int Position)
|
||||
{
|
||||
switch (diagnostic)
|
||||
{
|
||||
case Internal.MissingTokenDiagnostic missingToken:
|
||||
return new MissingTokenSyntaxDiagnostic(Position, missingToken.Kind);
|
||||
}
|
||||
|
||||
throw new System.ArgumentOutOfRangeException(nameof(diagnostic));
|
||||
}
|
||||
|
||||
protected SyntaxDiagnostic(int position)
|
||||
{
|
||||
Position = position;
|
||||
}
|
||||
}
|
||||
}
|
@ -127,38 +127,6 @@ namespace Parser
|
||||
}
|
||||
}
|
||||
|
||||
public class SyntaxDiagnostic
|
||||
{
|
||||
public int Position { get; }
|
||||
|
||||
public static SyntaxDiagnostic From(Internal.TokenDiagnostic diagnostic, int Position)
|
||||
{
|
||||
switch (diagnostic)
|
||||
{
|
||||
case Internal.MissingTokenDiagnostic missingToken:
|
||||
return new MissingTokenSyntaxDiagnostic(Position, missingToken.Kind);
|
||||
}
|
||||
|
||||
throw new System.ArgumentOutOfRangeException(nameof(diagnostic));
|
||||
}
|
||||
|
||||
protected SyntaxDiagnostic(int position)
|
||||
{
|
||||
Position = position;
|
||||
}
|
||||
}
|
||||
|
||||
public class MissingTokenSyntaxDiagnostic : SyntaxDiagnostic
|
||||
{
|
||||
public TokenKind Kind { get; }
|
||||
|
||||
internal MissingTokenSyntaxDiagnostic(int position, TokenKind tokenKind)
|
||||
: base(position)
|
||||
{
|
||||
Kind = tokenKind;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class StatementSyntaxNode : SyntaxNode
|
||||
{
|
||||
internal StatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position)
|
||||
|
Loading…
x
Reference in New Issue
Block a user