You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by jo...@apache.org on 2009/12/26 00:26:47 UTC

svn commit: r893898 - in /poi/trunk/src: java/org/apache/poi/ss/formula/FormulaParser.java testcases/org/apache/poi/hssf/model/TestFormulaParser.java

Author: josh
Date: Fri Dec 25 23:26:47 2009
New Revision: 893898

URL: http://svn.apache.org/viewvc?rev=893898&view=rev
Log:
Fixed FormulaParser to allow negative elements in array literals.

Modified:
    poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java
    poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java?rev=893898&r1=893897&r2=893898&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java Fri Dec 25 23:26:47 2009
@@ -1209,9 +1209,13 @@
 			case 'F': case 'f':
 			case 'T': case 't':
 				return parseBooleanLiteral();
+			case '-':
+				Match('-');
+				SkipWhite();
+				return convertArrayNumber(parseNumber(), false);
 		}
 		// else assume number
-		return convertArrayNumber(parseNumber());
+		return convertArrayNumber(parseNumber(), true);
 	}
 
 	private Boolean parseBooleanLiteral() {
@@ -1225,14 +1229,19 @@
 		throw expected("'TRUE' or 'FALSE'");
 	}
 
-	private static Double convertArrayNumber(Ptg ptg) {
+	private static Double convertArrayNumber(Ptg ptg, boolean isPositive) {
+		double value;
 		if (ptg instanceof IntPtg) {
-			return new Double(((IntPtg)ptg).getValue());
+			value = ((IntPtg)ptg).getValue();
+		} else  if (ptg instanceof NumberPtg) {
+			value = ((NumberPtg)ptg).getValue();
+		} else {
+			throw new RuntimeException("Unexpected ptg (" + ptg.getClass().getName() + ")");
 		}
-		if (ptg instanceof NumberPtg) {
-			return new Double(((NumberPtg)ptg).getValue());
+		if (!isPositive) {
+			value = -value;
 		}
-		throw new RuntimeException("Unexpected ptg (" + ptg.getClass().getName() + ")");
+		return new Double(value);
 	}
 
 	private Ptg parseNumber() {

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java?rev=893898&r1=893897&r2=893898&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java Fri Dec 25 23:26:47 2009
@@ -871,6 +871,28 @@
 		confirmTokenClasses(ptgs2, ArrayPtg.class, IntPtg.class, FuncVarPtg.class);
 	}
 
+	public void testParseArrayNegativeElement() {
+		Ptg[] ptgs;
+		try {
+			ptgs = parseFormula("{-42}");
+		} catch (FormulaParseException e) {
+			if (e.getMessage().equals("Parse error near char 1 '-' in specified formula '{-42}'. Expected Integer")) {
+				throw new AssertionFailedError("Identified bug - failed to parse negative array element.");
+			}
+			throw e;
+		}
+		confirmTokenClasses(ptgs, ArrayPtg.class);
+		Object element = ((ArrayPtg)ptgs[0]).getTokenArrayValues()[0][0];
+
+		assertEquals(-42.0, ((Double)element).doubleValue(), 0.0);
+
+		// Should be able to handle whitespace between unary minus and digits (Excel
+		// accepts this formula after presenting the user with a confirmation dialog).
+		ptgs = parseFormula("{- 5}");
+		element = ((ArrayPtg)ptgs[0]).getTokenArrayValues()[0][0];
+		assertEquals(-5.0, ((Double)element).doubleValue(), 0.0);
+	}
+
 	public void testRangeOperator() {
 
 		HSSFWorkbook wb = new HSSFWorkbook();



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org