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

History | View | Annotate | Download (16.4 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
    
100
    public void testTrue() {
101
        SymbolTable symbolTable = createSymbolTable();
102
        Compiler compiler = createCompiler();
103
        Interpreter interpreter = createInterpreter(symbolTable);
104
        
105
        String source = "true";
106

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

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

    
129
        Code code = compiler.compileExpression(source);
130
        assertEquals(null, interpreter.run(code));
131
    }
132
    
133
    public void testIsNull() {
134
        SymbolTable symbolTable = createSymbolTable();
135
        Compiler compiler = createCompiler();
136
        Interpreter interpreter = createInterpreter(symbolTable);
137
        
138
        String source = "10 is null";
139

    
140
        Code code = compiler.compileExpression(source);
141
        assertEquals(false, interpreter.run(code));
142
    }
143
    
144
    public void testIsNotNull() {
145
        SymbolTable symbolTable = createSymbolTable();
146
        Compiler compiler = createCompiler();
147
        Interpreter interpreter = createInterpreter(symbolTable);
148
        
149
        String source = "10 is not null";
150

    
151
        Code code = compiler.compileExpression(source);
152
        assertEquals(true, interpreter.run(code));
153
    }
154
    
155
    public void testAdd1() {
156
        SymbolTable symbolTable = createSymbolTable();
157
        Compiler compiler = createCompiler();
158
        Interpreter interpreter = createInterpreter(symbolTable);
159
        
160
        String source = "precio + 10";
161

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

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

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

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

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

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

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

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

    
258
        Code code = compiler.compileExpression(source);
259
        Object v = interpreter.run(code);
260
        assertEquals(-Math.PI, ((Number)v).doubleValue());
261
    }
262
    
263
    public void testSub1() {
264
        SymbolTable symbolTable = createSymbolTable();
265
        Compiler compiler = createCompiler();
266
        Interpreter interpreter = createInterpreter(symbolTable);
267
        
268
        String source = "precio - 10";
269

    
270
        Code code = compiler.compileExpression(source);
271
        Object v = interpreter.run(code);
272
        assertEquals(190, ((Number)v).intValue());
273
    }
274
    
275
    public void testMul1() {
276
        SymbolTable symbolTable = createSymbolTable();
277
        Compiler compiler = createCompiler();
278
        Interpreter interpreter = createInterpreter(symbolTable);
279
        
280
        String source = "precio * 10";
281

    
282
        Code code = compiler.compileExpression(source);
283
        Object v = interpreter.run(code);
284
        assertEquals(2000, ((Number)v).intValue());
285
    }
286

    
287
    public void testDiv1() {
288
        SymbolTable symbolTable = createSymbolTable();
289
        Compiler compiler = createCompiler();
290
        Interpreter interpreter = createInterpreter(symbolTable);
291
        
292
        String source = "precio / 10";
293

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

    
306
        Code code = compiler.compileExpression(source);
307
        Object v = interpreter.run(code);
308
        assertEquals(260, ((Number)v).intValue());
309
    }
310
    
311
    public void testAddMul() {
312
        SymbolTable symbolTable = createSymbolTable();
313
        Compiler compiler = createCompiler();
314
        Interpreter interpreter = createInterpreter(symbolTable);
315
        
316
        String source = "precio + 10 * 2 + 20 + 30";
317

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

    
330
        Code code = compiler.compileExpression(source);
331
        Object v = interpreter.run(code);
332
        assertEquals(470, ((Number)v).intValue());
333
    }    
334

    
335
    public void testAbs() {
336
        SymbolTable symbolTable = createSymbolTable();
337
        Compiler compiler = createCompiler();
338
        Interpreter interpreter = createInterpreter(symbolTable);
339
        
340
        String source = "precio + abs(10)";
341

    
342
        Code code = compiler.compileExpression(source);
343
        Object v = interpreter.run(code);
344
        assertEquals(210, ((Number)v).intValue());
345
    }
346

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

    
354
        Code code = compiler.compileExpression(source);
355
        Object v = interpreter.run(code);
356
        assertEquals(210, ((Number)v).intValue());
357
    }
358
    
359
    public void testCeil() {
360
        SymbolTable symbolTable = createSymbolTable();
361
        Compiler compiler = createCompiler();
362
        Interpreter interpreter = createInterpreter(symbolTable);
363
        
364
        String source = "precio + CEIL(PI())";
365

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

    
378
        Code code = compiler.compileExpression(source);
379
        Object v = interpreter.run(code);
380
        assertEquals("200 euros", (String)v);
381
    }
382

    
383
    public void testAccuracy() {
384
 
385
        SymbolTable symbolTable = createSymbolTable();
386
        Compiler compiler = createCompiler();
387
        Interpreter interpreter = createInterpreter(symbolTable);
388
        Code code;
389
        Object v;
390
        
391
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
392

    
393
        code = compiler.compileExpression("[1990] = 0.168873933773767");
394
        v = interpreter.run(code);
395
        assertEquals(true, ((Boolean)v).booleanValue());
396

    
397
        code = compiler.compileExpression("[1990] = 0.1688739");
398
        v = interpreter.run(code);
399
        assertEquals(false, ((Boolean)v).booleanValue());
400

    
401
        interpreter.setAccuracy(0.0000001);
402
        v = interpreter.run(code);
403
        assertEquals(true, ((Boolean)v).booleanValue());
404
    }    
405

    
406
    public void test2fields() {
407
        SymbolTable symbolTable = createSymbolTable();
408
        Compiler compiler = createCompiler();
409
        Interpreter interpreter = createInterpreter(symbolTable);
410
        
411
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
412

    
413
        String source = "[1990] = [precio]";
414

    
415
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
416
        Code code = compiler.compileExpression(source);
417
        Object v = interpreter.run(code);
418
        assertEquals(false, ((Boolean)v).booleanValue());
419
    }
420

    
421

    
422
    public void testInvokeMethod1() {
423
        SymbolTable symbolTable = createSymbolTable();
424
        Compiler compiler = createCompiler();
425
        Interpreter interpreter = createInterpreter(symbolTable);
426
        
427
        String source = "'hola'.length()";
428

    
429
        Code code = compiler.compileExpression(source);
430
        Object v = interpreter.run(code);
431

    
432
        assertEquals(4, ((Number)v).intValue());
433
    }
434
    
435
    
436
    public void testInvokeMethod2() {
437
        SymbolTable symbolTable = createSymbolTable();
438
        Compiler compiler = createCompiler();
439
        Interpreter interpreter = createInterpreter(symbolTable);
440
        
441
        String source = "'hola'.indexOf('l')";
442
        
443
        Code code = compiler.compileExpression(source);
444
        Object v = interpreter.run(code);
445

    
446
        assertEquals(2, ((Number)v).intValue());
447
    }
448

    
449
    public void testAlias() {
450
        SymbolTable symbolTable = createSymbolTable();
451
        Compiler compiler = createCompiler();
452
        Interpreter interpreter = createInterpreter(symbolTable);
453
        
454
        String source = "UPPER('hola')";
455
        Code code = compiler.compileExpression(source);
456
        Object v = interpreter.run(code);
457
        assertEquals("HOLA", (String)v);
458

    
459
        
460
        source = "UCASE('hola')";
461
        code = compiler.compileExpression(source);
462
        v = interpreter.run(code);
463
        assertEquals("HOLA", (String)v);
464
    }
465
    
466
    public void testRegexp1() {
467
        SymbolTable symbolTable = createSymbolTable();
468
        Compiler compiler = createCompiler();
469
        Interpreter interpreter = createInterpreter(symbolTable);
470
        
471
        String source = "'Hola' ~ '[Hh]ola'" ;
472
        Code code = compiler.compileExpression(source);
473
        Object v = interpreter.run(code);
474
        assertTrue((Boolean)v);
475
    }
476

    
477
    public void testGetitem1() {
478
        SymbolTable symbolTable = createSymbolTable();
479
        Compiler compiler = createCompiler();
480
        Interpreter interpreter = createInterpreter(symbolTable);
481
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(false);
482
        
483
        String source = "LIST('uno','dos','tres')[1]" ;
484
        
485
        Code code = compiler.compileExpression(source);
486
        Object v = interpreter.run(code);
487
        assertEquals("dos", (String)v);
488
    }
489

    
490
}