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

History | View | Annotate | Download (15.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 testTrue() {
89
        SymbolTable symbolTable = createSymbolTable();
90
        Compiler compiler = createCompiler();
91
        Interpreter interpreter = createInterpreter(symbolTable);
92
        
93
        String source = "true";
94

    
95
        Code code = compiler.compileExpression(source);
96
        assertEquals(Boolean.TRUE, interpreter.run(code));
97
    }
98
    
99
    public void testFalse() {
100
        SymbolTable symbolTable = createSymbolTable();
101
        Compiler compiler = createCompiler();
102
        Interpreter interpreter = createInterpreter(symbolTable);
103
        
104
        String source = "false";
105

    
106
        Code code = compiler.compileExpression(source);
107
        assertEquals(Boolean.FALSE, interpreter.run(code));
108
    }
109
    
110
    public void testNull() {
111
        SymbolTable symbolTable = createSymbolTable();
112
        Compiler compiler = createCompiler();
113
        Interpreter interpreter = createInterpreter(symbolTable);
114
        
115
        String source = "null";
116

    
117
        Code code = compiler.compileExpression(source);
118
        assertEquals(null, interpreter.run(code));
119
    }
120
    
121
    public void testAdd1() {
122
        SymbolTable symbolTable = createSymbolTable();
123
        Compiler compiler = createCompiler();
124
        Interpreter interpreter = createInterpreter(symbolTable);
125
        
126
        String source = "precio + 10";
127

    
128
        Code code = compiler.compileExpression(source);
129
        Object v = interpreter.run(code);
130
        assertEquals(210, ((Number)v).intValue());
131
    }
132
    
133
    public void testSimpleAdd1() {
134
        SymbolTable symbolTable = createSymbolTable();
135
        Compiler compiler = createCompiler();
136
        Interpreter interpreter = createInterpreter(symbolTable);
137
        
138
        String source = "5+10";
139

    
140
        Code code = compiler.compileExpression(source);
141
        Object v = interpreter.run(code);
142
        assertEquals(15, ((Number)v).intValue());
143
    }
144
    
145
    public void testSimpleAdd2() {
146
        SymbolTable symbolTable = createSymbolTable();
147
        Compiler compiler = createCompiler();
148
        Interpreter interpreter = createInterpreter(symbolTable);
149
        
150
        String source = "5 + 10";
151

    
152
        Code code = compiler.compileExpression(source);
153
        Object v = interpreter.run(code);
154
        assertEquals(15, ((Number)v).intValue());
155
    }
156
    
157
    public void testSimpleAdd3() {
158
        SymbolTable symbolTable = createSymbolTable();
159
        Compiler compiler = createCompiler();
160
        Interpreter interpreter = createInterpreter(symbolTable);
161
        
162
        String source = "10+-5";
163

    
164
        Code code = compiler.compileExpression(source);
165
        Object v = interpreter.run(code);
166
        assertEquals(5, ((Number)v).intValue());
167
    }
168
    
169
    public void testSimpleSub1() {
170
        SymbolTable symbolTable = createSymbolTable();
171
        Compiler compiler = createCompiler();
172
        Interpreter interpreter = createInterpreter(symbolTable);
173
        
174
        String source = "10-5";
175

    
176
        Code code = compiler.compileExpression(source);
177
        Object v = interpreter.run(code);
178
        assertEquals(5, ((Number)v).intValue());
179
    }
180
    
181
    public void testSimpleSub2() {
182
        SymbolTable symbolTable = createSymbolTable();
183
        Compiler compiler = createCompiler();
184
        Interpreter interpreter = createInterpreter(symbolTable);
185
        
186
        String source = "10 - 5";
187

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

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

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

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

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

    
248
        Code code = compiler.compileExpression(source);
249
        Object v = interpreter.run(code);
250
        assertEquals(2000, ((Number)v).intValue());
251
    }
252

    
253
    public void testDiv1() {
254
        SymbolTable symbolTable = createSymbolTable();
255
        Compiler compiler = createCompiler();
256
        Interpreter interpreter = createInterpreter(symbolTable);
257
        
258
        String source = "precio / 10";
259

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

    
272
        Code code = compiler.compileExpression(source);
273
        Object v = interpreter.run(code);
274
        assertEquals(260, ((Number)v).intValue());
275
    }
276
    
277
    public void testAddMul() {
278
        SymbolTable symbolTable = createSymbolTable();
279
        Compiler compiler = createCompiler();
280
        Interpreter interpreter = createInterpreter(symbolTable);
281
        
282
        String source = "precio + 10 * 2 + 20 + 30";
283

    
284
        Code code = compiler.compileExpression(source);
285
        Object v = interpreter.run(code);
286
        assertEquals(270, ((Number)v).intValue());
287
    }
288
    
289
    public void testAddMulPar() {
290
        SymbolTable symbolTable = createSymbolTable();
291
        Compiler compiler = createCompiler();
292
        Interpreter interpreter = createInterpreter(symbolTable);
293
        
294
        String source = "(precio + 10) * 2 + 20 + 30";
295

    
296
        Code code = compiler.compileExpression(source);
297
        Object v = interpreter.run(code);
298
        assertEquals(470, ((Number)v).intValue());
299
    }    
300

    
301
    public void testAbs() {
302
        SymbolTable symbolTable = createSymbolTable();
303
        Compiler compiler = createCompiler();
304
        Interpreter interpreter = createInterpreter(symbolTable);
305
        
306
        String source = "precio + abs(10)";
307

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

    
313
    public void testAbs2() {
314
        SymbolTable symbolTable = createSymbolTable();
315
        Compiler compiler = createCompiler();
316
        Interpreter interpreter = createInterpreter(symbolTable);
317
        
318
        String source = "precio + abs(-10)";
319

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

    
332
        Code code = compiler.compileExpression(source);
333
        Object v = interpreter.run(code);
334
        assertEquals(204, ((Number)v).intValue());
335
    }
336
    
337
    public void testConcat() {
338
        SymbolTable symbolTable = createSymbolTable();
339
        Compiler compiler = createCompiler();
340
        Interpreter interpreter = createInterpreter(symbolTable);
341
        
342
        String source = "CONCAT(precio,' euros')";
343

    
344
        Code code = compiler.compileExpression(source);
345
        Object v = interpreter.run(code);
346
        assertEquals("200 euros", (String)v);
347
    }
348

    
349
    public void testAccuracy() {
350
 
351
        SymbolTable symbolTable = createSymbolTable();
352
        Compiler compiler = createCompiler();
353
        Interpreter interpreter = createInterpreter(symbolTable);
354
        Code code;
355
        Object v;
356
        
357
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
358

    
359
        code = compiler.compileExpression("[1990] = 0.168873933773767");
360
        v = interpreter.run(code);
361
        assertEquals(true, ((Boolean)v).booleanValue());
362

    
363
        code = compiler.compileExpression("[1990] = 0.1688739");
364
        v = interpreter.run(code);
365
        assertEquals(false, ((Boolean)v).booleanValue());
366

    
367
        interpreter.setAccuracy(0.0000001);
368
        v = interpreter.run(code);
369
        assertEquals(true, ((Boolean)v).booleanValue());
370
    }    
371

    
372
    public void test2fields() {
373
        SymbolTable symbolTable = createSymbolTable();
374
        Compiler compiler = createCompiler();
375
        Interpreter interpreter = createInterpreter(symbolTable);
376
        
377
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
378

    
379
        String source = "[1990] = [precio]";
380

    
381
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
382
        Code code = compiler.compileExpression(source);
383
        Object v = interpreter.run(code);
384
        assertEquals(false, ((Boolean)v).booleanValue());
385
    }
386

    
387

    
388
    public void testInvokeMethod1() {
389
        SymbolTable symbolTable = createSymbolTable();
390
        Compiler compiler = createCompiler();
391
        Interpreter interpreter = createInterpreter(symbolTable);
392
        
393
        String source = "'hola'.length()";
394

    
395
        Code code = compiler.compileExpression(source);
396
        Object v = interpreter.run(code);
397

    
398
        assertEquals(4, ((Number)v).intValue());
399
    }
400
    
401
    
402
    public void testInvokeMethod2() {
403
        SymbolTable symbolTable = createSymbolTable();
404
        Compiler compiler = createCompiler();
405
        Interpreter interpreter = createInterpreter(symbolTable);
406
        
407
        String source = "'hola'.indexOf('l')";
408
        
409
        Code code = compiler.compileExpression(source);
410
        Object v = interpreter.run(code);
411

    
412
        assertEquals(2, ((Number)v).intValue());
413
    }
414

    
415
    public void testAlias() {
416
        SymbolTable symbolTable = createSymbolTable();
417
        Compiler compiler = createCompiler();
418
        Interpreter interpreter = createInterpreter(symbolTable);
419
        
420
        String source = "UPPER('hola')";
421
        Code code = compiler.compileExpression(source);
422
        Object v = interpreter.run(code);
423
        assertEquals("HOLA", (String)v);
424

    
425
        
426
        source = "UCASE('hola')";
427
        code = compiler.compileExpression(source);
428
        v = interpreter.run(code);
429
        assertEquals("HOLA", (String)v);
430
    }
431
    
432
    public void testRegexp1() {
433
        SymbolTable symbolTable = createSymbolTable();
434
        Compiler compiler = createCompiler();
435
        Interpreter interpreter = createInterpreter(symbolTable);
436
        
437
        String source = "'Hola' ~ '[Hh]ola'" ;
438
        Code code = compiler.compileExpression(source);
439
        Object v = interpreter.run(code);
440
        assertTrue((Boolean)v);
441
    }
442

    
443
    public void testGetitem1() {
444
        SymbolTable symbolTable = createSymbolTable();
445
        Compiler compiler = createCompiler();
446
        Interpreter interpreter = createInterpreter(symbolTable);
447
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(false);
448
        
449
        String source = "LIST('uno','dos','tres')[1]" ;
450
        
451
        Code code = compiler.compileExpression(source);
452
        Object v = interpreter.run(code);
453
        assertEquals("dos", (String)v);
454
    }
455

    
456
}