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

History | View | Annotate | Download (18 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 testAdd2() {
327
        SymbolTable symbolTable = createSymbolTable();
328
        Compiler compiler = createCompiler();
329
        Interpreter interpreter = createInterpreter(symbolTable);
330
        
331
        String source = "precio + 10 + 20 + 30";
332

    
333
        Code code = compiler.compileExpression(source);
334
        Object v = interpreter.run(code);
335
        assertEquals(260, ((Number)v).intValue());
336
    }
337
    
338
    public void testAddMul() {
339
        SymbolTable symbolTable = createSymbolTable();
340
        Compiler compiler = createCompiler();
341
        Interpreter interpreter = createInterpreter(symbolTable);
342
        
343
        String source = "precio + 10 * 2 + 20 + 30";
344

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

    
357
        Code code = compiler.compileExpression(source);
358
        Object v = interpreter.run(code);
359
        assertEquals(470, ((Number)v).intValue());
360
    }    
361

    
362
    public void testAbs() {
363
        SymbolTable symbolTable = createSymbolTable();
364
        Compiler compiler = createCompiler();
365
        Interpreter interpreter = createInterpreter(symbolTable);
366
        
367
        String source = "precio + abs(10)";
368

    
369
        Code code = compiler.compileExpression(source);
370
        Object v = interpreter.run(code);
371
        assertEquals(210, ((Number)v).intValue());
372
    }
373

    
374
    public void testAbs2() {
375
        SymbolTable symbolTable = createSymbolTable();
376
        Compiler compiler = createCompiler();
377
        Interpreter interpreter = createInterpreter(symbolTable);
378
        
379
        String source = "precio + abs(-10)";
380

    
381
        Code code = compiler.compileExpression(source);
382
        Object v = interpreter.run(code);
383
        assertEquals(210, ((Number)v).intValue());
384
    }
385
    
386
    public void testCeil() {
387
        SymbolTable symbolTable = createSymbolTable();
388
        Compiler compiler = createCompiler();
389
        Interpreter interpreter = createInterpreter(symbolTable);
390
        
391
        String source = "precio + CEIL(PI())";
392

    
393
        Code code = compiler.compileExpression(source);
394
        Object v = interpreter.run(code);
395
        assertEquals(204, ((Number)v).intValue());
396
    }
397
    
398
    public void testConcat() {
399
        SymbolTable symbolTable = createSymbolTable();
400
        Compiler compiler = createCompiler();
401
        Interpreter interpreter = createInterpreter(symbolTable);
402
        
403
        String source = "CONCAT(precio,' euros')";
404

    
405
        Code code = compiler.compileExpression(source);
406
        Object v = interpreter.run(code);
407
        assertEquals("200 euros", (String)v);
408
    }
409

    
410
    public void testAccuracy() {
411
 
412
        SymbolTable symbolTable = createSymbolTable();
413
        Compiler compiler = createCompiler();
414
        Interpreter interpreter = createInterpreter(symbolTable);
415
        Code code;
416
        Object v;
417
        
418
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
419

    
420
        code = compiler.compileExpression("[1990] = 0.168873933773767");
421
        v = interpreter.run(code);
422
        assertEquals(true, ((Boolean)v).booleanValue());
423

    
424
        code = compiler.compileExpression("[1990] = 0.1688739");
425
        v = interpreter.run(code);
426
        assertEquals(false, ((Boolean)v).booleanValue());
427

    
428
        interpreter.setAccuracy(0.0000001);
429
        v = interpreter.run(code);
430
        assertEquals(true, ((Boolean)v).booleanValue());
431
    }    
432

    
433
    public void test2fields() {
434
        SymbolTable symbolTable = createSymbolTable();
435
        Compiler compiler = createCompiler();
436
        Interpreter interpreter = createInterpreter(symbolTable);
437
        
438
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
439

    
440
        String source = "[1990] = [precio]";
441

    
442
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
443
        Code code = compiler.compileExpression(source);
444
        Object v = interpreter.run(code);
445
        assertEquals(false, ((Boolean)v).booleanValue());
446
    }
447

    
448

    
449
    public void testInvokeMethod1() {
450
        SymbolTable symbolTable = createSymbolTable();
451
        Compiler compiler = createCompiler();
452
        Interpreter interpreter = createInterpreter(symbolTable);
453
        
454
        String source = "'hola'.length()";
455

    
456
        Code code = compiler.compileExpression(source);
457
        Object v = interpreter.run(code);
458

    
459
        assertEquals(4, ((Number)v).intValue());
460
    }
461
    
462
    
463
    public void testInvokeMethod2() {
464
        SymbolTable symbolTable = createSymbolTable();
465
        Compiler compiler = createCompiler();
466
        Interpreter interpreter = createInterpreter(symbolTable);
467
        
468
        String source = "'hola'.indexOf('l')";
469
        
470
        Code code = compiler.compileExpression(source);
471
        Object v = interpreter.run(code);
472

    
473
        assertEquals(2, ((Number)v).intValue());
474
    }
475

    
476
    public void testAlias() {
477
        SymbolTable symbolTable = createSymbolTable();
478
        Compiler compiler = createCompiler();
479
        Interpreter interpreter = createInterpreter(symbolTable);
480
        
481
        String source = "UPPER('hola')";
482
        Code code = compiler.compileExpression(source);
483
        Object v = interpreter.run(code);
484
        assertEquals("HOLA", (String)v);
485

    
486
        
487
        source = "UCASE('hola')";
488
        code = compiler.compileExpression(source);
489
        v = interpreter.run(code);
490
        assertEquals("HOLA", (String)v);
491
    }
492
    
493
    public void testRegexp1() {
494
        SymbolTable symbolTable = createSymbolTable();
495
        Compiler compiler = createCompiler();
496
        Interpreter interpreter = createInterpreter(symbolTable);
497
        
498
        String source = "'Hola' ~ '[Hh]ola'" ;
499
        Code code = compiler.compileExpression(source);
500
        Object v = interpreter.run(code);
501
        assertTrue((Boolean)v);
502
    }
503

    
504
    public void testGetitem1() {
505
        SymbolTable symbolTable = createSymbolTable();
506
        Compiler compiler = createCompiler();
507
        Interpreter interpreter = createInterpreter(symbolTable);
508
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(false);
509
        
510
        String source = "LIST('uno','dos','tres')[1]" ;
511
        
512
        Code code = compiler.compileExpression(source);
513
        Object v = interpreter.run(code);
514
        assertEquals("dos", (String)v);
515
    }
516

    
517
    public void testGetattr1() {
518
        MutableSymbolTable symbolTable = createSymbolTable();
519
        Compiler compiler = createCompiler();
520
        Interpreter interpreter = createInterpreter(symbolTable);
521
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(false);
522

    
523
        symbolTable.setVar(
524
          "PARCELA", 
525
          (AttributeHandler) (String key) -> StringUtils.equalsIgnoreCase(key, "MASA")? "100":null
526
        );
527
        String source = "PARCELA.MASA" ;
528
        
529
        Code code = compiler.compileExpression(source);
530
        assertEquals("GETATTR(\"PARCELA\", 'MASA')", code.toString());
531
        
532
        Object v = interpreter.run(code);
533
        assertEquals("100", (String)v);
534
    }
535
}