1 module TTSListenerTest;
2 
3 import std.stdio;
4 import std.conv;
5 
6 version(unittest) {
7 
8     import RuleTranslatorLexer;
9     import RuleTranslatorParser;
10     import TTSListener;
11     import antlr.v4.runtime.ANTLRInputStream;
12     import antlr.v4.runtime.CommonToken;
13     import antlr.v4.runtime.CommonTokenStream;
14     import antlr.v4.runtime.DiagnosticErrorListener;
15     import antlr.v4.runtime.LexerNoViableAltException;
16     import antlr.v4.runtime.Token;
17     import antlr.v4.runtime.atn.ParserATNSimulator;
18     import antlr.v4.runtime.tree.ParseTreeWalker;
19     import dshould : be, equal, not, should;
20     import dshould.thrown;
21     import std.conv : to;
22     import std.file;
23     import unit_threaded;
24 
25     class Test {
26 
27         @Tags("ANTLRInputStream")
28         @("input file missing")
29         unittest {
30             try
31                 auto antlrInput = new ANTLRInputStream(File("simple.rule1"));
32             catch (Exception e)
33                 e.msg.should.equal("Cannot open file `simple.rule1' in " ~
34                                    "mode `rb' (No such file or directory)");
35         }
36 
37         @Tags("Lexer")
38         @("rule")
39         unittest {
40             auto antlrInput = new ANTLRInputStream(File("unittest/complex/complex.rule", "r"));
41             auto lexer = new RuleTranslatorLexer(antlrInput);
42             auto cts = new CommonTokenStream(lexer);
43             cts.getNumberOfOnChannelTokens.should.equal(405);
44             auto f = File("unittest/complex/tokens.cmp");
45             auto charRange = f.byLine();
46             string s;
47             int i;
48             foreach (t; charRange) {
49                 s = cts.get(i++).to!string;
50                 s.should.equal(t);
51             }
52             f.close;
53         }
54 
55         @Tags("Parser")
56         @("simple_rule")
57         unittest {
58             auto antlrInput = new ANTLRInputStream(File("unittest/complex/simple.rule", "r"));
59             auto lexer = new RuleTranslatorLexer(antlrInput);
60             auto cts = new CommonTokenStream(lexer);
61             cts.getNumberOfOnChannelTokens.should.equal(35);
62             auto f = File("unittest/complex/simple_tokens.cmp");
63             auto charRange = f.byLine();
64             string s;
65             int i;
66             foreach (t; charRange) {
67                 s = cts.get(i++).to!string;
68                 s.should.equal(t);
69             }
70             f.close;
71             auto parser = new RuleTranslatorParser(cts);
72             // Specify entry point
73             auto rootContext = parser.file_input;
74             parser.numberOfSyntaxErrors.should.equal(0);
75         }
76 
77         @Tags("Parser")
78         @("simple_rule_syntax_error")
79         unittest {
80             auto antlrInput = new ANTLRInputStream(File("unittest/complex/simple_error.rule", "r"));
81             auto lexer = new RuleTranslatorLexer(antlrInput);
82             auto cts = new CommonTokenStream(lexer);
83             cts.getNumberOfOnChannelTokens.should.equal(36);
84             auto f = File("unittest/complex/simple_tokens_error.cmp");
85             auto charRange = f.byLine();
86             string s;
87             int i;
88             foreach (t; charRange) {
89                 s = cts.get(i++).to!string;
90                 s.should.equal(t);
91             }
92             f.close;
93             auto parser = new RuleTranslatorParser(cts);
94             parser.addErrorListener(new DiagnosticErrorListener!(Token, ParserATNSimulator));
95             // Specify entry point
96             auto rootContext = parser.file_input;
97             parser.numberOfSyntaxErrors.should.equal(2);
98         }
99 
100     }
101 }