Revision 22517 trunk/extensions/extSymbology/src-test/org/gvsig/symbology/fmap/labeling/parse/TestLabelExpressionParser.java

View differences:

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