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

History | View | Annotate | Download (22.6 KB)

1
package org.gvsig.expresionevaluator.impl;
2

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

    
15

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

    
33
    // TODO add test methods here. The name must begin with 'test'. For example:
34
    // public void testHello() {}
35

    
36
    
37
    protected LexicalAnalyzer createLexicalAnalyzer() {
38
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
39
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
40
        return lexer;
41
    }
42

    
43
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
44
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
45
        Compiler compiler = manager.createCompiler();
46
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
47
        return compiler;
48
    }
49
    
50
    protected MutableSymbolTable createSymbolTable() {
51
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
52
        MutableSymbolTable symbolTable = manager.createSymbolTable();
53
        symbolTable.setVar("precio", 200);
54
        symbolTable.setVar("1990", 0.168873933773767);
55
        return symbolTable;
56
    }
57
    
58
    private void dump(String testname, Object expected, Object actual) {
59
        System.out.println("### ---------------------");
60
        System.out.println("### "+testname);
61
        System.out.println("### expected: ["+Objects.toString(expected)+"]");
62
        System.out.println("### actual  : ["+Objects.toString(actual)+"]");
63
    }
64
    
65
    private void checkEquals(String testname, Object expected, Object actual) {
66
        dump(testname,expected,actual);
67
        assertEquals(expected, actual);
68
    }
69

    
70
    private void checkEquals(Object expected, Object actual) {
71
        try {
72
            throw new RuntimeException();
73
        } catch(Throwable t) {
74
            String testname = t.getStackTrace()[1].getMethodName();
75
            dump(testname,expected,actual);
76
            assertEquals(expected, actual);
77
        }
78
    }
79

    
80
    public void testIdentifier1() {
81
        String source = "precio";
82

    
83
        Compiler compiler = createCompiler();
84
        Code code = compiler.compileExpression(source);
85
        checkEquals("\"precio\"", code.toString());
86
    }
87

    
88
    public void testIdentifier2() {
89
        Compiler compiler = createCompiler();
90
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
91

    
92
        String source = "[precio]";
93

    
94
        Code code = compiler.compileExpression(source);
95
        checkEquals("\"precio\"", code.toString());
96
    }
97

    
98
    public void testIdentifier3() {
99
        Compiler compiler = createCompiler();
100

    
101
        String source = "\"precio\"";
102

    
103
        Code code = compiler.compileExpression(source);
104
        checkEquals("\"precio\"", code.toString());
105
    }
106

    
107

    
108
    public void testTrue() {
109
        String source = "true";
110

    
111
        Compiler compiler = createCompiler();
112
        Code code = compiler.compileExpression(source);
113
        checkEquals("TRUE", code.toString());
114
    }
115

    
116
    public void testLet1() {
117
        String source = "LET a = 23";
118

    
119
        Compiler compiler = createCompiler();
120
        Code code = compiler.compileExpression(source);
121
        checkEquals("LET('a', 23)", code.toString());
122
    }
123

    
124
    public void testLet2() {
125
        String source = "a := 23";
126

    
127
        Compiler compiler = createCompiler();
128
        Code code = compiler.compileExpression(source);
129
        checkEquals("LET('a', 23)", code.toString());
130
    }
131

    
132
    public void testLet3() {
133
        String source = "SET a TO 23";
134

    
135
        Compiler compiler = createCompiler();
136
        Code code = compiler.compileExpression(source);
137
        checkEquals("LET('a', 23)", code.toString());
138
    }
139

    
140
    public void testFalse() {
141
        String source = "false";
142

    
143
        Compiler compiler = createCompiler();
144
        Code code = compiler.compileExpression(source);
145
        checkEquals("FALSE", code.toString());
146
    }
147

    
148
    public void testNull() {
149
        String source = "null";
150

    
151
        Compiler compiler = createCompiler();
152
        Code code = compiler.compileExpression(source);
153
        checkEquals("NULL", code.toString());
154
    }
155

    
156
    public void testIsNull() {
157
        String source = "10 is null";
158

    
159
        Compiler compiler = createCompiler();
160
        Code code = compiler.compileExpression(source);
161
        checkEquals("(10 IS NULL)", code.toString());
162
    }
163

    
164
    public void testIsNotNull() {
165
        try {
166
            String source = "10 is not null";
167

    
168
            Compiler compiler = createCompiler();
169
            Code code = compiler.compileExpression(source);
170
            checkEquals("NOT((10 IS NULL))", code.toString());
171
        } catch(Throwable t) {
172
            t.printStackTrace();
173
            throw t;
174
        }
175
    }
176

    
177
    public void testNotTrue() {
178
        String source = "not true";
179

    
180
        Compiler compiler = createCompiler();
181
        Code code = compiler.compileExpression(source);
182
        checkEquals("NOT(TRUE)", code.toString());
183
    }
184

    
185
    public void testInteger() {
186
        String source = "23";
187

    
188
        Compiler compiler = createCompiler();
189
        Code code = compiler.compileExpression(source);
190
        checkEquals("23", code.toString());
191
    }
192

    
193
    public void operator(String operatorName) {
194
        String source = "precio " + operatorName + " 23";
195

    
196
        Compiler compiler = createCompiler();
197
        Code code = compiler.compileExpression(source);
198
        checkEquals("(\"precio\" "+ operatorName + " 23)", code.toString());
199
    }
200
    
201
    public void testOperatorMod() {
202
        String source = "precio % 23";
203
        Compiler compiler = createCompiler();
204
        Code code = compiler.compileExpression(source);
205
        checkEquals("MOD(\"precio\", 23)", code.toString());
206
    }
207
    
208
    public void testOperators() {
209

    
210
        operator("=");
211
        operator("<>");
212
        operator(">");
213
        operator(">=");
214
        operator("<");
215
        operator("<=");
216
        operator("LIKE");
217
        operator("ILIKE");
218
        operator("||");
219
        operator("+");
220
        operator("-");
221
        operator("*");
222
        operator("OR");
223
        operator("AND");
224
//        operator("IS");
225

    
226
        operator("~");
227
    }
228

    
229
    public void testAddMul() {
230
        String source = "precio + 10 * 2 + 20 + 30";
231

    
232
        Compiler compiler = createCompiler();
233
        
234
        Code code = compiler.compileExpression(source);
235
        checkEquals("(((\"precio\" + (10 * 2)) + 20) + 30)", code.toString());
236
    }
237
    
238
    public void testAddMulPar() {
239
        String source = "(precio + 10) * 2 + 20 + 30";
240

    
241
        Compiler compiler = createCompiler();
242
        
243
        Code code = compiler.compileExpression(source);
244
        checkEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code.toString());
245
    }
246
    
247
    public void testAbs() {
248
        String source = "precio + abs(10)";
249

    
250
        Compiler compiler = createCompiler();
251
        
252
        Code code = compiler.compileExpression(source);
253
        checkEquals("(\"precio\" + abs(10))", code.toString());
254
    }
255
    
256
    public void testMod1() {
257
        String source = "4 % 3";
258

    
259
        Compiler compiler = createCompiler();
260
        
261
        Code code = compiler.compileExpression(source);
262
        checkEquals("MOD(4, 3)", code.toString());
263
    }
264
    
265
    public void testMod2() {
266
        String source = "MOD(4, 3)";
267

    
268
        Compiler compiler = createCompiler();
269
        
270
        Code code = compiler.compileExpression(source);
271
        checkEquals("MOD(4, 3)", code.toString());
272
    }
273
    
274
    public void testAbs2() {
275
        String source = "precio + abs(-10)";
276

    
277
        Compiler compiler = createCompiler();
278
        
279
        Code code = compiler.compileExpression(source);
280
        checkEquals("(\"precio\" + abs(-10))", code.toString());
281
    }
282
    
283
    public void testPI() {
284
        String source = "precio + PI()";
285

    
286
        Compiler compiler = createCompiler();
287
        
288
        Code code = compiler.compileExpression(source);
289
        checkEquals("(\"precio\" + PI())", code.toString());
290
    }
291
    
292
    public void testCeil() {
293
        String source = "precio + CEIL(PI())";
294

    
295
        Compiler compiler = createCompiler();
296
        
297
        Code code = compiler.compileExpression(source);
298
        checkEquals("(\"precio\" + CEIL(PI()))", code.toString());
299
    }
300
    
301
    public void testGetitem1() {
302
        String source = "LIST('uno','dos','tres')[1]" ;
303

    
304
        Compiler compiler = createCompiler();
305
        
306
        Code code = compiler.compileExpression(source);
307
        checkEquals("GETITEM(LIST('uno', 'dos', 'tres'), 1)", code.toString());
308
    }
309
    
310
    public void testConcat() {
311
        String source = "CONCAT(precio,' euros')";
312

    
313
        Compiler compiler = createCompiler();
314
        
315
        Code code = compiler.compileExpression(source);
316
        checkEquals("CONCAT(\"precio\", ' euros')", code.toString());
317
    }
318
    
319
    public void test1() {
320
        String source = "NOMBRE03 = 'Torre d''En Besora (la)'";
321

    
322
        Compiler compiler = createCompiler();
323
        
324
        Code code = compiler.compileExpression(source);
325
        checkEquals("(\"NOMBRE03\" = 'Torre d''En Besora (la)')", code.toString());
326
    }
327
    
328
    public void test2() {
329
        Compiler compiler = createCompiler();
330
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
331

    
332
        String source = "[1990] = 0.168873933773767";
333

    
334
        Code code = compiler.compileExpression(source);
335
        checkEquals("(\"1990\" = 0.168873933773767)", code.toString());
336
    }
337

    
338
    public void test2fields() {
339
        Compiler compiler = createCompiler();
340
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
341

    
342
        String source = "[1990] = [precio]";
343

    
344
        Code code = compiler.compileExpression(source);
345
        checkEquals("(\"1990\" = \"precio\")", code.toString());
346
    }
347
    
348
    
349
    public void testInvokeFunction1() {
350
        String source = "ST_Area(GEOMETRY)";
351

    
352
        Compiler compiler = createCompiler();
353
        
354
        Code code = compiler.compileExpression(source);
355
        checkEquals("ST_Area(\"GEOMETRY\")", code.toString());
356
    }
357

    
358
    public void testInvokeMethod1() {
359
        String source = "'hola'.length()";
360

    
361
        Compiler compiler = createCompiler();
362
        
363
        Code code = compiler.compileExpression(source);
364
        checkEquals("'hola'.length()", code.toString());
365
    }
366
    
367
    
368
    public void testInvokeMethod1b() {
369
        String source = "'hola'->length()";
370

    
371
        Compiler compiler = createCompiler();
372
        
373
        Code code = compiler.compileExpression(source);
374
        checkEquals("'hola'.length()", code.toString());
375
    }
376
    
377
    
378
    public void testInvokeMethod2() {
379
        String source = "'hola'.indexOf('l')    ";
380
        
381
        Compiler compiler = createCompiler();
382
        
383
        Code code = compiler.compileExpression(source);
384
        checkEquals("'hola'.indexOf('l')", code.toString());
385
    }
386

    
387
    public void testSyntaxError1() {
388
        Compiler compiler = createCompiler();
389
        String source;
390
        
391
        source = "3 + (2*)";
392
        try {
393
            compiler.compileExpression(source);
394
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
395
        } catch(ExpressionSyntaxException ex) {
396
            // Ok
397
        }
398
        source = "3 + 2*";
399
        try {
400
            compiler.compileExpression(source);
401
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
402
        } catch(ExpressionSyntaxException ex) {
403
            // Ok
404
        }
405
        source = "3 + (2*2))";
406
        try {
407
            compiler.compileExpression(source);
408
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
409
        } catch(ExpressionSyntaxException ex) {
410
            // Ok
411
        }
412
        source = "3 and or 2";
413
        try {
414
            compiler.compileExpression(source);
415
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
416
        } catch(ExpressionSyntaxException ex) {
417
            // Ok
418
        }
419
        source = "3*/2";
420
        try {
421
            compiler.compileExpression(source);
422
            assertTrue("A syntax exception should have been thrown compiling '"+source+"'.", false);
423
        } catch(ExpressionSyntaxException ex) {
424
            // Ok
425
        }
426
    }
427

    
428
    public void testInvokeFunction2paramters1() {
429
        String source = "LEFT('NOMBRE', 2)";
430

    
431
        Compiler compiler = createCompiler();
432
        
433
        Code code = compiler.compileExpression(source);
434
        checkEquals("LEFT('NOMBRE', 2)", code.toString());
435
    }
436

    
437
    public void testInvokeFunction2paramters2() {
438
        String source = "LEFT('NOMBRE',2)";
439

    
440
        Compiler compiler = createCompiler();
441
        
442
        Code code = compiler.compileExpression(source);
443
        checkEquals("LEFT('NOMBRE', 2)", code.toString());
444
    }
445

    
446
    public void testInvokeFunction3paramters1() {
447
        String source = "MID('NOMBRE', 2, 2)";
448

    
449
        Compiler compiler = createCompiler();
450
        
451
        Code code = compiler.compileExpression(source);
452
        checkEquals("MID('NOMBRE', 2, 2)", code.toString());
453
    }
454

    
455
    public void testInvokeFunction3paramters2() {
456
        String source = "MID('NOMBRE', 2,2)";
457

    
458
        Compiler compiler = createCompiler();
459
        
460
        Code code = compiler.compileExpression(source);
461
        checkEquals("MID('NOMBRE', 2, 2)", code.toString());
462
    }
463

    
464
    public void testDecimal1() {
465
        String source = "23.1";
466

    
467
        Compiler compiler = createCompiler();
468
        Code code = compiler.compileExpression(source);
469
        checkEquals("23.1", code.toString());
470
    }
471

    
472
    public void testDecimal2() {
473
        String source = "23,1";
474

    
475
        Compiler compiler = createCompiler();
476
        try {
477
            Code code = compiler.compileExpression(source);
478
            fail("I expected 23,1 to be erroneous.");
479
        } catch(ExpressionSyntaxException ex) {
480
            // This is OK.
481
        }
482
    }
483
    public void testDecimal3() {
484
        String source = "1.23E4";
485

    
486
        Compiler compiler = createCompiler();
487
        Code code = compiler.compileExpression(source);
488
        checkEquals("12300", code.toString());
489
    }
490

    
491
    public void testDecimal4() {
492
        String source = "1.23E-2";
493

    
494
        Compiler compiler = createCompiler();
495
        Code code = compiler.compileExpression(source);
496
        checkEquals("0.0123", code.toString());
497
    }
498

    
499
    public void testDecimal5() {
500
        String source = "1.23E-4";
501

    
502
        Compiler compiler = createCompiler();
503
        Code code = compiler.compileExpression(source);
504
        checkEquals("0.000123", code.toString());
505
    }
506

    
507
    public void testDecimal6() {
508
        String source = "-23.1";
509

    
510
        Compiler compiler = createCompiler();
511
        Code code = compiler.compileExpression(source);
512
        checkEquals("-23.1", code.toString());
513
    }
514

    
515
    public void testDecimal7() {
516
        String source = "-1.23E-2";
517

    
518
        Compiler compiler = createCompiler();
519
        Code code = compiler.compileExpression(source);
520
        checkEquals("-0.0123", code.toString());
521
    }
522

    
523
    public void testDecimal8() {
524
        String source = "-1.23E-4";
525

    
526
        Compiler compiler = createCompiler();
527
        Code code = compiler.compileExpression(source);
528
        checkEquals("-0.000123", code.toString());
529
    }
530

    
531
    public void testGetAttr1() {
532
        String source =  "ARENA2_VEHICULOS.ID_ACCIDENTE";
533

    
534
        Compiler compiler = createCompiler();
535
        
536
        Code code = compiler.compileExpression(source);
537
        checkEquals( "GETATTR(\"ARENA2_VEHICULOS\", 'ID_ACCIDENTE')", code.toString());
538
    }
539

    
540
    public void testGetAttr1b() {
541
        String source =  "ARENA2_VEHICULOS.ID_ACCIDENTE";
542

    
543
        Compiler compiler = createCompiler();
544
        
545
        Code code = compiler.compileExpression(source);
546
        code.link(this.createSymbolTable());
547
        checkEquals( "\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\"", code.toString());
548
    }
549

    
550
    public void testGetAttr2a() {
551
        String source =  "GETATTR(ARENA2_VEHICULOS,'ID_ACCIDENTE')";
552

    
553
        Compiler compiler = createCompiler();
554
        
555
        Code code = compiler.compileExpression(source);
556
        code.link(this.createSymbolTable());
557
        checkEquals( "\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\"", code.toString());
558
    }
559

    
560
    public void testGetAttr2b() {
561
        String source =  "GETATTR(ARENA2_VEHICULOS,\"ID_ACCIDENTE\")";
562

    
563
        Compiler compiler = createCompiler();
564
        
565
        Code code = compiler.compileExpression(source);
566
        code.link(this.createSymbolTable());
567
        checkEquals( "GETATTR(\"ARENA2_VEHICULOS\", \"ID_ACCIDENTE\")", code.toString());
568
    }
569

    
570
    public void testGetAttr2c() {
571
        String source =  "GETATTR(ARENA2_VEHICULOS,'ID_ACCIDENTE'||3)";
572

    
573
        Compiler compiler = createCompiler();
574
        
575
        Code code = compiler.compileExpression(source);
576
        code.link(this.createSymbolTable());
577
        checkEquals( "GETATTR(\"ARENA2_VEHICULOS\", ('ID_ACCIDENTE' || 3))", code.toString());
578
    }
579
    
580
    public void testJson1() {
581
        String source =  "[\n" +
582
"        [2,'Val','2018'],\n" +
583
"        [3,'ali','2018'],\n" +
584
"        [5,'Val','2020'],\n" +
585
"        [7,'ali','2020']\n" +
586
"        ]";
587

    
588
        Compiler compiler = createCompiler();
589
        
590
        Code code = compiler.compileExpression(source);
591
        code.link(this.createSymbolTable());
592
        checkEquals( "ARRAY[ ARRAY[ 2, 'Val', '2018' ], ARRAY[ 3, 'ali', '2018' ], ARRAY[ 5, 'Val', '2020' ], ARRAY[ 7, 'ali', '2020' ] ]", code.toString());
593
    }
594

    
595
    public void testListAdd() {
596
        String source =  "list().add(10)";
597

    
598
        Compiler compiler = createCompiler();
599
        
600
        Code code = compiler.compileExpression(source);
601
        code.link(this.createSymbolTable());
602
        checkEquals( "list().add(10)", code.toString());
603
    }
604
    
605
    public void testListSet() {
606
        String source =  "list(1,2,3).set(1,20)";
607

    
608
        Compiler compiler = createCompiler();
609
        
610
        Code code = compiler.compileExpression(source);
611
        code.link(this.createSymbolTable());
612
        checkEquals( "list(1, 2, 3).set(1, 20)", code.toString());
613
    }    
614

    
615
    public void testColon1() {
616
        String source =  ":a+b";
617

    
618
        Compiler compiler = createCompiler();
619
        
620
        Code code = compiler.compileExpression(source);
621
        code.link(this.createSymbolTable());
622
        checkEquals( "(:IN (\"a\") + \"b\")", code.toString());
623
    }    
624
    
625
    public void testColon2() {
626
        String source =  ":IN (a+b)+c";
627

    
628
        Compiler compiler = createCompiler();
629
        
630
        Code code = compiler.compileExpression(source);
631
        code.link(this.createSymbolTable());
632
        checkEquals( "(:IN ((\"a\" + \"b\")) + \"c\")", code.toString());
633
    }    
634
    
635
    
636
    public void testColon3() {
637
        String source =  ":a.c";
638

    
639
        Compiler compiler = createCompiler();
640
        
641
        Code code = compiler.compileExpression(source);
642
        code.link(this.createSymbolTable());
643
        checkEquals( "GETATTR(:IN (\"a\"), 'c')", code.toString());
644
    }    
645
    
646
    public void testColon4() {
647
        try {
648
            String source =  ":IN a.c";
649

    
650
            Compiler compiler = createCompiler();
651

    
652
            Code code = compiler.compileExpression(source);
653
            code.link(this.createSymbolTable());
654
            checkEquals( "GETATTR(:IN (\"a\"), 'c')", code.toString());
655
        } catch(Throwable t) {
656
            t.printStackTrace();
657
            throw t;
658
        }
659
    }    
660
    
661
    public void testColon5() {
662
        try {
663
            String source =  ":IN (a.c)";
664

    
665
            Compiler compiler = createCompiler();
666

    
667
            Code code = compiler.compileExpression(source);
668
            code.link(this.createSymbolTable());
669
            checkEquals( ":IN (\"a\".\"c\")", code.toString());
670
        } catch(Throwable t) {
671
            t.printStackTrace();
672
            throw t;
673
        }
674
    }    
675
    
676
    public void testHostexpression1() {
677
        String source =  "BEGIN v1 := 10; v2 := :v1; END";
678

    
679
        Compiler compiler = createCompiler();
680
        
681
        Code code = compiler.compileExpression(source);
682
        code.link(this.createSymbolTable());
683
        checkEquals("testHostexpression1", "BEGIN \"v1\" := 10; \"v2\" := :IN (\"v1\"); END ", code.toString());
684
    }    
685
    
686
    public void testNotLike1() {
687
        String source =  "NOT ( FIELD LIKE '%||%' )";
688

    
689
        Compiler compiler = createCompiler();
690
        
691
        Code code = compiler.compileExpression(source);
692
        code.link(this.createSymbolTable());
693
        checkEquals( "NOT((\"FIELD\" LIKE '%||%'))", code.toString());
694
    }    
695
    
696
    public void testVar1() {
697
        String source = "VAR a DEFAULT 23";
698

    
699
        Compiler compiler = createCompiler();
700
        Code code = compiler.compileExpression(source);
701
        checkEquals("VAR(\"a\", 23)", code.toString());
702
    }
703

    
704
    public void testVar2() {
705
        String source = "VAR(\"a\",23)";
706

    
707
        Compiler compiler = createCompiler();
708
        Code code = compiler.compileExpression(source);
709
        checkEquals("VAR(\"a\", 23)", code.toString());
710
    }
711

    
712
    public void testIn1() {
713
        String source = "\"a\" in ( 1, 2, 3)";
714

    
715
        Compiler compiler = createCompiler();
716
        Code code = compiler.compileExpression(source);
717
        code.link();
718
        checkEquals("(\"a\" IN ( 1, 2, 3 ))", code.toString());
719
    }
720

    
721
    public void testIn2() {
722
        String source = "\"a\" in iterator";
723

    
724
        Compiler compiler = createCompiler();
725
        Code code = compiler.compileExpression(source);
726
        code.link();
727
        checkEquals("(\"a\" IN \"iterator\")", code.toString());
728
    }
729

    
730
    public void testBetween1() {
731
        String source = "\"a\" between 10 and 20";
732

    
733
        Compiler compiler = createCompiler();
734
        Code code = compiler.compileExpression(source);
735
        code.link();
736
        checkEquals("(\"a\" BETWEEN 10 AND 20)", code.toString());
737
    }
738

    
739
    public void testBetween2() {
740
        String source = "\"a\"+3 between b+10 and b+20";
741

    
742
        Compiler compiler = createCompiler();
743
        Code code = compiler.compileExpression(source);
744
        code.link();
745
        checkEquals("((\"a\" + 3) BETWEEN (\"b\" + 10) AND (\"b\" + 20))", code.toString());
746
    }
747
}