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 / TestCompiler.java @ 46050

History | View | Annotate | Download (16.8 KB)

1 43512 jjdelcerro
package org.gvsig.expresionevaluator.impl;
2
3
import junit.framework.TestCase;
4
import org.gvsig.expressionevaluator.LexicalAnalyzer;
5
import org.gvsig.expressionevaluator.Compiler;
6
import org.gvsig.expressionevaluator.Code;
7 44139 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
8
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
9 43983 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionSyntaxException;
10 46010 jjdelcerro
import org.gvsig.expressionevaluator.MutableSymbolTable;
11 44098 jjdelcerro
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
12 43512 jjdelcerro
13
14
public class TestCompiler extends TestCase {
15
16
    public TestCompiler(String testName) {
17
        super(testName);
18
    }
19
20
    @Override
21
    protected void setUp() throws Exception {
22
        super.setUp();
23 44098 jjdelcerro
        new DefaultLibrariesInitializer().fullInitialize();
24 43512 jjdelcerro
    }
25
26
    @Override
27
    protected void tearDown() throws Exception {
28
        super.tearDown();
29
    }
30
31
    // TODO add test methods here. The name must begin with 'test'. For example:
32
    // public void testHello() {}
33
34 44139 jjdelcerro
35 43512 jjdelcerro
    protected LexicalAnalyzer createLexicalAnalyzer() {
36 44139 jjdelcerro
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
37
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
38 43512 jjdelcerro
        return lexer;
39
    }
40 44139 jjdelcerro
41
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
42
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
43
        Compiler compiler = manager.createCompiler();
44 43512 jjdelcerro
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
45
        return compiler;
46
    }
47
48 46010 jjdelcerro
    protected MutableSymbolTable createSymbolTable() {
49
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
50
        MutableSymbolTable symbolTable = manager.createSymbolTable();
51
        symbolTable.setVar("precio", 200);
52
        symbolTable.setVar("1990", 0.168873933773767);
53
        return symbolTable;
54
    }
55
56 43512 jjdelcerro
    public void testIdentifier1() {
57
        String source = "precio";
58
59
        Compiler compiler = createCompiler();
60
        Code code = compiler.compileExpression(source);
61 44006 jjdelcerro
        assertEquals("\"precio\"", code.toString());
62 43512 jjdelcerro
    }
63
64
    public void testIdentifier2() {
65 44139 jjdelcerro
        Compiler compiler = createCompiler();
66
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
67
68 43512 jjdelcerro
        String source = "[precio]";
69
70
        Code code = compiler.compileExpression(source);
71 44006 jjdelcerro
        assertEquals("\"precio\"", code.toString());
72 43512 jjdelcerro
    }
73
74
    public void testIdentifier3() {
75 44139 jjdelcerro
        Compiler compiler = createCompiler();
76
77 43512 jjdelcerro
        String source = "\"precio\"";
78
79
        Code code = compiler.compileExpression(source);
80 44006 jjdelcerro
        assertEquals("\"precio\"", code.toString());
81 43512 jjdelcerro
    }
82
83
84
    public void testTrue() {
85
        String source = "true";
86
87
        Compiler compiler = createCompiler();
88
        Code code = compiler.compileExpression(source);
89 44139 jjdelcerro
        assertEquals("TRUE", code.toString());
90 43512 jjdelcerro
    }
91
92 45125 jjdelcerro
    public void testLet1() {
93
        String source = "LET a = 23";
94
95
        Compiler compiler = createCompiler();
96
        Code code = compiler.compileExpression(source);
97
        assertEquals("LET('a', 23)", code.toString());
98
    }
99
100
    public void testLet2() {
101
        String source = "a := 23";
102
103
        Compiler compiler = createCompiler();
104
        Code code = compiler.compileExpression(source);
105
        assertEquals("LET('a', 23)", code.toString());
106
    }
107
108 43512 jjdelcerro
    public void testFalse() {
109
        String source = "false";
110
111
        Compiler compiler = createCompiler();
112
        Code code = compiler.compileExpression(source);
113 44139 jjdelcerro
        assertEquals("FALSE", code.toString());
114 43512 jjdelcerro
    }
115
116
    public void testNull() {
117
        String source = "null";
118
119
        Compiler compiler = createCompiler();
120
        Code code = compiler.compileExpression(source);
121 44139 jjdelcerro
        assertEquals("NULL", code.toString());
122 43512 jjdelcerro
    }
123
124 44384 jjdelcerro
    public void testIsNull() {
125
        String source = "10 is null";
126
127
        Compiler compiler = createCompiler();
128
        Code code = compiler.compileExpression(source);
129
        assertEquals("(10 IS NULL)", code.toString());
130
    }
131
132
    public void testIsNotNull() {
133
        String source = "10 is not null";
134
135
        Compiler compiler = createCompiler();
136
        Code code = compiler.compileExpression(source);
137
        assertEquals("NOT((10 IS NULL))", code.toString());
138
    }
139
140 43512 jjdelcerro
    public void testNotTrue() {
141
        String source = "not true";
142
143
        Compiler compiler = createCompiler();
144
        Code code = compiler.compileExpression(source);
145 44139 jjdelcerro
        assertEquals("NOT(TRUE)", code.toString());
146 43512 jjdelcerro
    }
147
148
    public void testInteger() {
149
        String source = "23";
150
151
        Compiler compiler = createCompiler();
152
        Code code = compiler.compileExpression(source);
153
        assertEquals("23", code.toString());
154
    }
155
156
    public void operator(String operatorName) {
157
        String source = "precio " + operatorName + " 23";
158
159
        Compiler compiler = createCompiler();
160
        Code code = compiler.compileExpression(source);
161 44198 jjdelcerro
        assertEquals("(\"precio\" "+ operatorName + " 23)", code.toString());
162 43512 jjdelcerro
    }
163
164 45073 omartinez
    public void testOperatorMod() {
165
        String source = "precio % 23";
166
        Compiler compiler = createCompiler();
167
        Code code = compiler.compileExpression(source);
168
        assertEquals("MOD(\"precio\", 23)", code.toString());
169
    }
170
171 43512 jjdelcerro
    public void testOperators() {
172
173
        operator("=");
174
        operator("<>");
175
        operator(">");
176
        operator(">=");
177
        operator("<");
178
        operator("<=");
179 44139 jjdelcerro
        operator("LIKE");
180
        operator("ILIKE");
181
        operator("||");
182 43512 jjdelcerro
        operator("+");
183
        operator("-");
184
        operator("*");
185 44139 jjdelcerro
        operator("OR");
186
        operator("AND");
187
        operator("IS");
188
189
        operator("~");
190 43512 jjdelcerro
    }
191
192
    public void testAddMul() {
193
        String source = "precio + 10 * 2 + 20 + 30";
194
195
        Compiler compiler = createCompiler();
196
197
        Code code = compiler.compileExpression(source);
198 44198 jjdelcerro
        assertEquals("(((\"precio\" + (10 * 2)) + 20) + 30)", code.toString());
199 43512 jjdelcerro
    }
200
201 43519 jjdelcerro
    public void testAddMulPar() {
202
        String source = "(precio + 10) * 2 + 20 + 30";
203
204
        Compiler compiler = createCompiler();
205
206
        Code code = compiler.compileExpression(source);
207 44198 jjdelcerro
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code.toString());
208 43519 jjdelcerro
    }
209 43512 jjdelcerro
210 43519 jjdelcerro
    public void testAbs() {
211
        String source = "precio + abs(10)";
212
213
        Compiler compiler = createCompiler();
214
215
        Code code = compiler.compileExpression(source);
216 44198 jjdelcerro
        assertEquals("(\"precio\" + abs(10))", code.toString());
217 43519 jjdelcerro
    }
218
219 44885 jjdelcerro
    public void testMod1() {
220
        String source = "4 % 3";
221
222
        Compiler compiler = createCompiler();
223
224
        Code code = compiler.compileExpression(source);
225
        assertEquals("MOD(4, 3)", code.toString());
226
    }
227
228
    public void testMod2() {
229
        String source = "MOD(4, 3)";
230
231
        Compiler compiler = createCompiler();
232
233
        Code code = compiler.compileExpression(source);
234
        assertEquals("MOD(4, 3)", code.toString());
235
    }
236
237 43519 jjdelcerro
    public void testAbs2() {
238
        String source = "precio + abs(-10)";
239
240
        Compiler compiler = createCompiler();
241
242
        Code code = compiler.compileExpression(source);
243 44211 jjdelcerro
        assertEquals("(\"precio\" + abs(-10))", code.toString());
244 43519 jjdelcerro
    }
245
246
    public void testPI() {
247
        String source = "precio + PI()";
248
249
        Compiler compiler = createCompiler();
250
251
        Code code = compiler.compileExpression(source);
252 44198 jjdelcerro
        assertEquals("(\"precio\" + PI())", code.toString());
253 43519 jjdelcerro
    }
254
255
    public void testCeil() {
256
        String source = "precio + CEIL(PI())";
257
258
        Compiler compiler = createCompiler();
259
260
        Code code = compiler.compileExpression(source);
261 44198 jjdelcerro
        assertEquals("(\"precio\" + CEIL(PI()))", code.toString());
262 43519 jjdelcerro
    }
263
264 44139 jjdelcerro
    public void testGetitem1() {
265
        String source = "LIST('uno','dos','tres')[1]" ;
266
267
        Compiler compiler = createCompiler();
268
269
        Code code = compiler.compileExpression(source);
270
        assertEquals("GETITEM(LIST('uno', 'dos', 'tres'), 1)", code.toString());
271
    }
272
273 43519 jjdelcerro
    public void testConcat() {
274
        String source = "CONCAT(precio,' euros')";
275
276
        Compiler compiler = createCompiler();
277
278
        Code code = compiler.compileExpression(source);
279 44006 jjdelcerro
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
280 43519 jjdelcerro
    }
281
282 43521 jjdelcerro
    public void test1() {
283
        String source = "NOMBRE03 = 'Torre d''En Besora (la)'";
284
285
        Compiler compiler = createCompiler();
286
287
        Code code = compiler.compileExpression(source);
288 44198 jjdelcerro
        assertEquals("(\"NOMBRE03\" = 'Torre d''En Besora (la)')", code.toString());
289 43521 jjdelcerro
    }
290
291
    public void test2() {
292 44139 jjdelcerro
        Compiler compiler = createCompiler();
293
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
294
295 43521 jjdelcerro
        String source = "[1990] = 0.168873933773767";
296
297
        Code code = compiler.compileExpression(source);
298 44198 jjdelcerro
        assertEquals("(\"1990\" = 0.168873933773767)", code.toString());
299 43521 jjdelcerro
    }
300 43532 jjdelcerro
301
    public void test2fields() {
302 44139 jjdelcerro
        Compiler compiler = createCompiler();
303
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
304
305 43532 jjdelcerro
        String source = "[1990] = [precio]";
306
307
        Code code = compiler.compileExpression(source);
308 44198 jjdelcerro
        assertEquals("(\"1990\" = \"precio\")", code.toString());
309 43532 jjdelcerro
    }
310 43521 jjdelcerro
311 43989 jjdelcerro
312
    public void testInvokeFunction1() {
313
        String source = "ST_Area(GEOMETRY)";
314
315
        Compiler compiler = createCompiler();
316
317
        Code code = compiler.compileExpression(source);
318 44006 jjdelcerro
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
319 43989 jjdelcerro
    }
320
321 43939 jjdelcerro
    public void testInvokeMethod1() {
322
        String source = "'hola'.length()";
323
324
        Compiler compiler = createCompiler();
325
326
        Code code = compiler.compileExpression(source);
327 46010 jjdelcerro
        assertEquals("'hola'.length()", code.toString());
328 43939 jjdelcerro
    }
329
330
331 46010 jjdelcerro
    public void testInvokeMethod1b() {
332
        String source = "'hola'->length()";
333
334
        Compiler compiler = createCompiler();
335
336
        Code code = compiler.compileExpression(source);
337
        assertEquals("'hola'.length()", code.toString());
338
    }
339
340
341 43939 jjdelcerro
    public void testInvokeMethod2() {
342 43983 jjdelcerro
        String source = "'hola'.indexOf('l')    ";
343 43939 jjdelcerro
344
        Compiler compiler = createCompiler();
345
346
        Code code = compiler.compileExpression(source);
347 46010 jjdelcerro
        assertEquals("'hola'.indexOf('l')", code.toString());
348 43939 jjdelcerro
    }
349 43983 jjdelcerro
350
    public void testSyntaxError1() {
351
        Compiler compiler = createCompiler();
352
        String source;
353
354
        source = "3 + (2*)";
355
        try {
356
            compiler.compileExpression(source);
357
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
358
        } catch(ExpressionSyntaxException ex) {
359
            // Ok
360
        }
361
        source = "3 + 2*";
362
        try {
363
            compiler.compileExpression(source);
364
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
365
        } catch(ExpressionSyntaxException ex) {
366
            // Ok
367
        }
368
        source = "3 + (2*2))";
369
        try {
370
            compiler.compileExpression(source);
371
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
372
        } catch(ExpressionSyntaxException ex) {
373
            // Ok
374
        }
375
        source = "3 and or 2";
376
        try {
377
            compiler.compileExpression(source);
378
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
379
        } catch(ExpressionSyntaxException ex) {
380
            // Ok
381
        }
382
        source = "3*/2";
383
        try {
384
            compiler.compileExpression(source);
385
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
386
        } catch(ExpressionSyntaxException ex) {
387
            // Ok
388
        }
389
    }
390 44210 jjdelcerro
391
    public void testInvokeFunction2paramters1() {
392
        String source = "LEFT('NOMBRE', 2)";
393
394
        Compiler compiler = createCompiler();
395
396
        Code code = compiler.compileExpression(source);
397
        assertEquals("LEFT('NOMBRE', 2)", code.toString());
398
    }
399
400
    public void testInvokeFunction2paramters2() {
401
        String source = "LEFT('NOMBRE',2)";
402
403
        Compiler compiler = createCompiler();
404
405
        Code code = compiler.compileExpression(source);
406
        assertEquals("LEFT('NOMBRE', 2)", code.toString());
407
    }
408
409
    public void testInvokeFunction3paramters1() {
410
        String source = "MID('NOMBRE', 2, 2)";
411
412
        Compiler compiler = createCompiler();
413
414
        Code code = compiler.compileExpression(source);
415
        assertEquals("MID('NOMBRE', 2, 2)", code.toString());
416
    }
417
418
    public void testInvokeFunction3paramters2() {
419
        String source = "MID('NOMBRE', 2,2)";
420
421
        Compiler compiler = createCompiler();
422
423
        Code code = compiler.compileExpression(source);
424
        assertEquals("MID('NOMBRE', 2, 2)", code.toString());
425
    }
426
427 44211 jjdelcerro
    public void testDecimal1() {
428
        String source = "23.1";
429
430
        Compiler compiler = createCompiler();
431
        Code code = compiler.compileExpression(source);
432
        assertEquals("23.1", code.toString());
433
    }
434
435
    public void testDecimal2() {
436
        String source = "23,1";
437
438
        Compiler compiler = createCompiler();
439
        try {
440
            Code code = compiler.compileExpression(source);
441
            fail("I expected 23,1 to be erroneous.");
442
        } catch(ExpressionSyntaxException ex) {
443
            // This is OK.
444
        }
445
    }
446
    public void testDecimal3() {
447
        String source = "1.23E4";
448
449
        Compiler compiler = createCompiler();
450
        Code code = compiler.compileExpression(source);
451
        assertEquals("12300", code.toString());
452
    }
453
454
    public void testDecimal4() {
455
        String source = "1.23E-2";
456
457
        Compiler compiler = createCompiler();
458
        Code code = compiler.compileExpression(source);
459
        assertEquals("0.0123", code.toString());
460
    }
461
462
    public void testDecimal5() {
463
        String source = "1.23E-4";
464
465
        Compiler compiler = createCompiler();
466
        Code code = compiler.compileExpression(source);
467 44797 jjdelcerro
        assertEquals("0.000123", code.toString());
468 44211 jjdelcerro
    }
469
470
    public void testDecimal6() {
471
        String source = "-23.1";
472
473
        Compiler compiler = createCompiler();
474
        Code code = compiler.compileExpression(source);
475
        assertEquals("-23.1", code.toString());
476
    }
477
478
    public void testDecimal7() {
479
        String source = "-1.23E-2";
480
481
        Compiler compiler = createCompiler();
482
        Code code = compiler.compileExpression(source);
483
        assertEquals("-0.0123", code.toString());
484
    }
485
486
    public void testDecimal8() {
487
        String source = "-1.23E-4";
488
489
        Compiler compiler = createCompiler();
490
        Code code = compiler.compileExpression(source);
491 44797 jjdelcerro
        assertEquals("-0.000123", code.toString());
492 44211 jjdelcerro
    }
493
494 46010 jjdelcerro
    public void testGetAttr1() {
495
        String source =  "ARENA2_VEHICULOS.ID_ACCIDENTE";
496 44211 jjdelcerro
497 46010 jjdelcerro
        Compiler compiler = createCompiler();
498
499
        Code code = compiler.compileExpression(source);
500
        assertEquals( "GETATTR(\"ARENA2_VEHICULOS\", 'ID_ACCIDENTE')", code.toString());
501
    }
502
503
    public void testGetAttr1b() {
504
        String source =  "ARENA2_VEHICULOS.ID_ACCIDENTE";
505
506
        Compiler compiler = createCompiler();
507
508
        Code code = compiler.compileExpression(source);
509
        code.link(this.createSymbolTable());
510
        assertEquals( "\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\"", code.toString());
511
    }
512
513
    public void testGetAttr2a() {
514
        String source =  "GETATTR(ARENA2_VEHICULOS,'ID_ACCIDENTE')";
515
516
        Compiler compiler = createCompiler();
517
518
        Code code = compiler.compileExpression(source);
519
        code.link(this.createSymbolTable());
520
        assertEquals( "\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\"", code.toString());
521
    }
522
523
    public void testGetAttr2b() {
524
        String source =  "GETATTR(ARENA2_VEHICULOS,\"ID_ACCIDENTE\")";
525
526
        Compiler compiler = createCompiler();
527
528
        Code code = compiler.compileExpression(source);
529
        code.link(this.createSymbolTable());
530
        assertEquals( "GETATTR(\"ARENA2_VEHICULOS\", \"ID_ACCIDENTE\")", code.toString());
531
    }
532
533
    public void testGetAttr2c() {
534
        String source =  "GETATTR(ARENA2_VEHICULOS,'ID_ACCIDENTE'||3)";
535
536
        Compiler compiler = createCompiler();
537
538
        Code code = compiler.compileExpression(source);
539
        code.link(this.createSymbolTable());
540
        assertEquals( "GETATTR(\"ARENA2_VEHICULOS\", ('ID_ACCIDENTE' || 3))", code.toString());
541
    }
542 46050 omartinez
543
    public void testJson1() {
544
        String source =  "[\n" +
545
"        [2,'Val','2018'],\n" +
546
"        [3,'ali','2018'],\n" +
547
"        [5,'Val','2020'],\n" +
548
"        [7,'ali','2020']\n" +
549
"        ]";
550 46010 jjdelcerro
551 46050 omartinez
        Compiler compiler = createCompiler();
552
553
        Code code = compiler.compileExpression(source);
554
        code.link(this.createSymbolTable());
555
        assertEquals( "ARRAY[ ARRAY[ 2, 'Val', '2018' ], ARRAY[ 3, 'ali', '2018' ], ARRAY[ 5, 'Val', '2020' ], ARRAY[ 7, 'ali', '2020' ] ]", code.toString());
556
    }
557 46010 jjdelcerro
558 43512 jjdelcerro
}