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

History | View | Annotate | Download (17.2 KB)

1 43512 jjdelcerro
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 44139 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
10
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
11
import org.gvsig.expressionevaluator.MutableSymbolTable;
12 44098 jjdelcerro
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
13 43512 jjdelcerro
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 44098 jjdelcerro
        new DefaultLibrariesInitializer().fullInitialize();
24 43512 jjdelcerro
    }
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 44139 jjdelcerro
35 43512 jjdelcerro
    protected LexicalAnalyzer createLexicalAnalyzer() {
36 44139 jjdelcerro
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
37
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
38 43512 jjdelcerro
        return lexer;
39
    }
40 44139 jjdelcerro
41
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
42
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
43
        Compiler compiler = manager.createCompiler();
44 43512 jjdelcerro
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
45
        return compiler;
46
    }
47 44139 jjdelcerro
48 43512 jjdelcerro
49
    protected SymbolTable createSymbolTable() {
50 44139 jjdelcerro
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
51
        MutableSymbolTable symbolTable = manager.createSymbolTable();
52 43939 jjdelcerro
        symbolTable.setVar("precio", 200);
53
        symbolTable.setVar("1990", 0.168873933773767);
54 43512 jjdelcerro
        return symbolTable;
55
    }
56
57
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
58 44139 jjdelcerro
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
59
        Interpreter interpreter = manager.createInterpreter();
60 43512 jjdelcerro
        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 44139 jjdelcerro
        String source = "precio";
70
71 43512 jjdelcerro
        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 44139 jjdelcerro
        String source = "23";
82
83 43512 jjdelcerro
        Code code = compiler.compileExpression(source);
84
        Object v = interpreter.run(code);
85
        assertEquals(23, ((Number)v).intValue());
86
    }
87
88 44421 jjdelcerro
    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 44430 jjdelcerro
        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 44421 jjdelcerro
    }
124
125 43512 jjdelcerro
    public void testTrue() {
126
        SymbolTable symbolTable = createSymbolTable();
127
        Compiler compiler = createCompiler();
128
        Interpreter interpreter = createInterpreter(symbolTable);
129
130 44139 jjdelcerro
        String source = "true";
131
132 43512 jjdelcerro
        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 44139 jjdelcerro
        String source = "false";
142
143 43512 jjdelcerro
        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 44139 jjdelcerro
        String source = "null";
153
154 43512 jjdelcerro
        Code code = compiler.compileExpression(source);
155
        assertEquals(null, interpreter.run(code));
156
    }
157
158 44384 jjdelcerro
    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 43512 jjdelcerro
    public void testAdd1() {
181
        SymbolTable symbolTable = createSymbolTable();
182
        Compiler compiler = createCompiler();
183
        Interpreter interpreter = createInterpreter(symbolTable);
184
185 44139 jjdelcerro
        String source = "precio + 10";
186
187 43512 jjdelcerro
        Code code = compiler.compileExpression(source);
188
        Object v = interpreter.run(code);
189
        assertEquals(210, ((Number)v).intValue());
190
    }
191
192 44098 jjdelcerro
    public void testSimpleAdd1() {
193
        SymbolTable symbolTable = createSymbolTable();
194
        Compiler compiler = createCompiler();
195
        Interpreter interpreter = createInterpreter(symbolTable);
196
197 44139 jjdelcerro
        String source = "5+10";
198
199 44098 jjdelcerro
        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 44139 jjdelcerro
        String source = "5 + 10";
210
211 44098 jjdelcerro
        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 44139 jjdelcerro
        String source = "10+-5";
222
223 44098 jjdelcerro
        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 44139 jjdelcerro
        String source = "10-5";
234
235 44098 jjdelcerro
        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 44139 jjdelcerro
        String source = "10 - 5";
246
247 44098 jjdelcerro
        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 44139 jjdelcerro
        String source = "23";
258
259 44098 jjdelcerro
        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 44139 jjdelcerro
        String source = "-23";
270
271 44098 jjdelcerro
        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 44139 jjdelcerro
        String source = "-PI()";
282
283 44098 jjdelcerro
        Code code = compiler.compileExpression(source);
284
        Object v = interpreter.run(code);
285
        assertEquals(-Math.PI, ((Number)v).doubleValue());
286
    }
287
288 43512 jjdelcerro
    public void testSub1() {
289
        SymbolTable symbolTable = createSymbolTable();
290
        Compiler compiler = createCompiler();
291
        Interpreter interpreter = createInterpreter(symbolTable);
292
293 44139 jjdelcerro
        String source = "precio - 10";
294
295 43512 jjdelcerro
        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 44139 jjdelcerro
        String source = "precio * 10";
306
307 43512 jjdelcerro
        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 44139 jjdelcerro
        String source = "precio / 10";
318
319 43512 jjdelcerro
        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 44139 jjdelcerro
        String source = "precio + 10 + 20 + 30";
330
331 43512 jjdelcerro
        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 44139 jjdelcerro
        String source = "precio + 10 * 2 + 20 + 30";
342
343 43512 jjdelcerro
        Code code = compiler.compileExpression(source);
344
        Object v = interpreter.run(code);
345
        assertEquals(270, ((Number)v).intValue());
346
    }
347
348 43519 jjdelcerro
    public void testAddMulPar() {
349
        SymbolTable symbolTable = createSymbolTable();
350
        Compiler compiler = createCompiler();
351
        Interpreter interpreter = createInterpreter(symbolTable);
352
353 44139 jjdelcerro
        String source = "(precio + 10) * 2 + 20 + 30";
354
355 43519 jjdelcerro
        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 44139 jjdelcerro
        String source = "precio + abs(10)";
366
367 43519 jjdelcerro
        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 44139 jjdelcerro
        String source = "precio + abs(-10)";
378
379 43519 jjdelcerro
        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 44139 jjdelcerro
        String source = "precio + CEIL(PI())";
390
391 43519 jjdelcerro
        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 44139 jjdelcerro
        String source = "CONCAT(precio,' euros')";
402
403 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
404
        Object v = interpreter.run(code);
405
        assertEquals("200 euros", (String)v);
406
    }
407 43521 jjdelcerro
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 44139 jjdelcerro
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
417
418 43521 jjdelcerro
        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 43532 jjdelcerro
    }
430
431
    public void test2fields() {
432
        SymbolTable symbolTable = createSymbolTable();
433
        Compiler compiler = createCompiler();
434
        Interpreter interpreter = createInterpreter(symbolTable);
435
436 44139 jjdelcerro
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
437
438
        String source = "[1990] = [precio]";
439
440
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
441 43532 jjdelcerro
        Code code = compiler.compileExpression(source);
442
        Object v = interpreter.run(code);
443
        assertEquals(false, ((Boolean)v).booleanValue());
444 43939 jjdelcerro
    }
445
446
447
    public void testInvokeMethod1() {
448
        SymbolTable symbolTable = createSymbolTable();
449
        Compiler compiler = createCompiler();
450
        Interpreter interpreter = createInterpreter(symbolTable);
451
452 44139 jjdelcerro
        String source = "'hola'.length()";
453
454 43939 jjdelcerro
        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 44139 jjdelcerro
        SymbolTable symbolTable = createSymbolTable();
463
        Compiler compiler = createCompiler();
464
        Interpreter interpreter = createInterpreter(symbolTable);
465
466 43939 jjdelcerro
        String source = "'hola'.indexOf('l')";
467
468 44139 jjdelcerro
        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 43939 jjdelcerro
        SymbolTable symbolTable = createSymbolTable();
476
        Compiler compiler = createCompiler();
477
        Interpreter interpreter = createInterpreter(symbolTable);
478
479 44139 jjdelcerro
        String source = "UPPER('hola')";
480 43939 jjdelcerro
        Code code = compiler.compileExpression(source);
481
        Object v = interpreter.run(code);
482 44139 jjdelcerro
        assertEquals("HOLA", (String)v);
483 43939 jjdelcerro
484 44139 jjdelcerro
485
        source = "UCASE('hola')";
486
        code = compiler.compileExpression(source);
487
        v = interpreter.run(code);
488
        assertEquals("HOLA", (String)v);
489 43939 jjdelcerro
    }
490 44139 jjdelcerro
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 43939 jjdelcerro
502 44139 jjdelcerro
    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 43939 jjdelcerro
515
}