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 / TestGrammarCompiler.java @ 44533

History | View | Annotate | Download (11.6 KB)

1
package org.gvsig.expresionevaluator.impl;
2

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

    
14
/**
15
 *
16
 * @author jjdelcerro
17
 */
18
public class TestGrammarCompiler extends TestCase {
19

    
20
    public TestGrammarCompiler(String testName) {
21
        super(testName);
22
    }
23

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

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

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

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

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

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

    
66
    public void testLet() {
67
        String source = "LET V1 = 23";
68

    
69
        Compiler compiler = createCompiler();
70

    
71
        Code code = compiler.compileExpression(source);
72
        assertEquals("LET('V1', 23)", code.toString());
73
    }
74

    
75
    public void testBlock() {
76
        String source = "BEGIN LET V1 = 23; END";
77

    
78
        Compiler compiler = createCompiler();
79

    
80
        Code code = compiler.compileExpression(source);
81
        assertEquals("BLOCK(LET('V1', 23))", code.toString());
82
    }
83

    
84
    public void testBlockExcept() {
85
        String source = "BEGIN LET V1 = 23; EXCEPT NULL; END";
86

    
87
        Compiler compiler = createCompiler();
88

    
89
        Code code = compiler.compileExpression(source);
90
        assertEquals("BLOCK_EXCEPT(LET('V1', 23), NULL)", code.toString());
91
    }
92

    
93
    public void testBlock2() {
94
        String source = "BEGIN LET V1 = 11; LET V2 = 22;  END";
95

    
96
        Compiler compiler = createCompiler();
97

    
98
        Code code = compiler.compileExpression(source);
99
        assertEquals("BLOCK(LET('V1', 11), LET('V2', 22))", code.toString());
100
    }
101

    
102
    public void testBlockExcept2() {
103
        String source = "BEGIN LET V1 = 11; LET V2 = 22; EXCEPT -1; END";
104

    
105
        Compiler compiler = createCompiler();
106

    
107
        Code code = compiler.compileExpression(source);
108
        assertEquals("BLOCK_EXCEPT(LET('V1', 11), LET('V2', 22), -1)", code.toString());
109
    }
110

    
111
    public void testBlock3() {
112
        Compiler compiler = createCompiler();
113

    
114
        String source = "BEGIN LET V1 = 11; LET V2 = 22;  END";
115
        Code code = compiler.compileExpression(source);
116
        assertEquals("BLOCK(LET('V1', 11), LET('V2', 22))", code.toString());
117

    
118
        source = "BEGIN LET V1 = 11;; LET V2 = 22;;;  END";
119
        code = compiler.compileExpression(source);
120
        assertEquals("BLOCK(LET('V1', 11), LET('V2', 22))", code.toString());
121
    }
122

    
123
    public void testIfThen() {
124
        String source = "IF V1 = 11 THEN LET V2 = 22; END IF";
125

    
126
        Compiler compiler = createCompiler();
127

    
128
        Code code = compiler.compileExpression(source);
129
        assertEquals("IFF((\"V1\" = 11), LET('V2', 22), NULL)", code.toString());
130
    }
131

    
132
    public void testIfThenElse() {
133
        String source = "IF V1 = 11 THEN LET V2 = 11; ELSE LET V2 = 22; END IF";
134

    
135
        Compiler compiler = createCompiler();
136

    
137
        Code code = compiler.compileExpression(source);
138
        assertEquals("IFF((\"V1\" = 11), LET('V2', 11), LET('V2', 22))", code.toString());
139
    }
140

    
141
    public void testIfThenBlock() {
142
        String source = "IF V1 = 11 THEN LET V2 = 22; LET V1 = 10; END IF";
143

    
144
        Compiler compiler = createCompiler();
145

    
146
        Code code = compiler.compileExpression(source);
147
        assertEquals("IFF((\"V1\" = 11), BLOCK(LET('V2', 22), LET('V1', 10)), NULL)", code.toString());
148
    }
149

    
150
    public void testWhile() {
151
        String source = "WHILE n < 10 BEGIN LET n = n + 1; END WHILE";
152

    
153
        Compiler compiler = createCompiler();
154

    
155
        Code code = compiler.compileExpression(source);
156
        assertEquals("WHILE((\"n\" < 10), LET('n', (\"n\" + 1)))", code.toString());
157
    }
158

    
159
    public void testWhileBlock() {
160
        String source = "WHILE n < 10 BEGIN LET n = n + 1; print(n); END WHILE";
161

    
162
        Compiler compiler = createCompiler();
163

    
164
        Code code = compiler.compileExpression(source);
165
        assertEquals("WHILE((\"n\" < 10), BLOCK(LET('n', (\"n\" + 1)), print(\"n\")))", code.toString());
166
    }
167

    
168
    public void testCast() {
169
        String source = "CAST(V1 AS INTEGER)";
170

    
171
        Compiler compiler = createCompiler();
172

    
173
        Code code = compiler.compileExpression(source);
174
        assertEquals("CAST(\"V1\", 'INTEGER')", code.toString());
175
    }
176

    
177
    public void testCast2() {
178
        String source = "CAST V1 AS INTEGER";
179

    
180
        Compiler compiler = createCompiler();
181

    
182
        Code code = compiler.compileExpression(source);
183
        assertEquals("CAST(\"V1\", 'INTEGER')", code.toString());
184
    }
185

    
186
    public void testMatch() {
187
        Compiler compiler = createCompiler();
188
        String source;
189
        Code code;
190

    
191
        source = "MATCH 'Hola', '[Hh]ola'";
192
        code = compiler.compileExpression(source);
193
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
194

    
195
        source = "MATCH 'Hola' '[Hh]ola'";
196
        code = compiler.compileExpression(source);
197
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
198

    
199
        source = "MATCH('Hola', '[Hh]ola')";
200
        code = compiler.compileExpression(source);
201
        assertEquals("~('Hola', '[Hh]ola')", code.toString());
202
    }
203

    
204
    public void testForEach() {
205
        String source = "FOR n in RANGE(10): print(n); END FOR";
206

    
207
        Compiler compiler = createCompiler();
208

    
209
        Code code = compiler.compileExpression(source);
210
        assertEquals("FOREACH('n', RANGE(10), print(\"n\"))", code.toString());
211
    }
212

    
213
//    public void testFor() {
214
//        String source = "FOR LET n = 0 ; n < 10 ; LET n = n + 1 print(n)";
215
//
216
//        Compiler compiler = createCompiler();
217
//
218
//        Code code = compiler.compileExpression(source);
219
//        assertEquals("FOR(LET('n', 0), <(\"n\", 10), LET('n', +(\"n\", 1)), print(\"n\"))", code.toString());
220
//    }
221

    
222
    public void testCase() {
223
        String source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG'; ELSE 'Other'; END CASE"; // ;)
224

    
225
        Compiler compiler = createCompiler();
226

    
227
        Code code = compiler.compileExpression(source);
228
        assertEquals("CASE((\"software\" LIKE '%gvSIG%'), 'gvSIG', 'Other')", code.toString());
229
    }
230

    
231
    public void testCase1() {
232
        String source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG'; ELSE 'Other'; END CASE"; // ;)
233

    
234
        Compiler compiler = createCompiler();
235

    
236
        Code code = compiler.compileExpression(source);
237
        assertEquals("CASE((\"software\" LIKE '%gvSIG%'), 'gvSIG', 'Other')", code.toString());
238
    }
239

    
240
    public void testCase2() {
241
        String source = "CASE WHEN Field_1 >= 75 AND Field_1 <=79 THEN 100; WHEN Field_1 >=80 AND Field_1 <=84 THEN 110; END CASE"; // ;)
242

    
243
        Compiler compiler = createCompiler();
244

    
245
        Code code = compiler.compileExpression(source);
246
        assertEquals("CASE(((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)), ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)), 100, 110, NULL)", code.toString());
247
    }
248
    
249
    public void testCase3() {
250
        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 CASE"; // ;)
251

    
252
        Compiler compiler = createCompiler();
253

    
254
        Code code = compiler.compileExpression(source);
255
        assertEquals("CASE(((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)), ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)), 100, 110, 120)", code.toString());
256
    }
257
    
258
    public void testDef1() {
259
        String source = "CREATE PROCEDURE test1 AS BEGIN print('Hola'); END PROCEDURE"; 
260

    
261
        Compiler compiler = createCompiler();
262

    
263
        Code code = compiler.compileExpression(source);
264
        assertEquals("CREATE_FUNCTION('test1', NULL, print('Hola'), NULL, NULL, NULL)", code.toString());
265
    }
266
    
267
    public void testDef2() {
268
        String source = "CREATE PROCEDURE test1 nombre AS BEGIN print('Hola '+nombre); END PROCEDURE";
269

    
270
        Compiler compiler = createCompiler();
271

    
272
        Code code = compiler.compileExpression(source);
273
        assertEquals("CREATE_FUNCTION('test1', LIST('nombre'), print(('Hola ' + \"nombre\")), NULL, NULL, NULL)", code.toString());
274
    }
275

    
276
    public void testDef3() {
277
        String source = "CREATE PROCEDURE test1 nombre AS BEGIN RETURN 'Hola '||nombre; END PROCEDURE";
278

    
279
        Compiler compiler = createCompiler();
280

    
281
        Code code = compiler.compileExpression(source);
282
        assertEquals("CREATE_FUNCTION('test1', LIST('nombre'), RETURN(('Hola ' || \"nombre\")), NULL, NULL, NULL)", code.toString());
283
    }
284
    
285
    public void testCreateFunctionExtern1() {
286
        String source = "CREATE FUNCTION test1(nombre) AS 'addons/test/test', test1";
287

    
288
        Compiler compiler = createCompiler();
289

    
290
        Code code = compiler.compileExpression(source);
291
        assertEquals("CREATE_FUNCTION('test1', LIST('nombre'), NULL, 'addons/test/test', 'test1', NULL)", code.toString());
292
    }
293
    
294
    public void testList() {
295
        String source = "set x TO LIST('hola','adios','fin')";
296

    
297
        Compiler compiler = createCompiler();
298

    
299
        Code code = compiler.compileExpression(source);
300
        assertEquals("LET('x', LIST('hola', 'adios', 'fin'))", code.toString());
301
    }
302
    
303
    public void testArray() {
304
        String source = "set x TO ARRAY['hola','adios','fin']";
305

    
306
        Compiler compiler = createCompiler();
307

    
308
        Code code = compiler.compileExpression(source);
309
        assertEquals("LET('x', LIST('hola', 'adios', 'fin'))", code.toString());
310
    }
311
    
312
    public void testUseCase1() {
313
        String source = "begin set x = ''; for n in list('hola','adios','fin'): let x = x || ' ' || n; end for; end";
314

    
315
        Compiler compiler = createCompiler();
316

    
317
        Code code = compiler.compileExpression(source);
318
        assertEquals("BLOCK(LET('x', ''), FOREACH('n', list('hola', 'adios', 'fin'), LET('x', ((\"x\" || ' ') || \"n\"))))", code.toString());
319
    }
320

    
321
    public void testUseCase2() {
322
        String source = "begin set s = ''; set x = LIST('hola','adios','fin'); FOR n in RANGE(3): set s = s || ' ' || x[n]; end for; end";
323

    
324
        Compiler compiler = createCompiler();
325

    
326
        Code code = compiler.compileExpression(source);
327
        assertEquals("BLOCK(LET('s', ''), LET('x', LIST('hola', 'adios', 'fin')), FOREACH('n', RANGE(3), LET('s', ((\"s\" || ' ') || GETITEM(\"x\", \"n\")))))", code.toString());
328
    }
329

    
330

    
331
}