Statistics
| Revision:

svn-gvsig-desktop / trunk / extSymbology / src-test / org / gvsig / symbology / fmap / labeling / parse / TestLabelExpressionParser.java @ 18755

History | View | Annotate | Download (14 KB)

1
package org.gvsig.symbology.fmap.labeling.parse;
2

    
3
import java.io.CharArrayReader;
4
import java.util.Date;
5

    
6
import junit.framework.TestCase;
7

    
8
import org.gvsig.symbology.fmap.labeling.lang.Symbol;
9
import org.gvsig.symbology.fmap.labeling.lang.functions.Substring;
10
import org.gvsig.symbology.fmap.labeling.parse.LabelExpressionParser;
11
import org.gvsig.symbology.fmap.labeling.parse.ParseException;
12

    
13
import com.hardcode.gdbms.engine.values.BooleanValue;
14
import com.hardcode.gdbms.engine.values.DateValue;
15
import com.hardcode.gdbms.engine.values.DoubleValue;
16
import com.hardcode.gdbms.engine.values.IntValue;
17
import com.hardcode.gdbms.engine.values.NullValue;
18
import com.hardcode.gdbms.engine.values.StringValue;
19
import com.hardcode.gdbms.engine.values.ValueFactory;
20

    
21
public class TestLabelExpressionParser extends TestCase {
22
        LabelExpressionParser parser;
23
        
24
        @Override
25
        protected void setUp() throws Exception {
26
                super.setUp();
27
                LabelExpressionParser.addFunction(Substring.class);
28
        }
29
        private Symbol[] symbols = new Symbol[] {
30
                        new Symbol(
31
                                        "A_DOUBLE_VALUE", 
32
                                        Symbol.DATA_TYPE_FLOATING,
33
                                        ValueFactory.createValue(4.0)
34
                        ),
35
                        new Symbol(
36
                                        "ANOTHER_DOUBLE_VALUE", 
37
                                        Symbol.DATA_TYPE_FLOATING,
38
                                        ValueFactory.createValue(Math.PI)
39
                        ),
40
                        new Symbol(
41
                                        "A_INTEGER_VALUE", 
42
                                        Symbol.DATA_TYPE_INT,
43
                                        ValueFactory.createValue(12)
44
                        ),
45
                        new Symbol(
46
                                        "A_STRING_VALUE", 
47
                                        Symbol.DATA_TYPE_STRING,
48
                                        ValueFactory.createValue("this is a String")
49
                        ),
50
                        new Symbol(
51
                                        "A_BOOLEAN_VALUE", 
52
                                        Symbol.DATA_TYPE_BOOLEAN,
53
                                        ValueFactory.createValue(true)
54
                        ),
55
                        new Symbol(
56
                                        "ANOTHER_BOOLEAN_VALUE", 
57
                                        Symbol.DATA_TYPE_BOOLEAN,
58
                                        ValueFactory.createValue(false)
59
                        ),
60
                        new Symbol(
61
                                        "A_NULL_VALUE", 
62
                                        Symbol.DATA_TYPE_NULL,
63
                                        ValueFactory.createNullValue()
64
                        ),
65
                        new Symbol(
66
                                        "A_DATE_VALUE", 
67
                                        Symbol.DATA_TYPE_DATE,
68
                                        ValueFactory.createValue(new Date())
69
                        )
70
                        
71
                        
72
        };
73
        
74
        public void testExpression() {
75
                
76
        }
77
        
78
        private String[] ArgumentsExpressions = new String[] {
79
                        "(754)",
80
                        "(754, \"blah\")",
81
                        "(-9.68, [A_DOUBLE_VALUE]) ",
82
                        "(false, true) ",
83
        };
84
        private Object[][] ArgumentsExpressionsValue = new Object[][]  {
85
                        new Object[] { 754 },
86
                        new Object[] { 754, "blah" },
87
                        new Object[] { -9.68, 4.0 },
88
                        new Object[] { false, true },
89
        };        
90
        public void testArguments() {
91
                
92
                String[] expressions = ArgumentsExpressions;
93
                Object[][] expectedValues = ArgumentsExpressionsValue;
94
                System.out.println("\nTestLabelExpressionParser.testArgumens()");
95
                
96
                for (int i = 0; i < expressions.length; i++) {
97
                        String expr = expressions[i];
98
                        parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
99
                        for (int j = 0; j < symbols.length; j++) {
100
                                parser.putSymbol(symbols[j]);
101
                        }
102
                        System.out.print("Parsing '"+expr+"'");
103
                        try {
104
                                int amount = parser.Arguments();
105
                                System.out.print(": [ parsed ]. Evaluating: ");
106
                                Object[] expected = expectedValues[i];
107
                                assertTrue("Failed detecting argument number. Expected "+expected.length+", but got "+amount+".", amount == expected.length);
108
                                
109
                                for (int j = expected.length-1; j >= 0; j--) { // <- Last in first out
110
                                        Object value = parser.pop();
111
                                        assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected[j]+"]", value.equals(expected[j]));
112
                                        System.out.print(value+" [ Ok! ]\t");
113
                                }
114
                                
115

    
116
                        } catch (ParseException e) {
117
                                System.err.println(":\t [ Fail! ]");
118
                                fail("Failed parsing text '"+expr+"'\n"+e.getMessage());
119
                        }
120
                        System.out.println();
121
                }
122
        }
123
        
124
        private String[] LiteralExpressions = new String[] {
125
                        "true",
126
                        "false",
127
                        " 43564356435.234",
128
                        " 12455 ",
129
                        " \"a string\"",
130
        };
131
        private Object[] LiteralExpressionsValue = new Object[]  {
132
                         true ,
133
                         false,
134
                         43564356435.234,
135
                         12455,
136
                         "a string"
137
        };        
138
        public void testLiteral() {
139
                String[] expressions = LiteralExpressions;
140
                Object[] expectedValues = LiteralExpressionsValue;
141
                System.out.println("\nTestLabelExpressionParser.testLiteral()");
142
                
143
                for (int i = 0; i < expressions.length; i++) {
144
                        String expr = expressions[i];
145
                        parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
146
                        for (int j = 0; j < symbols.length; j++) {
147
                                parser.putSymbol(symbols[j]);
148
                        }
149
                        System.out.print("Parsing '"+expr+"'");
150
                        try {
151
                                parser.Literal();
152
                                System.out.print(": [ parsed ]. Evaluating: ");
153
                                Object expected = expectedValues[i];
154

    
155
                                Object value = parser.pop();
156
                                assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected));
157
                                System.out.print(value+" [ Ok! ]\t");
158

    
159

    
160
                        } catch (ParseException e) {
161
                                System.err.println(":\t [ Fail! ]");
162
                                fail("Failed parsing text '"+expr+"'\n"+e.getMessage());
163
                        }
164
                        System.out.println();
165
                }
166
        }
167
        
168
        private String[] FunctionExpressions = new String[] {
169
                        new Substring().getName()+"(\"My taylor is rich!\", 3, 9)",
170
                        new Substring().getName()+"("+new Substring().getName()+"(\"My taylor is rich!\", 3, 9), 2,3)",
171
        };
172
        private Object[] FunctionExpressionsValue = new Object[]  {
173
                         "taylor" ,
174
                         "y",
175
        };        
176
        public void testFunction() {
177
                String[] expressions = FunctionExpressions;
178
                Object[] expectedValues = FunctionExpressionsValue;
179
                System.out.println("\nTestLabelExpressionParser.testFunction()");
180
                
181
                for (int i = 0; i < expressions.length; i++) {
182
                        String expr = expressions[i];
183
                        parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
184
                        for (int j = 0; j < symbols.length; j++) {
185
                                parser.putSymbol(symbols[j]);
186
                        }
187
                        System.out.print("Parsing '"+expr+"'");
188
                        try {
189
                                parser.Function();
190
                                System.out.print(": [ parsed ]. Evaluating: ");
191
                                Object expected = expectedValues[i];
192

    
193
                                Object value = parser.pop();
194
                                assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected));
195
                                System.out.print(value+" [ Ok! ]\t");
196

    
197

    
198
                        } catch (ParseException e) {
199
                                System.err.println(":\t [ Fail! ]");
200
                                fail("Failed parsing text '"+expr+"'\n"+e.getMessage());
201
                        }
202
                        System.out.println();
203
                }
204
        }
205

    
206
        
207
        public void testPrimitiveExpression() {
208
                String[] PrimitiveExpressions = new String[symbols.length];
209
                Object[] PrimitiveExpressionsValue = new Object[symbols.length];
210
                for (int i = 0; i < symbols.length; i++) {
211
                        PrimitiveExpressions[i] = "["+symbols[i].getName()+"]";
212
                        PrimitiveExpressionsValue[i] = symbols[i].getValue();
213
                }
214
                
215
                String[] expressions = PrimitiveExpressions;
216
                Object[] expectedValues = PrimitiveExpressionsValue;
217
                
218
                System.out.println("\nTestLabelExpressionParser.testPrimitiveExpression()");
219
                
220
                for (int i = 0; i < expressions.length; i++) {
221
                        String expr = expressions[i];
222
                        parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
223
                        for (int j = 0; j < symbols.length; j++) {
224
                                parser.putSymbol(symbols[j]);
225
                        }
226
                        System.out.print("Parsing '"+expr+"'");
227
                        try {
228
                                parser.PrimitiveExpression();
229
                                System.out.print(": [ parsed ]. Evaluating: ");
230
                                Object expected = expectedValues[i];
231
                                
232
                                // GDBMS values are evaluated as java primitives
233
                                if (expected instanceof DoubleValue) {
234
                                        expected = ((DoubleValue) expected).getValue();
235
                                } else if (expected instanceof IntValue) {
236
                                        expected = ((IntValue) expected).getValue();
237
                                } else if (expected instanceof StringValue) {
238
                                        expected = ((StringValue) expected).getValue();
239
                                } else if (expected instanceof DateValue) {
240
                                        expected = ((DateValue) expected).getValue();
241
                                } else if (expected instanceof BooleanValue) {
242
                                        expected = ((BooleanValue) expected).getValue();
243
                                } else if (expected instanceof NullValue) {
244
                                        expected = null;
245
                                }
246
                        
247

    
248
                                Object value = parser.pop();
249
                                assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value == null ? value == expected : value.equals(expected));
250
                                System.out.print(value+" [ Ok! ]\t");
251

    
252

    
253
                        } catch (ParseException e) {
254
                                System.err.println(":\t [ Fail! ]");
255
                                fail("Failed parsing text '"+expr+"'\n"+e.getMessage());
256
                        }
257
                        System.out.println();
258
                }
259
        }
260
        
261
        
262
        private String[] UnaryBooleanExpressions = new String[] {
263
                        "!false",
264
                        "!true",
265
                        "![A_BOOLEAN_VALUE]",
266
                        "![ANOTHER_BOOLEAN_VALUE]",
267
        };
268
        private Object[] UnaryBooleanExpressionsValue = new Object[]  {
269
                         !false,
270
                         !true,
271
                         !((BooleanValue) symbols[4].getValue()).getValue(),
272
                         !((BooleanValue) symbols[5].getValue()).getValue(),
273
        };        
274
        public void testBooleanUnaryExpression() {
275
                String[] expressions = UnaryBooleanExpressions;
276
                Object[] expectedValues = UnaryBooleanExpressionsValue;
277
                System.out.println("\nTestLabelExpressionParser.testBooleanUnaryExpression()");
278
                
279
                for (int i = 0; i < expressions.length; i++) {
280
                        String expr = expressions[i];
281
                        parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
282
                        for (int j = 0; j < symbols.length; j++) {
283
                                parser.putSymbol(symbols[j]);
284
                        }
285
                        System.out.print("Parsing '"+expr+"'");
286
                        try {
287
                                parser.BooleanUnaryExpression();
288
                                System.out.print(": [ parsed ]. Evaluating: ");
289
                                Object expected = expectedValues[i];
290

    
291
                                Object value = parser.pop();
292
                                assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected));
293
                                System.out.print(value+" [ Ok! ]\t");
294

    
295

    
296
                        } catch (ParseException e) {
297
                                System.err.println(":\t [ Fail! ]");
298
                                fail("Failed parsing text '"+expr+"'\n"+e.getMessage());
299
                        }
300
                        System.out.println();
301
                }
302
        }
303

    
304
        private String[] UnaryArithmeticExpressions = new String[] {
305
                        "+65",
306
                        "-5.5",
307
                        "+-+-[A_DOUBLE_VALUE]",
308
                        "--+[ANOTHER_DOUBLE_VALUE]",
309
        };
310
        private Object[] UnaryArithmeticExpressionsValue = new Object[]  {
311
                        65,
312
                        -5.5,
313
                        ((DoubleValue) symbols[0].getValue()).getValue(),
314
                        ((DoubleValue) symbols[1].getValue()).getValue(),
315
        };        
316
        public void testArithmeticUnaryExpression() {
317
                String[] expressions = UnaryArithmeticExpressions;
318
                Object[] expectedValues = UnaryArithmeticExpressionsValue;
319
                System.out.println("\nTestLabelExpressionParser.testArithmeticUnaryExpression()");
320
                
321
                for (int i = 0; i < expressions.length; i++) {
322
                        String expr = expressions[i];
323
                        parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
324
                        for (int j = 0; j < symbols.length; j++) {
325
                                parser.putSymbol(symbols[j]);
326
                        }
327
                        System.out.print("Parsing '"+expr+"'");
328
                        try {
329
                                parser.ArithmeticUnaryExpression();
330
                                System.out.print(": [ parsed ]. Evaluating: ");
331
                                Object expected = expectedValues[i];
332

    
333
                                Object value = parser.pop();
334
                                assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected));
335
                                System.out.print(value+" [ Ok! ]\t");
336

    
337

    
338
                        } catch (ParseException e) {
339
                                System.err.println(":\t [ Fail! ]");
340
                                fail("Failed parsing text '"+expr+"'\n"+e.getMessage());
341
                        }
342
                        System.out.println();
343
                }
344
        }
345

    
346
        
347
        private String[] MultiplicativeArithmeticExpressions = new String[] {
348
                        "3*4356.234",
349
                        "8768758/2432432",
350
                        "[A_DOUBLE_VALUE]*[ANOTHER_DOUBLE_VALUE]",
351
                        "[A_DOUBLE_VALUE]/[ANOTHER_DOUBLE_VALUE]",
352
        };
353
        private Object[] MultiplicativeArithmeticExpressionsValue = new Object[]  {
354
                        3*4356.234,
355
                        8768758/2432432,
356
                        ((DoubleValue) symbols[0].getValue()).getValue()*((DoubleValue) symbols[1].getValue()).getValue(),
357
                        ((DoubleValue) symbols[0].getValue()).getValue()/((DoubleValue) symbols[1].getValue()).getValue(),
358
        };        
359
        public void testMultiplicativeExpression() {
360
                String[] expressions = MultiplicativeArithmeticExpressions;
361
                Object[] expectedValues = MultiplicativeArithmeticExpressionsValue;
362
                System.out.println("\nTestLabelExpressionParser.testMultiplicativeExpression()");
363
                
364
                for (int i = 0; i < expressions.length; i++) {
365
                        String expr = expressions[i];
366
                        parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
367
                        for (int j = 0; j < symbols.length; j++) {
368
                                parser.putSymbol(symbols[j]);
369
                        }
370
                        System.out.print("Parsing '"+expr+"'");
371
                        try {
372
                                parser.MultiplicativeExpression();
373
                                System.out.print(": [ parsed ]. Evaluating: ");
374
                                Object expected = expectedValues[i];
375

    
376
                                Object value = parser.pop();
377
                                assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected));
378
                                System.out.print(value+" [ Ok! ]\t");
379

    
380

    
381
                        } catch (ParseException e) {
382
                                System.err.println(":\t [ Fail! ]");
383
                                fail("Failed parsing text '"+expr+"'\n"+e.getMessage());
384
                        }
385
                        System.out.println();
386
                }
387
        }
388
        
389
        private String[] AdditiveArithmeticExpressions = new String[] {
390
                        "3-4356.234",
391
                        "8768758+2432432",
392
                        "[A_DOUBLE_VALUE]+[ANOTHER_DOUBLE_VALUE]",
393
                        "[A_DOUBLE_VALUE]-[ANOTHER_DOUBLE_VALUE]",
394
        };
395
        private Object[] AdditiveArithmeticExpressionsValue = new Object[]  {
396
                        3-4356.234,
397
                        8768758+2432432,
398
                        ((DoubleValue) symbols[0].getValue()).getValue()+((DoubleValue) symbols[1].getValue()).getValue(),
399
                        ((DoubleValue) symbols[0].getValue()).getValue()-((DoubleValue) symbols[1].getValue()).getValue(),
400
        };
401
        public void testAdditiveExpression() {
402
                String[] expressions = AdditiveArithmeticExpressions;
403
                Object[] expectedValues = AdditiveArithmeticExpressionsValue;
404
                System.out.println("\nTestLabelExpressionParser.testAdditiveExpression()");
405
                
406
                for (int i = 0; i < expressions.length; i++) {
407
                        String expr = expressions[i];
408
                        parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
409
                        for (int j = 0; j < symbols.length; j++) {
410
                                parser.putSymbol(symbols[j]);
411
                        }
412
                        System.out.print("Parsing '"+expr+"'");
413
                        try {
414
                                parser.AdditiveExpression();
415
                                System.out.print(": [ parsed ]. Evaluating: ");
416
                                Object expected = expectedValues[i];
417

    
418
                                Object value = parser.pop();
419
                                assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected));
420
                                System.out.print(value+" [ Ok! ]\t");
421

    
422

    
423
                        } catch (ParseException e) {
424
                                System.err.println(":\t [ Fail! ]");
425
                                fail("Failed parsing text '"+expr+"'\n"+e.getMessage());
426
                        }
427
                        System.out.println();
428
                }
429
        }
430

    
431
        public void testComparisonExpression() {
432
                
433
        }
434

    
435
        public void testEqComparisonExpression() {
436
                
437
        }
438
        
439
        public void testAndComparisonExpression() {
440
                
441
        }
442
        
443
        public void testFieldExpression() {
444
                
445
        }
446
        
447
        public void testLabelExpression() {
448
                
449
        }
450
}