-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathParserGenerationTests.cs
More file actions
72 lines (64 loc) · 2.3 KB
/
Copy pathParserGenerationTests.cs
File metadata and controls
72 lines (64 loc) · 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using DotPython.ParserGenerator;
using DotPython.ParserGenerator.Generation;
using Xunit;
namespace DotPython.ParserTests;
public sealed class ParserGenerationTests
{
[Fact]
public void Generate_MatchesCheckedInParserAndIsDeterministic()
{
var repositoryRoot = FindRepositoryRoot();
var grammarPath = Path.Combine(
repositoryRoot,
"src",
"DotPython.ParserGenerator",
"Grammar",
"python314-subset.gram"
);
var generatedPath = Path.Combine(
repositoryRoot,
"src",
"DotPython.ParserGenerator",
"Generated",
"PythonGrammar.g.cs"
);
var grammar = File.ReadAllText(grammarPath);
var first = PythonParserSourceGenerator.Generate(grammar);
var second = PythonParserSourceGenerator.Generate(grammar);
var windowsLineEndings = PythonParserSourceGenerator.Generate(
grammar.ReplaceLineEndings("\r\n")
);
Assert.Equal(first, second);
Assert.Equal(first, windowsLineEndings);
Assert.Equal(File.ReadAllText(generatedPath), first);
Assert.Equal(69, ParserGeneratorCapabilities.GeneratedGrammarRuleCount);
Assert.Equal(64, ParserGeneratorCapabilities.GeneratedGrammarFingerprint.Length);
Assert.Contains(
ParserGeneratorCapabilities.GeneratedGrammarFingerprint,
first,
StringComparison.Ordinal
);
}
[Theory]
[InlineData("statement: missing\nfile: statement ENDMARKER")]
[InlineData("file: NAME\nfile: NUMBER")]
[InlineData("statement: NAME")]
[InlineData("file NAME")]
public void Generate_RejectsInvalidGrammar(string grammar)
{
Assert.Throws<InvalidDataException>(() => PythonParserSourceGenerator.Generate(grammar));
}
private static string FindRepositoryRoot()
{
var directory = new DirectoryInfo(AppContext.BaseDirectory);
while (directory is not null)
{
if (File.Exists(Path.Combine(directory.FullName, "DotPython.sln")))
{
return directory.FullName;
}
directory = directory.Parent;
}
throw new InvalidOperationException("The DotPython repository root could not be located.");
}
}