Skip to content

Commit

Permalink
Create method to get parser and cleanup snapshot tests (#205)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tinggaard authored Apr 22, 2024
1 parent 20456b2 commit 92e9015
Show file tree
Hide file tree
Showing 8 changed files with 47 additions and 72 deletions.
33 changes: 25 additions & 8 deletions SocietalConstructionTool/SctRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,30 @@ namespace Sct
{
public static class SctRunner
{
/// <summary>
/// Return the parser for the given SCT source file
/// </summary>
/// <param name="filename">File to parse</param>
/// <returns>The parser from ANTLR</returns>
public static SctParser GetParser(string filename) =>
GetSctParser(File.ReadAllText(filename));

/// <summary>
/// Return the parser for the given SCT source file asynchronously
/// </summary>
/// <param name="filename">File to parse</param>
/// <returns>The parser from ANTLR</returns>
public static async Task<SctParser> GetParserAsync(string filename) =>
GetSctParser(await File.ReadAllTextAsync(filename));

private static SctParser GetSctParser(string input)
{
ICharStream stream = CharStreams.fromString(input);
ITokenSource lexer = new SctLexer(stream);
ITokenStream tokens = new CommonTokenStream(lexer);
return new SctParser(tokens);
}

/**
* <summary>
* Reads an SCT source file, statically chekcs it and translates it into C# code
Expand All @@ -25,7 +49,6 @@ public static class SctRunner
*/
public static (string? outputText, IEnumerable<CompilerError> errors) CompileSct(string[] filenames)
{

// Make SctTableVisitor take a CTableBuilder as a parameter
// Analyse each file separately
// Add file name to each found error.
Expand All @@ -42,14 +65,8 @@ public static (string? outputText, IEnumerable<CompilerError> errors) CompileSct
// Run static analysis on each file separately.
foreach (var file in filenames)
{
string input = File.ReadAllText(file);
ICharStream fileStream = CharStreams.fromString(input);
ITokenSource fileLexer = new SctLexer(fileStream);
ITokenStream fileTokens = new CommonTokenStream(fileLexer);

var fileParser = new SctParser(fileTokens);
// Save parser for later use.
startNodes[file] = fileParser.start();
startNodes[file] = GetParser(file).start();
var startNode = startNodes[file];

KeywordContextCheckVisitor keywordChecker = new();
Expand Down
8 changes: 4 additions & 4 deletions SocietalConstructionToolTests/AbstractSnapshotTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ namespace SocietalConstructionToolTests
{
public abstract class AbstractSnapshotTests : VerifyBase
{
// yield all files in TestFiles directory
protected static IEnumerable<string[]> Files =>
Directory.GetFiles(Path.Join(AppDomain.CurrentDomain.BaseDirectory, "TestFiles/Parser"))
.Select(f => new[] { f });
// yield all files in some subdirectory of the TestFiles directory
protected static IEnumerable<string[]> GetTestFiles(string dir) =>
Directory.GetFiles(Path.Join(AppDomain.CurrentDomain.BaseDirectory, "TestFiles", dir))
.Select(f => new[] { f });


[ClassInitialize(InheritanceBehavior.BeforeEachDerivedClass)]
Expand Down
8 changes: 1 addition & 7 deletions SocietalConstructionToolTests/BehaviourTests.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using Microsoft.CodeAnalysis;

using Sct;
using Sct.Runtime.Trace;

Expand All @@ -8,10 +6,7 @@ namespace SocietalConstructionToolTests
[TestClass]
public class BehaviourTests : AbstractSnapshotTests
{

private static new IEnumerable<string[]> Files =>
Directory.GetFiles(Path.Join(AppDomain.CurrentDomain.BaseDirectory, "TestFiles", "BehaviourTests"))
.Select(f => new[] { f });
private static IEnumerable<string[]> Files => GetTestFiles("BehaviourTests");

// Run each file as a seperate test
[DataTestMethod]
Expand All @@ -32,5 +27,4 @@ public async Task RunFile(string file)
.UseFileName(Path.GetFileNameWithoutExtension(file));
}
}

}
12 changes: 4 additions & 8 deletions SocietalConstructionToolTests/ParserTests.cs
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
using Antlr4.Runtime;
using Sct;

namespace SocietalConstructionToolTests
{
[TestClass]
public class ParserTests : AbstractSnapshotTests
{
private static new IEnumerable<string[]> Files => AbstractSnapshotTests.Files;
private static IEnumerable<string[]> Files => GetTestFiles("Parser");

[DataTestMethod]
[DynamicData(nameof(Files), DynamicDataSourceType.Property)]
public async Task ParseFile(string testFile)
{
UseProjectRelativeDirectory("Snapshots/ParserTests"); // save snapshots here

string input = await File.ReadAllTextAsync(testFile);
ICharStream stream = CharStreams.fromString(input);
ITokenSource lexer = new SctLexer(stream);
ITokenStream tokens = new CommonTokenStream(lexer);
SctParser parser = new(tokens);
SctParser.StartContext result = parser.start();
var parser = await SctRunner.GetParserAsync(testFile);
var result = parser.start();

_ = await Verify(result.ToStringTree(parser))
.UseFileName(Path.GetFileNameWithoutExtension(testFile));
Expand Down
7 changes: 2 additions & 5 deletions SocietalConstructionToolTests/SplitFileTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@ namespace SocietalConstructionToolTests
[TestClass]
public class SplitFileTests : AbstractSnapshotTests
{
private static new IEnumerable<string[]> Files =>
Directory.GetFiles(Path.Join(AppDomain.CurrentDomain.BaseDirectory, "TestFiles", "SplitFileTests"))
.Select(f => new[] { f });

private static IEnumerable<string[]> Files => GetTestFiles("SplitFileTests");

[DataTestMethod]
public async Task RunFiles()
Expand All @@ -21,7 +18,7 @@ public async Task RunFiles()

var (outputText, errors) = SctRunner.CompileSct(files);

Assert.IsTrue(errors.Count() == 0, string.Join("\n", errors));
Assert.IsFalse(errors.Any(), string.Join("\n", errors));
Assert.IsNotNull(outputText);
_ = await Verify(outputText)
.UseFileName(Path.GetFileNameWithoutExtension(files[0]));
Expand Down
16 changes: 3 additions & 13 deletions SocietalConstructionToolTests/StaticCheckerTests.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
using Antlr4.Runtime;

using Sct;
using Sct.Compiler.Typechecker;

namespace SocietalConstructionToolTests
{
[TestClass]
public class StaticCheckerTests : AbstractSnapshotTests
{

private static new IEnumerable<string[]> Files =>
Directory.GetFiles(Path.Join(AppDomain.CurrentDomain.BaseDirectory, "TestFiles", "StaticCheckTests"))
.Select(f => new[] { f });
private static IEnumerable<string[]> Files => GetTestFiles("StaticCheckTests");

// Run each file as a seperate test
[DataTestMethod]
Expand All @@ -19,12 +15,7 @@ public async Task RunFile(string file)
{
UseProjectRelativeDirectory("Snapshots/StaticCheckTests"); // save snapshots here

string input = File.ReadAllText(file);
ICharStream stream = CharStreams.fromString(input);
ITokenSource lexer = new SctLexer(stream);
ITokenStream tokens = new CommonTokenStream(lexer);
SctParser parser = new(tokens);

SctParser parser = await SctRunner.GetParserAsync(file);
var startNode = parser.start();

KeywordContextCheckVisitor keywordChecker = new();
Expand All @@ -34,5 +25,4 @@ public async Task RunFile(string file)
.UseFileName(Path.GetFileNameWithoutExtension(file));
}
}

}
11 changes: 3 additions & 8 deletions SocietalConstructionToolTests/TranslatorTests.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
using Antlr4.Runtime;

using Microsoft.CodeAnalysis;

using Sct;
using Sct.Compiler.Translator;

namespace SocietalConstructionToolTests
{
[TestClass]
public class TranslatorTests : AbstractSnapshotTests
{
private static new IEnumerable<string[]> Files => AbstractSnapshotTests.Files;
private static IEnumerable<string[]> Files => GetTestFiles("Parser");

// Run each file as a seperate test
[DataTestMethod]
Expand All @@ -18,11 +17,7 @@ public async Task TranslateFile(string file)
{
UseProjectRelativeDirectory("Snapshots/TranslatorTests"); // save snapshots here

string input = File.ReadAllText(file);
ICharStream stream = CharStreams.fromString(input);
ITokenSource lexer = new SctLexer(stream);
ITokenStream tokens = new CommonTokenStream(lexer);
SctParser parser = new(tokens);
SctParser parser = await SctRunner.GetParserAsync(file);
var listener = new SctTranslator();
parser.AddParseListener(listener);
_ = parser.start();
Expand Down
24 changes: 5 additions & 19 deletions SocietalConstructionToolTests/TypecheckerTests.cs
Original file line number Diff line number Diff line change
@@ -1,37 +1,23 @@
using Antlr4.Runtime;

using Sct;
using Sct.Compiler;
using Sct.Compiler.Typechecker;

namespace SocietalConstructionToolTests
{
[TestClass]
public class TypeCheckerTests : VerifyBase
public class TypeCheckerTests : AbstractSnapshotTests
{
private static IEnumerable<string[]> Files =>
Directory.GetFiles(Path.Join(AppDomain.CurrentDomain.BaseDirectory, "TestFiles/Typechecker"))
.Select(f => new[] { f });

[ClassInitialize]
public static void Setup(TestContext _)
{
DiffEngine.DiffRunner.Disabled = true; // avoid destroying your terminal
}
private static IEnumerable<string[]> Files => GetTestFiles("Typechecker");

[DataTestMethod]
[DynamicData(nameof(Files), DynamicDataSourceType.Property)]
public async Task TypecheckFile(string testFile)
{
UseProjectRelativeDirectory("Snapshots/TypeCheckerTests"); // save snapshots here

string input = await File.ReadAllTextAsync(testFile);
ICharStream stream = CharStreams.fromString(input);
ITokenSource lexer = new SctLexer(stream);
ITokenStream tokens = new CommonTokenStream(lexer);

List<CompilerError> errors = new();
SctParser parser = new(tokens);
SctParser parser = await SctRunner.GetParserAsync(testFile);
SctParser.StartContext startNode = parser.start();
List<CompilerError> errors = new();

var returnChecker = new SctReturnCheckVisitor();
_ = startNode.Accept(returnChecker);
Expand Down

0 comments on commit 92e9015

Please sign in to comment.