Add diagnostics tests

This commit is contained in:
Alexander Luzgarev 2019-04-11 19:31:32 +02:00
parent fe5012bd29
commit f8096100c0
5 changed files with 86 additions and 33 deletions

View 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);
}
}
}

View File

@ -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]

View 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;
}
}
}

View 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;
}
}
}

View File

@ -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 public abstract class StatementSyntaxNode : SyntaxNode
{ {
internal StatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) internal StatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position)