]> source.dussan.org Git - poi.git/commitdiff
fixed LEFT and RIGHT to return #VALUE! when called with a negative operand, see Bugzi...
authorYegor Kozlov <yegor@apache.org>
Sat, 4 Sep 2010 09:48:34 +0000 (09:48 +0000)
committerYegor Kozlov <yegor@apache.org>
Sat, 4 Sep 2010 09:48:34 +0000 (09:48 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@992570 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/record/formula/functions/TextFunction.java
src/testcases/org/apache/poi/hssf/record/formula/functions/TestLeftRight.java [new file with mode: 0644]

index 7668ebc6f67111ccb9f9c35794830516aaad307b..40ad949571968688bb17376aad989b83631f80ea 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.7-beta3" date="2010-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">49841 - fixed LEFT and RIGHT to return #VALUE! when called with a negative operand </action>
            <action dev="POI-DEVELOPERS" type="fix">49783 - fixed evaluation of XSSF workbooks containing formulas with reference errors (#REF!)</action>
            <action dev="POI-DEVELOPERS" type="fix">49751 - fixed fetching names of user defined styles in HSSFCellStyle.getUserStyleName()</action>
            <action dev="POI-DEVELOPERS" type="add">48900 - support for protecting a XSSF workbook</action>
index 6e7e83a8c37cbbb8e5c7e5ff3da7ad9d5b7db8d3..6a2206f13e79ebf63b965bc9e46566af7bf40f0b 100644 (file)
@@ -173,7 +173,11 @@ public abstract class TextFunction implements Function {
                        } catch (EvaluationException e) {
                                return e.getErrorEval();
                        }
-
+                       
+                       if(index < 0) {
+                               return ErrorEval.VALUE_INVALID;
+                       }
+                       
                        String result;
                        if (_isLeft) {
                                result = arg.substring(0, Math.min(arg.length(), index));
diff --git a/src/testcases/org/apache/poi/hssf/record/formula/functions/TestLeftRight.java b/src/testcases/org/apache/poi/hssf/record/formula/functions/TestLeftRight.java
new file mode 100644 (file)
index 0000000..055e493
--- /dev/null
@@ -0,0 +1,73 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.record.formula.functions;
+
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.NumberEval;
+import org.apache.poi.hssf.record.formula.eval.StringEval;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+
+import junit.framework.TestCase;
+
+/**
+ * 
+ * Test cases for {@link TextFunction#LEFT} and {@link TextFunction#RIGHT}
+ * 
+ * @author Brendan Nolan
+ *
+ */
+public class TestLeftRight extends TestCase {
+
+       private static final NumberEval NEGATIVE_OPERAND = new NumberEval(-1.0);
+       private static final StringEval ANY_STRING_VALUE = new StringEval("ANYSTRINGVALUE");
+
+       
+       private static ValueEval invokeLeft(ValueEval text, ValueEval operand) {
+               ValueEval[] args = new ValueEval[] { text, operand };
+               return TextFunction.LEFT.evaluate(args, -1, (short)-1);
+       }
+       
+       private static ValueEval invokeRight(ValueEval text, ValueEval operand) {
+               ValueEval[] args = new ValueEval[] { text, operand };
+               return TextFunction.RIGHT.evaluate(args, -1, (short)-1);
+       }
+       
+       public void testLeftRight_bug49841() {
+
+               try {
+                       invokeLeft(ANY_STRING_VALUE, NEGATIVE_OPERAND);
+                       invokeRight(ANY_STRING_VALUE, NEGATIVE_OPERAND);
+               } catch (StringIndexOutOfBoundsException e) {
+                       fail("Identified bug 49841");
+               }
+
+       }
+       
+       public void testLeftRightNegativeOperand() {
+               
+               assertEquals(ErrorEval.VALUE_INVALID, invokeRight(ANY_STRING_VALUE, NEGATIVE_OPERAND));         
+               assertEquals(ErrorEval.VALUE_INVALID, invokeLeft(ANY_STRING_VALUE, NEGATIVE_OPERAND));
+
+       }
+       
+       
+       
+       
+
+       
+}