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

History | View | Annotate | Download (18.8 KB)

1
package org.gvsig.expresionevaluator.impl;
2

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

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

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

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

    
43
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
44
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
45
        Compiler compiler = manager.createCompiler();
46
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
47
        return compiler;
48
    }
49

    
50
    
51
    protected MutableSymbolTable createSymbolTable() {
52
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
53
        MutableSymbolTable symbolTable = manager.createSymbolTable();
54
        symbolTable.setVar("precio", 200);
55
        symbolTable.setVar("1990", 0.168873933773767);
56
        return symbolTable;
57
    }
58
    
59
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
60
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
61
        Interpreter interpreter = manager.createInterpreter();
62
        interpreter.setSymbolTable(symbolTable);
63
        return interpreter;
64
    }
65
    
66
    public void testIdentifier1() {
67
        SymbolTable symbolTable = createSymbolTable();
68
        Compiler compiler = createCompiler();
69
        Interpreter interpreter = createInterpreter(symbolTable);
70
        
71
        String source = "precio";
72

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
472

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

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

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

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

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

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

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

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

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