Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.lib / org.gvsig.expressionevaluator.lib.impl / src / test / java / org / gvsig / expresionevaluator / impl / TestGrammarInterpreter.java @ 44619

History | View | Annotate | Download (13.9 KB)

1 44139 jjdelcerro
package org.gvsig.expresionevaluator.impl;
2
3
import static junit.framework.Assert.assertEquals;
4
import junit.framework.TestCase;
5
import org.gvsig.expressionevaluator.Code;
6
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
7
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
8
import org.gvsig.expressionevaluator.Interpreter;
9
import org.gvsig.expressionevaluator.LexicalAnalyzer;
10
import org.gvsig.expressionevaluator.SymbolTable;
11
import org.gvsig.expressionevaluator.Compiler;
12
import org.gvsig.expressionevaluator.MutableSymbolTable;
13
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
14
15
/**
16
 *
17
 * @author jjdelcerro
18
 */
19
public class TestGrammarInterpreter extends TestCase {
20
21
    public TestGrammarInterpreter(String testName) {
22
        super(testName);
23
    }
24
25
    @Override
26
    protected void setUp() throws Exception {
27
        super.setUp();
28
        new DefaultLibrariesInitializer().fullInitialize();
29
    }
30
31
    @Override
32
    protected void tearDown() throws Exception {
33
        super.tearDown();
34
    }
35
36
    // TODO add test methods here. The name must begin with 'test'. For example:
37
    // public void testHello() {}
38
39
    protected LexicalAnalyzer createLexicalAnalyzer() {
40
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
41
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
42
        return lexer;
43
    }
44
45
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
46
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
47
        Compiler compiler = manager.createCompiler();
48
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
49
        return compiler;
50
    }
51
52
    protected MutableSymbolTable createSymbolTable() {
53
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
54
        MutableSymbolTable symbolTable = manager.createSymbolTable();
55
        symbolTable.setVar("precio", 200);
56
        symbolTable.setVar("1990", 0.168873933773767);
57
        return symbolTable;
58
    }
59
60
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
61
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
62
        Interpreter interpreter = manager.createInterpreter();
63
        interpreter.setSymbolTable(symbolTable);
64
        return interpreter;
65
    }
66
67
    public void testLet() {
68
        SymbolTable symbolTable = createSymbolTable();
69
        Compiler compiler = createCompiler();
70
        Interpreter interpreter = createInterpreter(symbolTable);
71
72
        String source = "LET V1 = 23";
73
74
        Code code = compiler.compileExpression(source);
75
        Object v = interpreter.run(code);
76
77
        assertEquals(23, symbolTable.value("V1"));
78
    }
79
80
    public void testBlock() {
81
        SymbolTable symbolTable = createSymbolTable();
82
        Compiler compiler = createCompiler();
83
        Interpreter interpreter = createInterpreter(symbolTable);
84
85
        String source = "BEGIN SET V1 = 23 END";
86
        Code code = compiler.compileExpression(source);
87
        Object v = interpreter.run(code);
88
89
        assertEquals(23, symbolTable.value("V1"));
90
    }
91
92
    public void testBlock2() {
93
        SymbolTable symbolTable = createSymbolTable();
94
        Compiler compiler = createCompiler();
95
        Interpreter interpreter = createInterpreter(symbolTable);
96
97
        String source = "BEGIN SET V1 = 11; SET V2 = 22  END";
98
        Code code = compiler.compileExpression(source);
99
        Object v = interpreter.run(code);
100
101
        assertEquals((Integer)11, symbolTable.value("V1"));
102
        assertEquals((Integer)22, symbolTable.value("V2"));
103
    }
104
105
    public void testIfThen() {
106
        MutableSymbolTable symbolTable = createSymbolTable();
107
        Compiler compiler = createCompiler();
108
        Interpreter interpreter = createInterpreter(symbolTable);
109
110
        symbolTable.setVar("V1", 10);
111 44379 jjdelcerro
        String source = "IF V1 = 11 THEN SET V2 = 22; END IF";
112 44139 jjdelcerro
        Code code = compiler.compileExpression(source);
113
        Object v = interpreter.run(code);
114
115
        assertEquals(null, v);
116
        assertEquals((Integer)10, symbolTable.value("V1"));
117
        assertEquals(null, symbolTable.value("V2"));
118
119
        symbolTable.setVar("V1", 11);
120 44379 jjdelcerro
        source = "IF V1 = 11 THEN SET V2 = 22; END IF";
121 44139 jjdelcerro
        code = compiler.compileExpression(source);
122
        v = interpreter.run(code);
123
124
        assertEquals((Integer)22, v);
125
        assertEquals((Integer)11, symbolTable.value("V1"));
126
        assertEquals((Integer)22, symbolTable.value("V2"));
127
    }
128
129
    public void testIfThenElse() {
130
        MutableSymbolTable symbolTable = createSymbolTable();
131
        Compiler compiler = createCompiler();
132
        Interpreter interpreter = createInterpreter(symbolTable);
133
134
        symbolTable.setVar("V1", 10);
135 44379 jjdelcerro
        String source = "IF V1 = 11 THEN SET V2 = 11; ELSE SET V2 = 22; END IF";
136 44139 jjdelcerro
        Code code = compiler.compileExpression(source);
137
        Object v = interpreter.run(code);
138
139
        assertEquals((Integer)22, v);
140
        assertEquals((Integer)10, symbolTable.value("V1"));
141
        assertEquals((Integer)22, symbolTable.value("V2"));
142
    }
143
144
    public void testIfThenBlock() {
145
        MutableSymbolTable symbolTable = createSymbolTable();
146
        Compiler compiler = createCompiler();
147
        Interpreter interpreter = createInterpreter(symbolTable);
148
149
        symbolTable.setVar("V1", 11);
150 44379 jjdelcerro
        String source = "IF V1 = 11 THEN LET V2 = 22; LET V1 = 10; END IF";
151 44139 jjdelcerro
        Code code = compiler.compileExpression(source);
152
        Object v = interpreter.run(code);
153
154
        assertEquals((Integer)10, v);
155
        assertEquals((Integer)10, symbolTable.value("V1"));
156
        assertEquals((Integer)22, symbolTable.value("V2"));
157
    }
158
159
    public void testWhile() {
160
        MutableSymbolTable symbolTable = createSymbolTable();
161
        Compiler compiler = createCompiler();
162
        Interpreter interpreter = createInterpreter(symbolTable);
163
164
        symbolTable.setVar("n",0);
165 44379 jjdelcerro
        String source = "WHILE n < 10 BEGIN SET n = n + 1; END WHILE";
166 44139 jjdelcerro
        Code code = compiler.compileExpression(source);
167
        Object v = interpreter.run(code);
168
169
        assertEquals((Integer)10, v);
170
        assertEquals((Integer)10, symbolTable.value("n"));
171
    }
172
173
    public void testWhileBlock() {
174
        MutableSymbolTable symbolTable = createSymbolTable();
175
        Compiler compiler = createCompiler();
176
        Interpreter interpreter = createInterpreter(symbolTable);
177
178
        symbolTable.setVar("n",0);
179
        String source = "WHILE n < 10 BEGIN SET n = n + 1; print(n) END";
180
        Code code = compiler.compileExpression(source);
181
        Object v = interpreter.run(code);
182
183
        assertEquals((Integer)10, v);
184
        assertEquals((Integer)10, symbolTable.value("n"));
185
    }
186
187
    public void testCast() {
188
        MutableSymbolTable symbolTable = createSymbolTable();
189
        Compiler compiler = createCompiler();
190
        Interpreter interpreter = createInterpreter(symbolTable);
191
192
        symbolTable.setVar("n",1.0);
193
        String source = "CAST n AS INTEGER";
194
        Code code = compiler.compileExpression(source);
195
        Object v = interpreter.run(code);
196
197
        assertEquals((Integer)1, v);
198
        assertEquals((Double)1.0, symbolTable.value("n"));
199
    }
200
201
    public void testMatch() {
202
        Compiler compiler = createCompiler();
203
        String source;
204
        Code code;
205
206
        source = "MATCH 'Hola', '[Hh]ola'";
207
        code = compiler.compileExpression(source);
208
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
209
210
        source = "MATCH 'Hola' '[Hh]ola'";
211
        code = compiler.compileExpression(source);
212
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
213
214
        source = "MATCH('Hola', '[Hh]ola')";
215
        code = compiler.compileExpression(source);
216
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
217
    }
218
219
    public void testForEach() {
220
        MutableSymbolTable symbolTable = createSymbolTable();
221
        Compiler compiler = createCompiler();
222
        Interpreter interpreter = createInterpreter(symbolTable);
223
224 44379 jjdelcerro
        String source = "FOR n in RANGE(10) BEGIN print(n); END FOR";
225 44139 jjdelcerro
        Code code = compiler.compileExpression(source);
226
        Object v = interpreter.run(code);
227
228
        assertEquals((Long)9L, v);
229
        assertEquals((Long)9L, symbolTable.value("n"));
230
    }
231
232
    public void testCase() {
233
        MutableSymbolTable symbolTable = createSymbolTable();
234
        Compiler compiler = createCompiler();
235
        Interpreter interpreter = createInterpreter(symbolTable);
236
237
        symbolTable.setVar("software","unknown");
238
        String source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG' ELSE 'Other' END"; // ;)
239
        Code code = compiler.compileExpression(source);
240
        Object v = interpreter.run(code);
241
        assertEquals("Other", v);
242
243
        symbolTable.setVar("software","gvSIG desktop");
244
        source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG' ELSE 'Other' END"; // ;)
245
        code = compiler.compileExpression(source);
246
        v = interpreter.run(code);
247
        assertEquals("gvSIG", v);
248
    }
249
250 44384 jjdelcerro
    public void testCaseUnWhenSolo() {
251
        MutableSymbolTable symbolTable = createSymbolTable();
252
        Compiler compiler = createCompiler();
253
        Interpreter interpreter = createInterpreter(symbolTable);
254
255
        symbolTable.setVar("software","unknown");
256
        String source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG' END"; // ;)
257
        Code code = compiler.compileExpression(source);
258
        Object v = interpreter.run(code);
259
        assertEquals(null, v);
260
    }
261
262 44139 jjdelcerro
    public void testCase2() {
263
        MutableSymbolTable symbolTable = createSymbolTable();
264
        Compiler compiler = createCompiler();
265
        Interpreter interpreter = createInterpreter(symbolTable);
266
267
        symbolTable.setVar("Field_1",77);
268
        String source = "CASE WHEN Field_1 >= 75 AND Field_1 <=79 THEN 100 WHEN Field_1 >=80 AND Field_1 <=84 THEN 110 END"; // ;)
269
        Code code = compiler.compileExpression(source);
270
        Object v = interpreter.run(code);
271
        assertEquals((Integer)100, v);
272
273
        symbolTable.setVar("Field_1",81);
274
        source = "CASE WHEN Field_1 >= 75 AND Field_1 <=79 THEN 100 WHEN Field_1 >=80 AND Field_1 <=84 THEN 110 END"; // ;)
275
        code = compiler.compileExpression(source);
276
        v = interpreter.run(code);
277
        assertEquals((Integer)110, v);
278
    }
279
280
    public void testCase3() {
281
        MutableSymbolTable symbolTable = createSymbolTable();
282
        Compiler compiler = createCompiler();
283
        Interpreter interpreter = createInterpreter(symbolTable);
284
285
        symbolTable.setVar("Field_1",100);
286
        String source = "CASE WHEN Field_1 >= 75 AND Field_1 <=79 THEN 100 WHEN Field_1 >=80 AND Field_1 <=84 THEN 110 ELSE 120 END"; // ;)
287
        Code code = compiler.compileExpression(source);
288
        Object v = interpreter.run(code);
289
        assertEquals((Integer)120, v);
290
    }
291
292
    public void testDef1() {
293
        MutableSymbolTable symbolTable = createSymbolTable();
294
        Compiler compiler = createCompiler();
295
        Interpreter interpreter = createInterpreter(symbolTable);
296
297 44533 jjdelcerro
        String source = "CREATE PROCEDURE test1 AS BEGIN RETURN 'Hola'; END PROCEDURE";
298 44139 jjdelcerro
        Code code = compiler.compileExpression(source);
299
        Object v = interpreter.run(code);
300
301
        source = "test1()";
302
        code = compiler.compileExpression(source);
303
        v = interpreter.run(code);
304
305
        assertEquals("Hola", v);
306
    }
307
308
    public void testDef2() {
309
        MutableSymbolTable symbolTable = createSymbolTable();
310
        Compiler compiler = createCompiler();
311
        Interpreter interpreter = createInterpreter(symbolTable);
312
313 44533 jjdelcerro
        String source = "CREATE PROCEDURE test1 nombre AS BEGIN RETURN 'Hola ' || nombre; END PROCEDURE";
314 44139 jjdelcerro
        Code code = compiler.compileExpression(source);
315
        Object v = interpreter.run(code);
316
317
        source = "test1('Joaquin')";
318
        code = compiler.compileExpression(source);
319
        v = interpreter.run(code);
320
321
        assertEquals("Hola Joaquin", v);
322
    }
323
324
    public void testReturn1() {
325
        MutableSymbolTable symbolTable = createSymbolTable();
326
        Compiler compiler = createCompiler();
327
        Interpreter interpreter = createInterpreter(symbolTable);
328
329 44533 jjdelcerro
        String source = "CREATE PROCEDURE test1 nombre AS BEGIN RETURN 'Hola ' || nombre; END PROCEDURE";
330 44139 jjdelcerro
        Code code = compiler.compileExpression(source);
331
        Object v = interpreter.run(code);
332
333
        source = "test1('Joaquin')";
334
        code = compiler.compileExpression(source);
335
        v = interpreter.run(code);
336
337
        assertEquals("Hola Joaquin", v);
338
    }
339
340
    public void testReturn2() {
341
        MutableSymbolTable symbolTable = createSymbolTable();
342
        Compiler compiler = createCompiler();
343
        Interpreter interpreter = createInterpreter(symbolTable);
344
345 44533 jjdelcerro
        String source = "CREATE PROCEDURE test1 nombre AS BEGIN RETURN 'Hola ' || nombre; END PROCEDURE";
346 44139 jjdelcerro
        Code code = compiler.compileExpression(source);
347
        Object v = interpreter.run(code);
348
349
        source = "test1('Joaquin')";
350
        code = compiler.compileExpression(source);
351
        v = interpreter.run(code);
352
353
        assertEquals("Hola Joaquin", v);
354
    }
355
356
    public void testUseCase1() {
357
        MutableSymbolTable symbolTable = createSymbolTable();
358
        Compiler compiler = createCompiler();
359
        Interpreter interpreter = createInterpreter(symbolTable);
360
361 44379 jjdelcerro
        String source = "begin set x = ''; for n in list('hola','adios','fin'): let x = x || ' ' || n; end for; end";
362 44139 jjdelcerro
        Code code = compiler.compileExpression(source);
363
        Object v = interpreter.run(code);
364
365
        assertEquals(" hola adios fin", v);
366
    }
367
368
    public void testUseCase2() {
369
        MutableSymbolTable symbolTable = createSymbolTable();
370
        Compiler compiler = createCompiler();
371
        Interpreter interpreter = createInterpreter(symbolTable);
372
373 44379 jjdelcerro
        String source = "begin set s = ''; set x = LIST('hola','adios','fin'); FOR n in RANGE(3): set s = s || ' ' || x[n]; end for; end";
374 44139 jjdelcerro
        Code code = compiler.compileExpression(source);
375
        Object v = interpreter.run(code);
376
377
        assertEquals(" hola adios fin", v);
378
    }
379
380
381
}