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 @ 47017

History | View | Annotate | Download (16.8 KB)

1
package org.gvsig.expresionevaluator.impl;
2

    
3
import junit.framework.TestCase;
4
import org.gvsig.expressionevaluator.Code;
5
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
6
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
7
import org.gvsig.expressionevaluator.Interpreter;
8
import org.gvsig.expressionevaluator.LexicalAnalyzer;
9
import org.gvsig.expressionevaluator.SymbolTable;
10
import org.gvsig.expressionevaluator.Compiler;
11
import org.gvsig.expressionevaluator.MutableSymbolTable;
12
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
13

    
14
/**
15
 *
16
 * @author jjdelcerro
17
 */
18
@SuppressWarnings("UnusedAssignment")
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 testVar() {
81
        SymbolTable symbolTable = createSymbolTable();
82
        Compiler compiler = createCompiler();
83
        Interpreter interpreter = createInterpreter(symbolTable);
84

    
85
        String source = "(VAR V1 DEFAULT 23)+2";
86

    
87
        Code code = compiler.compileExpression(source);
88
        Object v = interpreter.run(code);
89
        
90
        assertEquals(23, symbolTable.value("V1"));
91
        assertEquals((Integer)25, v);
92
    }
93

    
94
    public void testBlock() {
95
        SymbolTable symbolTable = createSymbolTable();
96
        Compiler compiler = createCompiler();
97
        Interpreter interpreter = createInterpreter(symbolTable);
98

    
99
        String source = "BEGIN SET V1 = 23 END";
100
        Code code = compiler.compileExpression(source);
101
        Object v = interpreter.run(code);
102
        
103
        assertEquals(23, symbolTable.value("V1"));
104
    }
105

    
106
    public void testBlock2() {
107
        SymbolTable symbolTable = createSymbolTable();
108
        Compiler compiler = createCompiler();
109
        Interpreter interpreter = createInterpreter(symbolTable);
110

    
111
        String source = "BEGIN SET V1 = 11; SET V2 = 22  END";
112
        Code code = compiler.compileExpression(source);
113
        Object v = interpreter.run(code);
114

    
115
        assertEquals((Integer)11, symbolTable.value("V1"));
116
        assertEquals((Integer)22, symbolTable.value("V2"));
117
    }
118

    
119
    public void testBlock3() {
120
        SymbolTable symbolTable = createSymbolTable();
121
        Compiler compiler = createCompiler();
122
        Interpreter interpreter = createInterpreter(symbolTable);
123

    
124
        String source = "BEGIN SET V1 = 11; SET V2 = :V1 * 2;  END";
125
        Code code = compiler.compileExpression(source);
126
        Object v = interpreter.run(code);
127

    
128
        assertEquals((Integer)11, symbolTable.value("V1"));
129
        assertEquals((Integer)22, symbolTable.value("V2"));
130
    }
131

    
132
    public void testCall1() {
133
        MutableSymbolTable symbolTable = createSymbolTable();
134
        Compiler compiler = createCompiler();
135
        Interpreter interpreter = createInterpreter(symbolTable);
136

    
137
        String source = "CALL ABS(-1)";
138
        Code code = compiler.compileExpression(source);
139
        Object v = interpreter.run(code);
140

    
141
        assertEquals((Integer)1, v);
142
    }
143

    
144
    public void testIfThen() {
145
        MutableSymbolTable symbolTable = createSymbolTable();
146
        Compiler compiler = createCompiler();
147
        Interpreter interpreter = createInterpreter(symbolTable);
148

    
149
        symbolTable.setVar("V1", 10);
150
        String source = "IF V1 = 11 THEN SET V2 = 22; END IF";
151
        Code code = compiler.compileExpression(source);
152
        Object v = interpreter.run(code);
153

    
154
        assertEquals(null, v);
155
        assertEquals((Integer)10, symbolTable.value("V1"));
156
        assertEquals(null, symbolTable.value("V2"));
157

    
158
        symbolTable.setVar("V1", 11);
159
        source = "IF V1 = 11 THEN SET V2 = 22; END IF";
160
        code = compiler.compileExpression(source);
161
        v = interpreter.run(code);
162

    
163
        assertEquals((Integer)22, v);
164
        assertEquals((Integer)11, symbolTable.value("V1"));
165
        assertEquals((Integer)22, symbolTable.value("V2"));
166
    }
167

    
168
    public void testIfThenElse() {
169
        MutableSymbolTable symbolTable = createSymbolTable();
170
        Compiler compiler = createCompiler();
171
        Interpreter interpreter = createInterpreter(symbolTable);
172

    
173
        symbolTable.setVar("V1", 10);
174
        String source = "IF V1 = 11 THEN SET V2 = 11; ELSE SET V2 = 22; END IF";
175
        Code code = compiler.compileExpression(source);
176
        Object v = interpreter.run(code);
177

    
178
        assertEquals((Integer)22, v);
179
        assertEquals((Integer)10, symbolTable.value("V1"));
180
        assertEquals((Integer)22, symbolTable.value("V2"));
181
    }
182

    
183
    public void testIfThenBlock() {
184
        MutableSymbolTable symbolTable = createSymbolTable();
185
        Compiler compiler = createCompiler();
186
        Interpreter interpreter = createInterpreter(symbolTable);
187

    
188
        symbolTable.setVar("V1", 11);
189
        String source = "IF V1 = 11 THEN LET V2 = 22; LET V1 = 10; END IF";
190
        Code code = compiler.compileExpression(source);
191
        Object v = interpreter.run(code);
192

    
193
        assertEquals((Integer)10, v);
194
        assertEquals((Integer)10, symbolTable.value("V1"));
195
        assertEquals((Integer)22, symbolTable.value("V2"));
196
    }
197

    
198
    public void testWhile() {
199
        MutableSymbolTable symbolTable = createSymbolTable();
200
        Compiler compiler = createCompiler();
201
        Interpreter interpreter = createInterpreter(symbolTable);
202

    
203
        symbolTable.setVar("n",0);
204
        String source = "WHILE n < 10 BEGIN SET n = n + 1; END WHILE";
205
        Code code = compiler.compileExpression(source);
206
        Object v = interpreter.run(code);
207

    
208
        assertEquals((Integer)10, v);
209
        assertEquals((Integer)10, symbolTable.value("n"));
210
    }
211

    
212
    public void testWhileBreak() {
213
        MutableSymbolTable symbolTable = createSymbolTable();
214
        Compiler compiler = createCompiler();
215
        Interpreter interpreter = createInterpreter(symbolTable);
216

    
217
        symbolTable.setVar("n",0);
218
        String source = "WHILE n < 10 BEGIN IF n = 5 THEN BREAK; END; SET n = n + 1; END WHILE";
219
        Code code = compiler.compileExpression(source);
220
        Object v = interpreter.run(code);
221

    
222
        assertEquals((Integer)5, v);
223
        assertEquals((Integer)5, symbolTable.value("n"));
224
    }
225

    
226
    public void testWhileBlock() {
227
        MutableSymbolTable symbolTable = createSymbolTable();
228
        Compiler compiler = createCompiler();
229
        Interpreter interpreter = createInterpreter(symbolTable);
230

    
231
        symbolTable.setVar("n",0);
232
        String source = "WHILE n < 10 BEGIN SET n = n + 1; print(n) END";
233
        Code code = compiler.compileExpression(source);
234
        Object v = interpreter.run(code);
235

    
236
        assertEquals((Integer)10, v);
237
        assertEquals((Integer)10, symbolTable.value("n"));
238
    }
239

    
240
    public void testCast() {
241
        MutableSymbolTable symbolTable = createSymbolTable();
242
        Compiler compiler = createCompiler();
243
        Interpreter interpreter = createInterpreter(symbolTable);
244

    
245
        symbolTable.setVar("n",1.0);
246
        String source = "CAST n AS INTEGER";
247
        Code code = compiler.compileExpression(source);
248
        Object v = interpreter.run(code);
249

    
250
        assertEquals((Integer)1, v);
251
        assertEquals((Double)1.0, symbolTable.value("n"));
252
    }
253

    
254
    public void testMatch() {
255
        Compiler compiler = createCompiler();
256
        String source;
257
        Code code;
258

    
259
        source = "MATCH 'Hola', '[Hh]ola'";
260
        code = compiler.compileExpression(source);
261
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
262

    
263
        source = "MATCH 'Hola' '[Hh]ola'";
264
        code = compiler.compileExpression(source);
265
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
266

    
267
        source = "MATCH('Hola', '[Hh]ola')";
268
        code = compiler.compileExpression(source);
269
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
270
    }
271

    
272
    public void testForEach() {
273
        MutableSymbolTable symbolTable = createSymbolTable();
274
        Compiler compiler = createCompiler();
275
        Interpreter interpreter = createInterpreter(symbolTable);
276

    
277
        String source = "FOR n in RANGE(10) LOOP print(n); END LOOP";
278
        Code code = compiler.compileExpression(source);
279
        Object v = interpreter.run(code);
280

    
281
        assertEquals((Long)9L, v);
282
        assertEquals((Long)9L, symbolTable.value("n"));
283
    }
284

    
285
    public void testForEachBreak() {
286
        MutableSymbolTable symbolTable = createSymbolTable();
287
        Compiler compiler = createCompiler();
288
        Interpreter interpreter = createInterpreter(symbolTable);
289

    
290
        String source = "FOR n in RANGE(10) LOOP IF n = 5 THEN BREAK; END; print(n); END LOOP";
291
        Code code = compiler.compileExpression(source);
292
        Object v = interpreter.run(code);
293

    
294
        assertEquals((Long)4L, v);
295
        assertEquals((Long)5L, symbolTable.value("n"));
296
    }
297

    
298
    public void testCase() {
299
        MutableSymbolTable symbolTable = createSymbolTable();
300
        Compiler compiler = createCompiler();
301
        Interpreter interpreter = createInterpreter(symbolTable);
302

    
303
        symbolTable.setVar("software","unknown");
304
        String source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG' ELSE 'Other' END"; // ;)
305
        Code code = compiler.compileExpression(source);
306
        Object v = interpreter.run(code);
307
        assertEquals("Other", v);
308

    
309
        symbolTable.setVar("software","gvSIG desktop");
310
        source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG' ELSE 'Other' END"; // ;)
311
        code = compiler.compileExpression(source);
312
        v = interpreter.run(code);
313
        assertEquals("gvSIG", v);
314
    }
315

    
316
    public void testCaseUnWhenSolo() {
317
        MutableSymbolTable symbolTable = createSymbolTable();
318
        Compiler compiler = createCompiler();
319
        Interpreter interpreter = createInterpreter(symbolTable);
320

    
321
        symbolTable.setVar("software","unknown");
322
        String source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG' END"; // ;)
323
        Code code = compiler.compileExpression(source);
324
        Object v = interpreter.run(code);
325
        assertEquals(null, v);
326
    }
327

    
328
    public void testCase2() {
329
        MutableSymbolTable symbolTable = createSymbolTable();
330
        Compiler compiler = createCompiler();
331
        Interpreter interpreter = createInterpreter(symbolTable);
332

    
333
        symbolTable.setVar("Field_1",77);
334
        String source = "CASE WHEN Field_1 >= 75 AND Field_1 <=79 THEN 100 WHEN Field_1 >=80 AND Field_1 <=84 THEN 110 END"; // ;)
335
        Code code = compiler.compileExpression(source);
336
        Object v = interpreter.run(code);
337
        assertEquals((Integer)100, v);
338

    
339
        symbolTable.setVar("Field_1",81);
340
        source = "CASE WHEN Field_1 >= 75 AND Field_1 <=79 THEN 100 WHEN Field_1 >=80 AND Field_1 <=84 THEN 110 END"; // ;)
341
        code = compiler.compileExpression(source);
342
        v = interpreter.run(code);
343
        assertEquals((Integer)110, v);
344
    }
345
    
346
    public void testCase3() {
347
        MutableSymbolTable symbolTable = createSymbolTable();
348
        Compiler compiler = createCompiler();
349
        Interpreter interpreter = createInterpreter(symbolTable);
350

    
351
        symbolTable.setVar("Field_1",100);
352
        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"; // ;)
353
        Code code = compiler.compileExpression(source);
354
        Object v = interpreter.run(code);
355
        assertEquals((Integer)120, v);
356
    }
357
    
358
    public void testCreateProcedure1() {
359
        MutableSymbolTable symbolTable = createSymbolTable();
360
        Compiler compiler = createCompiler();
361
        Interpreter interpreter = createInterpreter(symbolTable);
362

    
363
        String source = "CREATE PROCEDURE test1 AS BEGIN RETURN 'Hola'; END PROCEDURE"; 
364
        Code code = compiler.compileExpression(source);
365
        Object v = interpreter.run(code);
366

    
367
        source = "test1()"; 
368
        code = compiler.compileExpression(source);
369
        v = interpreter.run(code);
370

    
371
        assertEquals("Hola", v);
372
    }
373
    
374
    public void testCreateOrReplaceProcedure1() {
375
        MutableSymbolTable symbolTable = createSymbolTable();
376
        Compiler compiler = createCompiler();
377
        Interpreter interpreter = createInterpreter(symbolTable);
378

    
379
        String source = "CREATE OR REPLACE PROCEDURE test1 AS BEGIN RETURN 'Hola'; END PROCEDURE"; 
380
        Code code = compiler.compileExpression(source);
381
        Object v = interpreter.run(code);
382

    
383
        source = "test1()"; 
384
        code = compiler.compileExpression(source);
385
        v = interpreter.run(code);
386

    
387
        assertEquals("Hola", v);
388
    }
389
    
390
    public void testCreateProcedure2() {
391
        MutableSymbolTable symbolTable = createSymbolTable();
392
        Compiler compiler = createCompiler();
393
        Interpreter interpreter = createInterpreter(symbolTable);
394

    
395
        String source = "CREATE PROCEDURE test1 nombre AS BEGIN RETURN 'Hola ' || nombre; END PROCEDURE";
396
        Code code = compiler.compileExpression(source);
397
        Object v = interpreter.run(code);
398

    
399
        source = "test1('Joaquin')"; 
400
        code = compiler.compileExpression(source);
401
        v = interpreter.run(code);
402

    
403
        assertEquals("Hola Joaquin", v);
404
    }
405

    
406
    public void testReturn1() {
407
        MutableSymbolTable symbolTable = createSymbolTable();
408
        Compiler compiler = createCompiler();
409
        Interpreter interpreter = createInterpreter(symbolTable);
410

    
411
        String source = "CREATE PROCEDURE test1 nombre AS BEGIN RETURN 'Hola ' || nombre; END PROCEDURE";
412
        Code code = compiler.compileExpression(source);
413
        Object v = interpreter.run(code);
414

    
415
        source = "test1('Joaquin')"; 
416
        code = compiler.compileExpression(source);
417
        v = interpreter.run(code);
418

    
419
        assertEquals("Hola Joaquin", v);
420
    }
421

    
422
    public void testReturn2() {
423
        MutableSymbolTable symbolTable = createSymbolTable();
424
        Compiler compiler = createCompiler();
425
        Interpreter interpreter = createInterpreter(symbolTable);
426

    
427
        String source = "CREATE PROCEDURE test1 nombre AS BEGIN RETURN ; END PROCEDURE";
428
        Code code = compiler.compileExpression(source);
429
        Object v = interpreter.run(code);
430

    
431
        source = "test1('Joaquin')"; 
432
        code = compiler.compileExpression(source);
433
        v = interpreter.run(code);
434

    
435
        assertEquals(null, v);
436
    }
437

    
438
    public void testUseCase1() {
439
        MutableSymbolTable symbolTable = createSymbolTable();
440
        Compiler compiler = createCompiler();
441
        Interpreter interpreter = createInterpreter(symbolTable);
442

    
443
        String source = "begin set x = ''; for n in list('hola','adios','fin') loop let x = x || ' ' || n; end loop; end";
444
        Code code = compiler.compileExpression(source);
445
        Object v = interpreter.run(code);
446

    
447
        assertEquals(" hola adios fin", v);
448
    }
449

    
450
    public void testUseCase2() {
451
        MutableSymbolTable symbolTable = createSymbolTable();
452
        Compiler compiler = createCompiler();
453
        Interpreter interpreter = createInterpreter(symbolTable);
454

    
455
        String source = "begin set s = ''; set x = LIST('hola','adios','fin'); FOR n in RANGE(3) loop set s = s || ' ' || x[n]; end loop; end";
456
        Code code = compiler.compileExpression(source);
457
        Object v = interpreter.run(code);
458

    
459
        assertEquals(" hola adios fin", v);
460
    }
461

    
462

    
463
}