]> source.dussan.org Git - poi.git/commitdiff
Bug 55043: patch for missing function QUOTIENT
authorCédric Walter <cedricwalter@apache.org>
Fri, 16 Aug 2013 18:54:35 +0000 (18:54 +0000)
committerCédric Walter <cedricwalter@apache.org>
Fri, 16 Aug 2013 18:54:35 +0000 (18:54 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1514847 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
src/java/org/apache/poi/ss/formula/functions/Quotient.java
src/testcases/org/apache/poi/ss/formula/functions/TestQuotient.java
src/testcases/org/apache/poi/ss/formula/functions/TestQuotientFunctionsFromSpreadsheet.java [new file with mode: 0644]
test-data/spreadsheet/FormulaEvalTestData.xls
test-data/spreadsheet/QuotientFunctionTestCaseData.xls [new file with mode: 0644]

index ba3be146b90b81d67474a1b7a018f8687a78e36d..d73a31ee8e24008ce15e1c72567b1dece9506c3f 100644 (file)
@@ -39,8 +39,6 @@ public final class AnalysisToolPak implements UDFFinder {
         }
     }
 
-    ;
-
     private final Map<String, FreeRefFunction> _functionsByName = createFunctionsMap();
 
     private AnalysisToolPak() {
@@ -148,7 +146,7 @@ public final class AnalysisToolPak implements UDFFinder {
         r(m, "PRICE", null);
         r(m, "PRICEDISC", null);
         r(m, "PRICEMAT", null);
-        r(m, "QUOTIENT", null);
+        r(m, "QUOTIENT", Quotient.instance);
         r(m, "RANDBETWEEN", RandBetween.instance);
         r(m, "RECEIVED", null);
         r(m, "RTD", null);
index 44d6286200b6f7aa8eb07ed8da4d9090b3dcc919..f05915bce013e46239b92a056b2b7a0a31e96551 100644 (file)
@@ -17,6 +17,7 @@
 \r
 package org.apache.poi.ss.formula.functions;\r
 \r
+import org.apache.poi.ss.formula.OperationEvaluationContext;\r
 import org.apache.poi.ss.formula.eval.ValueEval;\r
 \r
 import org.apache.poi.ss.formula.eval.*;\r
@@ -35,8 +36,12 @@ import org.apache.poi.ss.formula.eval.*;
  *\r
  * If either enumerator/denominator is non numeric, QUOTIENT returns the #VALUE! error value.\r
  * If denominator is equals to zero, QUOTIENT returns the #DIV/0! error value.\r
+ *\r
+ * @author Cédric Walter\r
  */\r
-public class Quotient extends Fixed2ArgFunction {\r
+public class Quotient extends Fixed2ArgFunction implements FreeRefFunction {\r
+\r
+    public static final FreeRefFunction instance = new Quotient();\r
 \r
     public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval venumerator, ValueEval vedenominator) {\r
 \r
@@ -58,6 +63,13 @@ public class Quotient extends Fixed2ArgFunction {
             return ErrorEval.DIV_ZERO;\r
         }\r
 \r
-        return new StringEval(String.valueOf((int)(enumerator / denominator)));\r
+        return new NumberEval((int)(enumerator / denominator));\r
+    }\r
+\r
+    public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) {\r
+        if (args.length != 2) {\r
+            return ErrorEval.VALUE_INVALID;\r
+        }\r
+        return evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0], args[1]);\r
     }\r
 }\r
index d9fef5fdd9f9c0f38b9145638288fb78ade1448e..05c6a0aed838ed0d455978e39c178d10c6096713 100644 (file)
@@ -18,6 +18,7 @@ package org.apache.poi.ss.formula.functions;
 \r
 import junit.framework.TestCase;\r
 import org.apache.poi.ss.formula.eval.ErrorEval;\r
+import org.apache.poi.ss.formula.eval.NumberEval;\r
 import org.apache.poi.ss.formula.eval.StringEval;\r
 import org.apache.poi.ss.formula.eval.ValueEval;\r
 \r
@@ -34,8 +35,8 @@ public class TestQuotient extends TestCase {
 \r
     private static void confirmValue(String msg, String numerator, String denominator, String expected) {\r
         ValueEval result = invokeValue(numerator, denominator);\r
-        assertEquals(StringEval.class, result.getClass());\r
-        assertEquals(msg, expected, ((StringEval) result).getStringValue());\r
+        assertEquals(NumberEval.class, result.getClass());\r
+        assertEquals(msg, expected, ((NumberEval) result).getStringValue());\r
     }\r
 \r
     private static void confirmValueError(String msg, String numerator, String denominator, ErrorEval numError) {\r
@@ -58,6 +59,6 @@ public class TestQuotient extends TestCase {
         confirmValueError("numerator is nonnumeric", "ABCD", "", ErrorEval.VALUE_INVALID);\r
         confirmValueError("denominator is nonnumeric", "", "ABCD", ErrorEval.VALUE_INVALID);\r
 \r
-        confirmValueError("denominator is nonnumeric", "3.14159", "0", ErrorEval.DIV_ZERO);\r
+        confirmValueError("dividing by zero", "3.14159", "0", ErrorEval.DIV_ZERO);\r
     }\r
 }
\ No newline at end of file
diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestQuotientFunctionsFromSpreadsheet.java b/src/testcases/org/apache/poi/ss/formula/functions/TestQuotientFunctionsFromSpreadsheet.java
new file mode 100644 (file)
index 0000000..3d68845
--- /dev/null
@@ -0,0 +1,31 @@
+/* ====================================================================\r
+   Licensed to the Apache Software Foundation (ASF) under one or more\r
+   contributor license agreements.  See the NOTICE file distributed with\r
+   this work for additional information regarding copyright ownership.\r
+   The ASF licenses this file to You under the Apache License, Version 2.0\r
+   (the "License"); you may not use this file except in compliance with\r
+   the License.  You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+==================================================================== */\r
+\r
+package org.apache.poi.ss.formula.functions;\r
+\r
+/**\r
+ * Tests QUOTIENT() as loaded from a test data spreadsheet.<p/>\r
+ *\r
+ * @author cedric dot walter @ gmail dot com\r
+ */\r
+public class TestQuotientFunctionsFromSpreadsheet extends BaseTestFunctionsFromSpreadsheet {\r
+\r
+    @Override\r
+    protected String getFilename() {\r
+        return "QuotientFunctionTestCaseData.xls";\r
+    }\r
+}\r
index cc3fd416890a4335e51f55fed4ab3b9a6d3fedbd..434a04f7472e1b63c66e90682cb16d9d6e78ad63 100644 (file)
Binary files a/test-data/spreadsheet/FormulaEvalTestData.xls and b/test-data/spreadsheet/FormulaEvalTestData.xls differ
diff --git a/test-data/spreadsheet/QuotientFunctionTestCaseData.xls b/test-data/spreadsheet/QuotientFunctionTestCaseData.xls
new file mode 100644 (file)
index 0000000..729e774
Binary files /dev/null and b/test-data/spreadsheet/QuotientFunctionTestCaseData.xls differ