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

History | View | Annotate | Download (13.3 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 testFalse() {
84
        String source = "false";
85

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

    
91
    public void testNull() {
92
        String source = "null";
93

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

    
99
    public void testIsNull() {
100
        String source = "10 is null";
101

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

    
107
    public void testIsNotNull() {
108
        String source = "10 is not null";
109

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

    
115
    public void testNotTrue() {
116
        String source = "not true";
117

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

    
123
    public void testInteger() {
124
        String source = "23";
125

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

    
131
    public void operator(String operatorName) {
132
        String source = "precio " + operatorName + " 23";
133

    
134
        Compiler compiler = createCompiler();
135
        Code code = compiler.compileExpression(source);
136
        assertEquals("(\"precio\" "+ operatorName + " 23)", code.toString());
137
    }
138
    
139
    public void testOperators() {
140

    
141
        operator("=");
142
        operator("<>");
143
        operator(">");
144
        operator(">=");
145
        operator("<");
146
        operator("<=");
147
        operator("LIKE");
148
        operator("ILIKE");
149
        operator("||");
150
        operator("+");
151
        operator("-");
152
        operator("*");
153
        operator("OR");
154
        operator("AND");
155
//        operator("%");
156
        operator("IS");
157

    
158
        operator("~");
159
    }
160

    
161
    public void testAddMul() {
162
        String source = "precio + 10 * 2 + 20 + 30";
163

    
164
        Compiler compiler = createCompiler();
165
        
166
        Code code = compiler.compileExpression(source);
167
        assertEquals("(((\"precio\" + (10 * 2)) + 20) + 30)", code.toString());
168
    }
169
    
170
    public void testAddMulPar() {
171
        String source = "(precio + 10) * 2 + 20 + 30";
172

    
173
        Compiler compiler = createCompiler();
174
        
175
        Code code = compiler.compileExpression(source);
176
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code.toString());
177
    }
178
    
179
    public void testAbs() {
180
        String source = "precio + abs(10)";
181

    
182
        Compiler compiler = createCompiler();
183
        
184
        Code code = compiler.compileExpression(source);
185
        assertEquals("(\"precio\" + abs(10))", code.toString());
186
    }
187
    
188
    public void testMod1() {
189
        String source = "4 % 3";
190

    
191
        Compiler compiler = createCompiler();
192
        
193
        Code code = compiler.compileExpression(source);
194
        assertEquals("MOD(4, 3)", code.toString());
195
    }
196
    
197
    public void testMod2() {
198
        String source = "MOD(4, 3)";
199

    
200
        Compiler compiler = createCompiler();
201
        
202
        Code code = compiler.compileExpression(source);
203
        assertEquals("MOD(4, 3)", code.toString());
204
    }
205
    
206
    public void testAbs2() {
207
        String source = "precio + abs(-10)";
208

    
209
        Compiler compiler = createCompiler();
210
        
211
        Code code = compiler.compileExpression(source);
212
        assertEquals("(\"precio\" + abs(-10))", code.toString());
213
    }
214
    
215
    public void testPI() {
216
        String source = "precio + PI()";
217

    
218
        Compiler compiler = createCompiler();
219
        
220
        Code code = compiler.compileExpression(source);
221
        assertEquals("(\"precio\" + PI())", code.toString());
222
    }
223
    
224
    public void testCeil() {
225
        String source = "precio + CEIL(PI())";
226

    
227
        Compiler compiler = createCompiler();
228
        
229
        Code code = compiler.compileExpression(source);
230
        assertEquals("(\"precio\" + CEIL(PI()))", code.toString());
231
    }
232
    
233
    public void testGetitem1() {
234
        String source = "LIST('uno','dos','tres')[1]" ;
235

    
236
        Compiler compiler = createCompiler();
237
        
238
        Code code = compiler.compileExpression(source);
239
        assertEquals("GETITEM(LIST('uno', 'dos', 'tres'), 1)", code.toString());
240
    }
241
    
242
    public void testConcat() {
243
        String source = "CONCAT(precio,' euros')";
244

    
245
        Compiler compiler = createCompiler();
246
        
247
        Code code = compiler.compileExpression(source);
248
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
249
    }
250
    
251
    public void test1() {
252
        String source = "NOMBRE03 = 'Torre d''En Besora (la)'";
253

    
254
        Compiler compiler = createCompiler();
255
        
256
        Code code = compiler.compileExpression(source);
257
        assertEquals("(\"NOMBRE03\" = 'Torre d''En Besora (la)')", code.toString());
258
    }
259
    
260
    public void test2() {
261
        Compiler compiler = createCompiler();
262
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
263

    
264
        String source = "[1990] = 0.168873933773767";
265

    
266
        Code code = compiler.compileExpression(source);
267
        assertEquals("(\"1990\" = 0.168873933773767)", code.toString());
268
    }
269

    
270
    public void test2fields() {
271
        Compiler compiler = createCompiler();
272
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
273

    
274
        String source = "[1990] = [precio]";
275

    
276
        Code code = compiler.compileExpression(source);
277
        assertEquals("(\"1990\" = \"precio\")", code.toString());
278
    }
279
    
280
    
281
    public void testInvokeFunction1() {
282
        String source = "ST_Area(GEOMETRY)";
283

    
284
        Compiler compiler = createCompiler();
285
        
286
        Code code = compiler.compileExpression(source);
287
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
288
    }
289

    
290
    public void testInvokeMethod1() {
291
        String source = "'hola'.length()";
292

    
293
        Compiler compiler = createCompiler();
294
        
295
        Code code = compiler.compileExpression(source);
296
        assertEquals("'hola'->length()", code.toString());
297
    }
298
    
299
    
300
    public void testInvokeMethod2() {
301
        String source = "'hola'.indexOf('l')    ";
302
        
303
        Compiler compiler = createCompiler();
304
        
305
        Code code = compiler.compileExpression(source);
306
        assertEquals("'hola'->indexOf('l')", code.toString());
307
    }
308

    
309
    public void testSyntaxError1() {
310
        Compiler compiler = createCompiler();
311
        String source;
312
        
313
        source = "3 + (2*)";
314
        try {
315
            compiler.compileExpression(source);
316
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
317
        } catch(ExpressionSyntaxException ex) {
318
            // Ok
319
        }
320
        source = "3 + 2*";
321
        try {
322
            compiler.compileExpression(source);
323
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
324
        } catch(ExpressionSyntaxException ex) {
325
            // Ok
326
        }
327
        source = "3 + (2*2))";
328
        try {
329
            compiler.compileExpression(source);
330
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
331
        } catch(ExpressionSyntaxException ex) {
332
            // Ok
333
        }
334
        source = "3 and or 2";
335
        try {
336
            compiler.compileExpression(source);
337
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
338
        } catch(ExpressionSyntaxException ex) {
339
            // Ok
340
        }
341
        source = "3*/2";
342
        try {
343
            compiler.compileExpression(source);
344
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
345
        } catch(ExpressionSyntaxException ex) {
346
            // Ok
347
        }
348
    }
349

    
350
    public void testInvokeFunction2paramters1() {
351
        String source = "LEFT('NOMBRE', 2)";
352

    
353
        Compiler compiler = createCompiler();
354
        
355
        Code code = compiler.compileExpression(source);
356
        assertEquals("LEFT('NOMBRE', 2)", code.toString());
357
    }
358

    
359
    public void testInvokeFunction2paramters2() {
360
        String source = "LEFT('NOMBRE',2)";
361

    
362
        Compiler compiler = createCompiler();
363
        
364
        Code code = compiler.compileExpression(source);
365
        assertEquals("LEFT('NOMBRE', 2)", code.toString());
366
    }
367

    
368
    public void testInvokeFunction3paramters1() {
369
        String source = "MID('NOMBRE', 2, 2)";
370

    
371
        Compiler compiler = createCompiler();
372
        
373
        Code code = compiler.compileExpression(source);
374
        assertEquals("MID('NOMBRE', 2, 2)", code.toString());
375
    }
376

    
377
    public void testInvokeFunction3paramters2() {
378
        String source = "MID('NOMBRE', 2,2)";
379

    
380
        Compiler compiler = createCompiler();
381
        
382
        Code code = compiler.compileExpression(source);
383
        assertEquals("MID('NOMBRE', 2, 2)", code.toString());
384
    }
385

    
386
    public void testDecimal1() {
387
        String source = "23.1";
388

    
389
        Compiler compiler = createCompiler();
390
        Code code = compiler.compileExpression(source);
391
        assertEquals("23.1", code.toString());
392
    }
393

    
394
    public void testDecimal2() {
395
        String source = "23,1";
396

    
397
        Compiler compiler = createCompiler();
398
        try {
399
            Code code = compiler.compileExpression(source);
400
            fail("I expected 23,1 to be erroneous.");
401
        } catch(ExpressionSyntaxException ex) {
402
            // This is OK.
403
        }
404
    }
405
    public void testDecimal3() {
406
        String source = "1.23E4";
407

    
408
        Compiler compiler = createCompiler();
409
        Code code = compiler.compileExpression(source);
410
        assertEquals("12300", code.toString());
411
    }
412

    
413
    public void testDecimal4() {
414
        String source = "1.23E-2";
415

    
416
        Compiler compiler = createCompiler();
417
        Code code = compiler.compileExpression(source);
418
        assertEquals("0.0123", code.toString());
419
    }
420

    
421
    public void testDecimal5() {
422
        String source = "1.23E-4";
423

    
424
        Compiler compiler = createCompiler();
425
        Code code = compiler.compileExpression(source);
426
        assertEquals("0.000123", code.toString());
427
    }
428

    
429
    public void testDecimal6() {
430
        String source = "-23.1";
431

    
432
        Compiler compiler = createCompiler();
433
        Code code = compiler.compileExpression(source);
434
        assertEquals("-23.1", code.toString());
435
    }
436

    
437
    public void testDecimal7() {
438
        String source = "-1.23E-2";
439

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

    
445
    public void testDecimal8() {
446
        String source = "-1.23E-4";
447

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

    
453

    
454
}