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

History | View | Annotate | Download (24 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.Formatter;
13
import org.gvsig.expressionevaluator.MutableSymbolTable;
14
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
15

    
16

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

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

    
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 MutableSymbolTable 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
    private void dump(String testname, Object expected, Object actual) {
60
        System.out.println("### ---------------------");
61
        System.out.println("### "+testname);
62
        System.out.println("### expected: ["+Objects.toString(expected)+"]");
63
        System.out.println("### actual  : ["+Objects.toString(actual)+"]");
64
    }
65
    
66
    private void checkEquals(String testname, Object expected, Object actual) {
67
        dump(testname,expected,actual);
68
        assertEquals(expected, actual);
69
    }
70

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

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

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

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

    
93
        String source = "[precio]";
94

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

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

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

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

    
108

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
227
        operator("~");
228
    }
229

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
651
            Compiler compiler = createCompiler();
652

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

    
666
            Compiler compiler = createCompiler();
667

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

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

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

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

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

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

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

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

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

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

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

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

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

    
743
        Compiler compiler = createCompiler();
744
        Code code = compiler.compileExpression(source);
745
        code.link();
746
        checkEquals("((\"a\" + 3) BETWEEN (\"b\" + 10) AND (\"b\" + 20))", code.toString());
747
    }
748
    
749
    public void testBlockExcept1a() {
750
        String source = "BEGIN LET V1 = 11; LET V2 = 22; EXCEPT print('Hola'); TRUE; END";
751

    
752
        Compiler compiler = createCompiler();
753
        Code code = compiler.compileExpression(source);
754
        code.link();
755
        checkEquals("BEGIN \"V1\" := 11; \"V2\" := 22; EXCEPT print('Hola'); TRUE; END ", code.toString());
756
    }
757

    
758
    public void testBlockExcept1b() {
759
        String source = "BEGIN LET V1 = 11; LET V2 = 22; EXCEPT print('Hola'); TRUE; END";
760

    
761
        Formatter formatter = new Code.EmptyFormatter(true, 4);
762
        
763
        Compiler compiler = createCompiler();
764
        Code code = compiler.compileExpression(source);
765
        code.link();
766
        checkEquals("BEGIN \n    \"V1\" := 11; \n    \"V2\" := 22; \nEXCEPT \n    print('Hola'); \n    TRUE; \nEND \n", code.toString(formatter));
767
    }
768

    
769
    public void testBlockExcept2b() {
770
        String source = "DECLARE V1 := 0; V2 := 0; BEGIN V1 := 11; V2 := 22; EXCEPT print('Hola'); TRUE; END";
771

    
772
        Formatter formatter = new Code.EmptyFormatter(true, 4);
773
        
774
        Compiler compiler = createCompiler();
775
        Code code = compiler.compileExpression(source);
776
        code.link();
777
        checkEquals("DECLARE \n    \"V1\" := 0; \n    \"V2\" := 0; \nBEGIN \n    \"V1\" := 11; \n    \"V2\" := 22; \nEXCEPT \n    print('Hola'); \n    TRUE; \nEND \n", code.toString(formatter));
778
    }
779

    
780
}