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

History | View | Annotate | Download (17.4 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 testFalse() {
109
        String source = "false";
110

    
111
        Compiler compiler = createCompiler();
112
        Code code = compiler.compileExpression(source);
113
        assertEquals("FALSE", code.toString());
114
    }
115

    
116
    public void testNull() {
117
        String source = "null";
118

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

    
124
    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
    public void testNotTrue() {
141
        String source = "not true";
142

    
143
        Compiler compiler = createCompiler();
144
        Code code = compiler.compileExpression(source);
145
        assertEquals("NOT(TRUE)", code.toString());
146
    }
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
        assertEquals("(\"precio\" "+ operatorName + " 23)", code.toString());
162
    }
163
    
164
    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
    public void testOperators() {
172

    
173
        operator("=");
174
        operator("<>");
175
        operator(">");
176
        operator(">=");
177
        operator("<");
178
        operator("<=");
179
        operator("LIKE");
180
        operator("ILIKE");
181
        operator("||");
182
        operator("+");
183
        operator("-");
184
        operator("*");
185
        operator("OR");
186
        operator("AND");
187
        operator("IS");
188

    
189
        operator("~");
190
    }
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
        assertEquals("(((\"precio\" + (10 * 2)) + 20) + 30)", code.toString());
199
    }
200
    
201
    public void testAddMulPar() {
202
        String source = "(precio + 10) * 2 + 20 + 30";
203

    
204
        Compiler compiler = createCompiler();
205
        
206
        Code code = compiler.compileExpression(source);
207
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code.toString());
208
    }
209
    
210
    public void testAbs() {
211
        String source = "precio + abs(10)";
212

    
213
        Compiler compiler = createCompiler();
214
        
215
        Code code = compiler.compileExpression(source);
216
        assertEquals("(\"precio\" + abs(10))", code.toString());
217
    }
218
    
219
    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
    public void testAbs2() {
238
        String source = "precio + abs(-10)";
239

    
240
        Compiler compiler = createCompiler();
241
        
242
        Code code = compiler.compileExpression(source);
243
        assertEquals("(\"precio\" + abs(-10))", code.toString());
244
    }
245
    
246
    public void testPI() {
247
        String source = "precio + PI()";
248

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

    
258
        Compiler compiler = createCompiler();
259
        
260
        Code code = compiler.compileExpression(source);
261
        assertEquals("(\"precio\" + CEIL(PI()))", code.toString());
262
    }
263
    
264
    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
    public void testConcat() {
274
        String source = "CONCAT(precio,' euros')";
275

    
276
        Compiler compiler = createCompiler();
277
        
278
        Code code = compiler.compileExpression(source);
279
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
280
    }
281
    
282
    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
        assertEquals("(\"NOMBRE03\" = 'Torre d''En Besora (la)')", code.toString());
289
    }
290
    
291
    public void test2() {
292
        Compiler compiler = createCompiler();
293
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
294

    
295
        String source = "[1990] = 0.168873933773767";
296

    
297
        Code code = compiler.compileExpression(source);
298
        assertEquals("(\"1990\" = 0.168873933773767)", code.toString());
299
    }
300

    
301
    public void test2fields() {
302
        Compiler compiler = createCompiler();
303
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
304

    
305
        String source = "[1990] = [precio]";
306

    
307
        Code code = compiler.compileExpression(source);
308
        assertEquals("(\"1990\" = \"precio\")", code.toString());
309
    }
310
    
311
    
312
    public void testInvokeFunction1() {
313
        String source = "ST_Area(GEOMETRY)";
314

    
315
        Compiler compiler = createCompiler();
316
        
317
        Code code = compiler.compileExpression(source);
318
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
319
    }
320

    
321
    public void testInvokeMethod1() {
322
        String source = "'hola'.length()";
323

    
324
        Compiler compiler = createCompiler();
325
        
326
        Code code = compiler.compileExpression(source);
327
        assertEquals("'hola'.length()", code.toString());
328
    }
329
    
330
    
331
    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
    public void testInvokeMethod2() {
342
        String source = "'hola'.indexOf('l')    ";
343
        
344
        Compiler compiler = createCompiler();
345
        
346
        Code code = compiler.compileExpression(source);
347
        assertEquals("'hola'.indexOf('l')", code.toString());
348
    }
349

    
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

    
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
    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
        assertEquals("0.000123", code.toString());
468
    }
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
        assertEquals("-0.000123", code.toString());
492
    }
493

    
494
    public void testGetAttr1() {
495
        String source =  "ARENA2_VEHICULOS.ID_ACCIDENTE";
496

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

    
551
        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

    
558
    public void testListAdd() {
559
        String source =  "list().add(10)";
560

    
561
        Compiler compiler = createCompiler();
562
        
563
        Code code = compiler.compileExpression(source);
564
        code.link(this.createSymbolTable());
565
        assertEquals( "list().add(10)", code.toString());
566
    }
567
    
568
    public void testListSet() {
569
        String source =  "list(1,2,3).set(1,20)";
570

    
571
        Compiler compiler = createCompiler();
572
        
573
        Code code = compiler.compileExpression(source);
574
        code.link(this.createSymbolTable());
575
        assertEquals( "list(1, 2, 3).set(1, 20)", code.toString());
576
    }    
577
    
578
}