public void ProgramsShouldProduceExpectedUserDeclaredSymbols(DataSet dataSet) { var compilation = dataSet.CopyFilesAndCreateCompilation(TestContext, out var outputDirectory); var model = compilation.GetEntrypointSemanticModel(); var symbols = SymbolCollector .CollectSymbols(model) .OfType <DeclaredSymbol>(); var lineStarts = compilation.SyntaxTreeGrouping.EntryPoint.LineStarts; string getLoggingString(DeclaredSymbol symbol) { (_, var startChar) = TextCoordinateConverter.GetPosition(lineStarts, symbol.DeclaringSyntax.Span.Position); return($"{symbol.Kind} {symbol.Name}. Type: {symbol.Type}. Declaration start char: {startChar}, length: {symbol.DeclaringSyntax.Span.Length}"); } var sourceTextWithDiags = DataSet.AddDiagsToSourceText(dataSet, symbols, symb => symb.NameSyntax.Span, getLoggingString); var resultsFile = Path.Combine(outputDirectory, DataSet.TestFileMainDiagnostics); File.WriteAllText(resultsFile, sourceTextWithDiags); sourceTextWithDiags.Should().EqualWithLineByLineDiffOutput( TestContext, dataSet.Symbols, expectedLocation: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainSymbols), actualLocation: resultsFile); }
public void Parser_should_produce_expected_syntax(DataSet dataSet) { var program = ParserHelper.Parse(dataSet.Bicep); var syntaxList = SyntaxCollectorVisitor.Build(program); string getLoggingString(SyntaxCollectorVisitor.SyntaxItem data) { var depthPrefix = new string(' ', data.Depth); if (data.Syntax is Token token) { return($"{depthPrefix}{token.Type} |{OutputHelper.EscapeWhitespace(token.Text)}|"); } return($"{depthPrefix}{data.Syntax.GetType().Name}"); } TextSpan getSpan(SyntaxCollectorVisitor.SyntaxItem data) => data.Syntax.Span; var sourceTextWithDiags = DataSet.AddDiagsToSourceText(dataSet, syntaxList, getSpan, getLoggingString); var resultsFile = FileHelper.SaveResultFile(this.TestContext, Path.Combine(dataSet.Name, DataSet.TestFileMainSyntax), sourceTextWithDiags); sourceTextWithDiags.Should().EqualWithLineByLineDiffOutput( TestContext, dataSet.Syntax, expectedLocation: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainSyntax), actualLocation: resultsFile); }
public void ProgramsShouldProduceExpectedDiagnostics(DataSet dataSet) { var compilation = dataSet.CopyFilesAndCreateCompilation(TestContext, out var outputDirectory); var model = compilation.GetEntrypointSemanticModel(); var sourceTextWithDiags = DataSet.AddDiagsToSourceText(dataSet, model.GetAllDiagnostics(), diag => OutputHelper.GetDiagLoggingString(dataSet.Bicep, outputDirectory, diag)); var resultsFile = Path.Combine(outputDirectory, DataSet.TestFileMainDiagnostics); File.WriteAllText(resultsFile, sourceTextWithDiags); sourceTextWithDiags.Should().EqualWithLineByLineDiffOutput( TestContext, dataSet.Diagnostics, expectedLocation: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainDiagnostics), actualLocation: resultsFile); }
public void ProgramsShouldProduceExpectedDiagnostics(DataSet dataSet) { var compilation = dataSet.CopyFilesAndCreateCompilation(TestContext, out var outputDirectory, out _); var model = compilation.GetEntrypointSemanticModel(); // use a deterministic order var diagnostics = model.GetAllDiagnostics() .OrderBy(x => x.Span.Position) .ThenBy(x => x.Span.Length) .ThenBy(x => x.Message, StringComparer.Ordinal); var sourceTextWithDiags = DataSet.AddDiagsToSourceText(dataSet, diagnostics, diag => OutputHelper.GetDiagLoggingString(dataSet.Bicep, outputDirectory, diag)); var resultsFile = Path.Combine(outputDirectory, DataSet.TestFileMainDiagnostics); File.WriteAllText(resultsFile, sourceTextWithDiags); sourceTextWithDiags.Should().EqualWithLineByLineDiffOutput( TestContext, dataSet.Diagnostics, expectedLocation: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainDiagnostics), actualLocation: resultsFile); }
public void LexerShouldProduceExpectedTokens(DataSet dataSet) { var lexer = new Lexer(new SlidingTextWindow(dataSet.Bicep), ToListDiagnosticWriter.Create()); lexer.Lex(); string getLoggingString(Token token) { return($"{token.Type} |{token.Text}|"); } var sourceTextWithDiags = DataSet.AddDiagsToSourceText(dataSet, lexer.GetTokens(), getLoggingString); var resultsFile = FileHelper.SaveResultFile(this.TestContext, Path.Combine(dataSet.Name, DataSet.TestFileMainTokens), sourceTextWithDiags); sourceTextWithDiags.Should().EqualWithLineByLineDiffOutput( TestContext, dataSet.Tokens, expectedLocation: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainTokens), actualLocation: resultsFile); lexer.GetTokens().Count(token => token.Type == TokenType.EndOfFile).Should().Be(1, "because there should only be 1 EOF token"); lexer.GetTokens().Last().Type.Should().Be(TokenType.EndOfFile, "because the last token should always be EOF."); }