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 / TestGrammarInterpreter.java @ 44139

History | View | Annotate | Download (13.2 KB)

1
package org.gvsig.expresionevaluator.impl;
2

    
3
import static junit.framework.Assert.assertEquals;
4
import junit.framework.TestCase;
5
import org.gvsig.expressionevaluator.Code;
6
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
7
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
8
import org.gvsig.expressionevaluator.Interpreter;
9
import org.gvsig.expressionevaluator.LexicalAnalyzer;
10
import org.gvsig.expressionevaluator.SymbolTable;
11
import org.gvsig.expressionevaluator.Compiler;
12
import org.gvsig.expressionevaluator.MutableSymbolTable;
13
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
14

    
15
/**
16
 *
17
 * @author jjdelcerro
18
 */
19
public class TestGrammarInterpreter extends TestCase {
20

    
21
    public TestGrammarInterpreter(String testName) {
22
        super(testName);
23
    }
24

    
25
    @Override
26
    protected void setUp() throws Exception {
27
        super.setUp();
28
        new DefaultLibrariesInitializer().fullInitialize();
29
    }
30

    
31
    @Override
32
    protected void tearDown() throws Exception {
33
        super.tearDown();
34
    }
35

    
36
    // TODO add test methods here. The name must begin with 'test'. For example:
37
    // public void testHello() {}
38
    
39
    protected LexicalAnalyzer createLexicalAnalyzer() {
40
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
41
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
42
        return lexer;
43
    }
44

    
45
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
46
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
47
        Compiler compiler = manager.createCompiler();
48
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
49
        return compiler;
50
    }
51

    
52
    protected MutableSymbolTable createSymbolTable() {
53
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
54
        MutableSymbolTable symbolTable = manager.createSymbolTable();
55
        symbolTable.setVar("precio", 200);
56
        symbolTable.setVar("1990", 0.168873933773767);
57
        return symbolTable;
58
    }
59

    
60
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
61
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
62
        Interpreter interpreter = manager.createInterpreter();
63
        interpreter.setSymbolTable(symbolTable);
64
        return interpreter;
65
    }
66

    
67
    public void testLet() {
68
        SymbolTable symbolTable = createSymbolTable();
69
        Compiler compiler = createCompiler();
70
        Interpreter interpreter = createInterpreter(symbolTable);
71

    
72
        String source = "LET V1 = 23";
73

    
74
        Code code = compiler.compileExpression(source);
75
        Object v = interpreter.run(code);
76
        
77
        assertEquals(23, symbolTable.value("V1"));
78
    }
79

    
80
    public void testBlock() {
81
        SymbolTable symbolTable = createSymbolTable();
82
        Compiler compiler = createCompiler();
83
        Interpreter interpreter = createInterpreter(symbolTable);
84

    
85
        String source = "BEGIN SET V1 = 23 END";
86
        Code code = compiler.compileExpression(source);
87
        Object v = interpreter.run(code);
88
        
89
        assertEquals(23, symbolTable.value("V1"));
90
    }
91

    
92
    public void testBlock2() {
93
        SymbolTable symbolTable = createSymbolTable();
94
        Compiler compiler = createCompiler();
95
        Interpreter interpreter = createInterpreter(symbolTable);
96

    
97
        String source = "BEGIN SET V1 = 11; SET V2 = 22  END";
98
        Code code = compiler.compileExpression(source);
99
        Object v = interpreter.run(code);
100

    
101
        assertEquals((Integer)11, symbolTable.value("V1"));
102
        assertEquals((Integer)22, symbolTable.value("V2"));
103
    }
104

    
105
    public void testIfThen() {
106
        MutableSymbolTable symbolTable = createSymbolTable();
107
        Compiler compiler = createCompiler();
108
        Interpreter interpreter = createInterpreter(symbolTable);
109

    
110
        symbolTable.setVar("V1", 10);
111
        String source = "IF V1 = 11 THEN SET V2 = 22";
112
        Code code = compiler.compileExpression(source);
113
        Object v = interpreter.run(code);
114

    
115
        assertEquals(null, v);
116
        assertEquals((Integer)10, symbolTable.value("V1"));
117
        assertEquals(null, symbolTable.value("V2"));
118

    
119
        symbolTable.setVar("V1", 11);
120
        source = "IF V1 = 11 THEN SET V2 = 22";
121
        code = compiler.compileExpression(source);
122
        v = interpreter.run(code);
123

    
124
        assertEquals((Integer)22, v);
125
        assertEquals((Integer)11, symbolTable.value("V1"));
126
        assertEquals((Integer)22, symbolTable.value("V2"));
127
    }
128

    
129
    public void testIfThenElse() {
130
        MutableSymbolTable symbolTable = createSymbolTable();
131
        Compiler compiler = createCompiler();
132
        Interpreter interpreter = createInterpreter(symbolTable);
133

    
134
        symbolTable.setVar("V1", 10);
135
        String source = "IF V1 = 11 THEN SET V2 = 11 ELSE SET V2 = 22";
136
        Code code = compiler.compileExpression(source);
137
        Object v = interpreter.run(code);
138

    
139
        assertEquals((Integer)22, v);
140
        assertEquals((Integer)10, symbolTable.value("V1"));
141
        assertEquals((Integer)22, symbolTable.value("V2"));
142
    }
143

    
144
    public void testIfThenBlock() {
145
        MutableSymbolTable symbolTable = createSymbolTable();
146
        Compiler compiler = createCompiler();
147
        Interpreter interpreter = createInterpreter(symbolTable);
148

    
149
        symbolTable.setVar("V1", 11);
150
        String source = "IF V1 = 11 THEN BEGIN LET V2 = 22; LET V1 = 10 END";
151
        Code code = compiler.compileExpression(source);
152
        Object v = interpreter.run(code);
153

    
154
        assertEquals((Integer)10, v);
155
        assertEquals((Integer)10, symbolTable.value("V1"));
156
        assertEquals((Integer)22, symbolTable.value("V2"));
157
    }
158

    
159
    public void testWhile() {
160
        MutableSymbolTable symbolTable = createSymbolTable();
161
        Compiler compiler = createCompiler();
162
        Interpreter interpreter = createInterpreter(symbolTable);
163

    
164
        symbolTable.setVar("n",0);
165
        String source = "WHILE n < 10 SET n = n + 1";
166
        Code code = compiler.compileExpression(source);
167
        Object v = interpreter.run(code);
168

    
169
        assertEquals((Integer)10, v);
170
        assertEquals((Integer)10, symbolTable.value("n"));
171
    }
172

    
173
    public void testWhileBlock() {
174
        MutableSymbolTable symbolTable = createSymbolTable();
175
        Compiler compiler = createCompiler();
176
        Interpreter interpreter = createInterpreter(symbolTable);
177

    
178
        symbolTable.setVar("n",0);
179
        String source = "WHILE n < 10 BEGIN SET n = n + 1; print(n) END";
180
        Code code = compiler.compileExpression(source);
181
        Object v = interpreter.run(code);
182

    
183
        assertEquals((Integer)10, v);
184
        assertEquals((Integer)10, symbolTable.value("n"));
185
    }
186

    
187
    public void testCast() {
188
        MutableSymbolTable symbolTable = createSymbolTable();
189
        Compiler compiler = createCompiler();
190
        Interpreter interpreter = createInterpreter(symbolTable);
191

    
192
        symbolTable.setVar("n",1.0);
193
        String source = "CAST n AS INTEGER";
194
        Code code = compiler.compileExpression(source);
195
        Object v = interpreter.run(code);
196

    
197
        assertEquals((Integer)1, v);
198
        assertEquals((Double)1.0, symbolTable.value("n"));
199
    }
200

    
201
    public void testMatch() {
202
        Compiler compiler = createCompiler();
203
        String source;
204
        Code code;
205

    
206
        source = "MATCH 'Hola', '[Hh]ola'";
207
        code = compiler.compileExpression(source);
208
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
209

    
210
        source = "MATCH 'Hola' '[Hh]ola'";
211
        code = compiler.compileExpression(source);
212
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
213

    
214
        source = "MATCH('Hola', '[Hh]ola')";
215
        code = compiler.compileExpression(source);
216
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
217
    }
218

    
219
    public void testForEach() {
220
        MutableSymbolTable symbolTable = createSymbolTable();
221
        Compiler compiler = createCompiler();
222
        Interpreter interpreter = createInterpreter(symbolTable);
223

    
224
        String source = "FOR n in RANGE(10) print(n)";
225
        Code code = compiler.compileExpression(source);
226
        Object v = interpreter.run(code);
227

    
228
        assertEquals((Long)9L, v);
229
        assertEquals((Long)9L, symbolTable.value("n"));
230
    }
231

    
232
    public void testCase() {
233
        MutableSymbolTable symbolTable = createSymbolTable();
234
        Compiler compiler = createCompiler();
235
        Interpreter interpreter = createInterpreter(symbolTable);
236

    
237
        symbolTable.setVar("software","unknown");
238
        String source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG' ELSE 'Other' END"; // ;)
239
        Code code = compiler.compileExpression(source);
240
        Object v = interpreter.run(code);
241
        assertEquals("Other", v);
242

    
243
        symbolTable.setVar("software","gvSIG desktop");
244
        source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG' ELSE 'Other' END"; // ;)
245
        code = compiler.compileExpression(source);
246
        v = interpreter.run(code);
247
        assertEquals("gvSIG", v);
248
    }
249

    
250
    public void testCase2() {
251
        MutableSymbolTable symbolTable = createSymbolTable();
252
        Compiler compiler = createCompiler();
253
        Interpreter interpreter = createInterpreter(symbolTable);
254

    
255
        symbolTable.setVar("Field_1",77);
256
        String source = "CASE WHEN Field_1 >= 75 AND Field_1 <=79 THEN 100 WHEN Field_1 >=80 AND Field_1 <=84 THEN 110 END"; // ;)
257
        Code code = compiler.compileExpression(source);
258
        Object v = interpreter.run(code);
259
        assertEquals((Integer)100, v);
260

    
261
        symbolTable.setVar("Field_1",81);
262
        source = "CASE WHEN Field_1 >= 75 AND Field_1 <=79 THEN 100 WHEN Field_1 >=80 AND Field_1 <=84 THEN 110 END"; // ;)
263
        code = compiler.compileExpression(source);
264
        v = interpreter.run(code);
265
        assertEquals((Integer)110, v);
266
    }
267
    
268
    public void testCase3() {
269
        MutableSymbolTable symbolTable = createSymbolTable();
270
        Compiler compiler = createCompiler();
271
        Interpreter interpreter = createInterpreter(symbolTable);
272

    
273
        symbolTable.setVar("Field_1",100);
274
        String source = "CASE WHEN Field_1 >= 75 AND Field_1 <=79 THEN 100 WHEN Field_1 >=80 AND Field_1 <=84 THEN 110 ELSE 120 END"; // ;)
275
        Code code = compiler.compileExpression(source);
276
        Object v = interpreter.run(code);
277
        assertEquals((Integer)120, v);
278
    }
279
    
280
    public void testDef1() {
281
        MutableSymbolTable symbolTable = createSymbolTable();
282
        Compiler compiler = createCompiler();
283
        Interpreter interpreter = createInterpreter(symbolTable);
284

    
285
        String source = "DEF test1() 'Hola'"; 
286
        Code code = compiler.compileExpression(source);
287
        Object v = interpreter.run(code);
288

    
289
        source = "test1()"; 
290
        code = compiler.compileExpression(source);
291
        v = interpreter.run(code);
292

    
293
        assertEquals("Hola", v);
294
    }
295
    
296
    public void testDef2() {
297
        MutableSymbolTable symbolTable = createSymbolTable();
298
        Compiler compiler = createCompiler();
299
        Interpreter interpreter = createInterpreter(symbolTable);
300

    
301
        String source = "DEF test1(nombre) 'Hola ' || nombre";
302
        Code code = compiler.compileExpression(source);
303
        Object v = interpreter.run(code);
304

    
305
        source = "test1('Joaquin')"; 
306
        code = compiler.compileExpression(source);
307
        v = interpreter.run(code);
308

    
309
        assertEquals("Hola Joaquin", v);
310
    }
311

    
312
    public void testReturn1() {
313
        MutableSymbolTable symbolTable = createSymbolTable();
314
        Compiler compiler = createCompiler();
315
        Interpreter interpreter = createInterpreter(symbolTable);
316

    
317
        String source = "DEF test1(nombre) BEGIN RETURN 'Hola ' || nombre END";
318
        Code code = compiler.compileExpression(source);
319
        Object v = interpreter.run(code);
320

    
321
        source = "test1('Joaquin')"; 
322
        code = compiler.compileExpression(source);
323
        v = interpreter.run(code);
324

    
325
        assertEquals("Hola Joaquin", v);
326
    }
327

    
328
    public void testReturn2() {
329
        MutableSymbolTable symbolTable = createSymbolTable();
330
        Compiler compiler = createCompiler();
331
        Interpreter interpreter = createInterpreter(symbolTable);
332

    
333
        String source = "DEF test1(nombre) BEGIN RETURN 'Hola ' || nombre; 'Oh!...'; END";
334
        Code code = compiler.compileExpression(source);
335
        Object v = interpreter.run(code);
336

    
337
        source = "test1('Joaquin')"; 
338
        code = compiler.compileExpression(source);
339
        v = interpreter.run(code);
340

    
341
        assertEquals("Hola Joaquin", v);
342
    }
343

    
344
    public void testUseCase1() {
345
        MutableSymbolTable symbolTable = createSymbolTable();
346
        Compiler compiler = createCompiler();
347
        Interpreter interpreter = createInterpreter(symbolTable);
348

    
349
        String source = "begin set x = ''; for n in list('hola','adios','fin'): let x = x || ' ' || n end";
350
        Code code = compiler.compileExpression(source);
351
        Object v = interpreter.run(code);
352

    
353
        assertEquals(" hola adios fin", v);
354
    }
355

    
356
    public void testUseCase2() {
357
        MutableSymbolTable symbolTable = createSymbolTable();
358
        Compiler compiler = createCompiler();
359
        Interpreter interpreter = createInterpreter(symbolTable);
360

    
361
        String source = "begin set s = ''; set x = LIST('hola','adios','fin'); FOR n in RANGE(3): set s = s || ' ' || x[n] end";
362
        Code code = compiler.compileExpression(source);
363
        Object v = interpreter.run(code);
364

    
365
        assertEquals(" hola adios fin", v);
366
    }
367

    
368

    
369
}