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
|
namespace Parser.Tests
|
||||||
{
|
{
|
||||||
|
using static DiagnosticExtensions;
|
||||||
|
|
||||||
public class MParserShould
|
public class MParserShould
|
||||||
{
|
{
|
||||||
private static MParser GetSut(string text)
|
private static MParser GetSut(string text)
|
||||||
@ -66,7 +68,7 @@ namespace Parser.Tests
|
|||||||
var sut = GetSut(text);
|
var sut = GetSut(text);
|
||||||
var actual = sut.Parse();
|
var actual = sut.Parse();
|
||||||
var diagnostics = actual.Root.GetDiagnostics();
|
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]
|
[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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -126,38 +126,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
|
public abstract class StatementSyntaxNode : SyntaxNode
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user