1 module TokenStreamRewriterTest;
2 
3 version(unittest) {
4 
5     import RuleTranslatorLexer;
6     import RuleTranslatorParser: RuleTranslatorParser;
7     import RuleTranslatorBaseListener;
8     import antlr.v4.runtime.ANTLRInputStream;
9     import antlr.v4.runtime.CommonToken;
10     import antlr.v4.runtime.CommonTokenStream;
11     import antlr.v4.runtime.TokenStream;
12     import antlr.v4.runtime.DiagnosticErrorListener;
13     import antlr.v4.runtime.LexerNoViableAltException;
14     import antlr.v4.runtime.Token;
15     import antlr.v4.runtime.TokenStreamRewriter : TokenStreamRewriter;
16     import antlr.v4.runtime.atn.ParserATNSimulator;
17     import antlr.v4.runtime.tree.ParseTreeWalker;
18     import dshould : be, equal, not, should;
19     import dshould.thrown;
20     import std.conv : to;
21     import std.file;
22     import std.variant;
23     import unit_threaded;
24 
25     public class InsertAt0TestListenerReplace : RuleTranslatorBaseListener {
26 
27         TokenStreamRewriter rewriter;
28         Token currentToken;
29 
30         this(TokenStream tokens)
31         {
32             rewriter = new TokenStreamRewriter(tokens);
33         }
34 
35         override public void enterFile_input(RuleTranslatorParser.File_inputContext ctx) {
36             currentToken = ctx.start;
37         }
38 
39         override public void exitStmt(RuleTranslatorParser.StmtContext ctx) {
40             debug(TokenStreamRewriter) {
41                 import std.stdio : writefln;
42                 writefln("exitStmt ctx.start = %s", ctx.start);
43             }
44             Variant parameter = "alpha";
45             rewriter.replace(currentToken, ctx.stop, parameter);
46         }
47     }
48 
49         public class InsertTestListenerReplace : RuleTranslatorBaseListener {
50 
51         TokenStreamRewriter rewriter;
52         Token currentToken;
53 
54         this(TokenStream tokens)
55         {
56             rewriter = new TokenStreamRewriter(tokens);
57         }
58 
59         override public void enterFile_input(RuleTranslatorParser.File_inputContext ctx) {
60             currentToken = ctx.start;
61         }
62 
63         override public void exitStmt(RuleTranslatorParser.StmtContext ctx) {
64             debug(TokenStreamRewriter) {
65                 import std.stdio : writefln;
66                 writefln("exitStmt ctx.start = %s", ctx.start);
67             }
68             Variant parameter = "gamma";
69             rewriter.replace(ctx.start, ctx.stop, parameter);
70         }
71     }
72 
73     public class InsertTestListenerDelete : RuleTranslatorBaseListener {
74 
75         TokenStreamRewriter rewriter;
76 
77         this(TokenStream tokens)
78         {
79             rewriter = new TokenStreamRewriter(tokens);
80         }
81 
82         /**
83          * {@inheritDoc}
84          *
85          * <p>The default implementation does nothing.</p>
86          */
87         override public void exitStmt(RuleTranslatorParser.StmtContext ctx) {
88             debug(TokenStreamRewriter) {
89                 import std.stdio : writefln;
90                 writefln("exitStmt ctx.start = %s", ctx.start);
91             }
92             rewriter.deleteT(ctx.start, ctx.stop);
93         }
94     }
95 
96     public class InsertTestListener : RuleTranslatorBaseListener {
97 
98         TokenStreamRewriter rewriter;
99 
100         this(TokenStream tokens)
101         {
102             rewriter = new TokenStreamRewriter(tokens);
103         }
104 
105         /**
106          * {@inheritDoc}struct Result { ushort indent; string text;}
107          *
108          * <p>The default implementation does nothing.</p>
109          */
110         override public void exitStmt(RuleTranslatorParser.StmtContext ctx) {
111             Variant str_a = "alpha";
112             Variant str_b = "beta";
113             rewriter.insertBefore(ctx.start, str_a);
114             rewriter.insertAfter(ctx.start, str_b);
115         }
116     }
117 
118     class Test {
119         @Tags("TokenStreamRewriter")
120         @("replace_and_delete")
121         unittest {
122             auto input =
123                 `# Text definition DEFAS
124 # for automatic announcements
125 # Version 2018-02-21
126 
127 rule Delay as DELAY de
128 base de.Phrases
129 
130 "Information zu"
131 `
132                 ;
133 
134             auto expected =
135                 `
136 ruleDelayasDELAYde
137 basede.Phrases
138 gamma`;
139 
140             auto antlrInput = new ANTLRInputStream(input);
141             auto lexer = new RuleTranslatorLexer(antlrInput);
142             auto cts = new CommonTokenStream(lexer);
143             cts.fill;
144             auto tokens = cts.getTokens;
145             cts.getNumberOfOnChannelTokens.should.equal(15);
146             auto parser = new RuleTranslatorParser(cts);
147             // Specify entry point
148             auto rootContext = parser.file_input;
149             parser.numberOfSyntaxErrors.should.equal(0);
150             auto extractor = new InsertTestListenerReplace(cts);
151             auto walker = new ParseTreeWalker;
152             walker.walk(extractor, rootContext);
153             auto str = extractor.rewriter.getText.get!(string);
154             str.should.equal(expected);
155             extractor.rewriter.deleteProgram;
156             str = extractor.rewriter.getText.get!(string);
157             expected =
158                 `
159 ruleDelayasDELAYde
160 basede.Phrases
161 "Information zu"
162 `;
163             str.should.equal(expected);
164         }
165 
166         @Tags("TokenStreamRewriter")
167         @("insert after and before")
168         unittest {
169             auto input =
170                 `# Text definition DEFAS
171 # for automatic announcements
172 # Version 2018-02-21
173 
174 rule Delay as DELAY de
175 base de.Phrases
176 
177 "Information zu"
178 `
179                 ;
180 
181             auto expected =
182                 `
183 ruleDelayasDELAYde
184 basede.Phrases
185 alpha"Information zu"beta
186 `;
187 
188             auto antlrInput = new ANTLRInputStream(input);
189             auto lexer = new RuleTranslatorLexer(antlrInput);
190             auto cts = new CommonTokenStream(lexer);
191             cts.fill;
192             auto tokens = cts.getTokens;
193             cts.getNumberOfOnChannelTokens.should.equal(15);
194             auto parser = new RuleTranslatorParser(cts);
195             // Specify entry point
196             auto rootContext = parser.file_input;
197             parser.numberOfSyntaxErrors.should.equal(0);
198             auto extractor = new InsertTestListener(cts);
199             auto walker = new ParseTreeWalker;
200             walker.walk(extractor, rootContext);
201             auto str = extractor.rewriter.getText.get!(string);
202             str.should.equal(expected);
203         }
204     }
205 
206     @Tags("TokenStreamRewriter")
207         @("deleteT")
208         unittest {
209             auto input =
210                 `# Text definition DEFAS
211 # for automatic announcements
212 # Version 2018-02-21
213 
214 rule Delay as DELAY de
215 base de.Phrases
216 
217 "Information zu"
218 `
219                 ;
220 
221             auto expected =
222                 `
223 ruleDelayasDELAYde
224 basede.Phrases
225 `;
226 
227             auto antlrInput = new ANTLRInputStream(input);
228             auto lexer = new RuleTranslatorLexer(antlrInput);
229             auto cts = new CommonTokenStream(lexer);
230             cts.fill;
231             auto tokens = cts.getTokens;
232             cts.getNumberOfOnChannelTokens.should.equal(15);
233             auto parser = new RuleTranslatorParser(cts);
234             // Specify entry point
235             auto rootContext = parser.file_input;
236             parser.numberOfSyntaxErrors.should.equal(0);
237             auto extractor = new InsertTestListenerDelete(cts);
238             auto walker = new ParseTreeWalker;
239             walker.walk(extractor, rootContext);
240             auto str = extractor.rewriter.getText.get!(string);
241             str.should.equal(expected);
242         }
243 
244         @Tags("TokenStreamRewriter")
245         @("replaceAt0")
246         unittest {
247             auto input =
248                 `# Text definition DEFAS
249 # for automatic announcements
250 # Version 2018-02-21
251 
252 rule Delay as DELAY de
253 base de.Phrases
254 
255 "Information zu"
256 `
257                 ;
258 
259             auto expected = "alpha";
260 
261             auto antlrInput = new ANTLRInputStream(input);
262             auto lexer = new RuleTranslatorLexer(antlrInput);
263             auto cts = new CommonTokenStream(lexer);
264             cts.fill;
265             auto tokens = cts.getTokens;
266             cts.getNumberOfOnChannelTokens.should.equal(15);
267             auto parser = new RuleTranslatorParser(cts);
268             // Specify entry point
269             auto rootContext = parser.file_input;
270             parser.numberOfSyntaxErrors.should.equal(0);
271             auto extractor = new InsertAt0TestListenerReplace(cts);
272             auto walker = new ParseTreeWalker;
273             walker.walk(extractor, rootContext);
274             auto str = extractor.rewriter.getText.get!(string);
275             str.should.equal(expected);
276         }
277 
278 }