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 / TestInterpreter.java @ 45213

History | View | Annotate | Download (20.7 KB)

1
package org.gvsig.expresionevaluator.impl;
2

    
3
import java.util.Map;
4
import junit.framework.TestCase;
5
import org.apache.commons.lang3.StringUtils;
6
import org.gvsig.expressionevaluator.AttributeHandler;
7
import org.gvsig.expressionevaluator.LexicalAnalyzer;
8
import org.gvsig.expressionevaluator.Compiler;
9
import org.gvsig.expressionevaluator.SymbolTable;
10
import org.gvsig.expressionevaluator.Interpreter;
11
import org.gvsig.expressionevaluator.Code;
12
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
13
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
14
import org.gvsig.expressionevaluator.MutableSymbolTable;
15
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
16

    
17
public class TestInterpreter extends TestCase {
18
    
19
    public TestInterpreter(String testName) {
20
        super(testName);
21
    }
22
    
23
    @Override
24
    protected void setUp() throws Exception {
25
        super.setUp();
26
        new DefaultLibrariesInitializer().fullInitialize();
27
    }
28
    
29
    @Override
30
    protected void tearDown() throws Exception {
31
        super.tearDown();
32
    }
33

    
34
    // TODO add test methods here. The name must begin with 'test'. For example:
35
    // public void testHello() {}
36

    
37
    
38
    protected LexicalAnalyzer createLexicalAnalyzer() {
39
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
40
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
41
        return lexer;
42
    }
43

    
44
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
45
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
46
        Compiler compiler = manager.createCompiler();
47
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
48
        return compiler;
49
    }
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 testIdentifier1() {
68
        SymbolTable symbolTable = createSymbolTable();
69
        Compiler compiler = createCompiler();
70
        Interpreter interpreter = createInterpreter(symbolTable);
71
        
72
        String source = "precio";
73

    
74
        Code code = compiler.compileExpression(source);
75
        Object v = interpreter.run(code);
76
        assertEquals(200, ((Number)v).intValue());
77
    }
78
    
79
    public void testInteger() {
80
        SymbolTable symbolTable = createSymbolTable();
81
        Compiler compiler = createCompiler();
82
        Interpreter interpreter = createInterpreter(symbolTable);
83
        
84
        String source = "23";
85

    
86
        Code code = compiler.compileExpression(source);
87
        Object v = interpreter.run(code);
88
        assertEquals(23, ((Number)v).intValue());
89
    }
90
    
91
    public void testNumberDMS() {
92
        SymbolTable symbolTable = createSymbolTable();
93
        Compiler compiler = createCompiler();
94
        Interpreter interpreter = createInterpreter(symbolTable);
95
        
96
        String source = "@10 30 1.2 N";
97

    
98
        Code code = compiler.compileExpression(source);
99
        Object v = interpreter.run(code);
100
        assertEquals(10.5003, Math.round(((Number)v).doubleValue()*10000d)/10000d);
101

    
102
        source = "@10 30 0.09 N";
103

    
104
        code = compiler.compileExpression(source);
105
        v = interpreter.run(code);
106
        assertEquals(10.500025, Math.round(((Number)v).doubleValue()*1000000d)/1000000d);
107

    
108
        source = "@10 30 0.09 S";
109

    
110
        code = compiler.compileExpression(source);
111
        v = interpreter.run(code);
112
        assertEquals(-10.500025, Math.round(((Number)v).doubleValue()*1000000d)/1000000d);
113

    
114
        source = "@+10 30 0.09";
115

    
116
        code = compiler.compileExpression(source);
117
        v = interpreter.run(code);
118
        assertEquals(10.500025, Math.round(((Number)v).doubleValue()*1000000d)/1000000d);
119

    
120
        source = "@-10 30 0.09";
121

    
122
        code = compiler.compileExpression(source);
123
        v = interpreter.run(code);
124
        assertEquals(-10.500025, Math.round(((Number)v).doubleValue()*1000000d)/1000000d);
125

    
126
    }
127
    
128
    public void testTrue() {
129
        SymbolTable symbolTable = createSymbolTable();
130
        Compiler compiler = createCompiler();
131
        Interpreter interpreter = createInterpreter(symbolTable);
132
        
133
        String source = "true";
134

    
135
        Code code = compiler.compileExpression(source);
136
        assertEquals(Boolean.TRUE, interpreter.run(code));
137
    }
138
    
139
    public void testFalse() {
140
        SymbolTable symbolTable = createSymbolTable();
141
        Compiler compiler = createCompiler();
142
        Interpreter interpreter = createInterpreter(symbolTable);
143
        
144
        String source = "false";
145

    
146
        Code code = compiler.compileExpression(source);
147
        assertEquals(Boolean.FALSE, interpreter.run(code));
148
    }
149
    
150
    public void testNull() {
151
        SymbolTable symbolTable = createSymbolTable();
152
        Compiler compiler = createCompiler();
153
        Interpreter interpreter = createInterpreter(symbolTable);
154
        
155
        String source = "null";
156

    
157
        Code code = compiler.compileExpression(source);
158
        assertEquals(null, interpreter.run(code));
159
    }
160
    
161
    public void testIsNull() {
162
        SymbolTable symbolTable = createSymbolTable();
163
        Compiler compiler = createCompiler();
164
        Interpreter interpreter = createInterpreter(symbolTable);
165
        
166
        String source = "10 is null";
167

    
168
        Code code = compiler.compileExpression(source);
169
        assertEquals(false, interpreter.run(code));
170
    }
171
    
172
    public void testIsNotNull() {
173
        SymbolTable symbolTable = createSymbolTable();
174
        Compiler compiler = createCompiler();
175
        Interpreter interpreter = createInterpreter(symbolTable);
176
        
177
        String source = "10 is not null";
178

    
179
        Code code = compiler.compileExpression(source);
180
        assertEquals(true, interpreter.run(code));
181
    }
182
    
183
    public void testAdd1() {
184
        SymbolTable symbolTable = createSymbolTable();
185
        Compiler compiler = createCompiler();
186
        Interpreter interpreter = createInterpreter(symbolTable);
187
        
188
        String source = "precio + 10";
189

    
190
        Code code = compiler.compileExpression(source);
191
        Object v = interpreter.run(code);
192
        assertEquals(210, ((Number)v).intValue());
193
    }
194
    
195
    public void testSimpleAdd1() {
196
        SymbolTable symbolTable = createSymbolTable();
197
        Compiler compiler = createCompiler();
198
        Interpreter interpreter = createInterpreter(symbolTable);
199
        
200
        String source = "5+10";
201

    
202
        Code code = compiler.compileExpression(source);
203
        Object v = interpreter.run(code);
204
        assertEquals(15, ((Number)v).intValue());
205
    }
206
    
207
    public void testSimpleAdd2() {
208
        SymbolTable symbolTable = createSymbolTable();
209
        Compiler compiler = createCompiler();
210
        Interpreter interpreter = createInterpreter(symbolTable);
211
        
212
        String source = "5 + 10";
213

    
214
        Code code = compiler.compileExpression(source);
215
        Object v = interpreter.run(code);
216
        assertEquals(15, ((Number)v).intValue());
217
    }
218
    
219
    public void testSimpleAdd3() {
220
        SymbolTable symbolTable = createSymbolTable();
221
        Compiler compiler = createCompiler();
222
        Interpreter interpreter = createInterpreter(symbolTable);
223
        
224
        String source = "10+-5";
225

    
226
        Code code = compiler.compileExpression(source);
227
        Object v = interpreter.run(code);
228
        assertEquals(5, ((Number)v).intValue());
229
    }
230
    
231
    public void testSimpleSub1() {
232
        SymbolTable symbolTable = createSymbolTable();
233
        Compiler compiler = createCompiler();
234
        Interpreter interpreter = createInterpreter(symbolTable);
235
        
236
        String source = "10-5";
237

    
238
        Code code = compiler.compileExpression(source);
239
        Object v = interpreter.run(code);
240
        assertEquals(5, ((Number)v).intValue());
241
    }
242
    
243
    public void testSimpleSub2() {
244
        SymbolTable symbolTable = createSymbolTable();
245
        Compiler compiler = createCompiler();
246
        Interpreter interpreter = createInterpreter(symbolTable);
247
        
248
        String source = "10 - 5";
249

    
250
        Code code = compiler.compileExpression(source);
251
        Object v = interpreter.run(code);
252
        assertEquals(5, ((Number)v).intValue());
253
    }
254
    
255
    public void testSimpleNumber() {
256
        SymbolTable symbolTable = createSymbolTable();
257
        Compiler compiler = createCompiler();
258
        Interpreter interpreter = createInterpreter(symbolTable);
259
        
260
        String source = "23";
261

    
262
        Code code = compiler.compileExpression(source);
263
        Object v = interpreter.run(code);
264
        assertEquals(23, ((Number)v).intValue());
265
    }
266
    
267
    public void testSimpleNegativeNumber() {
268
        SymbolTable symbolTable = createSymbolTable();
269
        Compiler compiler = createCompiler();
270
        Interpreter interpreter = createInterpreter(symbolTable);
271
        
272
        String source = "-23";
273

    
274
        Code code = compiler.compileExpression(source);
275
        Object v = interpreter.run(code);
276
        assertEquals(-23, ((Number)v).intValue());
277
    }
278
    
279
    public void testNegateFunction() {
280
        SymbolTable symbolTable = createSymbolTable();
281
        Compiler compiler = createCompiler();
282
        Interpreter interpreter = createInterpreter(symbolTable);
283
        
284
        String source = "-PI()";
285

    
286
        Code code = compiler.compileExpression(source);
287
        Object v = interpreter.run(code);
288
        assertEquals(-Math.PI, ((Number)v).doubleValue());
289
    }
290
    
291
    public void testSub1() {
292
        SymbolTable symbolTable = createSymbolTable();
293
        Compiler compiler = createCompiler();
294
        Interpreter interpreter = createInterpreter(symbolTable);
295
        
296
        String source = "precio - 10";
297

    
298
        Code code = compiler.compileExpression(source);
299
        Object v = interpreter.run(code);
300
        assertEquals(190, ((Number)v).intValue());
301
    }
302
    
303
    public void testMul1() {
304
        SymbolTable symbolTable = createSymbolTable();
305
        Compiler compiler = createCompiler();
306
        Interpreter interpreter = createInterpreter(symbolTable);
307
        
308
        String source = "precio * 10";
309

    
310
        Code code = compiler.compileExpression(source);
311
        Object v = interpreter.run(code);
312
        assertEquals(2000, ((Number)v).intValue());
313
    }
314

    
315
    public void testDiv1() {
316
        SymbolTable symbolTable = createSymbolTable();
317
        Compiler compiler = createCompiler();
318
        Interpreter interpreter = createInterpreter(symbolTable);
319
        
320
        String source = "precio / 10";
321

    
322
        Code code = compiler.compileExpression(source);
323
        Object v = interpreter.run(code);
324
        assertEquals(20, ((Number)v).intValue());
325
    }
326
    
327
    public void testMod1() {
328
        SymbolTable symbolTable = createSymbolTable();
329
        Compiler compiler = createCompiler();
330
        Interpreter interpreter = createInterpreter(symbolTable);
331
        
332
        String source = "4 % 3";
333

    
334
        Code code = compiler.compileExpression(source);
335
        Object v = interpreter.run(code);
336
        assertEquals(1, ((Number)v).intValue());
337
    }
338
    
339
    public void testMod2() {
340
        SymbolTable symbolTable = createSymbolTable();
341
        Compiler compiler = createCompiler();
342
        Interpreter interpreter = createInterpreter(symbolTable);
343
        
344
        String source = "MOD(4, 3)";
345

    
346
        Code code = compiler.compileExpression(source);
347
        Object v = interpreter.run(code);
348
        assertEquals(1, ((Number)v).intValue());
349
    }
350
    
351
    public void testAdd2() {
352
        SymbolTable symbolTable = createSymbolTable();
353
        Compiler compiler = createCompiler();
354
        Interpreter interpreter = createInterpreter(symbolTable);
355
        
356
        String source = "precio + 10 + 20 + 30";
357

    
358
        Code code = compiler.compileExpression(source);
359
        Object v = interpreter.run(code);
360
        assertEquals(260, ((Number)v).intValue());
361
    }
362
    
363
    public void testAddMul() {
364
        SymbolTable symbolTable = createSymbolTable();
365
        Compiler compiler = createCompiler();
366
        Interpreter interpreter = createInterpreter(symbolTable);
367
        
368
        String source = "precio + 10 * 2 + 20 + 30";
369

    
370
        Code code = compiler.compileExpression(source);
371
        Object v = interpreter.run(code);
372
        assertEquals(270, ((Number)v).intValue());
373
    }
374
    
375
    public void testAddMulPar() {
376
        SymbolTable symbolTable = createSymbolTable();
377
        Compiler compiler = createCompiler();
378
        Interpreter interpreter = createInterpreter(symbolTable);
379
        
380
        String source = "(precio + 10) * 2 + 20 + 30";
381

    
382
        Code code = compiler.compileExpression(source);
383
        Object v = interpreter.run(code);
384
        assertEquals(470, ((Number)v).intValue());
385
    }    
386

    
387
    public void testAbs() {
388
        SymbolTable symbolTable = createSymbolTable();
389
        Compiler compiler = createCompiler();
390
        Interpreter interpreter = createInterpreter(symbolTable);
391
        
392
        String source = "precio + abs(10)";
393

    
394
        Code code = compiler.compileExpression(source);
395
        Object v = interpreter.run(code);
396
        assertEquals(210, ((Number)v).intValue());
397
    }
398

    
399
    public void testAbs2() {
400
        SymbolTable symbolTable = createSymbolTable();
401
        Compiler compiler = createCompiler();
402
        Interpreter interpreter = createInterpreter(symbolTable);
403
        
404
        String source = "precio + abs(-10)";
405

    
406
        Code code = compiler.compileExpression(source);
407
        Object v = interpreter.run(code);
408
        assertEquals(210, ((Number)v).intValue());
409
    }
410
    
411
    public void testCeil() {
412
        SymbolTable symbolTable = createSymbolTable();
413
        Compiler compiler = createCompiler();
414
        Interpreter interpreter = createInterpreter(symbolTable);
415
        
416
        String source = "precio + CEIL(PI())";
417

    
418
        Code code = compiler.compileExpression(source);
419
        Object v = interpreter.run(code);
420
        assertEquals(204, ((Number)v).intValue());
421
    }
422
    
423
    public void testConcat() {
424
        SymbolTable symbolTable = createSymbolTable();
425
        Compiler compiler = createCompiler();
426
        Interpreter interpreter = createInterpreter(symbolTable);
427
        
428
        String source = "CONCAT(precio,' euros')";
429

    
430
        Code code = compiler.compileExpression(source);
431
        Object v = interpreter.run(code);
432
        assertEquals("200 euros", (String)v);
433
    }
434

    
435
    public void testAccuracy() {
436
 
437
        SymbolTable symbolTable = createSymbolTable();
438
        Compiler compiler = createCompiler();
439
        Interpreter interpreter = createInterpreter(symbolTable);
440
        Code code;
441
        Object v;
442
        
443
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
444

    
445
        code = compiler.compileExpression("[1990] = 0.168873933773767");
446
        v = interpreter.run(code);
447
        assertEquals(true, ((Boolean)v).booleanValue());
448

    
449
        code = compiler.compileExpression("[1990] = 0.1688739");
450
        v = interpreter.run(code);
451
        assertEquals(false, ((Boolean)v).booleanValue());
452

    
453
        interpreter.setAccuracy(0.0000001);
454
        v = interpreter.run(code);
455
        assertEquals(true, ((Boolean)v).booleanValue());
456
    }    
457

    
458
    public void test2fields() {
459
        SymbolTable symbolTable = createSymbolTable();
460
        Compiler compiler = createCompiler();
461
        Interpreter interpreter = createInterpreter(symbolTable);
462
        
463
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
464

    
465
        String source = "[1990] = [precio]";
466

    
467
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
468
        Code code = compiler.compileExpression(source);
469
        Object v = interpreter.run(code);
470
        assertEquals(false, ((Boolean)v).booleanValue());
471
    }
472

    
473

    
474
    public void testInvokeMethod1() {
475
        SymbolTable symbolTable = createSymbolTable();
476
        Compiler compiler = createCompiler();
477
        Interpreter interpreter = createInterpreter(symbolTable);
478
        
479
        String source = "'hola'.length()";
480

    
481
        Code code = compiler.compileExpression(source);
482
        Object v = interpreter.run(code);
483

    
484
        assertEquals(4, ((Number)v).intValue());
485
    }
486
    
487
    
488
    public void testInvokeMethod2() {
489
        SymbolTable symbolTable = createSymbolTable();
490
        Compiler compiler = createCompiler();
491
        Interpreter interpreter = createInterpreter(symbolTable);
492
        
493
        String source = "'hola'.indexOf('l')";
494
        
495
        Code code = compiler.compileExpression(source);
496
        Object v = interpreter.run(code);
497

    
498
        assertEquals(2, ((Number)v).intValue());
499
    }
500

    
501
    public void testAlias() {
502
        SymbolTable symbolTable = createSymbolTable();
503
        Compiler compiler = createCompiler();
504
        Interpreter interpreter = createInterpreter(symbolTable);
505
        
506
        String source = "UPPER('hola')";
507
        Code code = compiler.compileExpression(source);
508
        Object v = interpreter.run(code);
509
        assertEquals("HOLA", (String)v);
510

    
511
        
512
        source = "UCASE('hola')";
513
        code = compiler.compileExpression(source);
514
        v = interpreter.run(code);
515
        assertEquals("HOLA", (String)v);
516
    }
517
    
518
    public void testRegexp1() {
519
        SymbolTable symbolTable = createSymbolTable();
520
        Compiler compiler = createCompiler();
521
        Interpreter interpreter = createInterpreter(symbolTable);
522
        
523
        String source = "'Hola' ~ '[Hh]ola'" ;
524
        Code code = compiler.compileExpression(source);
525
        Object v = interpreter.run(code);
526
        assertTrue((Boolean)v);
527
    }
528

    
529
    public void testGetitem1() {
530
        SymbolTable symbolTable = createSymbolTable();
531
        Compiler compiler = createCompiler();
532
        Interpreter interpreter = createInterpreter(symbolTable);
533
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(false);
534
        
535
        String source = "LIST('uno','dos','tres')[1]" ;
536
        
537
        Code code = compiler.compileExpression(source);
538
        Object v = interpreter.run(code);
539
        assertEquals("dos", (String)v);
540
    }
541

    
542
    public void testGetattr1() {
543
        MutableSymbolTable symbolTable = createSymbolTable();
544
        Compiler compiler = createCompiler();
545
        Interpreter interpreter = createInterpreter(symbolTable);
546
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(false);
547

    
548
        symbolTable.setVar(
549
          "PARCELA", 
550
          (AttributeHandler) (String key) -> StringUtils.equalsIgnoreCase(key, "MASA")? "100":null
551
        );
552
        String source = "PARCELA.MASA" ;
553
        
554
        Code code = compiler.compileExpression(source);
555
        assertEquals("GETATTR(\"PARCELA\", 'MASA')", code.toString());
556
        
557
        Object v = interpreter.run(code);
558
        assertEquals("100", (String)v);
559
    }
560

    
561
    public void testDict1() {
562
        MutableSymbolTable symbolTable = createSymbolTable();
563
        Compiler compiler = createCompiler();
564
        Interpreter interpreter = createInterpreter(symbolTable);
565

    
566
        String source = "dict()" ;
567
        
568
        Code code = compiler.compileExpression(source);
569
        assertEquals("dict()", code.toString());
570
        
571
        Object v = interpreter.run(code);
572
        assertTrue("Map expected", v instanceof Map);
573
        assertEquals(0, ((Map)v).size());
574
    }
575

    
576
    public void testDict2() {
577
        MutableSymbolTable symbolTable = createSymbolTable();
578
        Compiler compiler = createCompiler();
579
        Interpreter interpreter = createInterpreter(symbolTable);
580

    
581
        String source = "dict(diez=10, veinte:20)" ;
582
        
583
        Code code = compiler.compileExpression(source);
584
        assertEquals("DICT('diez', 10, 'veinte', 20)", code.toString());
585
        
586
        Object v = interpreter.run(code);
587
        assertTrue("Map expected", v instanceof Map);
588
        assertEquals(2, ((Map)v).size());
589
        assertEquals(10, ((Number)((Map)v).get("diez")).intValue());
590
        assertEquals(20, ((Number)((Map)v).get("veinte")).intValue());
591
    }
592

    
593
    public void testDict3() {
594
        MutableSymbolTable symbolTable = createSymbolTable();
595
        Compiler compiler = createCompiler();
596
        Interpreter interpreter = createInterpreter(symbolTable);
597

    
598
        String source = "dict('diez', 10, 'veinte', 20)" ;
599
        
600
        Code code = compiler.compileExpression(source);
601
        assertEquals("dict('diez', 10, 'veinte', 20)", code.toString());
602
        
603
        Object v = interpreter.run(code);
604
        assertTrue("Map expected", v instanceof Map);
605
        assertEquals(2, ((Map)v).size());
606
        assertEquals(10, ((Number)((Map)v).get("diez")).intValue());
607
        assertEquals(20, ((Number)((Map)v).get("veinte")).intValue());
608
    }
609

    
610
}