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 / TestInterpreter.java @ 47099

History | View | Annotate | Download (26.7 KB)

1
package org.gvsig.expresionevaluator.impl;
2

    
3
import java.util.Map;
4
import junit.framework.TestCase;
5
import org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.tuple.ImmutablePair;
7
import org.apache.commons.lang3.tuple.Pair;
8
import org.gvsig.expressionevaluator.AttributeHandler;
9
import org.gvsig.expressionevaluator.LexicalAnalyzer;
10
import org.gvsig.expressionevaluator.Compiler;
11
import org.gvsig.expressionevaluator.SymbolTable;
12
import org.gvsig.expressionevaluator.Interpreter;
13
import org.gvsig.expressionevaluator.Code;
14
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
15
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
16
import org.gvsig.expressionevaluator.MutableSymbolTable;
17
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
18
import org.gvsig.tools.util.IsEmpty;
19

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

    
37
    // TODO add test methods here. The name must begin with 'test'. For example:
38
    // public void testHello() {}
39

    
40
    
41
    protected LexicalAnalyzer createLexicalAnalyzer() {
42
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
43
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
44
        return lexer;
45
    }
46

    
47
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
48
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
49
        Compiler compiler = manager.createCompiler();
50
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
51
        return compiler;
52
    }
53

    
54
    
55
    protected MutableSymbolTable createSymbolTable() {
56
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
57
        MutableSymbolTable symbolTable = manager.createSymbolTable();
58
        symbolTable.setVar("precio", 200);
59
        symbolTable.setVar("1990", 0.168873933773767);
60
        return symbolTable;
61
    }
62
    
63
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
64
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
65
        Interpreter interpreter = manager.createInterpreter();
66
        interpreter.setSymbolTable(symbolTable);
67
        return interpreter;
68
    }
69
    
70
    public void testIdentifier1() {
71
        SymbolTable symbolTable = createSymbolTable();
72
        Compiler compiler = createCompiler();
73
        Interpreter interpreter = createInterpreter(symbolTable);
74
        
75
        String source = "precio";
76

    
77
        Code code = compiler.compileExpression(source);
78
        Object v = interpreter.run(code);
79
        assertEquals(200, ((Number)v).intValue());
80
    }
81
    
82
    public void testInteger() {
83
        SymbolTable symbolTable = createSymbolTable();
84
        Compiler compiler = createCompiler();
85
        Interpreter interpreter = createInterpreter(symbolTable);
86
        
87
        String source = "23";
88

    
89
        Code code = compiler.compileExpression(source);
90
        Object v = interpreter.run(code);
91
        assertEquals(23, ((Number)v).intValue());
92
    }
93
    
94
    public void testNumberDMS() {
95
        SymbolTable symbolTable = createSymbolTable();
96
        Compiler compiler = createCompiler();
97
        Interpreter interpreter = createInterpreter(symbolTable);
98
        
99
        String source = "@10 30 1.2 N";
100

    
101
        Code code = compiler.compileExpression(source);
102
        Object v = interpreter.run(code);
103
        assertEquals(10.5003, Math.round(((Number)v).doubleValue()*10000d)/10000d);
104

    
105
        source = "@10 30 0.09 N";
106

    
107
        code = compiler.compileExpression(source);
108
        v = interpreter.run(code);
109
        assertEquals(10.500025, Math.round(((Number)v).doubleValue()*1000000d)/1000000d);
110

    
111
        source = "@10 30 0.09 S";
112

    
113
        code = compiler.compileExpression(source);
114
        v = interpreter.run(code);
115
        assertEquals(-10.500025, Math.round(((Number)v).doubleValue()*1000000d)/1000000d);
116

    
117
        source = "@+10 30 0.09";
118

    
119
        code = compiler.compileExpression(source);
120
        v = interpreter.run(code);
121
        assertEquals(10.500025, Math.round(((Number)v).doubleValue()*1000000d)/1000000d);
122

    
123
        source = "@-10 30 0.09";
124

    
125
        code = compiler.compileExpression(source);
126
        v = interpreter.run(code);
127
        assertEquals(-10.500025, Math.round(((Number)v).doubleValue()*1000000d)/1000000d);
128

    
129
    }
130
    
131
    public void testTrue() {
132
        SymbolTable symbolTable = createSymbolTable();
133
        Compiler compiler = createCompiler();
134
        Interpreter interpreter = createInterpreter(symbolTable);
135
        
136
        String source = "true";
137

    
138
        Code code = compiler.compileExpression(source);
139
        assertEquals(Boolean.TRUE, interpreter.run(code));
140
    }
141
    
142
    public void testFalse() {
143
        SymbolTable symbolTable = createSymbolTable();
144
        Compiler compiler = createCompiler();
145
        Interpreter interpreter = createInterpreter(symbolTable);
146
        
147
        String source = "false";
148

    
149
        Code code = compiler.compileExpression(source);
150
        assertEquals(Boolean.FALSE, interpreter.run(code));
151
    }
152
    
153
    public void testNull() {
154
        SymbolTable symbolTable = createSymbolTable();
155
        Compiler compiler = createCompiler();
156
        Interpreter interpreter = createInterpreter(symbolTable);
157
        
158
        String source = "null";
159

    
160
        Code code = compiler.compileExpression(source);
161
        assertEquals(null, interpreter.run(code));
162
    }
163
    
164
    public void testIsNull() {
165
        SymbolTable symbolTable = createSymbolTable();
166
        Compiler compiler = createCompiler();
167
        Interpreter interpreter = createInterpreter(symbolTable);
168
        
169
        String source = "10 is null";
170

    
171
        Code code = compiler.compileExpression(source);
172
        assertEquals(false, interpreter.run(code));
173
    }
174
    
175
    public void testIsNotNull() {
176
        SymbolTable symbolTable = createSymbolTable();
177
        Compiler compiler = createCompiler();
178
        Interpreter interpreter = createInterpreter(symbolTable);
179
        
180
        String source = "10 is not null";
181

    
182
        Code code = compiler.compileExpression(source);
183
        assertEquals(true, interpreter.run(code));
184
    }
185
    
186
    public void testAdd1() {
187
        SymbolTable symbolTable = createSymbolTable();
188
        Compiler compiler = createCompiler();
189
        Interpreter interpreter = createInterpreter(symbolTable);
190
        
191
        String source = "precio + 10";
192

    
193
        Code code = compiler.compileExpression(source);
194
        Object v = interpreter.run(code);
195
        assertEquals(210, ((Number)v).intValue());
196
    }
197
    
198
    public void testSimpleAdd1() {
199
        SymbolTable symbolTable = createSymbolTable();
200
        Compiler compiler = createCompiler();
201
        Interpreter interpreter = createInterpreter(symbolTable);
202
        
203
        String source = "5+10";
204

    
205
        Code code = compiler.compileExpression(source);
206
        Object v = interpreter.run(code);
207
        assertEquals(15, ((Number)v).intValue());
208
    }
209
    
210
    public void testSimpleAdd2() {
211
        SymbolTable symbolTable = createSymbolTable();
212
        Compiler compiler = createCompiler();
213
        Interpreter interpreter = createInterpreter(symbolTable);
214
        
215
        String source = "5 + 10";
216

    
217
        Code code = compiler.compileExpression(source);
218
        Object v = interpreter.run(code);
219
        assertEquals(15, ((Number)v).intValue());
220
    }
221
    
222
    public void testSimpleAdd3() {
223
        SymbolTable symbolTable = createSymbolTable();
224
        Compiler compiler = createCompiler();
225
        Interpreter interpreter = createInterpreter(symbolTable);
226
        
227
        String source = "10+-5";
228

    
229
        Code code = compiler.compileExpression(source);
230
        Object v = interpreter.run(code);
231
        assertEquals(5, ((Number)v).intValue());
232
    }
233
    
234
    public void testSimpleSub1() {
235
        SymbolTable symbolTable = createSymbolTable();
236
        Compiler compiler = createCompiler();
237
        Interpreter interpreter = createInterpreter(symbolTable);
238
        
239
        String source = "10-5";
240

    
241
        Code code = compiler.compileExpression(source);
242
        Object v = interpreter.run(code);
243
        assertEquals(5, ((Number)v).intValue());
244
    }
245
    
246
    public void testSimpleSub2() {
247
        SymbolTable symbolTable = createSymbolTable();
248
        Compiler compiler = createCompiler();
249
        Interpreter interpreter = createInterpreter(symbolTable);
250
        
251
        String source = "10 - 5";
252

    
253
        Code code = compiler.compileExpression(source);
254
        Object v = interpreter.run(code);
255
        assertEquals(5, ((Number)v).intValue());
256
    }
257
    
258
    public void testSimpleNumber() {
259
        SymbolTable symbolTable = createSymbolTable();
260
        Compiler compiler = createCompiler();
261
        Interpreter interpreter = createInterpreter(symbolTable);
262
        
263
        String source = "23";
264

    
265
        Code code = compiler.compileExpression(source);
266
        Object v = interpreter.run(code);
267
        assertEquals(23, ((Number)v).intValue());
268
    }
269
    
270
    public void testSimpleNegativeNumber() {
271
        SymbolTable symbolTable = createSymbolTable();
272
        Compiler compiler = createCompiler();
273
        Interpreter interpreter = createInterpreter(symbolTable);
274
        
275
        String source = "-23";
276

    
277
        Code code = compiler.compileExpression(source);
278
        Object v = interpreter.run(code);
279
        assertEquals(-23, ((Number)v).intValue());
280
    }
281
    
282
    public void testNegateFunction() {
283
        SymbolTable symbolTable = createSymbolTable();
284
        Compiler compiler = createCompiler();
285
        Interpreter interpreter = createInterpreter(symbolTable);
286
        
287
        String source = "-PI()";
288

    
289
        Code code = compiler.compileExpression(source);
290
        Object v = interpreter.run(code);
291
        assertEquals(-Math.PI, ((Number)v).doubleValue());
292
    }
293
    
294
    public void testSub1() {
295
        SymbolTable symbolTable = createSymbolTable();
296
        Compiler compiler = createCompiler();
297
        Interpreter interpreter = createInterpreter(symbolTable);
298
        
299
        String source = "precio - 10";
300

    
301
        Code code = compiler.compileExpression(source);
302
        Object v = interpreter.run(code);
303
        assertEquals(190, ((Number)v).intValue());
304
    }
305
    
306
    public void testMul1() {
307
        SymbolTable symbolTable = createSymbolTable();
308
        Compiler compiler = createCompiler();
309
        Interpreter interpreter = createInterpreter(symbolTable);
310
        
311
        String source = "precio * 10";
312

    
313
        Code code = compiler.compileExpression(source);
314
        Object v = interpreter.run(code);
315
        assertEquals(2000, ((Number)v).intValue());
316
    }
317

    
318
    public void testDiv1() {
319
        SymbolTable symbolTable = createSymbolTable();
320
        Compiler compiler = createCompiler();
321
        Interpreter interpreter = createInterpreter(symbolTable);
322
        
323
        String source = "precio / 10";
324

    
325
        Code code = compiler.compileExpression(source);
326
        Object v = interpreter.run(code);
327
        assertEquals(20, ((Number)v).intValue());
328
    }
329
    
330
    public void testMod1() {
331
        SymbolTable symbolTable = createSymbolTable();
332
        Compiler compiler = createCompiler();
333
        Interpreter interpreter = createInterpreter(symbolTable);
334
        
335
        String source = "4 % 3";
336

    
337
        Code code = compiler.compileExpression(source);
338
        Object v = interpreter.run(code);
339
        assertEquals(1, ((Number)v).intValue());
340
    }
341
    
342
    public void testMod2() {
343
        SymbolTable symbolTable = createSymbolTable();
344
        Compiler compiler = createCompiler();
345
        Interpreter interpreter = createInterpreter(symbolTable);
346
        
347
        String source = "MOD(4, 3)";
348

    
349
        Code code = compiler.compileExpression(source);
350
        Object v = interpreter.run(code);
351
        assertEquals(1, ((Number)v).intValue());
352
    }
353
    
354
    public void testAdd2() {
355
        SymbolTable symbolTable = createSymbolTable();
356
        Compiler compiler = createCompiler();
357
        Interpreter interpreter = createInterpreter(symbolTable);
358
        
359
        String source = "precio + 10 + 20 + 30";
360

    
361
        Code code = compiler.compileExpression(source);
362
        Object v = interpreter.run(code);
363
        assertEquals(260, ((Number)v).intValue());
364
    }
365
    
366
    public void testAddMul() {
367
        SymbolTable symbolTable = createSymbolTable();
368
        Compiler compiler = createCompiler();
369
        Interpreter interpreter = createInterpreter(symbolTable);
370
        
371
        String source = "precio + 10 * 2 + 20 + 30";
372

    
373
        Code code = compiler.compileExpression(source);
374
        Object v = interpreter.run(code);
375
        assertEquals(270, ((Number)v).intValue());
376
    }
377
    
378
    public void testAddMulPar() {
379
        SymbolTable symbolTable = createSymbolTable();
380
        Compiler compiler = createCompiler();
381
        Interpreter interpreter = createInterpreter(symbolTable);
382
        
383
        String source = "(precio + 10) * 2 + 20 + 30";
384

    
385
        Code code = compiler.compileExpression(source);
386
        Object v = interpreter.run(code);
387
        assertEquals(470, ((Number)v).intValue());
388
    }    
389

    
390
    public void testAbs() {
391
        SymbolTable symbolTable = createSymbolTable();
392
        Compiler compiler = createCompiler();
393
        Interpreter interpreter = createInterpreter(symbolTable);
394
        
395
        String source = "precio + abs(10)";
396

    
397
        Code code = compiler.compileExpression(source);
398
        Object v = interpreter.run(code);
399
        assertEquals(210, ((Number)v).intValue());
400
    }
401

    
402
    public void testAbs2() {
403
        SymbolTable symbolTable = createSymbolTable();
404
        Compiler compiler = createCompiler();
405
        Interpreter interpreter = createInterpreter(symbolTable);
406
        
407
        String source = "precio + abs(-10)";
408

    
409
        Code code = compiler.compileExpression(source);
410
        Object v = interpreter.run(code);
411
        assertEquals(210, ((Number)v).intValue());
412
    }
413
    
414
    public void testCeil() {
415
        SymbolTable symbolTable = createSymbolTable();
416
        Compiler compiler = createCompiler();
417
        Interpreter interpreter = createInterpreter(symbolTable);
418
        
419
        String source = "precio + CEIL(PI())";
420

    
421
        Code code = compiler.compileExpression(source);
422
        Object v = interpreter.run(code);
423
        assertEquals(204, ((Number)v).intValue());
424
    }
425
    
426
    public void testConcat() {
427
        SymbolTable symbolTable = createSymbolTable();
428
        Compiler compiler = createCompiler();
429
        Interpreter interpreter = createInterpreter(symbolTable);
430
        
431
        String source = "CONCAT(precio,' euros')";
432

    
433
        Code code = compiler.compileExpression(source);
434
        Object v = interpreter.run(code);
435
        assertEquals("200 euros", (String)v);
436
    }
437

    
438
    public void testAccuracy() {
439
 
440
        SymbolTable symbolTable = createSymbolTable();
441
        Compiler compiler = createCompiler();
442
        Interpreter interpreter = createInterpreter(symbolTable);
443
        Code code;
444
        Object v;
445
        
446
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
447

    
448
        code = compiler.compileExpression("[1990] = 0.168873933773767");
449
        v = interpreter.run(code);
450
        assertEquals(true, ((Boolean)v).booleanValue());
451

    
452
        code = compiler.compileExpression("[1990] = 0.1688739");
453
        v = interpreter.run(code);
454
        assertEquals(false, ((Boolean)v).booleanValue());
455

    
456
        interpreter.setAccuracy(0.0000001);
457
        v = interpreter.run(code);
458
        assertEquals(true, ((Boolean)v).booleanValue());
459
    }    
460

    
461
    public void test2fields() {
462
        SymbolTable symbolTable = createSymbolTable();
463
        Compiler compiler = createCompiler();
464
        Interpreter interpreter = createInterpreter(symbolTable);
465
        
466
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
467

    
468
        String source = "[1990] = [precio]";
469

    
470
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
471
        Code code = compiler.compileExpression(source);
472
        Object v = interpreter.run(code);
473
        assertEquals(false, ((Boolean)v).booleanValue());
474
    }
475

    
476

    
477
    public void testInvokeMethod1() {
478
        SymbolTable symbolTable = createSymbolTable();
479
        Compiler compiler = createCompiler();
480
        Interpreter interpreter = createInterpreter(symbolTable);
481
        
482
        String source = "'hola'.length()";
483

    
484
        Code code = compiler.compileExpression(source);
485
        Object v = interpreter.run(code);
486

    
487
        assertEquals(4, ((Number)v).intValue());
488
    }
489
    
490
    
491
    public void testInvokeMethod2() {
492
        SymbolTable symbolTable = createSymbolTable();
493
        Compiler compiler = createCompiler();
494
        Interpreter interpreter = createInterpreter(symbolTable);
495
        
496
        String source = "'hola'.indexOf('l')";
497
        
498
        Code code = compiler.compileExpression(source);
499
        Object v = interpreter.run(code);
500

    
501
        assertEquals(2, ((Number)v).intValue());
502
    }
503

    
504
    public void testAlias() {
505
        SymbolTable symbolTable = createSymbolTable();
506
        Compiler compiler = createCompiler();
507
        Interpreter interpreter = createInterpreter(symbolTable);
508
        
509
        String source = "UPPER('hola')";
510
        Code code = compiler.compileExpression(source);
511
        Object v = interpreter.run(code);
512
        assertEquals("HOLA", (String)v);
513

    
514
        
515
        source = "UCASE('hola')";
516
        code = compiler.compileExpression(source);
517
        v = interpreter.run(code);
518
        assertEquals("HOLA", (String)v);
519
    }
520
    
521
    public void testRegexp1() {
522
        SymbolTable symbolTable = createSymbolTable();
523
        Compiler compiler = createCompiler();
524
        Interpreter interpreter = createInterpreter(symbolTable);
525
        
526
        String source = "'Hola' ~ '[Hh]ola'" ;
527
        Code code = compiler.compileExpression(source);
528
        Object v = interpreter.run(code);
529
        assertTrue((Boolean)v);
530
    }
531

    
532
    public void testGetitem1() {
533
        SymbolTable symbolTable = createSymbolTable();
534
        Compiler compiler = createCompiler();
535
        Interpreter interpreter = createInterpreter(symbolTable);
536
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(false);
537
        
538
        String source = "LIST('uno','dos','tres')[1]" ;
539
        
540
        Code code = compiler.compileExpression(source);
541
        Object v = interpreter.run(code);
542
        assertEquals("dos", (String)v);
543
    }
544

    
545
    public void testGetattr1() {
546
        MutableSymbolTable symbolTable = createSymbolTable();
547
        Compiler compiler = createCompiler();
548
        Interpreter interpreter = createInterpreter(symbolTable);
549
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(false);
550

    
551
        symbolTable.setVar(
552
          "PARCELA", 
553
          (AttributeHandler) (String key) -> StringUtils.equalsIgnoreCase(key, "MASA")? "100":null
554
        );
555
        String source = "PARCELA.MASA" ;
556
        
557
        Code code = compiler.compileExpression(source);
558
        assertEquals("GETATTR(\"PARCELA\", 'MASA')", code.toString());
559
        
560
        Object v = interpreter.run(code);
561
        assertEquals("100", (String)v);
562
    }
563

    
564
    public void testDict1() {
565
        MutableSymbolTable symbolTable = createSymbolTable();
566
        Compiler compiler = createCompiler();
567
        Interpreter interpreter = createInterpreter(symbolTable);
568

    
569
        String source = "dict()" ;
570
        
571
        Code code = compiler.compileExpression(source);
572
        assertEquals("dict()", code.toString());
573
        
574
        Object v = interpreter.run(code);
575
        assertTrue("Map expected", v instanceof Map);
576
        assertEquals(0, ((Map)v).size());
577
    }
578

    
579
    public void testDict2() {
580
        MutableSymbolTable symbolTable = createSymbolTable();
581
        Compiler compiler = createCompiler();
582
        Interpreter interpreter = createInterpreter(symbolTable);
583

    
584
        String source = "dict(diez=10, veinte:20)" ;
585
        
586
        Code code = compiler.compileExpression(source);
587
        assertEquals("DICT('diez', 10, 'veinte', 20)", code.toString());
588
        
589
        Object v = interpreter.run(code);
590
        assertTrue("Map expected", v instanceof Map);
591
        assertEquals(2, ((Map)v).size());
592
        assertEquals(10, ((Number)((Map)v).get("diez")).intValue());
593
        assertEquals(20, ((Number)((Map)v).get("veinte")).intValue());
594
    }
595

    
596
    public void testDict3() {
597
        MutableSymbolTable symbolTable = createSymbolTable();
598
        Compiler compiler = createCompiler();
599
        Interpreter interpreter = createInterpreter(symbolTable);
600

    
601
        String source = "dict('diez', 10, 'veinte', 20)" ;
602
        
603
        Code code = compiler.compileExpression(source);
604
        assertEquals("dict('diez', 10, 'veinte', 20)", code.toString());
605
        
606
        Object v = interpreter.run(code);
607
        assertTrue("Map expected", v instanceof Map);
608
        assertEquals(2, ((Map)v).size());
609
        assertEquals(10, ((Number)((Map)v).get("diez")).intValue());
610
        assertEquals(20, ((Number)((Map)v).get("veinte")).intValue());
611
    }
612
    
613
    public void testEmptyDict1() {
614
        String source =  "x := { }";
615

    
616
        SymbolTable symbolTable = createSymbolTable();
617
        Compiler compiler = createCompiler();
618
        Interpreter interpreter = createInterpreter(symbolTable);
619
        
620
        Code code = compiler.compileExpression(source);
621
        Object v = interpreter.run(code);
622
        assertEquals( true, ((IsEmpty)v).isEmpty());
623
    }   
624

    
625
    public void testEmptyDict2() {
626
        String source =  "x := dict()";
627

    
628
        SymbolTable symbolTable = createSymbolTable();
629
        Compiler compiler = createCompiler();
630
        Interpreter interpreter = createInterpreter(symbolTable);
631
        
632
        Code code = compiler.compileExpression(source);
633
        Object v = interpreter.run(code);
634
        assertEquals( true, ((IsEmpty)v).isEmpty());
635
    }   
636

    
637
    public void testStrOfInt() {
638
        SymbolTable symbolTable = createSymbolTable();
639
        Compiler compiler = createCompiler();
640
        Interpreter interpreter = createInterpreter(symbolTable);
641
        
642
        String source = "STR(10)";
643

    
644
        Code code = compiler.compileExpression(source);
645
        Object v = interpreter.run(code);
646
        assertEquals("10", (String)v);
647
    }
648

    
649
    public void testStrOfDouble() {
650
        SymbolTable symbolTable = createSymbolTable();
651
        Compiler compiler = createCompiler();
652
        Interpreter interpreter = createInterpreter(symbolTable);
653
        
654
        String source = "STR(10.1)";
655

    
656
        Code code = compiler.compileExpression(source);
657
        Object v = interpreter.run(code);
658
        assertEquals("10.1", (String)v);
659
    }
660

    
661
    public void testStrOfArray() {
662
        SymbolTable symbolTable = createSymbolTable();
663
        Compiler compiler = createCompiler();
664
        Interpreter interpreter = createInterpreter(symbolTable);
665
        
666
        String source = "STR([ 10, 20.1, 'adios' ])";
667

    
668
        Code code = compiler.compileExpression(source);
669
        Object v = interpreter.run(code);
670
        assertEquals("[10, 20.1, adios]", v);
671
    }
672

    
673
    public void testStrOfList() {
674
        SymbolTable symbolTable = createSymbolTable();
675
        Compiler compiler = createCompiler();
676
        Interpreter interpreter = createInterpreter(symbolTable);
677
        
678
        String source = "STR(LIST(10, [2,20.1], 'adios'))";
679

    
680
        Code code = compiler.compileExpression(source);
681
        Object v = interpreter.run(code);
682
        assertEquals("[10, [2, 20.1], adios]", v);
683
    }
684

    
685
    public void testSymbolTableGetName() {
686
        SymbolTable symbolTable = createSymbolTable();
687
        Compiler compiler = createCompiler();
688
        Interpreter interpreter = createInterpreter(symbolTable);
689
        
690
        String source = "$symboltable.SQL.getName()";
691

    
692
        Code code = compiler.compileExpression(source);
693
        Object v = interpreter.run(code);
694
        assertEquals("SQL", v);
695
    }
696

    
697
    public void testEmptyList() {
698
        String source =  "x := [ ]";
699

    
700
        SymbolTable symbolTable = createSymbolTable();
701
        Compiler compiler = createCompiler();
702
        Interpreter interpreter = createInterpreter(symbolTable);
703
        
704
        Code code = compiler.compileExpression(source);
705
        Object v = interpreter.run(code);
706
        assertEquals( true, ((IsEmpty)v).isEmpty());
707
    }
708
    
709
    public void testListAppend() {
710
        String source =  "list().add(10)";
711

    
712
        SymbolTable symbolTable = createSymbolTable();
713
        Compiler compiler = createCompiler();
714
        Interpreter interpreter = createInterpreter(symbolTable);
715
        
716
        Code code = compiler.compileExpression(source);
717
        Object v = interpreter.run(code);
718
        assertEquals( true, v);
719
    }
720
    
721
    public void testListSet() {
722
        String source =  "list(1,2,3).set(1,20)";
723

    
724
        SymbolTable symbolTable = createSymbolTable();
725
        Compiler compiler = createCompiler();
726
        Interpreter interpreter = createInterpreter(symbolTable);
727
        
728
        Code code = compiler.compileExpression(source);
729
        Object v = interpreter.run(code);
730
        assertEquals( 2, v);
731
    }    
732
    
733
    public void testLike() {
734
        Pair<String, Boolean>[] sources = new Pair[] {
735
//            new ImmutablePair<>("'\\110?' LIKE '\\\\%?'", Boolean.TRUE), 
736
            new ImmutablePair<>("'1.3'   LIKE '%||%'", Boolean.FALSE),
737
            new ImmutablePair<>("'1.3||' LIKE '%||%'", Boolean.TRUE),
738
            new ImmutablePair<>("'1.3'   LIKE '%.%'", Boolean.TRUE),
739
            new ImmutablePair<>("'123'   LIKE '%.%'", Boolean.FALSE),
740
            new ImmutablePair<>("'123'   LIKE '%[%'", Boolean.FALSE),
741
            new ImmutablePair<>("'12[3]' LIKE '%[%'", Boolean.TRUE),
742
            new ImmutablePair<>("'12[3]' LIKE '%]%'", Boolean.TRUE),
743
            new ImmutablePair<>("'123]'  LIKE '%[%'", Boolean.FALSE),
744
            new ImmutablePair<>("'(1{3}|3)' LIKE '(%{%}|%)'", Boolean.TRUE),
745
            new ImmutablePair<>("'(1{3}|3' LIKE '(%{%}|%)'", Boolean.FALSE),
746
            new ImmutablePair<>("'1*?' LIKE '%*&%?'", Boolean.FALSE),
747
            new ImmutablePair<>("'1*&10?' LIKE '%*&%?'", Boolean.TRUE),
748
        };
749

    
750
        MutableSymbolTable symbolTable = createSymbolTable();
751
        Compiler compiler = createCompiler();
752
        Interpreter interpreter = createInterpreter(symbolTable);
753
        
754
        for (Pair<String, Boolean> source : sources) {
755
            Code code = compiler.compileExpression(source.getLeft());
756
            Object v = interpreter.run(code);
757
            assertEquals(source.getLeft(), source.getRight(), v);
758
        }
759
    }    
760

    
761
    public void testNotLike1() {
762
        String source =  "NOT ( FIELD LIKE '%||%' )";
763

    
764
        MutableSymbolTable symbolTable = createSymbolTable();
765
        symbolTable.setVar("FIELD", "1.3");
766
        Compiler compiler = createCompiler();
767
        Interpreter interpreter = createInterpreter(symbolTable);
768
        
769
        Code code = compiler.compileExpression(source);
770
        Object v = interpreter.run(code);
771
        assertEquals( true, v);
772
    }    
773
}