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

History | View | Annotate | Download (10.4 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 TestGrammarCompiler extends TestCase {
20

    
21
    public TestGrammarCompiler(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 SymbolTable 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
        String source = "LET V1 = 23";
69

    
70
        Compiler compiler = createCompiler();
71

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

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

    
79
        Compiler compiler = createCompiler();
80

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

    
85
    public void testBlock2() {
86
        String source = "BEGIN LET V1 = 11; LET V2 = 22  END";
87

    
88
        Compiler compiler = createCompiler();
89

    
90
        Code code = compiler.compileExpression(source);
91
        assertEquals("BLOCK(LET('V1', 11), LET('V2', 22))", code.toString());
92
    }
93

    
94
    public void testBlock3() {
95
        Compiler compiler = createCompiler();
96

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

    
101
        source = "BEGIN LET V1 = 11;; LET V2 = 22;;;  END";
102
        code = compiler.compileExpression(source);
103
        assertEquals("BLOCK(LET('V1', 11), LET('V2', 22))", code.toString());
104
    }
105

    
106
    public void testIfThen() {
107
        String source = "IF V1 = 11 THEN LET V2 = 22";
108

    
109
        Compiler compiler = createCompiler();
110

    
111
        Code code = compiler.compileExpression(source);
112
        assertEquals("IFF((\"V1\" = 11), LET('V2', 22))", code.toString());
113
    }
114

    
115
    public void testIfThen2() {
116
        String source = "IF V1 = 11 LET V2 = 22";
117

    
118
        Compiler compiler = createCompiler();
119

    
120
        Code code = compiler.compileExpression(source);
121
        assertEquals("IFF((\"V1\" = 11), LET('V2', 22))", code.toString());
122
    }
123

    
124
    public void testIfThen3() {
125
        String source = "IF V1 = 11: LET V2 = 22";
126

    
127
        Compiler compiler = createCompiler();
128

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

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

    
136
        Compiler compiler = createCompiler();
137

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

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

    
145
        Compiler compiler = createCompiler();
146

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

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

    
154
        Compiler compiler = createCompiler();
155

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

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

    
163
        Compiler compiler = createCompiler();
164

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

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

    
172
        Compiler compiler = createCompiler();
173

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

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

    
181
        Compiler compiler = createCompiler();
182

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

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

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

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

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

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

    
208
        Compiler compiler = createCompiler();
209

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

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

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

    
226
        Compiler compiler = createCompiler();
227

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

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

    
235
        Compiler compiler = createCompiler();
236

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

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

    
244
        Compiler compiler = createCompiler();
245

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

    
253
        Compiler compiler = createCompiler();
254

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

    
262
        Compiler compiler = createCompiler();
263

    
264
        Code code = compiler.compileExpression(source);
265
        assertEquals("CREATE_FUNCTION('test1', print('Hola'))", code.toString());
266
    }
267
    
268
    public void testDef2() {
269
        String source = "DEF test1(nombre) print('Hola '+nombre)";
270

    
271
        Compiler compiler = createCompiler();
272

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

    
277
    public void testDef3() {
278
        String source = "DEF test1(nombre) BEGIN RETURN 'Hola '||nombre END";
279

    
280
        Compiler compiler = createCompiler();
281

    
282
        Code code = compiler.compileExpression(source);
283
        assertEquals("CREATE_FUNCTION('test1', LIST('nombre'), BLOCK(RETURN(('Hola ' || \"nombre\"))))", code.toString());
284
    }
285

    
286
    public void testUseCase1() {
287
        String source = "begin set x = ''; for n in list('hola','adios','fin'): let x = x || ' ' || n end";
288

    
289
        Compiler compiler = createCompiler();
290

    
291
        Code code = compiler.compileExpression(source);
292
        assertEquals("BLOCK(LET('x', ''), FOREACH('n', list('hola', 'adios', 'fin'), LET('x', ((\"x\" || ' ') || \"n\"))))", code.toString());
293
    }
294

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

    
298
        Compiler compiler = createCompiler();
299

    
300
        Code code = compiler.compileExpression(source);
301
        assertEquals("BLOCK(LET('s', ''), LET('x', LIST('hola', 'adios', 'fin')), FOREACH('n', RANGE(3), LET('s', ((\"s\" || ' ') || GETITEM(\"x\", \"n\")))))", code.toString());
302
    }
303

    
304

    
305
}