From f75f0ec6124f53c443786ad3db5d47269b8c37e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Walter?= Date: Fri, 16 Aug 2013 18:54:35 +0000 Subject: [PATCH] Bug 55043: patch for missing function QUOTIENT git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1514847 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/ss/formula/atp/AnalysisToolPak.java | 4 +-- .../poi/ss/formula/functions/Quotient.java | 16 +++++++-- .../ss/formula/functions/TestQuotient.java | 7 ++-- .../TestQuotientFunctionsFromSpreadsheet.java | 31 ++++++++++++++++++ test-data/spreadsheet/FormulaEvalTestData.xls | Bin 169472 -> 169984 bytes .../QuotientFunctionTestCaseData.xls | Bin 0 -> 27648 bytes 6 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 src/testcases/org/apache/poi/ss/formula/functions/TestQuotientFunctionsFromSpreadsheet.java create mode 100644 test-data/spreadsheet/QuotientFunctionTestCaseData.xls diff --git a/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java b/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java index ba3be146b9..d73a31ee8e 100644 --- a/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java +++ b/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java @@ -39,8 +39,6 @@ public final class AnalysisToolPak implements UDFFinder { } } - ; - private final Map _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); diff --git a/src/java/org/apache/poi/ss/formula/functions/Quotient.java b/src/java/org/apache/poi/ss/formula/functions/Quotient.java index 44d6286200..f05915bce0 100644 --- a/src/java/org/apache/poi/ss/formula/functions/Quotient.java +++ b/src/java/org/apache/poi/ss/formula/functions/Quotient.java @@ -17,6 +17,7 @@ package org.apache.poi.ss.formula.functions; +import org.apache.poi.ss.formula.OperationEvaluationContext; import org.apache.poi.ss.formula.eval.ValueEval; import org.apache.poi.ss.formula.eval.*; @@ -35,8 +36,12 @@ import org.apache.poi.ss.formula.eval.*; * * If either enumerator/denominator is non numeric, QUOTIENT returns the #VALUE! error value. * If denominator is equals to zero, QUOTIENT returns the #DIV/0! error value. + * + * @author Cédric Walter */ -public class Quotient extends Fixed2ArgFunction { +public class Quotient extends Fixed2ArgFunction implements FreeRefFunction { + + public static final FreeRefFunction instance = new Quotient(); public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval venumerator, ValueEval vedenominator) { @@ -58,6 +63,13 @@ public class Quotient extends Fixed2ArgFunction { return ErrorEval.DIV_ZERO; } - return new StringEval(String.valueOf((int)(enumerator / denominator))); + return new NumberEval((int)(enumerator / denominator)); + } + + public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { + if (args.length != 2) { + return ErrorEval.VALUE_INVALID; + } + return evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0], args[1]); } } diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestQuotient.java b/src/testcases/org/apache/poi/ss/formula/functions/TestQuotient.java index d9fef5fdd9..05c6a0aed8 100644 --- a/src/testcases/org/apache/poi/ss/formula/functions/TestQuotient.java +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestQuotient.java @@ -18,6 +18,7 @@ package org.apache.poi.ss.formula.functions; import junit.framework.TestCase; import org.apache.poi.ss.formula.eval.ErrorEval; +import org.apache.poi.ss.formula.eval.NumberEval; import org.apache.poi.ss.formula.eval.StringEval; import org.apache.poi.ss.formula.eval.ValueEval; @@ -34,8 +35,8 @@ public class TestQuotient extends TestCase { private static void confirmValue(String msg, String numerator, String denominator, String expected) { ValueEval result = invokeValue(numerator, denominator); - assertEquals(StringEval.class, result.getClass()); - assertEquals(msg, expected, ((StringEval) result).getStringValue()); + assertEquals(NumberEval.class, result.getClass()); + assertEquals(msg, expected, ((NumberEval) result).getStringValue()); } private static void confirmValueError(String msg, String numerator, String denominator, ErrorEval numError) { @@ -58,6 +59,6 @@ public class TestQuotient extends TestCase { confirmValueError("numerator is nonnumeric", "ABCD", "", ErrorEval.VALUE_INVALID); confirmValueError("denominator is nonnumeric", "", "ABCD", ErrorEval.VALUE_INVALID); - confirmValueError("denominator is nonnumeric", "3.14159", "0", ErrorEval.DIV_ZERO); + confirmValueError("dividing by zero", "3.14159", "0", ErrorEval.DIV_ZERO); } } \ 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 index 0000000000..3d68845e50 --- /dev/null +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestQuotientFunctionsFromSpreadsheet.java @@ -0,0 +1,31 @@ +/* ==================================================================== + 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.ss.formula.functions; + +/** + * Tests QUOTIENT() as loaded from a test data spreadsheet.

+ * + * @author cedric dot walter @ gmail dot com + */ +public class TestQuotientFunctionsFromSpreadsheet extends BaseTestFunctionsFromSpreadsheet { + + @Override + protected String getFilename() { + return "QuotientFunctionTestCaseData.xls"; + } +} diff --git a/test-data/spreadsheet/FormulaEvalTestData.xls b/test-data/spreadsheet/FormulaEvalTestData.xls index cc3fd416890a4335e51f55fed4ab3b9a6d3fedbd..434a04f7472e1b63c66e90682cb16d9d6e78ad63 100644 GIT binary patch delta 23518 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 IRfg;T0$T>zU;qFB diff --git a/test-data/spreadsheet/QuotientFunctionTestCaseData.xls b/test-data/spreadsheet/QuotientFunctionTestCaseData.xls new file mode 100644 index 0000000000000000000000000000000000000000..729e77485071fc9460913a7bcc91f565e4ac4aeb GIT binary patch literal 27648 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 literal 0 HcmV?d00001