Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.geometry / org.gvsig.expressionevaluator.geometry.lib / org.gvsig.expressionevaluator.geometry.lib.impl / src / test / java / org / gvsig / expresionevaluator / impl / TestInterpreter.java @ 47598

History | View | Annotate | Download (19 KB)

1
package org.gvsig.expresionevaluator.impl;
2

    
3
import junit.framework.TestCase;
4
import org.cresques.cts.IProjection;
5
import org.gvsig.expressionevaluator.LexicalAnalyzer;
6
import org.gvsig.expressionevaluator.Compiler;
7
import org.gvsig.expressionevaluator.SymbolTable;
8
import org.gvsig.expressionevaluator.Interpreter;
9
import org.gvsig.expressionevaluator.Code;
10
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
11
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
12
import org.gvsig.expressionevaluator.GeometryExpressionBuilder;
13
import org.gvsig.expressionevaluator.GeometryExpressionUtils;
14
import org.gvsig.expressionevaluator.MutableSymbolTable;
15
import org.gvsig.fmap.crs.CRSFactory;
16
import org.gvsig.fmap.geom.Geometry;
17
import org.gvsig.fmap.geom.GeometryLocator;
18
import org.gvsig.fmap.geom.GeometryManager;
19
import org.gvsig.fmap.geom.primitive.Point;
20
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
21

    
22
public class TestInterpreter extends TestCase {
23
    
24
    public TestInterpreter(String testName) {
25
        super(testName);
26
    }
27
    
28
    @Override
29
    protected void setUp() throws Exception {
30
        super.setUp();
31
        new DefaultLibrariesInitializer().fullInitialize();
32
    }
33
    
34
    @Override
35
    protected void tearDown() throws Exception {
36
        super.tearDown();
37
    }
38

    
39
    // TODO add test methods here. The name must begin with 'test'. For example:
40
    // public void testHello() {}
41

    
42
    
43
    protected LexicalAnalyzer createLexicalAnalyzer() {
44
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
45
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
46
        return lexer;
47
    }
48

    
49
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
50
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
51
        Compiler compiler = manager.createCompiler();
52
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
53
        return compiler;
54
    }
55

    
56
    
57
    protected MutableSymbolTable createSymbolTable() {
58
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
59
        MutableSymbolTable symbolTable = manager.createSymbolTable();
60
        symbolTable.setVar("precio", 200);
61
        symbolTable.setVar("1990", 0.168873933773767);
62
        return symbolTable;
63
    }
64
    
65
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
66
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
67
        Interpreter interpreter = manager.createInterpreter();
68
        interpreter.setSymbolTable(symbolTable);
69
        return interpreter;
70
    }
71

    
72
    protected GeometryExpressionBuilder createExpressionBuilder() {
73
        GeometryExpressionBuilder builder = GeometryExpressionUtils.createExpressionBuilder();
74
        return builder;
75
    }
76
    
77
    public void testIdentifier1() {
78
        SymbolTable symbolTable = createSymbolTable();
79
        Compiler compiler = createCompiler();
80
        Interpreter interpreter = createInterpreter(symbolTable);
81
        
82
        String source = "precio";
83

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

    
96
        Code code = compiler.compileExpression(source);
97
        Object v = interpreter.run(code);
98
        assertEquals(23, ((Number)v).intValue());
99
    }
100
    
101
    public void testNumberDMS() {
102
        SymbolTable symbolTable = createSymbolTable();
103
        Compiler compiler = createCompiler();
104
        Interpreter interpreter = createInterpreter(symbolTable);
105
        
106
        String source = "@10 30 1.2 N";
107

    
108
        Code code = compiler.compileExpression(source);
109
        Object v = interpreter.run(code);
110
        assertEquals(10.5003, Math.round(((Number)v).doubleValue()*10000d)/10000d);
111

    
112
        source = "@10 30 0.09 N";
113

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

    
118
        source = "@10 30 0.09 S";
119

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

    
124
        source = "@+10 30 0.09";
125

    
126
        code = compiler.compileExpression(source);
127
        v = interpreter.run(code);
128
        assertEquals(10.500025, Math.round(((Number)v).doubleValue()*1000000d)/1000000d);
129

    
130
        source = "@-10 30 0.09";
131

    
132
        code = compiler.compileExpression(source);
133
        v = interpreter.run(code);
134
        assertEquals(-10.500025, Math.round(((Number)v).doubleValue()*1000000d)/1000000d);
135

    
136
    }
137
    
138
    public void testTrue() {
139
        SymbolTable symbolTable = createSymbolTable();
140
        Compiler compiler = createCompiler();
141
        Interpreter interpreter = createInterpreter(symbolTable);
142
        
143
        String source = "true";
144

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

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

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

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

    
189
        Code code = compiler.compileExpression(source);
190
        assertEquals(true, interpreter.run(code));
191
    }
192
    
193
    public void testAdd1() {
194
        SymbolTable symbolTable = createSymbolTable();
195
        Compiler compiler = createCompiler();
196
        Interpreter interpreter = createInterpreter(symbolTable);
197
        
198
        String source = "precio + 10";
199

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

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

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

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

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

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

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

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

    
296
        Code code = compiler.compileExpression(source);
297
        Object v = interpreter.run(code);
298
        assertEquals(-Math.PI, ((Number)v).doubleValue());
299
    }
300
    
301
    public void testSub1() {
302
        SymbolTable symbolTable = createSymbolTable();
303
        Compiler compiler = createCompiler();
304
        Interpreter interpreter = createInterpreter(symbolTable);
305
        
306
        String source = "precio - 10";
307

    
308
        Code code = compiler.compileExpression(source);
309
        Object v = interpreter.run(code);
310
        assertEquals(190, ((Number)v).intValue());
311
    }
312
    
313
    @SuppressWarnings({"UseSpecificCatch", "CallToPrintStackTrace"})
314
    public void testAndAnd1() throws Throwable {
315
        try {
316
            GeometryExpressionBuilder builder = createExpressionBuilder();
317

    
318
            GeometryManager geometryManager = GeometryLocator.getGeometryManager();
319
            IProjection proj = CRSFactory.getCRS("EPSG:4326");
320

    
321
            Point point = geometryManager.createPoint(-0.1779813, 51.6122315, Geometry.SUBTYPES.GEOM2D);
322
            Geometry point_buffer = point.buffer(0.001);
323

    
324
            builder.and(
325
                builder.andand(
326
                    builder.column("geometry"),
327
                    builder.geometry(point_buffer, proj)
328
                )
329
            );            
330
            
331
            MutableSymbolTable symbolTable = createSymbolTable();
332
            Compiler compiler = createCompiler();
333
            Interpreter interpreter = createInterpreter(symbolTable);
334

    
335
            symbolTable.setVar("geometry", point);
336
            String source = builder.toString();
337

    
338
            Code code = compiler.compileExpression(source);
339
            Object v = interpreter.run(code);
340
            assertEquals(true, ((Boolean)v).booleanValue());
341
        } catch(Throwable t) {
342
            t.printStackTrace();
343
            throw t;
344
        }
345
    }
346

    
347
    public void testMul1() {
348
        SymbolTable symbolTable = createSymbolTable();
349
        Compiler compiler = createCompiler();
350
        Interpreter interpreter = createInterpreter(symbolTable);
351
        
352
        String source = "precio * 10";
353

    
354
        Code code = compiler.compileExpression(source);
355
        Object v = interpreter.run(code);
356
        assertEquals(2000, ((Number)v).intValue());
357
    }
358

    
359
    public void testDiv1() {
360
        SymbolTable symbolTable = createSymbolTable();
361
        Compiler compiler = createCompiler();
362
        Interpreter interpreter = createInterpreter(symbolTable);
363
        
364
        String source = "precio / 10";
365

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

    
378
        Code code = compiler.compileExpression(source);
379
        Object v = interpreter.run(code);
380
        assertEquals(260, ((Number)v).intValue());
381
    }
382
    
383
    public void testAddMul() {
384
        SymbolTable symbolTable = createSymbolTable();
385
        Compiler compiler = createCompiler();
386
        Interpreter interpreter = createInterpreter(symbolTable);
387
        
388
        String source = "precio + 10 * 2 + 20 + 30";
389

    
390
        Code code = compiler.compileExpression(source);
391
        Object v = interpreter.run(code);
392
        assertEquals(270, ((Number)v).intValue());
393
    }
394
    
395
    public void testAddMulPar() {
396
        SymbolTable symbolTable = createSymbolTable();
397
        Compiler compiler = createCompiler();
398
        Interpreter interpreter = createInterpreter(symbolTable);
399
        
400
        String source = "(precio + 10) * 2 + 20 + 30";
401

    
402
        Code code = compiler.compileExpression(source);
403
        Object v = interpreter.run(code);
404
        assertEquals(470, ((Number)v).intValue());
405
    }    
406

    
407
    public void testAbs() {
408
        SymbolTable symbolTable = createSymbolTable();
409
        Compiler compiler = createCompiler();
410
        Interpreter interpreter = createInterpreter(symbolTable);
411
        
412
        String source = "precio + abs(10)";
413

    
414
        Code code = compiler.compileExpression(source);
415
        Object v = interpreter.run(code);
416
        assertEquals(210, ((Number)v).intValue());
417
    }
418

    
419
    public void testAbs2() {
420
        SymbolTable symbolTable = createSymbolTable();
421
        Compiler compiler = createCompiler();
422
        Interpreter interpreter = createInterpreter(symbolTable);
423
        
424
        String source = "precio + abs(-10)";
425

    
426
        Code code = compiler.compileExpression(source);
427
        Object v = interpreter.run(code);
428
        assertEquals(210, ((Number)v).intValue());
429
    }
430
    
431
    public void testCeil() {
432
        SymbolTable symbolTable = createSymbolTable();
433
        Compiler compiler = createCompiler();
434
        Interpreter interpreter = createInterpreter(symbolTable);
435
        
436
        String source = "precio + CEIL(PI())";
437

    
438
        Code code = compiler.compileExpression(source);
439
        Object v = interpreter.run(code);
440
        assertEquals(204, ((Number)v).intValue());
441
    }
442
    
443
    public void testConcat() {
444
        SymbolTable symbolTable = createSymbolTable();
445
        Compiler compiler = createCompiler();
446
        Interpreter interpreter = createInterpreter(symbolTable);
447
        
448
        String source = "CONCAT(precio,' euros')";
449

    
450
        Code code = compiler.compileExpression(source);
451
        Object v = interpreter.run(code);
452
        assertEquals("200 euros", (String)v);
453
    }
454

    
455
    public void testAccuracy() {
456
 
457
        SymbolTable symbolTable = createSymbolTable();
458
        Compiler compiler = createCompiler();
459
        Interpreter interpreter = createInterpreter(symbolTable);
460
        Code code;
461
        Object v;
462
        
463
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
464

    
465
        code = compiler.compileExpression("[1990] = 0.168873933773767");
466
        v = interpreter.run(code);
467
        assertEquals(true, ((Boolean)v).booleanValue());
468

    
469
        code = compiler.compileExpression("[1990] = 0.1688739");
470
        v = interpreter.run(code);
471
        assertEquals(false, ((Boolean)v).booleanValue());
472

    
473
        interpreter.setAccuracy(0.0000001);
474
        v = interpreter.run(code);
475
        assertEquals(true, ((Boolean)v).booleanValue());
476
    }    
477

    
478
    public void test2fields() {
479
        SymbolTable symbolTable = createSymbolTable();
480
        Compiler compiler = createCompiler();
481
        Interpreter interpreter = createInterpreter(symbolTable);
482
        
483
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
484

    
485
        String source = "[1990] = [precio]";
486

    
487
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
488
        Code code = compiler.compileExpression(source);
489
        Object v = interpreter.run(code);
490
        assertEquals(false, ((Boolean)v).booleanValue());
491
    }
492

    
493

    
494
    public void testInvokeMethod1() {
495
        SymbolTable symbolTable = createSymbolTable();
496
        Compiler compiler = createCompiler();
497
        Interpreter interpreter = createInterpreter(symbolTable);
498
        
499
        String source = "'hola'.length()";
500

    
501
        Code code = compiler.compileExpression(source);
502
        Object v = interpreter.run(code);
503

    
504
        assertEquals(4, ((Number)v).intValue());
505
    }
506
    
507
    
508
    public void testInvokeMethod2() {
509
        SymbolTable symbolTable = createSymbolTable();
510
        Compiler compiler = createCompiler();
511
        Interpreter interpreter = createInterpreter(symbolTable);
512
        
513
        String source = "'hola'.indexOf('l')";
514
        
515
        Code code = compiler.compileExpression(source);
516
        Object v = interpreter.run(code);
517

    
518
        assertEquals(2, ((Number)v).intValue());
519
    }
520

    
521
    public void testAlias() {
522
        SymbolTable symbolTable = createSymbolTable();
523
        Compiler compiler = createCompiler();
524
        Interpreter interpreter = createInterpreter(symbolTable);
525
        
526
        String source = "UPPER('hola')";
527
        Code code = compiler.compileExpression(source);
528
        Object v = interpreter.run(code);
529
        assertEquals("HOLA", (String)v);
530

    
531
        
532
        source = "UCASE('hola')";
533
        code = compiler.compileExpression(source);
534
        v = interpreter.run(code);
535
        assertEquals("HOLA", (String)v);
536
    }
537
    
538
    public void testRegexp1() {
539
        SymbolTable symbolTable = createSymbolTable();
540
        Compiler compiler = createCompiler();
541
        Interpreter interpreter = createInterpreter(symbolTable);
542
        
543
        String source = "'Hola' ~ '[Hh]ola'" ;
544
        Code code = compiler.compileExpression(source);
545
        Object v = interpreter.run(code);
546
        assertTrue((Boolean)v);
547
    }
548

    
549
    public void testGetitem1() {
550
        SymbolTable symbolTable = createSymbolTable();
551
        Compiler compiler = createCompiler();
552
        Interpreter interpreter = createInterpreter(symbolTable);
553
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(false);
554
        
555
        String source = "LIST('uno','dos','tres')[1]" ;
556
        
557
        Code code = compiler.compileExpression(source);
558
        Object v = interpreter.run(code);
559
        assertEquals("dos", (String)v);
560
    }
561

    
562
}