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

History | View | Annotate | Download (19.2 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 46083 jjdelcerro
    public void testLet3() {
109
        String source = "SET a TO 23";
110
111
        Compiler compiler = createCompiler();
112
        Code code = compiler.compileExpression(source);
113
        assertEquals("LET('a', 23)", code.toString());
114
    }
115
116 43512 jjdelcerro
    public void testFalse() {
117
        String source = "false";
118
119
        Compiler compiler = createCompiler();
120
        Code code = compiler.compileExpression(source);
121 44139 jjdelcerro
        assertEquals("FALSE", code.toString());
122 43512 jjdelcerro
    }
123
124
    public void testNull() {
125
        String source = "null";
126
127
        Compiler compiler = createCompiler();
128
        Code code = compiler.compileExpression(source);
129 44139 jjdelcerro
        assertEquals("NULL", code.toString());
130 43512 jjdelcerro
    }
131
132 44384 jjdelcerro
    public void testIsNull() {
133
        String source = "10 is null";
134
135
        Compiler compiler = createCompiler();
136
        Code code = compiler.compileExpression(source);
137
        assertEquals("(10 IS NULL)", code.toString());
138
    }
139
140
    public void testIsNotNull() {
141
        String source = "10 is not null";
142
143
        Compiler compiler = createCompiler();
144
        Code code = compiler.compileExpression(source);
145
        assertEquals("NOT((10 IS NULL))", code.toString());
146
    }
147
148 43512 jjdelcerro
    public void testNotTrue() {
149
        String source = "not true";
150
151
        Compiler compiler = createCompiler();
152
        Code code = compiler.compileExpression(source);
153 44139 jjdelcerro
        assertEquals("NOT(TRUE)", code.toString());
154 43512 jjdelcerro
    }
155
156
    public void testInteger() {
157
        String source = "23";
158
159
        Compiler compiler = createCompiler();
160
        Code code = compiler.compileExpression(source);
161
        assertEquals("23", code.toString());
162
    }
163
164
    public void operator(String operatorName) {
165
        String source = "precio " + operatorName + " 23";
166
167
        Compiler compiler = createCompiler();
168
        Code code = compiler.compileExpression(source);
169 44198 jjdelcerro
        assertEquals("(\"precio\" "+ operatorName + " 23)", code.toString());
170 43512 jjdelcerro
    }
171
172 45073 omartinez
    public void testOperatorMod() {
173
        String source = "precio % 23";
174
        Compiler compiler = createCompiler();
175
        Code code = compiler.compileExpression(source);
176
        assertEquals("MOD(\"precio\", 23)", code.toString());
177
    }
178
179 43512 jjdelcerro
    public void testOperators() {
180
181
        operator("=");
182
        operator("<>");
183
        operator(">");
184
        operator(">=");
185
        operator("<");
186
        operator("<=");
187 44139 jjdelcerro
        operator("LIKE");
188
        operator("ILIKE");
189
        operator("||");
190 43512 jjdelcerro
        operator("+");
191
        operator("-");
192
        operator("*");
193 44139 jjdelcerro
        operator("OR");
194
        operator("AND");
195
        operator("IS");
196
197
        operator("~");
198 43512 jjdelcerro
    }
199
200
    public void testAddMul() {
201
        String source = "precio + 10 * 2 + 20 + 30";
202
203
        Compiler compiler = createCompiler();
204
205
        Code code = compiler.compileExpression(source);
206 44198 jjdelcerro
        assertEquals("(((\"precio\" + (10 * 2)) + 20) + 30)", code.toString());
207 43512 jjdelcerro
    }
208
209 43519 jjdelcerro
    public void testAddMulPar() {
210
        String source = "(precio + 10) * 2 + 20 + 30";
211
212
        Compiler compiler = createCompiler();
213
214
        Code code = compiler.compileExpression(source);
215 44198 jjdelcerro
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code.toString());
216 43519 jjdelcerro
    }
217 43512 jjdelcerro
218 43519 jjdelcerro
    public void testAbs() {
219
        String source = "precio + abs(10)";
220
221
        Compiler compiler = createCompiler();
222
223
        Code code = compiler.compileExpression(source);
224 44198 jjdelcerro
        assertEquals("(\"precio\" + abs(10))", code.toString());
225 43519 jjdelcerro
    }
226
227 44885 jjdelcerro
    public void testMod1() {
228
        String source = "4 % 3";
229
230
        Compiler compiler = createCompiler();
231
232
        Code code = compiler.compileExpression(source);
233
        assertEquals("MOD(4, 3)", code.toString());
234
    }
235
236
    public void testMod2() {
237
        String source = "MOD(4, 3)";
238
239
        Compiler compiler = createCompiler();
240
241
        Code code = compiler.compileExpression(source);
242
        assertEquals("MOD(4, 3)", code.toString());
243
    }
244
245 43519 jjdelcerro
    public void testAbs2() {
246
        String source = "precio + abs(-10)";
247
248
        Compiler compiler = createCompiler();
249
250
        Code code = compiler.compileExpression(source);
251 44211 jjdelcerro
        assertEquals("(\"precio\" + abs(-10))", code.toString());
252 43519 jjdelcerro
    }
253
254
    public void testPI() {
255
        String source = "precio + PI()";
256
257
        Compiler compiler = createCompiler();
258
259
        Code code = compiler.compileExpression(source);
260 44198 jjdelcerro
        assertEquals("(\"precio\" + PI())", code.toString());
261 43519 jjdelcerro
    }
262
263
    public void testCeil() {
264
        String source = "precio + CEIL(PI())";
265
266
        Compiler compiler = createCompiler();
267
268
        Code code = compiler.compileExpression(source);
269 44198 jjdelcerro
        assertEquals("(\"precio\" + CEIL(PI()))", code.toString());
270 43519 jjdelcerro
    }
271
272 44139 jjdelcerro
    public void testGetitem1() {
273
        String source = "LIST('uno','dos','tres')[1]" ;
274
275
        Compiler compiler = createCompiler();
276
277
        Code code = compiler.compileExpression(source);
278
        assertEquals("GETITEM(LIST('uno', 'dos', 'tres'), 1)", code.toString());
279
    }
280
281 43519 jjdelcerro
    public void testConcat() {
282
        String source = "CONCAT(precio,' euros')";
283
284
        Compiler compiler = createCompiler();
285
286
        Code code = compiler.compileExpression(source);
287 44006 jjdelcerro
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
288 43519 jjdelcerro
    }
289
290 43521 jjdelcerro
    public void test1() {
291
        String source = "NOMBRE03 = 'Torre d''En Besora (la)'";
292
293
        Compiler compiler = createCompiler();
294
295
        Code code = compiler.compileExpression(source);
296 44198 jjdelcerro
        assertEquals("(\"NOMBRE03\" = 'Torre d''En Besora (la)')", code.toString());
297 43521 jjdelcerro
    }
298
299
    public void test2() {
300 44139 jjdelcerro
        Compiler compiler = createCompiler();
301
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
302
303 43521 jjdelcerro
        String source = "[1990] = 0.168873933773767";
304
305
        Code code = compiler.compileExpression(source);
306 44198 jjdelcerro
        assertEquals("(\"1990\" = 0.168873933773767)", code.toString());
307 43521 jjdelcerro
    }
308 43532 jjdelcerro
309
    public void test2fields() {
310 44139 jjdelcerro
        Compiler compiler = createCompiler();
311
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
312
313 43532 jjdelcerro
        String source = "[1990] = [precio]";
314
315
        Code code = compiler.compileExpression(source);
316 44198 jjdelcerro
        assertEquals("(\"1990\" = \"precio\")", code.toString());
317 43532 jjdelcerro
    }
318 43521 jjdelcerro
319 43989 jjdelcerro
320
    public void testInvokeFunction1() {
321
        String source = "ST_Area(GEOMETRY)";
322
323
        Compiler compiler = createCompiler();
324
325
        Code code = compiler.compileExpression(source);
326 44006 jjdelcerro
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
327 43989 jjdelcerro
    }
328
329 43939 jjdelcerro
    public void testInvokeMethod1() {
330
        String source = "'hola'.length()";
331
332
        Compiler compiler = createCompiler();
333
334
        Code code = compiler.compileExpression(source);
335 46010 jjdelcerro
        assertEquals("'hola'.length()", code.toString());
336 43939 jjdelcerro
    }
337
338
339 46010 jjdelcerro
    public void testInvokeMethod1b() {
340
        String source = "'hola'->length()";
341
342
        Compiler compiler = createCompiler();
343
344
        Code code = compiler.compileExpression(source);
345
        assertEquals("'hola'.length()", code.toString());
346
    }
347
348
349 43939 jjdelcerro
    public void testInvokeMethod2() {
350 43983 jjdelcerro
        String source = "'hola'.indexOf('l')    ";
351 43939 jjdelcerro
352
        Compiler compiler = createCompiler();
353
354
        Code code = compiler.compileExpression(source);
355 46010 jjdelcerro
        assertEquals("'hola'.indexOf('l')", code.toString());
356 43939 jjdelcerro
    }
357 43983 jjdelcerro
358
    public void testSyntaxError1() {
359
        Compiler compiler = createCompiler();
360
        String source;
361
362
        source = "3 + (2*)";
363
        try {
364
            compiler.compileExpression(source);
365
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
366
        } catch(ExpressionSyntaxException ex) {
367
            // Ok
368
        }
369
        source = "3 + 2*";
370
        try {
371
            compiler.compileExpression(source);
372
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
373
        } catch(ExpressionSyntaxException ex) {
374
            // Ok
375
        }
376
        source = "3 + (2*2))";
377
        try {
378
            compiler.compileExpression(source);
379
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
380
        } catch(ExpressionSyntaxException ex) {
381
            // Ok
382
        }
383
        source = "3 and or 2";
384
        try {
385
            compiler.compileExpression(source);
386
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
387
        } catch(ExpressionSyntaxException ex) {
388
            // Ok
389
        }
390
        source = "3*/2";
391
        try {
392
            compiler.compileExpression(source);
393
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
394
        } catch(ExpressionSyntaxException ex) {
395
            // Ok
396
        }
397
    }
398 44210 jjdelcerro
399
    public void testInvokeFunction2paramters1() {
400
        String source = "LEFT('NOMBRE', 2)";
401
402
        Compiler compiler = createCompiler();
403
404
        Code code = compiler.compileExpression(source);
405
        assertEquals("LEFT('NOMBRE', 2)", code.toString());
406
    }
407
408
    public void testInvokeFunction2paramters2() {
409
        String source = "LEFT('NOMBRE',2)";
410
411
        Compiler compiler = createCompiler();
412
413
        Code code = compiler.compileExpression(source);
414
        assertEquals("LEFT('NOMBRE', 2)", code.toString());
415
    }
416
417
    public void testInvokeFunction3paramters1() {
418
        String source = "MID('NOMBRE', 2, 2)";
419
420
        Compiler compiler = createCompiler();
421
422
        Code code = compiler.compileExpression(source);
423
        assertEquals("MID('NOMBRE', 2, 2)", code.toString());
424
    }
425
426
    public void testInvokeFunction3paramters2() {
427
        String source = "MID('NOMBRE', 2,2)";
428
429
        Compiler compiler = createCompiler();
430
431
        Code code = compiler.compileExpression(source);
432
        assertEquals("MID('NOMBRE', 2, 2)", code.toString());
433
    }
434
435 44211 jjdelcerro
    public void testDecimal1() {
436
        String source = "23.1";
437
438
        Compiler compiler = createCompiler();
439
        Code code = compiler.compileExpression(source);
440
        assertEquals("23.1", code.toString());
441
    }
442
443
    public void testDecimal2() {
444
        String source = "23,1";
445
446
        Compiler compiler = createCompiler();
447
        try {
448
            Code code = compiler.compileExpression(source);
449
            fail("I expected 23,1 to be erroneous.");
450
        } catch(ExpressionSyntaxException ex) {
451
            // This is OK.
452
        }
453
    }
454
    public void testDecimal3() {
455
        String source = "1.23E4";
456
457
        Compiler compiler = createCompiler();
458
        Code code = compiler.compileExpression(source);
459
        assertEquals("12300", code.toString());
460
    }
461
462
    public void testDecimal4() {
463
        String source = "1.23E-2";
464
465
        Compiler compiler = createCompiler();
466
        Code code = compiler.compileExpression(source);
467
        assertEquals("0.0123", code.toString());
468
    }
469
470
    public void testDecimal5() {
471
        String source = "1.23E-4";
472
473
        Compiler compiler = createCompiler();
474
        Code code = compiler.compileExpression(source);
475 44797 jjdelcerro
        assertEquals("0.000123", code.toString());
476 44211 jjdelcerro
    }
477
478
    public void testDecimal6() {
479
        String source = "-23.1";
480
481
        Compiler compiler = createCompiler();
482
        Code code = compiler.compileExpression(source);
483
        assertEquals("-23.1", code.toString());
484
    }
485
486
    public void testDecimal7() {
487
        String source = "-1.23E-2";
488
489
        Compiler compiler = createCompiler();
490
        Code code = compiler.compileExpression(source);
491
        assertEquals("-0.0123", code.toString());
492
    }
493
494
    public void testDecimal8() {
495
        String source = "-1.23E-4";
496
497
        Compiler compiler = createCompiler();
498
        Code code = compiler.compileExpression(source);
499 44797 jjdelcerro
        assertEquals("-0.000123", code.toString());
500 44211 jjdelcerro
    }
501
502 46010 jjdelcerro
    public void testGetAttr1() {
503
        String source =  "ARENA2_VEHICULOS.ID_ACCIDENTE";
504 44211 jjdelcerro
505 46010 jjdelcerro
        Compiler compiler = createCompiler();
506
507
        Code code = compiler.compileExpression(source);
508
        assertEquals( "GETATTR(\"ARENA2_VEHICULOS\", 'ID_ACCIDENTE')", code.toString());
509
    }
510
511
    public void testGetAttr1b() {
512
        String source =  "ARENA2_VEHICULOS.ID_ACCIDENTE";
513
514
        Compiler compiler = createCompiler();
515
516
        Code code = compiler.compileExpression(source);
517
        code.link(this.createSymbolTable());
518
        assertEquals( "\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\"", code.toString());
519
    }
520
521
    public void testGetAttr2a() {
522
        String source =  "GETATTR(ARENA2_VEHICULOS,'ID_ACCIDENTE')";
523
524
        Compiler compiler = createCompiler();
525
526
        Code code = compiler.compileExpression(source);
527
        code.link(this.createSymbolTable());
528
        assertEquals( "\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\"", code.toString());
529
    }
530
531
    public void testGetAttr2b() {
532
        String source =  "GETATTR(ARENA2_VEHICULOS,\"ID_ACCIDENTE\")";
533
534
        Compiler compiler = createCompiler();
535
536
        Code code = compiler.compileExpression(source);
537
        code.link(this.createSymbolTable());
538
        assertEquals( "GETATTR(\"ARENA2_VEHICULOS\", \"ID_ACCIDENTE\")", code.toString());
539
    }
540
541
    public void testGetAttr2c() {
542
        String source =  "GETATTR(ARENA2_VEHICULOS,'ID_ACCIDENTE'||3)";
543
544
        Compiler compiler = createCompiler();
545
546
        Code code = compiler.compileExpression(source);
547
        code.link(this.createSymbolTable());
548
        assertEquals( "GETATTR(\"ARENA2_VEHICULOS\", ('ID_ACCIDENTE' || 3))", code.toString());
549
    }
550 46050 omartinez
551
    public void testJson1() {
552
        String source =  "[\n" +
553
"        [2,'Val','2018'],\n" +
554
"        [3,'ali','2018'],\n" +
555
"        [5,'Val','2020'],\n" +
556
"        [7,'ali','2020']\n" +
557
"        ]";
558 46010 jjdelcerro
559 46050 omartinez
        Compiler compiler = createCompiler();
560
561
        Code code = compiler.compileExpression(source);
562
        code.link(this.createSymbolTable());
563
        assertEquals( "ARRAY[ ARRAY[ 2, 'Val', '2018' ], ARRAY[ 3, 'ali', '2018' ], ARRAY[ 5, 'Val', '2020' ], ARRAY[ 7, 'ali', '2020' ] ]", code.toString());
564
    }
565 46010 jjdelcerro
566 46056 jjdelcerro
    public void testListAdd() {
567
        String source =  "list().add(10)";
568
569
        Compiler compiler = createCompiler();
570
571
        Code code = compiler.compileExpression(source);
572
        code.link(this.createSymbolTable());
573
        assertEquals( "list().add(10)", code.toString());
574
    }
575
576
    public void testListSet() {
577
        String source =  "list(1,2,3).set(1,20)";
578
579
        Compiler compiler = createCompiler();
580
581
        Code code = compiler.compileExpression(source);
582
        code.link(this.createSymbolTable());
583
        assertEquals( "list(1, 2, 3).set(1, 20)", code.toString());
584
    }
585 46081 jjdelcerro
586
    public void testColon1() {
587
        String source =  ":a+b";
588
589
        Compiler compiler = createCompiler();
590
591
        Code code = compiler.compileExpression(source);
592
        code.link(this.createSymbolTable());
593 46082 jjdelcerro
        assertEquals( "($HOSTEXPRESSION(\"a\", 'IN') + \"b\")", code.toString());
594 46081 jjdelcerro
    }
595 46056 jjdelcerro
596 46081 jjdelcerro
    public void testColon2() {
597
        String source =  ":(a+b)+c";
598
599
        Compiler compiler = createCompiler();
600
601
        Code code = compiler.compileExpression(source);
602
        code.link(this.createSymbolTable());
603 46082 jjdelcerro
        assertEquals( "($HOSTEXPRESSION((\"a\" + \"b\"), 'IN') + \"c\")", code.toString());
604 46081 jjdelcerro
    }
605
606
607
    public void testColon3() {
608
        String source =  ":a.c";
609
610
        Compiler compiler = createCompiler();
611
612
        Code code = compiler.compileExpression(source);
613
        code.link(this.createSymbolTable());
614 46082 jjdelcerro
        assertEquals( "GETATTR($HOSTEXPRESSION(\"a\", 'IN'), 'c')", code.toString());
615 46081 jjdelcerro
    }
616
617
    public void testColon4() {
618
        String source =  ":IN a.c";
619
620
        Compiler compiler = createCompiler();
621
622
        Code code = compiler.compileExpression(source);
623
        code.link(this.createSymbolTable());
624 46082 jjdelcerro
        assertEquals( "GETATTR($HOSTEXPRESSION(\"a\", 'IN'), 'c')", code.toString());
625 46081 jjdelcerro
    }
626
627 46083 jjdelcerro
    public void testHostexpression1() {
628
        String source =  "BEGIN v1 := 10; v2 := :v1; END";
629
630
        Compiler compiler = createCompiler();
631
632
        Code code = compiler.compileExpression(source);
633
        code.link(this.createSymbolTable());
634
        assertEquals( "BLOCK(LET('v1', 10), LET('v2', $HOSTEXPRESSION(\"v1\", 'IN')))", code.toString());
635
    }
636
637 43512 jjdelcerro
}