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 / TestCompiler.java @ 45213

History | View | Annotate | Download (13.9 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.Code;
7
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
8
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
9
import org.gvsig.expressionevaluator.ExpressionSyntaxException;
10
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
11

    
12

    
13
public class TestCompiler extends TestCase {
14
    
15
    public TestCompiler(String testName) {
16
        super(testName);
17
    }
18
    
19
    @Override
20
    protected void setUp() throws Exception {
21
        super.setUp();
22
        new DefaultLibrariesInitializer().fullInitialize();
23
    }
24
    
25
    @Override
26
    protected void tearDown() throws Exception {
27
        super.tearDown();
28
    }
29

    
30
    // TODO add test methods here. The name must begin with 'test'. For example:
31
    // public void testHello() {}
32

    
33
    
34
    protected LexicalAnalyzer createLexicalAnalyzer() {
35
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
36
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
37
        return lexer;
38
    }
39

    
40
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
41
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
42
        Compiler compiler = manager.createCompiler();
43
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
44
        return compiler;
45
    }
46
    
47
    public void testIdentifier1() {
48
        String source = "precio";
49

    
50
        Compiler compiler = createCompiler();
51
        Code code = compiler.compileExpression(source);
52
        assertEquals("\"precio\"", code.toString());
53
    }
54

    
55
    public void testIdentifier2() {
56
        Compiler compiler = createCompiler();
57
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
58

    
59
        String source = "[precio]";
60

    
61
        Code code = compiler.compileExpression(source);
62
        assertEquals("\"precio\"", code.toString());
63
    }
64

    
65
    public void testIdentifier3() {
66
        Compiler compiler = createCompiler();
67

    
68
        String source = "\"precio\"";
69

    
70
        Code code = compiler.compileExpression(source);
71
        assertEquals("\"precio\"", code.toString());
72
    }
73

    
74

    
75
    public void testTrue() {
76
        String source = "true";
77

    
78
        Compiler compiler = createCompiler();
79
        Code code = compiler.compileExpression(source);
80
        assertEquals("TRUE", code.toString());
81
    }
82

    
83
    public void testLet1() {
84
        String source = "LET a = 23";
85

    
86
        Compiler compiler = createCompiler();
87
        Code code = compiler.compileExpression(source);
88
        assertEquals("LET('a', 23)", code.toString());
89
    }
90

    
91
    public void testLet2() {
92
        String source = "a := 23";
93

    
94
        Compiler compiler = createCompiler();
95
        Code code = compiler.compileExpression(source);
96
        assertEquals("LET('a', 23)", code.toString());
97
    }
98

    
99
    public void testFalse() {
100
        String source = "false";
101

    
102
        Compiler compiler = createCompiler();
103
        Code code = compiler.compileExpression(source);
104
        assertEquals("FALSE", code.toString());
105
    }
106

    
107
    public void testNull() {
108
        String source = "null";
109

    
110
        Compiler compiler = createCompiler();
111
        Code code = compiler.compileExpression(source);
112
        assertEquals("NULL", code.toString());
113
    }
114

    
115
    public void testIsNull() {
116
        String source = "10 is null";
117

    
118
        Compiler compiler = createCompiler();
119
        Code code = compiler.compileExpression(source);
120
        assertEquals("(10 IS NULL)", code.toString());
121
    }
122

    
123
    public void testIsNotNull() {
124
        String source = "10 is not null";
125

    
126
        Compiler compiler = createCompiler();
127
        Code code = compiler.compileExpression(source);
128
        assertEquals("NOT((10 IS NULL))", code.toString());
129
    }
130

    
131
    public void testNotTrue() {
132
        String source = "not true";
133

    
134
        Compiler compiler = createCompiler();
135
        Code code = compiler.compileExpression(source);
136
        assertEquals("NOT(TRUE)", code.toString());
137
    }
138

    
139
    public void testInteger() {
140
        String source = "23";
141

    
142
        Compiler compiler = createCompiler();
143
        Code code = compiler.compileExpression(source);
144
        assertEquals("23", code.toString());
145
    }
146

    
147
    public void operator(String operatorName) {
148
        String source = "precio " + operatorName + " 23";
149

    
150
        Compiler compiler = createCompiler();
151
        Code code = compiler.compileExpression(source);
152
        assertEquals("(\"precio\" "+ operatorName + " 23)", code.toString());
153
    }
154
    
155
    public void testOperatorMod() {
156
        String source = "precio % 23";
157
        Compiler compiler = createCompiler();
158
        Code code = compiler.compileExpression(source);
159
        assertEquals("MOD(\"precio\", 23)", code.toString());
160
    }
161
    
162
    public void testOperators() {
163

    
164
        operator("=");
165
        operator("<>");
166
        operator(">");
167
        operator(">=");
168
        operator("<");
169
        operator("<=");
170
        operator("LIKE");
171
        operator("ILIKE");
172
        operator("||");
173
        operator("+");
174
        operator("-");
175
        operator("*");
176
        operator("OR");
177
        operator("AND");
178
        operator("IS");
179

    
180
        operator("~");
181
    }
182

    
183
    public void testAddMul() {
184
        String source = "precio + 10 * 2 + 20 + 30";
185

    
186
        Compiler compiler = createCompiler();
187
        
188
        Code code = compiler.compileExpression(source);
189
        assertEquals("(((\"precio\" + (10 * 2)) + 20) + 30)", code.toString());
190
    }
191
    
192
    public void testAddMulPar() {
193
        String source = "(precio + 10) * 2 + 20 + 30";
194

    
195
        Compiler compiler = createCompiler();
196
        
197
        Code code = compiler.compileExpression(source);
198
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code.toString());
199
    }
200
    
201
    public void testAbs() {
202
        String source = "precio + abs(10)";
203

    
204
        Compiler compiler = createCompiler();
205
        
206
        Code code = compiler.compileExpression(source);
207
        assertEquals("(\"precio\" + abs(10))", code.toString());
208
    }
209
    
210
    public void testMod1() {
211
        String source = "4 % 3";
212

    
213
        Compiler compiler = createCompiler();
214
        
215
        Code code = compiler.compileExpression(source);
216
        assertEquals("MOD(4, 3)", code.toString());
217
    }
218
    
219
    public void testMod2() {
220
        String source = "MOD(4, 3)";
221

    
222
        Compiler compiler = createCompiler();
223
        
224
        Code code = compiler.compileExpression(source);
225
        assertEquals("MOD(4, 3)", code.toString());
226
    }
227
    
228
    public void testAbs2() {
229
        String source = "precio + abs(-10)";
230

    
231
        Compiler compiler = createCompiler();
232
        
233
        Code code = compiler.compileExpression(source);
234
        assertEquals("(\"precio\" + abs(-10))", code.toString());
235
    }
236
    
237
    public void testPI() {
238
        String source = "precio + PI()";
239

    
240
        Compiler compiler = createCompiler();
241
        
242
        Code code = compiler.compileExpression(source);
243
        assertEquals("(\"precio\" + PI())", code.toString());
244
    }
245
    
246
    public void testCeil() {
247
        String source = "precio + CEIL(PI())";
248

    
249
        Compiler compiler = createCompiler();
250
        
251
        Code code = compiler.compileExpression(source);
252
        assertEquals("(\"precio\" + CEIL(PI()))", code.toString());
253
    }
254
    
255
    public void testGetitem1() {
256
        String source = "LIST('uno','dos','tres')[1]" ;
257

    
258
        Compiler compiler = createCompiler();
259
        
260
        Code code = compiler.compileExpression(source);
261
        assertEquals("GETITEM(LIST('uno', 'dos', 'tres'), 1)", code.toString());
262
    }
263
    
264
    public void testConcat() {
265
        String source = "CONCAT(precio,' euros')";
266

    
267
        Compiler compiler = createCompiler();
268
        
269
        Code code = compiler.compileExpression(source);
270
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
271
    }
272
    
273
    public void test1() {
274
        String source = "NOMBRE03 = 'Torre d''En Besora (la)'";
275

    
276
        Compiler compiler = createCompiler();
277
        
278
        Code code = compiler.compileExpression(source);
279
        assertEquals("(\"NOMBRE03\" = 'Torre d''En Besora (la)')", code.toString());
280
    }
281
    
282
    public void test2() {
283
        Compiler compiler = createCompiler();
284
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
285

    
286
        String source = "[1990] = 0.168873933773767";
287

    
288
        Code code = compiler.compileExpression(source);
289
        assertEquals("(\"1990\" = 0.168873933773767)", code.toString());
290
    }
291

    
292
    public void test2fields() {
293
        Compiler compiler = createCompiler();
294
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
295

    
296
        String source = "[1990] = [precio]";
297

    
298
        Code code = compiler.compileExpression(source);
299
        assertEquals("(\"1990\" = \"precio\")", code.toString());
300
    }
301
    
302
    
303
    public void testInvokeFunction1() {
304
        String source = "ST_Area(GEOMETRY)";
305

    
306
        Compiler compiler = createCompiler();
307
        
308
        Code code = compiler.compileExpression(source);
309
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
310
    }
311

    
312
    public void testInvokeMethod1() {
313
        String source = "'hola'.length()";
314

    
315
        Compiler compiler = createCompiler();
316
        
317
        Code code = compiler.compileExpression(source);
318
        assertEquals("'hola'->length()", code.toString());
319
    }
320
    
321
    
322
    public void testInvokeMethod2() {
323
        String source = "'hola'.indexOf('l')    ";
324
        
325
        Compiler compiler = createCompiler();
326
        
327
        Code code = compiler.compileExpression(source);
328
        assertEquals("'hola'->indexOf('l')", code.toString());
329
    }
330

    
331
    public void testSyntaxError1() {
332
        Compiler compiler = createCompiler();
333
        String source;
334
        
335
        source = "3 + (2*)";
336
        try {
337
            compiler.compileExpression(source);
338
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
339
        } catch(ExpressionSyntaxException ex) {
340
            // Ok
341
        }
342
        source = "3 + 2*";
343
        try {
344
            compiler.compileExpression(source);
345
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
346
        } catch(ExpressionSyntaxException ex) {
347
            // Ok
348
        }
349
        source = "3 + (2*2))";
350
        try {
351
            compiler.compileExpression(source);
352
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
353
        } catch(ExpressionSyntaxException ex) {
354
            // Ok
355
        }
356
        source = "3 and or 2";
357
        try {
358
            compiler.compileExpression(source);
359
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
360
        } catch(ExpressionSyntaxException ex) {
361
            // Ok
362
        }
363
        source = "3*/2";
364
        try {
365
            compiler.compileExpression(source);
366
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
367
        } catch(ExpressionSyntaxException ex) {
368
            // Ok
369
        }
370
    }
371

    
372
    public void testInvokeFunction2paramters1() {
373
        String source = "LEFT('NOMBRE', 2)";
374

    
375
        Compiler compiler = createCompiler();
376
        
377
        Code code = compiler.compileExpression(source);
378
        assertEquals("LEFT('NOMBRE', 2)", code.toString());
379
    }
380

    
381
    public void testInvokeFunction2paramters2() {
382
        String source = "LEFT('NOMBRE',2)";
383

    
384
        Compiler compiler = createCompiler();
385
        
386
        Code code = compiler.compileExpression(source);
387
        assertEquals("LEFT('NOMBRE', 2)", code.toString());
388
    }
389

    
390
    public void testInvokeFunction3paramters1() {
391
        String source = "MID('NOMBRE', 2, 2)";
392

    
393
        Compiler compiler = createCompiler();
394
        
395
        Code code = compiler.compileExpression(source);
396
        assertEquals("MID('NOMBRE', 2, 2)", code.toString());
397
    }
398

    
399
    public void testInvokeFunction3paramters2() {
400
        String source = "MID('NOMBRE', 2,2)";
401

    
402
        Compiler compiler = createCompiler();
403
        
404
        Code code = compiler.compileExpression(source);
405
        assertEquals("MID('NOMBRE', 2, 2)", code.toString());
406
    }
407

    
408
    public void testDecimal1() {
409
        String source = "23.1";
410

    
411
        Compiler compiler = createCompiler();
412
        Code code = compiler.compileExpression(source);
413
        assertEquals("23.1", code.toString());
414
    }
415

    
416
    public void testDecimal2() {
417
        String source = "23,1";
418

    
419
        Compiler compiler = createCompiler();
420
        try {
421
            Code code = compiler.compileExpression(source);
422
            fail("I expected 23,1 to be erroneous.");
423
        } catch(ExpressionSyntaxException ex) {
424
            // This is OK.
425
        }
426
    }
427
    public void testDecimal3() {
428
        String source = "1.23E4";
429

    
430
        Compiler compiler = createCompiler();
431
        Code code = compiler.compileExpression(source);
432
        assertEquals("12300", code.toString());
433
    }
434

    
435
    public void testDecimal4() {
436
        String source = "1.23E-2";
437

    
438
        Compiler compiler = createCompiler();
439
        Code code = compiler.compileExpression(source);
440
        assertEquals("0.0123", code.toString());
441
    }
442

    
443
    public void testDecimal5() {
444
        String source = "1.23E-4";
445

    
446
        Compiler compiler = createCompiler();
447
        Code code = compiler.compileExpression(source);
448
        assertEquals("0.000123", code.toString());
449
    }
450

    
451
    public void testDecimal6() {
452
        String source = "-23.1";
453

    
454
        Compiler compiler = createCompiler();
455
        Code code = compiler.compileExpression(source);
456
        assertEquals("-23.1", code.toString());
457
    }
458

    
459
    public void testDecimal7() {
460
        String source = "-1.23E-2";
461

    
462
        Compiler compiler = createCompiler();
463
        Code code = compiler.compileExpression(source);
464
        assertEquals("-0.0123", code.toString());
465
    }
466

    
467
    public void testDecimal8() {
468
        String source = "-1.23E-4";
469

    
470
        Compiler compiler = createCompiler();
471
        Code code = compiler.compileExpression(source);
472
        assertEquals("-0.000123", code.toString());
473
    }
474

    
475

    
476
}