Return-Path: Delivered-To: apmail-poi-commits-archive@minotaur.apache.org Received: (qmail 56330 invoked from network); 25 Dec 2009 23:27:15 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 25 Dec 2009 23:27:15 -0000 Received: (qmail 46164 invoked by uid 500); 25 Dec 2009 23:27:15 -0000 Delivered-To: apmail-poi-commits-archive@poi.apache.org Received: (qmail 46129 invoked by uid 500); 25 Dec 2009 23:27:15 -0000 Mailing-List: contact commits-help@poi.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@poi.apache.org Delivered-To: mailing list commits@poi.apache.org Received: (qmail 46120 invoked by uid 99); 25 Dec 2009 23:27:14 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 25 Dec 2009 23:27:14 +0000 X-ASF-Spam-Status: No, hits=-2.6 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 25 Dec 2009 23:27:08 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 080282388996; Fri, 25 Dec 2009 23:26:48 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r893898 - in /poi/trunk/src: java/org/apache/poi/ss/formula/FormulaParser.java testcases/org/apache/poi/hssf/model/TestFormulaParser.java Date: Fri, 25 Dec 2009 23:26:47 -0000 To: commits@poi.apache.org From: josh@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091225232648.080282388996@eris.apache.org> 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