root / trunk / extensions / extSymbology / src-test / org / gvsig / symbology / fmap / labeling / parse / TestLabelExpressionParser.java @ 22511
History | View | Annotate | Download (21.3 KB)
1 | 22218 | jdominguez | /* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
---|---|---|---|
2 | *
|
||
3 | * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
|
||
4 | *
|
||
5 | * This program is free software; you can redistribute it and/or
|
||
6 | * modify it under the terms of the GNU General Public License
|
||
7 | * as published by the Free Software Foundation; either version 2
|
||
8 | * of the License, or (at your option) any later version.
|
||
9 | *
|
||
10 | * This program is distributed in the hope that it will be useful,
|
||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
13 | * GNU General Public License for more details.
|
||
14 | *
|
||
15 | * You should have received a copy of the GNU General Public License
|
||
16 | * along with this program; if not, write to the Free Software
|
||
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
18 | *
|
||
19 | * For more information, contact:
|
||
20 | *
|
||
21 | * Generalitat Valenciana
|
||
22 | * Conselleria d'Infraestructures i Transport
|
||
23 | * Av. Blasco Ib??ez, 50
|
||
24 | * 46010 VALENCIA
|
||
25 | * SPAIN
|
||
26 | *
|
||
27 | * +34 963862235
|
||
28 | * gvsig@gva.es
|
||
29 | * www.gvsig.gva.es
|
||
30 | *
|
||
31 | * or
|
||
32 | *
|
||
33 | * IVER T.I. S.A
|
||
34 | * Salamanca 50
|
||
35 | * 46005 Valencia
|
||
36 | * Spain
|
||
37 | *
|
||
38 | * +34 963163400
|
||
39 | * dac@iver.es
|
||
40 | */
|
||
41 | 20768 | jdominguez | package org.gvsig.symbology.fmap.labeling.parse; |
42 | |||
43 | import java.io.CharArrayReader; |
||
44 | |||
45 | import junit.framework.TestCase; |
||
46 | |||
47 | 22218 | jdominguez | import org.gvsig.symbology.fmap.labeling.lang.functions.SubstringFunction; |
48 | import org.gvsig.symbology.fmap.rendering.filter.operations.Expression; |
||
49 | import org.gvsig.symbology.fmap.rendering.filter.operations.ExpressionException; |
||
50 | import org.gvsig.symbology.fmap.rendering.filter.operations.OperatorsFactory; |
||
51 | 20768 | jdominguez | |
52 | import com.hardcode.gdbms.engine.values.BooleanValue; |
||
53 | import com.hardcode.gdbms.engine.values.DoubleValue; |
||
54 | import com.hardcode.gdbms.engine.values.IntValue; |
||
55 | import com.hardcode.gdbms.engine.values.NullValue; |
||
56 | import com.hardcode.gdbms.engine.values.StringValue; |
||
57 | 22218 | jdominguez | import com.hardcode.gdbms.engine.values.Value; |
58 | 20768 | jdominguez | import com.hardcode.gdbms.engine.values.ValueFactory; |
59 | |||
60 | public class TestLabelExpressionParser extends TestCase { |
||
61 | LabelExpressionParser parser; |
||
62 | 22511 | jdominguez | |
63 | 20768 | jdominguez | protected void setUp() throws Exception { |
64 | super.setUp();
|
||
65 | } |
||
66 | 22218 | jdominguez | |
67 | private class Symbol { |
||
68 | private String id; |
||
69 | private Value val;
|
||
70 | |||
71 | public Symbol(String id, Value val) { |
||
72 | this.id = id;
|
||
73 | this.val = val;
|
||
74 | } |
||
75 | } |
||
76 | 20768 | jdominguez | private Symbol[] symbols = new Symbol[] { |
77 | 22495 | jdominguez | // 0
|
78 | 20768 | jdominguez | new Symbol(
|
79 | "A_DOUBLE_VALUE",
|
||
80 | ValueFactory.createValue(4.0)
|
||
81 | ), |
||
82 | 22495 | jdominguez | // 1
|
83 | 20768 | jdominguez | new Symbol(
|
84 | "ANOTHER_DOUBLE_VALUE",
|
||
85 | ValueFactory.createValue(Math.PI)
|
||
86 | ), |
||
87 | 22495 | jdominguez | // 2
|
88 | 20768 | jdominguez | new Symbol(
|
89 | "A_INTEGER_VALUE",
|
||
90 | ValueFactory.createValue(12)
|
||
91 | ), |
||
92 | 22495 | jdominguez | // 3
|
93 | 20768 | jdominguez | new Symbol(
|
94 | "A_STRING_VALUE",
|
||
95 | ValueFactory.createValue("this is a String")
|
||
96 | ), |
||
97 | 22495 | jdominguez | // 4
|
98 | 20768 | jdominguez | new Symbol(
|
99 | "A_BOOLEAN_VALUE",
|
||
100 | ValueFactory.createValue(true)
|
||
101 | ), |
||
102 | 22495 | jdominguez | // 5
|
103 | 20768 | jdominguez | new Symbol(
|
104 | "ANOTHER_BOOLEAN_VALUE",
|
||
105 | ValueFactory.createValue(false)
|
||
106 | ), |
||
107 | 22495 | jdominguez | // 6
|
108 | 20768 | jdominguez | new Symbol(
|
109 | "A_NULL_VALUE",
|
||
110 | ValueFactory.createNullValue() |
||
111 | ), |
||
112 | 22495 | jdominguez | // 7
|
113 | new Symbol(
|
||
114 | "XX",
|
||
115 | ValueFactory.createValue(2)),
|
||
116 | // 8
|
||
117 | new Symbol(
|
||
118 | "Y",
|
||
119 | ValueFactory.createValue(2.0)),
|
||
120 | 20768 | jdominguez | }; |
121 | 22218 | jdominguez | |
122 | 20768 | jdominguez | private String[] ArgumentsExpressions = new String[] { |
123 | "(754)",
|
||
124 | "(754, \"blah\")",
|
||
125 | "(-9.68, [A_DOUBLE_VALUE]) ",
|
||
126 | "(false, true) ",
|
||
127 | }; |
||
128 | private Object[][] ArgumentsExpressionsValue = new Object[][] { |
||
129 | new Object[] { 754 }, |
||
130 | new Object[] { 754, "blah" }, |
||
131 | new Object[] { -9.68, 4.0 }, |
||
132 | new Object[] { false, true }, |
||
133 | }; |
||
134 | 22218 | jdominguez | |
135 | public void testArguments() throws ExpressionException { |
||
136 | |||
137 | 20768 | jdominguez | String[] expressions = ArgumentsExpressions; |
138 | Object[][] expectedValues = ArgumentsExpressionsValue; |
||
139 | System.out.println("\nTestLabelExpressionParser.testArgumens()"); |
||
140 | 22218 | jdominguez | |
141 | 20768 | jdominguez | for (int i = 0; i < expressions.length; i++) { |
142 | String expr = expressions[i];
|
||
143 | parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
||
144 | 22218 | jdominguez | |
145 | 20768 | jdominguez | for (int j = 0; j < symbols.length; j++) { |
146 | 22218 | jdominguez | parser.putSymbol(symbols[j].id,symbols[j].val); |
147 | 20768 | jdominguez | } |
148 | System.out.print("Parsing '"+expr+"'"); |
||
149 | try {
|
||
150 | 22279 | jvidal | |
151 | 20768 | jdominguez | int amount = parser.Arguments();
|
152 | 22279 | jvidal | |
153 | 20768 | jdominguez | System.out.print(": [ parsed ]. Evaluating: "); |
154 | Object[] expected = expectedValues[i]; |
||
155 | assertTrue("Failed detecting argument number. Expected "+expected.length+", but got "+amount+".", amount == expected.length); |
||
156 | 22218 | jdominguez | |
157 | 20768 | jdominguez | for (int j = expected.length-1; j >= 0; j--) { // <- Last in first out |
158 | Object value = parser.pop();
|
||
159 | assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected[j]+"]", value.equals(expected[j])); |
||
160 | System.out.print(value+" [ Ok! ]\t"); |
||
161 | } |
||
162 | |||
163 | 22218 | jdominguez | |
164 | 20768 | jdominguez | } catch (ParseException e) { |
165 | System.err.println(":\t [ Fail! ]"); |
||
166 | fail("Failed parsing text '"+expr+"'\n"+e.getMessage()); |
||
167 | } |
||
168 | System.out.println();
|
||
169 | } |
||
170 | } |
||
171 | 22279 | jvidal | |
172 | 20768 | jdominguez | private String[] LiteralExpressions = new String[] { |
173 | "true",
|
||
174 | "false",
|
||
175 | " 43564356435.234",
|
||
176 | " 12455 ",
|
||
177 | " \"a string\"",
|
||
178 | }; |
||
179 | private Object[] LiteralExpressionsValue = new Object[] { |
||
180 | 22279 | jvidal | true ,
|
181 | false,
|
||
182 | 43564356435.234,
|
||
183 | 12455,
|
||
184 | "a string"
|
||
185 | 20768 | jdominguez | }; |
186 | 22279 | jvidal | |
187 | 22218 | jdominguez | public void testLiteral() throws ExpressionException { |
188 | 20768 | jdominguez | String[] expressions = LiteralExpressions; |
189 | Object[] expectedValues = LiteralExpressionsValue; |
||
190 | System.out.println("\nTestLabelExpressionParser.testLiteral()"); |
||
191 | 22279 | jvidal | |
192 | 20768 | jdominguez | for (int i = 0; i < expressions.length; i++) { |
193 | String expr = expressions[i];
|
||
194 | 22218 | jdominguez | parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
195 | 20768 | jdominguez | for (int j = 0; j < symbols.length; j++) { |
196 | 22218 | jdominguez | parser.putSymbol(symbols[j].id,symbols[j].val); |
197 | 20768 | jdominguez | } |
198 | System.out.print("Parsing '"+expr+"'"); |
||
199 | try {
|
||
200 | 22218 | jdominguez | parser.UnaryElement(); |
201 | 20768 | jdominguez | System.out.print(": [ parsed ]. Evaluating: "); |
202 | Object expected = expectedValues[i];
|
||
203 | |||
204 | Object value = parser.pop();
|
||
205 | assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected)); |
||
206 | System.out.print(value+" [ Ok! ]\t"); |
||
207 | |||
208 | |||
209 | } catch (ParseException e) { |
||
210 | System.err.println(":\t [ Fail! ]"); |
||
211 | fail("Failed parsing text '"+expr+"'\n"+e.getMessage()); |
||
212 | } |
||
213 | System.out.println();
|
||
214 | } |
||
215 | } |
||
216 | 22279 | jvidal | |
217 | 20768 | jdominguez | private String[] FunctionExpressions = new String[] { |
218 | 22218 | jdominguez | new SubstringFunction().getName()+"(\"My taylor is rich!\", 1)", |
219 | new SubstringFunction().getName()+"(\"My taylor is rich!\", 3, 9)", |
||
220 | new SubstringFunction().getName()+"("+new SubstringFunction().getName()+"(\"My taylor is rich!\", 3, 9), 2,3)", |
||
221 | 20768 | jdominguez | }; |
222 | private Object[] FunctionExpressionsValue = new Object[] { |
||
223 | 22218 | jdominguez | "y taylor is rich!" ,
|
224 | 22279 | jvidal | "taylor" ,
|
225 | "y",
|
||
226 | 20768 | jdominguez | }; |
227 | 22218 | jdominguez | public void testFunction() throws ExpressionException { |
228 | OperatorsFactory operators = OperatorsFactory.getInstance(); |
||
229 | 22279 | jvidal | operators.addOperator(SubstringFunction.class); |
230 | |||
231 | 20768 | jdominguez | String[] expressions = FunctionExpressions; |
232 | Object[] expectedValues = FunctionExpressionsValue; |
||
233 | System.out.println("\nTestLabelExpressionParser.testFunction()"); |
||
234 | 22279 | jvidal | |
235 | |||
236 | 20768 | jdominguez | for (int i = 0; i < expressions.length; i++) { |
237 | String expr = expressions[i];
|
||
238 | 22218 | jdominguez | parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
239 | 22279 | jvidal | parser.setOperatorsFactory(operators); |
240 | |||
241 | 20768 | jdominguez | for (int j = 0; j < symbols.length; j++) { |
242 | 22218 | jdominguez | parser.putSymbol(symbols[j].id,symbols[j].val); |
243 | 20768 | jdominguez | } |
244 | System.out.print("Parsing '"+expr+"'"); |
||
245 | try {
|
||
246 | 22218 | jdominguez | parser.function(); |
247 | 20768 | jdominguez | System.out.print(": [ parsed ]. Evaluating: "); |
248 | Object expected = expectedValues[i];
|
||
249 | |||
250 | Object value = parser.pop();
|
||
251 | assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected)); |
||
252 | System.out.print(value+" [ Ok! ]\t"); |
||
253 | |||
254 | |||
255 | } catch (ParseException e) { |
||
256 | System.err.println(":\t [ Fail! ]"); |
||
257 | fail("Failed parsing text '"+expr+"'\n"+e.getMessage()); |
||
258 | } |
||
259 | System.out.println();
|
||
260 | } |
||
261 | } |
||
262 | |||
263 | 22218 | jdominguez | public void testPrimitiveExpression() throws ExpressionException { |
264 | 20768 | jdominguez | String[] PrimitiveExpressions = new String[symbols.length]; |
265 | Object[] PrimitiveExpressionsValue = new Object[symbols.length]; |
||
266 | for (int i = 0; i < symbols.length; i++) { |
||
267 | 22218 | jdominguez | PrimitiveExpressions[i] = "["+symbols[i].id+"]"; |
268 | PrimitiveExpressionsValue[i] = symbols[i].val; |
||
269 | 20768 | jdominguez | } |
270 | 22279 | jvidal | |
271 | 20768 | jdominguez | String[] expressions = PrimitiveExpressions; |
272 | Object[] expectedValues = PrimitiveExpressionsValue; |
||
273 | 22279 | jvidal | |
274 | 20768 | jdominguez | System.out.println("\nTestLabelExpressionParser.testPrimitiveExpression()"); |
275 | 22279 | jvidal | |
276 | 20768 | jdominguez | for (int i = 0; i < expressions.length; i++) { |
277 | String expr = expressions[i];
|
||
278 | parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
||
279 | for (int j = 0; j < symbols.length; j++) { |
||
280 | 22218 | jdominguez | parser.putSymbol(symbols[j].id,symbols[j].val); |
281 | 20768 | jdominguez | } |
282 | System.out.print("Parsing '"+expr+"'"); |
||
283 | try {
|
||
284 | 22218 | jdominguez | parser.Element(); |
285 | 20768 | jdominguez | System.out.print(": [ parsed ]. Evaluating: "); |
286 | Object expected = expectedValues[i];
|
||
287 | 22279 | jvidal | |
288 | 20768 | jdominguez | // GDBMS values are evaluated as java primitives
|
289 | if (expected instanceof DoubleValue) { |
||
290 | expected = ((DoubleValue) expected).getValue(); |
||
291 | } else if (expected instanceof IntValue) { |
||
292 | expected = ((IntValue) expected).getValue(); |
||
293 | } else if (expected instanceof StringValue) { |
||
294 | expected = ((StringValue) expected).getValue(); |
||
295 | 22218 | jdominguez | } |
296 | 22279 | jvidal | |
297 | 22218 | jdominguez | // else if (expected instanceof DateValue) {
|
298 | 22279 | jvidal | // expected = ((DateValue) expected).getValue();
|
299 | 22218 | jdominguez | // }
|
300 | 22279 | jvidal | |
301 | 22218 | jdominguez | else if (expected instanceof BooleanValue) { |
302 | 20768 | jdominguez | expected = ((BooleanValue) expected).getValue(); |
303 | } else if (expected instanceof NullValue) { |
||
304 | expected = null;
|
||
305 | } |
||
306 | |||
307 | 22279 | jvidal | |
308 | 20768 | jdominguez | Object value = parser.pop();
|
309 | assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value == null ? value == expected : value.equals(expected)); |
||
310 | System.out.print(value+" [ Ok! ]\t"); |
||
311 | |||
312 | |||
313 | } catch (ParseException e) { |
||
314 | System.err.println(":\t [ Fail! ]"); |
||
315 | fail("Failed parsing text '"+expr+"'\n"+e.getMessage()); |
||
316 | } |
||
317 | System.out.println();
|
||
318 | } |
||
319 | } |
||
320 | 22495 | jdominguez | |
321 | |||
322 | 20768 | jdominguez | private String[] UnaryBooleanExpressions = new String[] { |
323 | "!false",
|
||
324 | "!true",
|
||
325 | "![A_BOOLEAN_VALUE]",
|
||
326 | "![ANOTHER_BOOLEAN_VALUE]",
|
||
327 | }; |
||
328 | private Object[] UnaryBooleanExpressionsValue = new Object[] { |
||
329 | 22279 | jvidal | !false,
|
330 | !true,
|
||
331 | !((BooleanValue) symbols[4].val).getValue(),
|
||
332 | !((BooleanValue) symbols[5].val).getValue(),
|
||
333 | 20768 | jdominguez | }; |
334 | 22218 | jdominguez | public void testBooleanUnaryExpression() throws ExpressionException { |
335 | 20768 | jdominguez | String[] expressions = UnaryBooleanExpressions; |
336 | Object[] expectedValues = UnaryBooleanExpressionsValue; |
||
337 | System.out.println("\nTestLabelExpressionParser.testBooleanUnaryExpression()"); |
||
338 | 22279 | jvidal | |
339 | 20768 | jdominguez | for (int i = 0; i < expressions.length; i++) { |
340 | String expr = expressions[i];
|
||
341 | parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
||
342 | for (int j = 0; j < symbols.length; j++) { |
||
343 | 22218 | jdominguez | parser.putSymbol(symbols[j].id,symbols[j].val); |
344 | 20768 | jdominguez | } |
345 | System.out.print("Parsing '"+expr+"'"); |
||
346 | try {
|
||
347 | 22218 | jdominguez | parser.UnaryElement(); |
348 | 20768 | jdominguez | System.out.print(": [ parsed ]. Evaluating: "); |
349 | Object expected = expectedValues[i];
|
||
350 | |||
351 | Object value = parser.pop();
|
||
352 | assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected)); |
||
353 | System.out.print(value+" [ Ok! ]\t"); |
||
354 | |||
355 | |||
356 | } catch (ParseException e) { |
||
357 | System.err.println(":\t [ Fail! ]"); |
||
358 | fail("Failed parsing text '"+expr+"'\n"+e.getMessage()); |
||
359 | } |
||
360 | System.out.println();
|
||
361 | } |
||
362 | } |
||
363 | 22279 | jvidal | |
364 | |||
365 | 20768 | jdominguez | private String[] UnaryArithmeticExpressions = new String[] { |
366 | "+65",
|
||
367 | "-5.5",
|
||
368 | "+-+-[A_DOUBLE_VALUE]",
|
||
369 | "--+[ANOTHER_DOUBLE_VALUE]",
|
||
370 | }; |
||
371 | private Object[] UnaryArithmeticExpressionsValue = new Object[] { |
||
372 | 65,
|
||
373 | -5.5,
|
||
374 | 22218 | jdominguez | ((DoubleValue) symbols[0].val).getValue(),
|
375 | ((DoubleValue) symbols[1].val).getValue(),
|
||
376 | 20768 | jdominguez | }; |
377 | 22218 | jdominguez | public void testArithmeticUnaryExpression() throws ExpressionException { |
378 | 20768 | jdominguez | String[] expressions = UnaryArithmeticExpressions; |
379 | Object[] expectedValues = UnaryArithmeticExpressionsValue; |
||
380 | System.out.println("\nTestLabelExpressionParser.testArithmeticUnaryExpression()"); |
||
381 | 22279 | jvidal | |
382 | 20768 | jdominguez | for (int i = 0; i < expressions.length; i++) { |
383 | String expr = expressions[i];
|
||
384 | parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
||
385 | for (int j = 0; j < symbols.length; j++) { |
||
386 | 22218 | jdominguez | parser.putSymbol(symbols[j].id,symbols[j].val); |
387 | 20768 | jdominguez | } |
388 | System.out.print("Parsing '"+expr+"'"); |
||
389 | try {
|
||
390 | 22218 | jdominguez | parser.MultiplicativeExpression(); |
391 | 20768 | jdominguez | System.out.print(": [ parsed ]. Evaluating: "); |
392 | Object expected = expectedValues[i];
|
||
393 | |||
394 | Object value = parser.pop();
|
||
395 | assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected)); |
||
396 | System.out.print(value+" [ Ok! ]\t"); |
||
397 | |||
398 | |||
399 | } catch (ParseException e) { |
||
400 | System.err.println(":\t [ Fail! ]"); |
||
401 | fail("Failed parsing text '"+expr+"'\n"+e.getMessage()); |
||
402 | } |
||
403 | System.out.println();
|
||
404 | } |
||
405 | } |
||
406 | 22279 | jvidal | |
407 | 20768 | jdominguez | private String[] MultiplicativeArithmeticExpressions = new String[] { |
408 | "3*4356.234",
|
||
409 | 22218 | jdominguez | "15*10",
|
410 | "15/10",
|
||
411 | 20768 | jdominguez | "8768758/2432432",
|
412 | "[A_DOUBLE_VALUE]*[ANOTHER_DOUBLE_VALUE]",
|
||
413 | "[A_DOUBLE_VALUE]/[ANOTHER_DOUBLE_VALUE]",
|
||
414 | 22495 | jdominguez | "[A_DOUBLE_VALUE]*16",
|
415 | 20768 | jdominguez | }; |
416 | private Object[] MultiplicativeArithmeticExpressionsValue = new Object[] { |
||
417 | 3*4356.234, |
||
418 | 22218 | jdominguez | 15*10, |
419 | 15/10, |
||
420 | 20768 | jdominguez | 8768758/2432432, |
421 | 22218 | jdominguez | ((DoubleValue) symbols[0].val).getValue()*((DoubleValue) symbols[1].val).getValue(), |
422 | ((DoubleValue) symbols[0].val).getValue()/((DoubleValue) symbols[1].val).getValue(), |
||
423 | 22495 | jdominguez | ((DoubleValue) symbols[0].val).getValue() * 16, |
424 | 20768 | jdominguez | }; |
425 | 22218 | jdominguez | public void testMultiplicativeExpression() throws ExpressionException { |
426 | 20768 | jdominguez | String[] expressions = MultiplicativeArithmeticExpressions; |
427 | Object[] expectedValues = MultiplicativeArithmeticExpressionsValue; |
||
428 | System.out.println("\nTestLabelExpressionParser.testMultiplicativeExpression()"); |
||
429 | 22279 | jvidal | |
430 | 20768 | jdominguez | for (int i = 0; i < expressions.length; i++) { |
431 | String expr = expressions[i];
|
||
432 | parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
||
433 | for (int j = 0; j < symbols.length; j++) { |
||
434 | 22218 | jdominguez | parser.putSymbol(symbols[j].id,symbols[j].val); |
435 | 20768 | jdominguez | } |
436 | System.out.print("Parsing '"+expr+"'"); |
||
437 | try {
|
||
438 | parser.MultiplicativeExpression(); |
||
439 | System.out.print(": [ parsed ]. Evaluating: "); |
||
440 | Object expected = expectedValues[i];
|
||
441 | |||
442 | Object value = parser.pop();
|
||
443 | assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected)); |
||
444 | System.out.print(value+" [ Ok! ]\t"); |
||
445 | |||
446 | |||
447 | } catch (ParseException e) { |
||
448 | System.err.println(":\t [ Fail! ]"); |
||
449 | fail("Failed parsing text '"+expr+"'\n"+e.getMessage()); |
||
450 | } |
||
451 | System.out.println();
|
||
452 | } |
||
453 | } |
||
454 | 22279 | jvidal | |
455 | 20768 | jdominguez | private String[] AdditiveArithmeticExpressions = new String[] { |
456 | "3-4356.234",
|
||
457 | "8768758+2432432",
|
||
458 | "[A_DOUBLE_VALUE]+[ANOTHER_DOUBLE_VALUE]",
|
||
459 | "[A_DOUBLE_VALUE]-[ANOTHER_DOUBLE_VALUE]",
|
||
460 | }; |
||
461 | private Object[] AdditiveArithmeticExpressionsValue = new Object[] { |
||
462 | 3-4356.234, |
||
463 | 8768758+2432432, |
||
464 | 22218 | jdominguez | ((DoubleValue) symbols[0].val).getValue()+((DoubleValue) symbols[1].val).getValue(), |
465 | ((DoubleValue) symbols[0].val).getValue()-((DoubleValue) symbols[1].val).getValue(), |
||
466 | 20768 | jdominguez | }; |
467 | 22218 | jdominguez | public void testAdditiveExpression() throws ExpressionException { |
468 | 20768 | jdominguez | String[] expressions = AdditiveArithmeticExpressions; |
469 | Object[] expectedValues = AdditiveArithmeticExpressionsValue; |
||
470 | System.out.println("\nTestLabelExpressionParser.testAdditiveExpression()"); |
||
471 | 22279 | jvidal | |
472 | 20768 | jdominguez | for (int i = 0; i < expressions.length; i++) { |
473 | String expr = expressions[i];
|
||
474 | parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
||
475 | for (int j = 0; j < symbols.length; j++) { |
||
476 | 22218 | jdominguez | parser.putSymbol(symbols[j].id,symbols[j].val); |
477 | 20768 | jdominguez | } |
478 | System.out.print("Parsing '"+expr+"'"); |
||
479 | try {
|
||
480 | parser.AdditiveExpression(); |
||
481 | System.out.print(": [ parsed ]. Evaluating: "); |
||
482 | Object expected = expectedValues[i];
|
||
483 | |||
484 | Object value = parser.pop();
|
||
485 | assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected)); |
||
486 | System.out.print(value+" [ Ok! ]\t"); |
||
487 | |||
488 | |||
489 | } catch (ParseException e) { |
||
490 | System.err.println(":\t [ Fail! ]"); |
||
491 | fail("Failed parsing text '"+expr+"'\n"+e.getMessage()); |
||
492 | } |
||
493 | System.out.println();
|
||
494 | } |
||
495 | } |
||
496 | |||
497 | 22279 | jvidal | |
498 | 22218 | jdominguez | |
499 | 22279 | jvidal | private String EOField = LabelExpressionParser.tokenFor(LabelExpressionParser.EOFIELD); |
500 | private String EOExpression = LabelExpressionParser.tokenFor(LabelExpressionParser.EOEXPR); |
||
501 | private String DOUBLEQUOTE = "\""; |
||
502 | |||
503 | 22421 | jdominguez | private String[] FieldExpressionStrings = new String[] { |
504 | 22279 | jvidal | "km" +"25", |
505 | DOUBLEQUOTE+"km"+DOUBLEQUOTE+" "+DOUBLEQUOTE+" 25"+DOUBLEQUOTE, |
||
506 | "[A_STRING_VALUE] "+DOUBLEQUOTE+" 25"+DOUBLEQUOTE, |
||
507 | "[A_INTEGER_VALUE] "+DOUBLEQUOTE+" 25"+DOUBLEQUOTE, |
||
508 | "[A_DOUBLE_VALUE] "+DOUBLEQUOTE+" 25"+DOUBLEQUOTE, |
||
509 | "2+3"+"km", |
||
510 | }; |
||
511 | 22421 | jdominguez | private Object[] FieldExpressionValue = new Object[] { |
512 | 22279 | jvidal | "km25",
|
513 | "km 25",
|
||
514 | ((StringValue) symbols[3].val).getValue()+" 25", |
||
515 | ((IntValue) symbols[2].val).getValue()+" 25", |
||
516 | ((DoubleValue) symbols[0].val).getValue()+" 25", |
||
517 | "5km"
|
||
518 | }; |
||
519 | |||
520 | 22421 | jdominguez | public void testFieldExpressionStrings() throws ExpressionException { |
521 | 22279 | jvidal | |
522 | 22421 | jdominguez | String[] expressions = FieldExpressionStrings; |
523 | Object[] expectedValues = FieldExpressionValue; |
||
524 | 22279 | jvidal | System.out.println("\nTestLabelExpressionParser.testConcatExpressions()"); |
525 | |||
526 | for (int i = 0; i < expressions.length; i++) { |
||
527 | String expr = expressions[i];
|
||
528 | parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
||
529 | |||
530 | for (int j = 0; j < symbols.length; j++) { |
||
531 | parser.putSymbol(symbols[j].id,symbols[j].val); |
||
532 | } |
||
533 | |||
534 | |||
535 | System.out.print("Parsing '"+expr+"'"); |
||
536 | try {
|
||
537 | |||
538 | parser.LabelExpression(); |
||
539 | |||
540 | System.out.print(": [ parsed ]. Evaluating: "); |
||
541 | Object[] expected = expectedValues; |
||
542 | String myValues = ((Expression)parser.getStack().pop()).evaluate(parser.getSymbols()).toString(); |
||
543 | |||
544 | |||
545 | Object value = myValues;
|
||
546 | assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected[i]+"]", value.equals(expected[i].toString())); |
||
547 | System.out.print(value+" [ Ok! ]\t"); |
||
548 | |||
549 | |||
550 | |||
551 | } catch (ParseException e) { |
||
552 | System.err.println(":\t [ Fail! ]"); |
||
553 | fail("Failed parsing text '"+expr+"'\n"+e.getMessage()); |
||
554 | } |
||
555 | System.out.println();
|
||
556 | } |
||
557 | } |
||
558 | |||
559 | |||
560 | private String[] LabelExpressions = new String[] { |
||
561 | "1+2"+EOField+"true"+EOField+"2<3", |
||
562 | "300+454"+EOField+"false", |
||
563 | "1+2"+EOField+"1+5"+EOField+"2<3", |
||
564 | "[A_DOUBLE_VALUE]/[ANOTHER_DOUBLE_VALUE]"+EOField+"Km", |
||
565 | "km" +"25"+EOField+"1+5", |
||
566 | DOUBLEQUOTE+"km"+DOUBLEQUOTE+" "+DOUBLEQUOTE+" 25"+DOUBLEQUOTE+EOField+"1+2"+EOField+"true"+EOField+"2<3", |
||
567 | 22218 | jdominguez | |
568 | }; |
||
569 | 22279 | jvidal | private Object[][] LabelExpressionsValue = new Object[][] { |
570 | new Object[] {3,true,true }, |
||
571 | 22218 | jdominguez | new Object[] { 754, false }, |
572 | 22279 | jvidal | new Object[] { 3,6,true }, |
573 | new Object[] {((DoubleValue) symbols[0].val).getValue()/((DoubleValue) symbols[1].val).getValue(),"Km"}, |
||
574 | new Object[] {"km25",6 }, |
||
575 | new Object[] {"km 25",3,true,true }, |
||
576 | |||
577 | 22218 | jdominguez | }; |
578 | |||
579 | 22279 | jvidal | public void testLabelExpressions() throws ExpressionException { |
580 | 22218 | jdominguez | |
581 | 22279 | jvidal | String[] expressions = LabelExpressions; |
582 | Object[][] expectedValues = LabelExpressionsValue; |
||
583 | System.out.println("\nTestLabelExpressionParser.testLabelExpressions()"); |
||
584 | |||
585 | 22218 | jdominguez | for (int i = 0; i < expressions.length; i++) { |
586 | String expr = expressions[i];
|
||
587 | parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
||
588 | |||
589 | for (int j = 0; j < symbols.length; j++) { |
||
590 | parser.putSymbol(symbols[j].id,symbols[j].val); |
||
591 | } |
||
592 | 22279 | jvidal | |
593 | |||
594 | 22218 | jdominguez | System.out.print("Parsing '"+expr+"'"); |
595 | try {
|
||
596 | 22279 | jvidal | |
597 | 22218 | jdominguez | parser.LabelExpression(); |
598 | 22279 | jvidal | |
599 | 22218 | jdominguez | System.out.print(": [ parsed ]. Evaluating: "); |
600 | Object[] expected = expectedValues[i]; |
||
601 | Object[] myValues = (Object[]) ((Expression)parser.getStack().pop()).evaluate(parser.getSymbols()); |
||
602 | 22279 | jvidal | |
603 | for (int j = 0; j < myValues.length; j++) { // <- Last in first out |
||
604 | Object value = myValues[j];
|
||
605 | 22218 | jdominguez | assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected[j]+"]", value.equals(expected[j].toString())); |
606 | System.out.print(value+" [ Ok! ]\t"); |
||
607 | } |
||
608 | |||
609 | |||
610 | } catch (ParseException e) { |
||
611 | System.err.println(":\t [ Fail! ]"); |
||
612 | fail("Failed parsing text '"+expr+"'\n"+e.getMessage()); |
||
613 | } |
||
614 | System.out.println();
|
||
615 | } |
||
616 | 20768 | jdominguez | } |
617 | |||
618 | 22279 | jvidal | |
619 | |||
620 | 22495 | jdominguez | private String[] SolvedBugsExpressions = new String[] { |
621 | 22510 | jdominguez | "([Y] + 3) * 5;",
|
622 | "([Y] + 3) * 5"+EOField+"([Y] + 3) * 5", |
||
623 | 22495 | jdominguez | }; |
624 | private Object[][] SolvedBugsExpressionsValue = new Object[][] { |
||
625 | 22510 | jdominguez | new Object[] { ((((DoubleValue) symbols[8].val ).getValue() + 3 ) *5) }, |
626 | new Object[] { |
||
627 | ""+((((DoubleValue) symbols[8].val ).getValue() + 3 ) *5), |
||
628 | ""+((((DoubleValue) symbols[8].val ).getValue() + 3 ) *5) }, |
||
629 | 22495 | jdominguez | }; |
630 | /**
|
||
631 | * Tests several buggy expressions detected by testers and users
|
||
632 | * @throws ExpressionException
|
||
633 | */
|
||
634 | public void testSolvedBugsExpressions() throws ExpressionException { |
||
635 | |||
636 | String[] expressions = SolvedBugsExpressions; |
||
637 | Object[][] expectedValues = SolvedBugsExpressionsValue; |
||
638 | System.out.println("\nTestLabelExpressionParser.testSolvedBugsExpressions()"); |
||
639 | |||
640 | for (int i = 0; i < expressions.length; i++) { |
||
641 | String expr = expressions[i];
|
||
642 | parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
||
643 | |||
644 | for (int j = 0; j < symbols.length; j++) { |
||
645 | parser.putSymbol(symbols[j].id,symbols[j].val); |
||
646 | } |
||
647 | |||
648 | |||
649 | System.out.print("Parsing '"+expr+"'"); |
||
650 | try {
|
||
651 | |||
652 | parser.LabelExpression(); |
||
653 | |||
654 | System.out.print(": [ parsed ]. Evaluating: "); |
||
655 | Object[] expected = expectedValues[i]; |
||
656 | 22510 | jdominguez | Object value = ((Expression)parser.getStack().pop()).evaluate(parser.getSymbols()); |
657 | if (value.getClass().isArray()) {
|
||
658 | Object[] myValues = (Object[]) value; |
||
659 | 22495 | jdominguez | |
660 | 22510 | jdominguez | for (int j = 0; j < myValues.length; j++) { // <- Last in first out |
661 | Object aValue = myValues[j];
|
||
662 | assertTrue("Parsed text '"+expr+"' evaluated to ("+aValue+") when expecting ["+expected[j]+"]", aValue.equals(expected[j].toString())); |
||
663 | System.out.print(aValue+" [ Ok! ]\t"); |
||
664 | } |
||
665 | } else {
|
||
666 | assertTrue("Parsed text '"+expr+"' evaluated to ("+value+") when expecting ["+expected+"]", value.equals(expected[0])); |
||
667 | 22495 | jdominguez | System.out.print(value+" [ Ok! ]\t"); |
668 | } |
||
669 | |||
670 | } catch (ParseException e) { |
||
671 | System.err.println(":\t [ Fail! ]"); |
||
672 | fail("Failed parsing text '"+expr+"'\n"+e.getMessage()); |
||
673 | } |
||
674 | System.out.println();
|
||
675 | } |
||
676 | } |
||
677 | |||
678 | 20768 | jdominguez | } |