Revision 22517 trunk/extensions/extSymbology/src-test/org/gvsig/symbology/fmap/labeling/parse/TestLabelExpressionParser.java
TestLabelExpressionParser.java | ||
---|---|---|
41 | 41 |
package org.gvsig.symbology.fmap.labeling.parse; |
42 | 42 |
|
43 | 43 |
import java.io.CharArrayReader; |
44 |
import java.io.StringReader; |
|
45 |
import java.util.Hashtable; |
|
44 | 46 |
|
45 | 47 |
import junit.framework.TestCase; |
46 | 48 |
|
49 |
|
|
47 | 50 |
import org.gvsig.symbology.fmap.labeling.lang.functions.SubstringFunction; |
48 | 51 |
import org.gvsig.symbology.fmap.rendering.filter.operations.Expression; |
49 | 52 |
import org.gvsig.symbology.fmap.rendering.filter.operations.ExpressionException; |
... | ... | |
59 | 62 |
|
60 | 63 |
public class TestLabelExpressionParser extends TestCase { |
61 | 64 |
LabelExpressionParser parser; |
62 |
|
|
65 |
Hashtable<String, Value> symbols_table = new Hashtable<String, Value>(); |
|
66 |
|
|
63 | 67 |
protected void setUp() throws Exception { |
64 | 68 |
super.setUp(); |
69 |
|
|
70 |
for (int j = 0; j < symbols.length; j++) { |
|
71 |
symbols_table.put(symbols[j].id,symbols[j].val); |
|
72 |
} |
|
65 | 73 |
} |
66 | 74 |
|
67 | 75 |
private class Symbol { |
... | ... | |
76 | 84 |
private Symbol[] symbols = new Symbol[] { |
77 | 85 |
// 0 |
78 | 86 |
new Symbol( |
79 |
"A_DOUBLE_VALUE",
|
|
87 |
"A_DOUBLE_VALUE", |
|
80 | 88 |
ValueFactory.createValue(4.0) |
81 | 89 |
), |
82 | 90 |
// 1 |
83 | 91 |
new Symbol( |
84 |
"ANOTHER_DOUBLE_VALUE",
|
|
92 |
"ANOTHER_DOUBLE_VALUE", |
|
85 | 93 |
ValueFactory.createValue(Math.PI) |
86 | 94 |
), |
87 | 95 |
// 2 |
88 | 96 |
new Symbol( |
89 |
"A_INTEGER_VALUE",
|
|
97 |
"A_INTEGER_VALUE", |
|
90 | 98 |
ValueFactory.createValue(12) |
91 | 99 |
), |
92 | 100 |
// 3 |
93 | 101 |
new Symbol( |
94 |
"A_STRING_VALUE",
|
|
102 |
"A_STRING_VALUE", |
|
95 | 103 |
ValueFactory.createValue("this is a String") |
96 | 104 |
), |
97 | 105 |
// 4 |
98 | 106 |
new Symbol( |
99 |
"A_BOOLEAN_VALUE",
|
|
107 |
"A_BOOLEAN_VALUE", |
|
100 | 108 |
ValueFactory.createValue(true) |
101 | 109 |
), |
102 | 110 |
// 5 |
103 | 111 |
new Symbol( |
104 |
"ANOTHER_BOOLEAN_VALUE",
|
|
112 |
"ANOTHER_BOOLEAN_VALUE", |
|
105 | 113 |
ValueFactory.createValue(false) |
106 | 114 |
), |
107 | 115 |
// 6 |
108 | 116 |
new Symbol( |
109 |
"A_NULL_VALUE",
|
|
117 |
"A_NULL_VALUE", |
|
110 | 118 |
ValueFactory.createNullValue() |
111 | 119 |
), |
120 |
|
|
112 | 121 |
// 7 |
113 | 122 |
new Symbol( |
114 | 123 |
"XX", |
... | ... | |
117 | 126 |
new Symbol( |
118 | 127 |
"Y", |
119 | 128 |
ValueFactory.createValue(2.0)), |
129 |
|
|
120 | 130 |
}; |
121 | 131 |
|
122 | 132 |
private String[] ArgumentsExpressions = new String[] { |
... | ... | |
130 | 140 |
new Object[] { 754, "blah" }, |
131 | 141 |
new Object[] { -9.68, 4.0 }, |
132 | 142 |
new Object[] { false, true }, |
133 |
};
|
|
143 |
}; |
|
134 | 144 |
|
135 | 145 |
public void testArguments() throws ExpressionException { |
136 | 146 |
|
... | ... | |
140 | 150 |
|
141 | 151 |
for (int i = 0; i < expressions.length; i++) { |
142 | 152 |
String expr = expressions[i]; |
143 |
parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
|
|
153 |
parser = new LabelExpressionParser(new StringReader(expr),symbols_table);
|
|
144 | 154 |
|
145 |
for (int j = 0; j < symbols.length; j++) { |
|
146 |
parser.putSymbol(symbols[j].id,symbols[j].val); |
|
147 |
} |
|
148 | 155 |
System.out.print("Parsing '"+expr+"'"); |
149 | 156 |
try { |
150 | 157 |
|
... | ... | |
182 | 189 |
43564356435.234, |
183 | 190 |
12455, |
184 | 191 |
"a string" |
185 |
};
|
|
192 |
}; |
|
186 | 193 |
|
187 | 194 |
public void testLiteral() throws ExpressionException { |
188 | 195 |
String[] expressions = LiteralExpressions; |
... | ... | |
191 | 198 |
|
192 | 199 |
for (int i = 0; i < expressions.length; i++) { |
193 | 200 |
String expr = expressions[i]; |
194 |
parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
|
195 |
for (int j = 0; j < symbols.length; j++) { |
|
196 |
parser.putSymbol(symbols[j].id,symbols[j].val); |
|
197 |
} |
|
201 |
parser = new LabelExpressionParser(new StringReader(expr),symbols_table); |
|
202 |
|
|
198 | 203 |
System.out.print("Parsing '"+expr+"'"); |
199 | 204 |
try { |
200 | 205 |
parser.UnaryElement(); |
... | ... | |
215 | 220 |
} |
216 | 221 |
|
217 | 222 |
private String[] FunctionExpressions = new String[] { |
218 |
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)",
|
|
223 |
new SubstringFunction(symbols_table).getName()+"(\"My taylor is rich!\", 1)",
|
|
224 |
new SubstringFunction(symbols_table).getName()+"(\"My taylor is rich!\", 3, 9)",
|
|
225 |
new SubstringFunction(symbols_table).getName()+"("+new SubstringFunction(symbols_table).getName()+"(\"My taylor is rich!\", 3, 9), 2,3)",
|
|
221 | 226 |
}; |
222 | 227 |
private Object[] FunctionExpressionsValue = new Object[] { |
223 | 228 |
"y taylor is rich!" , |
224 | 229 |
"taylor" , |
225 | 230 |
"y", |
226 |
};
|
|
231 |
}; |
|
227 | 232 |
public void testFunction() throws ExpressionException { |
228 | 233 |
OperatorsFactory operators = OperatorsFactory.getInstance(); |
229 | 234 |
operators.addOperator(SubstringFunction.class); |
... | ... | |
235 | 240 |
|
236 | 241 |
for (int i = 0; i < expressions.length; i++) { |
237 | 242 |
String expr = expressions[i]; |
238 |
parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
|
|
243 |
parser = new LabelExpressionParser(new StringReader(expr),symbols_table);
|
|
239 | 244 |
parser.setOperatorsFactory(operators); |
240 | 245 |
|
241 |
for (int j = 0; j < symbols.length; j++) { |
|
242 |
parser.putSymbol(symbols[j].id,symbols[j].val); |
|
243 |
} |
|
244 | 246 |
System.out.print("Parsing '"+expr+"'"); |
245 | 247 |
try { |
246 | 248 |
parser.function(); |
... | ... | |
275 | 277 |
|
276 | 278 |
for (int i = 0; i < expressions.length; i++) { |
277 | 279 |
String expr = expressions[i]; |
278 |
parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
|
279 |
for (int j = 0; j < symbols.length; j++) { |
|
280 |
parser.putSymbol(symbols[j].id,symbols[j].val); |
|
281 |
} |
|
280 |
parser = new LabelExpressionParser(new StringReader(expr),symbols_table); |
|
281 |
|
|
282 | 282 |
System.out.print("Parsing '"+expr+"'"); |
283 | 283 |
try { |
284 | 284 |
parser.Element(); |
... | ... | |
292 | 292 |
expected = ((IntValue) expected).getValue(); |
293 | 293 |
} else if (expected instanceof StringValue) { |
294 | 294 |
expected = ((StringValue) expected).getValue(); |
295 |
}
|
|
295 |
} |
|
296 | 296 |
|
297 | 297 |
// else if (expected instanceof DateValue) { |
298 | 298 |
// expected = ((DateValue) expected).getValue(); |
299 |
// }
|
|
299 |
// } |
|
300 | 300 |
|
301 | 301 |
else if (expected instanceof BooleanValue) { |
302 | 302 |
expected = ((BooleanValue) expected).getValue(); |
... | ... | |
317 | 317 |
System.out.println(); |
318 | 318 |
} |
319 | 319 |
} |
320 |
|
|
321 |
|
|
320 |
|
|
321 |
|
|
322 | 322 |
private String[] UnaryBooleanExpressions = new String[] { |
323 | 323 |
"!false", |
324 | 324 |
"!true", |
... | ... | |
330 | 330 |
!true, |
331 | 331 |
!((BooleanValue) symbols[4].val).getValue(), |
332 | 332 |
!((BooleanValue) symbols[5].val).getValue(), |
333 |
};
|
|
333 |
}; |
|
334 | 334 |
public void testBooleanUnaryExpression() throws ExpressionException { |
335 | 335 |
String[] expressions = UnaryBooleanExpressions; |
336 | 336 |
Object[] expectedValues = UnaryBooleanExpressionsValue; |
... | ... | |
338 | 338 |
|
339 | 339 |
for (int i = 0; i < expressions.length; i++) { |
340 | 340 |
String expr = expressions[i]; |
341 |
parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
|
342 |
for (int j = 0; j < symbols.length; j++) { |
|
343 |
parser.putSymbol(symbols[j].id,symbols[j].val); |
|
344 |
} |
|
341 |
parser = new LabelExpressionParser(new StringReader(expr),symbols_table); |
|
342 |
|
|
345 | 343 |
System.out.print("Parsing '"+expr+"'"); |
346 | 344 |
try { |
347 | 345 |
parser.UnaryElement(); |
... | ... | |
373 | 371 |
-5.5, |
374 | 372 |
((DoubleValue) symbols[0].val).getValue(), |
375 | 373 |
((DoubleValue) symbols[1].val).getValue(), |
376 |
};
|
|
374 |
}; |
|
377 | 375 |
public void testArithmeticUnaryExpression() throws ExpressionException { |
378 | 376 |
String[] expressions = UnaryArithmeticExpressions; |
379 | 377 |
Object[] expectedValues = UnaryArithmeticExpressionsValue; |
... | ... | |
381 | 379 |
|
382 | 380 |
for (int i = 0; i < expressions.length; i++) { |
383 | 381 |
String expr = expressions[i]; |
384 |
parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
|
385 |
for (int j = 0; j < symbols.length; j++) { |
|
386 |
parser.putSymbol(symbols[j].id,symbols[j].val); |
|
387 |
} |
|
382 |
parser = new LabelExpressionParser(new StringReader(expr),symbols_table); |
|
383 |
|
|
388 | 384 |
System.out.print("Parsing '"+expr+"'"); |
389 | 385 |
try { |
390 | 386 |
parser.MultiplicativeExpression(); |
... | ... | |
421 | 417 |
((DoubleValue) symbols[0].val).getValue()*((DoubleValue) symbols[1].val).getValue(), |
422 | 418 |
((DoubleValue) symbols[0].val).getValue()/((DoubleValue) symbols[1].val).getValue(), |
423 | 419 |
((DoubleValue) symbols[0].val).getValue() * 16, |
424 |
}; |
|
420 |
}; |
|
421 |
|
|
425 | 422 |
public void testMultiplicativeExpression() throws ExpressionException { |
426 | 423 |
String[] expressions = MultiplicativeArithmeticExpressions; |
427 | 424 |
Object[] expectedValues = MultiplicativeArithmeticExpressionsValue; |
... | ... | |
429 | 426 |
|
430 | 427 |
for (int i = 0; i < expressions.length; i++) { |
431 | 428 |
String expr = expressions[i]; |
432 |
parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
|
433 |
for (int j = 0; j < symbols.length; j++) { |
|
434 |
parser.putSymbol(symbols[j].id,symbols[j].val); |
|
435 |
} |
|
429 |
parser = new LabelExpressionParser(new StringReader(expr),symbols_table); |
|
430 |
|
|
436 | 431 |
System.out.print("Parsing '"+expr+"'"); |
437 | 432 |
try { |
438 | 433 |
parser.MultiplicativeExpression(); |
... | ... | |
471 | 466 |
|
472 | 467 |
for (int i = 0; i < expressions.length; i++) { |
473 | 468 |
String expr = expressions[i]; |
474 |
parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray())); |
|
475 |
for (int j = 0; j < symbols.length; j++) { |
|
476 |
parser.putSymbol(symbols[j].id,symbols[j].val); |
|
477 |
} |
|
469 |
parser = new LabelExpressionParser(new StringReader(expr),symbols_table); |
|
470 |
|
|
478 | 471 |
System.out.print("Parsing '"+expr+"'"); |
479 | 472 |
try { |
480 | 473 |
parser.AdditiveExpression(); |
... | ... | |
495 | 488 |
} |
496 | 489 |
|
497 | 490 |
|
498 |
|
|
491 |
|
|
499 | 492 |
private String EOField = LabelExpressionParser.tokenFor(LabelExpressionParser.EOFIELD); |
500 | 493 |
private String EOExpression = LabelExpressionParser.tokenFor(LabelExpressionParser.EOEXPR); |
501 | 494 |
private String DOUBLEQUOTE = "\""; |
502 |
|
|
495 |
|
|
503 | 496 |
private String[] FieldExpressionStrings = new String[] { |
504 | 497 |
"km" +"25", |
505 | 498 |
DOUBLEQUOTE+"km"+DOUBLEQUOTE+" "+DOUBLEQUOTE+" 25"+DOUBLEQUOTE, |
... | ... | |
525 | 518 |
|
526 | 519 |
for (int i = 0; i < expressions.length; i++) { |
527 | 520 |
String expr = expressions[i]; |
528 |
parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
|
|
521 |
parser = new LabelExpressionParser(new StringReader(expr),symbols_table);
|
|
529 | 522 |
|
530 |
for (int j = 0; j < symbols.length; j++) { |
|
531 |
parser.putSymbol(symbols[j].id,symbols[j].val); |
|
532 |
} |
|
533 | 523 |
|
534 |
|
|
535 | 524 |
System.out.print("Parsing '"+expr+"'"); |
536 | 525 |
try { |
537 | 526 |
|
... | ... | |
539 | 528 |
|
540 | 529 |
System.out.print(": [ parsed ]. Evaluating: "); |
541 | 530 |
Object[] expected = expectedValues; |
542 |
String myValues = ((Expression)parser.getStack().pop()).evaluate(parser.getSymbols()).toString();
|
|
531 |
String myValues = ((Expression)parser.getStack().pop()).evaluate().toString(); |
|
543 | 532 |
|
544 | 533 |
|
545 | 534 |
Object value = myValues; |
... | ... | |
556 | 545 |
} |
557 | 546 |
} |
558 | 547 |
|
559 |
|
|
548 |
|
|
560 | 549 |
private String[] LabelExpressions = new String[] { |
561 | 550 |
"1+2"+EOField+"true"+EOField+"2<3", |
562 | 551 |
"300+454"+EOField+"false", |
... | ... | |
564 | 553 |
"[A_DOUBLE_VALUE]/[ANOTHER_DOUBLE_VALUE]"+EOField+"Km", |
565 | 554 |
"km" +"25"+EOField+"1+5", |
566 | 555 |
DOUBLEQUOTE+"km"+DOUBLEQUOTE+" "+DOUBLEQUOTE+" 25"+DOUBLEQUOTE+EOField+"1+2"+EOField+"true"+EOField+"2<3", |
567 |
|
|
556 |
|
|
568 | 557 |
}; |
569 | 558 |
private Object[][] LabelExpressionsValue = new Object[][] { |
570 | 559 |
new Object[] {3,true,true }, |
... | ... | |
573 | 562 |
new Object[] {((DoubleValue) symbols[0].val).getValue()/((DoubleValue) symbols[1].val).getValue(),"Km"}, |
574 | 563 |
new Object[] {"km25",6 }, |
575 | 564 |
new Object[] {"km 25",3,true,true }, |
576 |
|
|
565 |
|
|
577 | 566 |
}; |
578 | 567 |
|
579 | 568 |
public void testLabelExpressions() throws ExpressionException { |
... | ... | |
584 | 573 |
|
585 | 574 |
for (int i = 0; i < expressions.length; i++) { |
586 | 575 |
String expr = expressions[i]; |
587 |
parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
|
|
576 |
parser = new LabelExpressionParser(new StringReader(expr),symbols_table);
|
|
588 | 577 |
|
589 |
for (int j = 0; j < symbols.length; j++) { |
|
590 |
parser.putSymbol(symbols[j].id,symbols[j].val); |
|
591 |
} |
|
592 | 578 |
|
593 |
|
|
594 | 579 |
System.out.print("Parsing '"+expr+"'"); |
595 | 580 |
try { |
596 | 581 |
|
... | ... | |
598 | 583 |
|
599 | 584 |
System.out.print(": [ parsed ]. Evaluating: "); |
600 | 585 |
Object[] expected = expectedValues[i]; |
601 |
Object[] myValues = (Object[]) ((Expression)parser.getStack().pop()).evaluate(parser.getSymbols());
|
|
586 |
Object[] myValues = (Object[]) ((Expression)parser.getStack().pop()).evaluate(); |
|
602 | 587 |
|
603 | 588 |
for (int j = 0; j < myValues.length; j++) { // <- Last in first out |
604 | 589 |
Object value = myValues[j]; |
... | ... | |
623 | 608 |
}; |
624 | 609 |
private Object[][] SolvedBugsExpressionsValue = new Object[][] { |
625 | 610 |
new Object[] { ((((DoubleValue) symbols[8].val ).getValue() + 3 ) *5) }, |
626 |
new Object[] {
|
|
611 |
new Object[] { |
|
627 | 612 |
""+((((DoubleValue) symbols[8].val ).getValue() + 3 ) *5), |
628 | 613 |
""+((((DoubleValue) symbols[8].val ).getValue() + 3 ) *5) }, |
629 | 614 |
}; |
... | ... | |
639 | 624 |
|
640 | 625 |
for (int i = 0; i < expressions.length; i++) { |
641 | 626 |
String expr = expressions[i]; |
642 |
parser = new LabelExpressionParser(new CharArrayReader(expr.toCharArray()));
|
|
627 |
parser = new LabelExpressionParser(new StringReader(expr),symbols_table);
|
|
643 | 628 |
|
644 |
for (int j = 0; j < symbols.length; j++) { |
|
645 |
parser.putSymbol(symbols[j].id,symbols[j].val); |
|
646 |
} |
|
647 | 629 |
|
648 |
|
|
649 | 630 |
System.out.print("Parsing '"+expr+"'"); |
650 | 631 |
try { |
651 | 632 |
|
... | ... | |
653 | 634 |
|
654 | 635 |
System.out.print(": [ parsed ]. Evaluating: "); |
655 | 636 |
Object[] expected = expectedValues[i]; |
656 |
Object value = ((Expression)parser.getStack().pop()).evaluate(parser.getSymbols());
|
|
637 |
Object value = ((Expression)parser.getStack().pop()).evaluate(); |
|
657 | 638 |
if (value.getClass().isArray()) { |
658 | 639 |
Object[] myValues = (Object[]) value; |
659 | 640 |
|
Also available in: Unified diff