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
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
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
8
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
9
import org.gvsig.expressionevaluator.ExpressionSyntaxException;
10
import org.gvsig.expressionevaluator.MutableSymbolTable;
11
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
12

    
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
        new DefaultLibrariesInitializer().fullInitialize();
24
    }
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
    
35
    protected LexicalAnalyzer createLexicalAnalyzer() {
36
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
37
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
38
        return lexer;
39
    }
40

    
41
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
42
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
43
        Compiler compiler = manager.createCompiler();
44
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
45
        return compiler;
46
    }
47
    
48
    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
    public void testIdentifier1() {
57
        String source = "precio";
58

    
59
        Compiler compiler = createCompiler();
60
        Code code = compiler.compileExpression(source);
61
        assertEquals("\"precio\"", code.toString());
62
    }
63

    
64
    public void testIdentifier2() {
65
        Compiler compiler = createCompiler();
66
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
67

    
68
        String source = "[precio]";
69

    
70
        Code code = compiler.compileExpression(source);
71
        assertEquals("\"precio\"", code.toString());
72
    }
73

    
74
    public void testIdentifier3() {
75
        Compiler compiler = createCompiler();
76

    
77
        String source = "\"precio\"";
78

    
79
        Code code = compiler.compileExpression(source);
80
        assertEquals("\"precio\"", code.toString());
81
    }
82

    
83

    
84
    public void testTrue() {
85
        String source = "true";
86

    
87
        Compiler compiler = createCompiler();
88
        Code code = compiler.compileExpression(source);
89
        assertEquals("TRUE", code.toString());
90
    }
91

    
92
    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
    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
    public void testFalse() {
117
        String source = "false";
118

    
119
        Compiler compiler = createCompiler();
120
        Code code = compiler.compileExpression(source);
121
        assertEquals("FALSE", code.toString());
122
    }
123

    
124
    public void testNull() {
125
        String source = "null";
126

    
127
        Compiler compiler = createCompiler();
128
        Code code = compiler.compileExpression(source);
129
        assertEquals("NULL", code.toString());
130
    }
131

    
132
    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
    public void testNotTrue() {
149
        String source = "not true";
150

    
151
        Compiler compiler = createCompiler();
152
        Code code = compiler.compileExpression(source);
153
        assertEquals("NOT(TRUE)", code.toString());
154
    }
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
        assertEquals("(\"precio\" "+ operatorName + " 23)", code.toString());
170
    }
171
    
172
    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
    public void testOperators() {
180

    
181
        operator("=");
182
        operator("<>");
183
        operator(">");
184
        operator(">=");
185
        operator("<");
186
        operator("<=");
187
        operator("LIKE");
188
        operator("ILIKE");
189
        operator("||");
190
        operator("+");
191
        operator("-");
192
        operator("*");
193
        operator("OR");
194
        operator("AND");
195
        operator("IS");
196

    
197
        operator("~");
198
    }
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
        assertEquals("(((\"precio\" + (10 * 2)) + 20) + 30)", code.toString());
207
    }
208
    
209
    public void testAddMulPar() {
210
        String source = "(precio + 10) * 2 + 20 + 30";
211

    
212
        Compiler compiler = createCompiler();
213
        
214
        Code code = compiler.compileExpression(source);
215
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code.toString());
216
    }
217
    
218
    public void testAbs() {
219
        String source = "precio + abs(10)";
220

    
221
        Compiler compiler = createCompiler();
222
        
223
        Code code = compiler.compileExpression(source);
224
        assertEquals("(\"precio\" + abs(10))", code.toString());
225
    }
226
    
227
    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
    public void testAbs2() {
246
        String source = "precio + abs(-10)";
247

    
248
        Compiler compiler = createCompiler();
249
        
250
        Code code = compiler.compileExpression(source);
251
        assertEquals("(\"precio\" + abs(-10))", code.toString());
252
    }
253
    
254
    public void testPI() {
255
        String source = "precio + PI()";
256

    
257
        Compiler compiler = createCompiler();
258
        
259
        Code code = compiler.compileExpression(source);
260
        assertEquals("(\"precio\" + PI())", code.toString());
261
    }
262
    
263
    public void testCeil() {
264
        String source = "precio + CEIL(PI())";
265

    
266
        Compiler compiler = createCompiler();
267
        
268
        Code code = compiler.compileExpression(source);
269
        assertEquals("(\"precio\" + CEIL(PI()))", code.toString());
270
    }
271
    
272
    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
    public void testConcat() {
282
        String source = "CONCAT(precio,' euros')";
283

    
284
        Compiler compiler = createCompiler();
285
        
286
        Code code = compiler.compileExpression(source);
287
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
288
    }
289
    
290
    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
        assertEquals("(\"NOMBRE03\" = 'Torre d''En Besora (la)')", code.toString());
297
    }
298
    
299
    public void test2() {
300
        Compiler compiler = createCompiler();
301
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
302

    
303
        String source = "[1990] = 0.168873933773767";
304

    
305
        Code code = compiler.compileExpression(source);
306
        assertEquals("(\"1990\" = 0.168873933773767)", code.toString());
307
    }
308

    
309
    public void test2fields() {
310
        Compiler compiler = createCompiler();
311
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
312

    
313
        String source = "[1990] = [precio]";
314

    
315
        Code code = compiler.compileExpression(source);
316
        assertEquals("(\"1990\" = \"precio\")", code.toString());
317
    }
318
    
319
    
320
    public void testInvokeFunction1() {
321
        String source = "ST_Area(GEOMETRY)";
322

    
323
        Compiler compiler = createCompiler();
324
        
325
        Code code = compiler.compileExpression(source);
326
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
327
    }
328

    
329
    public void testInvokeMethod1() {
330
        String source = "'hola'.length()";
331

    
332
        Compiler compiler = createCompiler();
333
        
334
        Code code = compiler.compileExpression(source);
335
        assertEquals("'hola'.length()", code.toString());
336
    }
337
    
338
    
339
    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
    public void testInvokeMethod2() {
350
        String source = "'hola'.indexOf('l')    ";
351
        
352
        Compiler compiler = createCompiler();
353
        
354
        Code code = compiler.compileExpression(source);
355
        assertEquals("'hola'.indexOf('l')", code.toString());
356
    }
357

    
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

    
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
    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
        assertEquals("0.000123", code.toString());
476
    }
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
        assertEquals("-0.000123", code.toString());
500
    }
501

    
502
    public void testGetAttr1() {
503
        String source =  "ARENA2_VEHICULOS.ID_ACCIDENTE";
504

    
505
        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
    
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

    
559
        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

    
566
    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

    
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
        assertEquals( "($HOSTEXPRESSION(\"a\", 'IN') + \"b\")", code.toString());
594
    }    
595
    
596
    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
        assertEquals( "($HOSTEXPRESSION((\"a\" + \"b\"), 'IN') + \"c\")", code.toString());
604
    }    
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
        assertEquals( "GETATTR($HOSTEXPRESSION(\"a\", 'IN'), 'c')", code.toString());
615
    }    
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
        assertEquals( "GETATTR($HOSTEXPRESSION(\"a\", 'IN'), 'c')", code.toString());
625
    }    
626
    
627
    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
}