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

History | View | Annotate | Download (17.2 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.SymbolTable;
7
import org.gvsig.expressionevaluator.Interpreter;
8
import org.gvsig.expressionevaluator.Code;
9
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
10
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
11
import org.gvsig.expressionevaluator.MutableSymbolTable;
12
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
13

    
14
public class TestInterpreter extends TestCase {
15
    
16
    public TestInterpreter(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
    
49
    protected SymbolTable createSymbolTable() {
50
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
51
        MutableSymbolTable symbolTable = manager.createSymbolTable();
52
        symbolTable.setVar("precio", 200);
53
        symbolTable.setVar("1990", 0.168873933773767);
54
        return symbolTable;
55
    }
56
    
57
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
58
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
59
        Interpreter interpreter = manager.createInterpreter();
60
        interpreter.setSymbolTable(symbolTable);
61
        return interpreter;
62
    }
63
    
64
    public void testIdentifier1() {
65
        SymbolTable symbolTable = createSymbolTable();
66
        Compiler compiler = createCompiler();
67
        Interpreter interpreter = createInterpreter(symbolTable);
68
        
69
        String source = "precio";
70

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

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

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

    
99
        source = "@10 30 0.09 N";
100

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

    
105
        source = "@10 30 0.09 S";
106

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

    
111
        source = "@+10 30 0.09";
112

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

    
117
        source = "@-10 30 0.09";
118

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
319
        Code code = compiler.compileExpression(source);
320
        Object v = interpreter.run(code);
321
        assertEquals(20, ((Number)v).intValue());
322
    }
323
    
324
    public void testAdd2() {
325
        SymbolTable symbolTable = createSymbolTable();
326
        Compiler compiler = createCompiler();
327
        Interpreter interpreter = createInterpreter(symbolTable);
328
        
329
        String source = "precio + 10 + 20 + 30";
330

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
438
        String source = "[1990] = [precio]";
439

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

    
446

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

    
454
        Code code = compiler.compileExpression(source);
455
        Object v = interpreter.run(code);
456

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

    
471
        assertEquals(2, ((Number)v).intValue());
472
    }
473

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

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

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

    
515
}