From f0ebb76204bd6b120f76a2d27108f4afe0c44efa Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Wed, 19 Aug 2009 20:55:44 +0000 Subject: [PATCH] changed interface from OperationEval to Function for basic operators git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@805971 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hssf/record/formula/eval/AddEval.java | 45 ----------- .../hssf/record/formula/eval/ConcatEval.java | 10 +-- .../hssf/record/formula/eval/DivideEval.java | 36 --------- .../hssf/record/formula/eval/EqualEval.java | 34 -------- .../record/formula/eval/GreaterEqualEval.java | 34 -------- .../record/formula/eval/GreaterThanEval.java | 34 -------- .../record/formula/eval/LessEqualEval.java | 34 -------- .../record/formula/eval/LessThanEval.java | 34 -------- .../record/formula/eval/MultiplyEval.java | 33 -------- .../record/formula/eval/NotEqualEval.java | 34 -------- .../record/formula/eval/OperandResolver.java | 6 +- .../hssf/record/formula/eval/PercentEval.java | 10 +-- .../hssf/record/formula/eval/PowerEval.java | 33 -------- .../hssf/record/formula/eval/RangeEval.java | 12 ++- .../formula/eval/RelationalOperationEval.java | 36 ++++++++- .../record/formula/eval/SubtractEval.java | 33 -------- .../eval/TwoOperandNumericOperation.java | 42 ++++++++-- .../record/formula/eval/UnaryMinusEval.java | 10 +-- .../record/formula/eval/UnaryPlusEval.java | 10 +-- .../ss/formula/OperationEvaluatorFactory.java | 79 ++++++++++++------- .../record/formula/eval/EvalInstances.java | 53 +++++++++++++ .../record/formula/eval/TestDivideEval.java | 4 +- .../record/formula/eval/TestEqualEval.java | 32 +++++--- .../formula/eval/TestMinusZeroResult.java | 31 ++++---- .../record/formula/eval/TestPercentEval.java | 3 +- .../functions/NumericFunctionInvoker.java | 23 +----- 26 files changed, 238 insertions(+), 507 deletions(-) delete mode 100644 src/java/org/apache/poi/hssf/record/formula/eval/AddEval.java delete mode 100644 src/java/org/apache/poi/hssf/record/formula/eval/DivideEval.java delete mode 100644 src/java/org/apache/poi/hssf/record/formula/eval/EqualEval.java delete mode 100644 src/java/org/apache/poi/hssf/record/formula/eval/GreaterEqualEval.java delete mode 100644 src/java/org/apache/poi/hssf/record/formula/eval/GreaterThanEval.java delete mode 100644 src/java/org/apache/poi/hssf/record/formula/eval/LessEqualEval.java delete mode 100644 src/java/org/apache/poi/hssf/record/formula/eval/LessThanEval.java delete mode 100644 src/java/org/apache/poi/hssf/record/formula/eval/MultiplyEval.java delete mode 100644 src/java/org/apache/poi/hssf/record/formula/eval/NotEqualEval.java delete mode 100644 src/java/org/apache/poi/hssf/record/formula/eval/PowerEval.java delete mode 100644 src/java/org/apache/poi/hssf/record/formula/eval/SubtractEval.java create mode 100644 src/testcases/org/apache/poi/hssf/record/formula/eval/EvalInstances.java diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/AddEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/AddEval.java deleted file mode 100644 index bf1b424214..0000000000 --- a/src/java/org/apache/poi/hssf/record/formula/eval/AddEval.java +++ /dev/null @@ -1,45 +0,0 @@ -/* ==================================================================== - 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.eval; - - -/** - * @author Amol S. Deshmukh < amolweb at ya hoo dot com > - * This is a documentation of the observed behaviour of - * the '+' operator in Excel: - *
    - *
  1. 1+TRUE = 2 - *
  2. 1+FALSE = 1 - *
  3. 1+"true" = #VALUE! - *
  4. 1+"1" = 2 - *
  5. 1+A1 = #VALUE if A1 contains "1" - *
  6. 1+A1 = 2 if A1 contains ="1" - *
  7. 1+A1 = 2 if A1 contains TRUE or =TRUE - *
  8. 1+A1 = #VALUE! if A1 contains "TRUE" or ="TRUE" - */ -public final class AddEval extends TwoOperandNumericOperation { - - public static final OperationEval instance = new AddEval(); - - private AddEval() { - } - - protected double evaluate(double d0, double d1) { - return d0 + d1; - } -} diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/ConcatEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/ConcatEval.java index 0ffba7c358..65ecb33d68 100644 --- a/src/java/org/apache/poi/hssf/record/formula/eval/ConcatEval.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/ConcatEval.java @@ -17,12 +17,14 @@ package org.apache.poi.hssf.record.formula.eval; +import org.apache.poi.hssf.record.formula.functions.Function; + /** * @author Amol S. Deshmukh < amolweb at ya hoo dot com > */ -public final class ConcatEval implements OperationEval { +public final class ConcatEval implements Function { - public static final OperationEval instance = new ConcatEval(); + public static final Function instance = new ConcatEval(); private ConcatEval() { // enforce singleton @@ -53,8 +55,4 @@ public final class ConcatEval implements OperationEval { return new StringEval(sb.toString()); } - - public int getNumberOfOperands() { - return 2; - } } diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/DivideEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/DivideEval.java deleted file mode 100644 index ba0b07e7e4..0000000000 --- a/src/java/org/apache/poi/hssf/record/formula/eval/DivideEval.java +++ /dev/null @@ -1,36 +0,0 @@ -/* ==================================================================== - 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.eval; - -/** - * @author Amol S. Deshmukh < amolweb at ya hoo dot com > - */ -public final class DivideEval extends TwoOperandNumericOperation { - - public static final OperationEval instance = new DivideEval(); - - private DivideEval() { - } - - protected double evaluate(double d0, double d1) throws EvaluationException { - if (d1 == 0.0) { - throw new EvaluationException(ErrorEval.DIV_ZERO); - } - return d0 / d1; - } -} diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/EqualEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/EqualEval.java deleted file mode 100644 index 8dca609066..0000000000 --- a/src/java/org/apache/poi/hssf/record/formula/eval/EqualEval.java +++ /dev/null @@ -1,34 +0,0 @@ -/* ==================================================================== - 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.eval; - -/** - * @author Amol S. Deshmukh < amolweb at ya hoo dot com > - * - */ -public final class EqualEval extends RelationalOperationEval { - - public static final OperationEval instance = new EqualEval(); - - private EqualEval() { - } - - protected boolean convertComparisonResult(int cmpResult) { - return cmpResult == 0; - } -} diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/GreaterEqualEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/GreaterEqualEval.java deleted file mode 100644 index 16dd48846e..0000000000 --- a/src/java/org/apache/poi/hssf/record/formula/eval/GreaterEqualEval.java +++ /dev/null @@ -1,34 +0,0 @@ -/* ==================================================================== - 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.eval; - -/** - * @author Amol S. Deshmukh < amolweb at ya hoo dot com > - * - */ -public final class GreaterEqualEval extends RelationalOperationEval { - - public static final OperationEval instance = new GreaterEqualEval(); - - private GreaterEqualEval() { - } - - protected boolean convertComparisonResult(int cmpResult) { - return cmpResult >= 0; - } -} diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/GreaterThanEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/GreaterThanEval.java deleted file mode 100644 index 45605a41c0..0000000000 --- a/src/java/org/apache/poi/hssf/record/formula/eval/GreaterThanEval.java +++ /dev/null @@ -1,34 +0,0 @@ -/* ==================================================================== - 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.eval; - -/** - * @author Amol S. Deshmukh < amolweb at ya hoo dot com > - * - */ -public final class GreaterThanEval extends RelationalOperationEval { - - public static final OperationEval instance = new GreaterThanEval(); - - private GreaterThanEval() { - } - - protected boolean convertComparisonResult(int cmpResult) { - return cmpResult > 0; - } -} diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/LessEqualEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/LessEqualEval.java deleted file mode 100644 index e62be04d0c..0000000000 --- a/src/java/org/apache/poi/hssf/record/formula/eval/LessEqualEval.java +++ /dev/null @@ -1,34 +0,0 @@ -/* ==================================================================== - 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.eval; - -/** - * @author Amol S. Deshmukh < amolweb at ya hoo dot com > - * - */ -public final class LessEqualEval extends RelationalOperationEval { - - public static final OperationEval instance = new LessEqualEval(); - - private LessEqualEval() { - } - - protected boolean convertComparisonResult(int cmpResult) { - return cmpResult <= 0; - } -} diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/LessThanEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/LessThanEval.java deleted file mode 100644 index cf1fc1befc..0000000000 --- a/src/java/org/apache/poi/hssf/record/formula/eval/LessThanEval.java +++ /dev/null @@ -1,34 +0,0 @@ -/* ==================================================================== - 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.eval; - -/** - * @author Amol S. Deshmukh < amolweb at ya hoo dot com > - * - */ -public final class LessThanEval extends RelationalOperationEval { - - public static final OperationEval instance = new LessThanEval(); - - private LessThanEval() { - } - - protected boolean convertComparisonResult(int cmpResult) { - return cmpResult < 0; - } -} diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/MultiplyEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/MultiplyEval.java deleted file mode 100644 index 83b829c711..0000000000 --- a/src/java/org/apache/poi/hssf/record/formula/eval/MultiplyEval.java +++ /dev/null @@ -1,33 +0,0 @@ -/* ==================================================================== - 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.eval; - -/** - * @author Amol S. Deshmukh < amolweb at ya hoo dot com > - */ -public final class MultiplyEval extends TwoOperandNumericOperation { - - public static final OperationEval instance = new MultiplyEval(); - - private MultiplyEval() { - } - - protected double evaluate(double d0, double d1) { - return d0 * d1; - } -} diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/NotEqualEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/NotEqualEval.java deleted file mode 100644 index da8f315490..0000000000 --- a/src/java/org/apache/poi/hssf/record/formula/eval/NotEqualEval.java +++ /dev/null @@ -1,34 +0,0 @@ -/* ==================================================================== - 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.eval; - -/** - * @author Amol S. Deshmukh < amolweb at ya hoo dot com > - * - */ -public final class NotEqualEval extends RelationalOperationEval { - - public static final OperationEval instance = new NotEqualEval(); - - private NotEqualEval() { - } - - protected boolean convertComparisonResult(int cmpResult) { - return cmpResult != 0; - } -} diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/OperandResolver.java b/src/java/org/apache/poi/hssf/record/formula/eval/OperandResolver.java index 690a486f31..55684b0197 100755 --- a/src/java/org/apache/poi/hssf/record/formula/eval/OperandResolver.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/OperandResolver.java @@ -40,7 +40,7 @@ public final class OperandResolver { * an AreaEval. If the actual value retrieved is an ErrorEval, a corresponding * EvaluationException is thrown. */ - public static ValueEval getSingleValue(ValueEval arg, int srcCellRow, short srcCellCol) + public static ValueEval getSingleValue(ValueEval arg, int srcCellRow, int srcCellCol) throws EvaluationException { ValueEval result; if (arg instanceof RefEval) { @@ -101,8 +101,8 @@ public final class OperandResolver { * evaluated cell has an error. */ public static ValueEval chooseSingleElementFromArea(AreaEval ae, - int srcCellRow, short srcCellCol) throws EvaluationException { - ValueEval result = chooseSingleElementFromAreaInternal(ae, srcCellRow, srcCellCol); + int srcCellRow, int srcCellCol) throws EvaluationException { + ValueEval result = chooseSingleElementFromAreaInternal(ae, srcCellRow, (short) srcCellCol); if(result == null) { // This seems to be required because AreaEval.values() array may contain nulls. // perhaps that should not be allowed. diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/PercentEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/PercentEval.java index 60c0642924..8e202fdd26 100755 --- a/src/java/org/apache/poi/hssf/record/formula/eval/PercentEval.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/PercentEval.java @@ -17,14 +17,16 @@ package org.apache.poi.hssf.record.formula.eval; +import org.apache.poi.hssf.record.formula.functions.Function; + /** * Implementation of Excel formula token '%'.

    * @author Josh Micich */ -public final class PercentEval implements OperationEval { +public final class PercentEval implements Function { - public static final OperationEval instance = new PercentEval(); + public static final Function instance = new PercentEval(); private PercentEval() { // enforce singleton @@ -46,8 +48,4 @@ public final class PercentEval implements OperationEval { } return new NumberEval(d / 100); } - - public int getNumberOfOperands() { - return 1; - } } diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/PowerEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/PowerEval.java deleted file mode 100644 index 685332a053..0000000000 --- a/src/java/org/apache/poi/hssf/record/formula/eval/PowerEval.java +++ /dev/null @@ -1,33 +0,0 @@ -/* ==================================================================== - 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.eval; - -/** - * @author Amol S. Deshmukh < amolweb at ya hoo dot com > - */ -public final class PowerEval extends TwoOperandNumericOperation { - - public static final OperationEval instance = new PowerEval(); - - private PowerEval() { - } - - protected double evaluate(double d0, double d1) { - return Math.pow(d0, d1); - } -} diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/RangeEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/RangeEval.java index 8db93bb3ea..b1975a2121 100644 --- a/src/java/org/apache/poi/hssf/record/formula/eval/RangeEval.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/RangeEval.java @@ -17,20 +17,22 @@ package org.apache.poi.hssf.record.formula.eval; +import org.apache.poi.hssf.record.formula.functions.Function; + /** * * @author Josh Micich */ -public final class RangeEval implements OperationEval { +public final class RangeEval implements Function { - public static final OperationEval instance = new RangeEval(); + public static final Function instance = new RangeEval(); private RangeEval() { // enforces singleton } - public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) { + public ValueEval evaluate(ValueEval[] args, int srcRow, short srcCol) { if(args.length != 2) { return ErrorEval.VALUE_INVALID; } @@ -72,8 +74,4 @@ public final class RangeEval implements OperationEval { } throw new IllegalArgumentException("Unexpected ref arg class (" + arg.getClass().getName() + ")"); } - - public int getNumberOfOperands() { - return 2; - } } diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/RelationalOperationEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/RelationalOperationEval.java index d2ce53296d..a07ea3baf5 100644 --- a/src/java/org/apache/poi/hssf/record/formula/eval/RelationalOperationEval.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/RelationalOperationEval.java @@ -17,6 +17,7 @@ package org.apache.poi.hssf.record.formula.eval; +import org.apache.poi.hssf.record.formula.functions.Function; import org.apache.poi.ss.util.NumberComparer; /** @@ -24,7 +25,7 @@ import org.apache.poi.ss.util.NumberComparer; * * @author Amol S. Deshmukh < amolweb at ya hoo dot com > */ -public abstract class RelationalOperationEval implements OperationEval { +public abstract class RelationalOperationEval implements Function { /** * Converts a standard compare result (-1, 0, 1) to true or false @@ -136,7 +137,34 @@ public abstract class RelationalOperationEval implements OperationEval { throw new IllegalArgumentException("bad value class (" + v.getClass().getName() + ")"); } - public final int getNumberOfOperands() { - return 2; - } + public static final Function EqualEval = new RelationalOperationEval() { + protected boolean convertComparisonResult(int cmpResult) { + return cmpResult == 0; + } + }; + public static final Function GreaterEqualEval = new RelationalOperationEval() { + protected boolean convertComparisonResult(int cmpResult) { + return cmpResult >= 0; + } + }; + public static final Function GreaterThanEval = new RelationalOperationEval() { + protected boolean convertComparisonResult(int cmpResult) { + return cmpResult > 0; + } + }; + public static final Function LessEqualEval = new RelationalOperationEval() { + protected boolean convertComparisonResult(int cmpResult) { + return cmpResult <= 0; + } + }; + public static final Function LessThanEval = new RelationalOperationEval() { + protected boolean convertComparisonResult(int cmpResult) { + return cmpResult < 0; + } + }; + public static final Function NotEqualEval = new RelationalOperationEval() { + protected boolean convertComparisonResult(int cmpResult) { + return cmpResult != 0; + } + }; } diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/SubtractEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/SubtractEval.java deleted file mode 100644 index cbd6dc5eec..0000000000 --- a/src/java/org/apache/poi/hssf/record/formula/eval/SubtractEval.java +++ /dev/null @@ -1,33 +0,0 @@ -/* ==================================================================== - 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.eval; - -/** - * @author Amol S. Deshmukh < amolweb at ya hoo dot com > - */ -public final class SubtractEval extends TwoOperandNumericOperation { - - public static final OperationEval instance = new SubtractEval(); - - private SubtractEval() { - } - - protected double evaluate(double d0, double d1) { - return d0 - d1; - } -} diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/TwoOperandNumericOperation.java b/src/java/org/apache/poi/hssf/record/formula/eval/TwoOperandNumericOperation.java index 17587e838e..8b5043a705 100644 --- a/src/java/org/apache/poi/hssf/record/formula/eval/TwoOperandNumericOperation.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/TwoOperandNumericOperation.java @@ -17,12 +17,14 @@ package org.apache.poi.hssf.record.formula.eval; +import org.apache.poi.hssf.record.formula.functions.Function; + /** * @author Josh Micich */ -abstract class TwoOperandNumericOperation implements OperationEval { +public abstract class TwoOperandNumericOperation implements Function { - protected final double singleOperandEvaluate(ValueEval arg, int srcCellRow, short srcCellCol) throws EvaluationException { + protected final double singleOperandEvaluate(ValueEval arg, int srcCellRow, int srcCellCol) throws EvaluationException { ValueEval ve = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol); return OperandResolver.coerceValueToDouble(ve); } @@ -35,7 +37,7 @@ abstract class TwoOperandNumericOperation implements OperationEval { result = evaluate(d0, d1); if (result == 0.0) { // this '==' matches +0.0 and -0.0 // Excel converts -0.0 to +0.0 for '*', '/', '%', '+' and '^' - if (!(this instanceof SubtractEval)) { + if (!(this instanceof SubtractEvalClass)) { return NumberEval.ZERO; } } @@ -48,7 +50,37 @@ abstract class TwoOperandNumericOperation implements OperationEval { return new NumberEval(result); } protected abstract double evaluate(double d0, double d1) throws EvaluationException; - public final int getNumberOfOperands() { - return 2; + + public static final Function AddEval = new TwoOperandNumericOperation() { + protected double evaluate(double d0, double d1) { + return d0+d1; + } + }; + public static final Function DivideEval = new TwoOperandNumericOperation() { + protected double evaluate(double d0, double d1) throws EvaluationException { + if (d1 == 0.0) { + throw new EvaluationException(ErrorEval.DIV_ZERO); + } + return d0/d1; + } + }; + public static final Function MultiplyEval = new TwoOperandNumericOperation() { + protected double evaluate(double d0, double d1) { + return d0*d1; + } + }; + public static final Function PowerEval = new TwoOperandNumericOperation() { + protected double evaluate(double d0, double d1) { + return Math.pow(d0, d1); + } + }; + private static final class SubtractEvalClass extends TwoOperandNumericOperation { + public SubtractEvalClass() { + // + } + protected double evaluate(double d0, double d1) { + return d0-d1; + } } + public static final Function SubtractEval = new SubtractEvalClass(); } diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/UnaryMinusEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/UnaryMinusEval.java index c9130953dc..764cfe1a45 100644 --- a/src/java/org/apache/poi/hssf/record/formula/eval/UnaryMinusEval.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/UnaryMinusEval.java @@ -17,14 +17,16 @@ package org.apache.poi.hssf.record.formula.eval; +import org.apache.poi.hssf.record.formula.functions.Function; + /** * @author Amol S. Deshmukh < amolweb at ya hoo dot com > * */ -public final class UnaryMinusEval implements OperationEval { +public final class UnaryMinusEval implements Function { - public static final OperationEval instance = new UnaryMinusEval(); + public static final Function instance = new UnaryMinusEval(); private UnaryMinusEval() { // enforce singleton @@ -46,8 +48,4 @@ public final class UnaryMinusEval implements OperationEval { } return new NumberEval(-d); } - - public int getNumberOfOperands() { - return 1; - } } diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/UnaryPlusEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/UnaryPlusEval.java index 1cac938734..9b4a068fee 100644 --- a/src/java/org/apache/poi/hssf/record/formula/eval/UnaryPlusEval.java +++ b/src/java/org/apache/poi/hssf/record/formula/eval/UnaryPlusEval.java @@ -17,14 +17,16 @@ package org.apache.poi.hssf.record.formula.eval; +import org.apache.poi.hssf.record.formula.functions.Function; + /** * @author Amol S. Deshmukh < amolweb at ya hoo dot com > * */ -public final class UnaryPlusEval implements OperationEval { +public final class UnaryPlusEval implements Function { - public static final OperationEval instance = new UnaryPlusEval(); + public static final Function instance = new UnaryPlusEval(); private UnaryPlusEval() { // enforce singleton @@ -49,8 +51,4 @@ public final class UnaryPlusEval implements OperationEval { } return new NumberEval(+d); } - - public int getNumberOfOperands() { - return 1; - } } diff --git a/src/java/org/apache/poi/ss/formula/OperationEvaluatorFactory.java b/src/java/org/apache/poi/ss/formula/OperationEvaluatorFactory.java index c98ed3277a..b459b4c99c 100755 --- a/src/java/org/apache/poi/ss/formula/OperationEvaluatorFactory.java +++ b/src/java/org/apache/poi/ss/formula/OperationEvaluatorFactory.java @@ -39,24 +39,17 @@ import org.apache.poi.hssf.record.formula.RangePtg; import org.apache.poi.hssf.record.formula.SubtractPtg; import org.apache.poi.hssf.record.formula.UnaryMinusPtg; import org.apache.poi.hssf.record.formula.UnaryPlusPtg; -import org.apache.poi.hssf.record.formula.eval.AddEval; import org.apache.poi.hssf.record.formula.eval.ConcatEval; -import org.apache.poi.hssf.record.formula.eval.DivideEval; -import org.apache.poi.hssf.record.formula.eval.EqualEval; import org.apache.poi.hssf.record.formula.eval.FunctionEval; -import org.apache.poi.hssf.record.formula.eval.GreaterEqualEval; -import org.apache.poi.hssf.record.formula.eval.GreaterThanEval; -import org.apache.poi.hssf.record.formula.eval.LessEqualEval; -import org.apache.poi.hssf.record.formula.eval.LessThanEval; -import org.apache.poi.hssf.record.formula.eval.MultiplyEval; -import org.apache.poi.hssf.record.formula.eval.NotEqualEval; import org.apache.poi.hssf.record.formula.eval.OperationEval; import org.apache.poi.hssf.record.formula.eval.PercentEval; -import org.apache.poi.hssf.record.formula.eval.PowerEval; import org.apache.poi.hssf.record.formula.eval.RangeEval; -import org.apache.poi.hssf.record.formula.eval.SubtractEval; +import org.apache.poi.hssf.record.formula.eval.RelationalOperationEval; +import org.apache.poi.hssf.record.formula.eval.TwoOperandNumericOperation; import org.apache.poi.hssf.record.formula.eval.UnaryMinusEval; import org.apache.poi.hssf.record.formula.eval.UnaryPlusEval; +import org.apache.poi.hssf.record.formula.eval.ValueEval; +import org.apache.poi.hssf.record.formula.functions.Function; /** * This class creates OperationEval instances to help evaluate OperationPtg @@ -74,28 +67,54 @@ final class OperationEvaluatorFactory { private static Map, OperationEval> initialiseInstancesMap() { Map, OperationEval> m = new HashMap, OperationEval>(32); - m.put(EqualPtg.class, EqualEval.instance); - - m.put(EqualPtg.class, EqualEval.instance); - m.put(GreaterEqualPtg.class, GreaterEqualEval.instance); - m.put(GreaterThanPtg.class, GreaterThanEval.instance); - m.put(LessEqualPtg.class, LessEqualEval.instance); - m.put(LessThanPtg.class, LessThanEval.instance); - m.put(NotEqualPtg.class, NotEqualEval.instance); - - m.put(ConcatPtg.class, ConcatEval.instance); - m.put(AddPtg.class, AddEval.instance); - m.put(DividePtg.class, DivideEval.instance); - m.put(MultiplyPtg.class, MultiplyEval.instance); - m.put(PercentPtg.class, PercentEval.instance); - m.put(PowerPtg.class, PowerEval.instance); - m.put(SubtractPtg.class, SubtractEval.instance); - m.put(UnaryMinusPtg.class, UnaryMinusEval.instance); - m.put(UnaryPlusPtg.class, UnaryPlusEval.instance); - m.put(RangePtg.class, RangeEval.instance); + + put(m, 2, EqualPtg.class, RelationalOperationEval.EqualEval); + put(m, 2, GreaterEqualPtg.class, RelationalOperationEval.GreaterEqualEval); + put(m, 2, GreaterThanPtg.class, RelationalOperationEval.GreaterThanEval); + put(m, 2, LessEqualPtg.class, RelationalOperationEval.LessEqualEval); + put(m, 2, LessThanPtg.class, RelationalOperationEval.LessThanEval); + put(m, 2, NotEqualPtg.class, RelationalOperationEval.NotEqualEval); + + put(m, 2, ConcatPtg.class, ConcatEval.instance); + put(m, 2, AddPtg.class, TwoOperandNumericOperation.AddEval); + put(m, 2, DividePtg.class, TwoOperandNumericOperation.DivideEval); + put(m, 2, MultiplyPtg.class, TwoOperandNumericOperation.MultiplyEval); + put(m, 1, PercentPtg.class, PercentEval.instance); + put(m, 2, PowerPtg.class, TwoOperandNumericOperation.PowerEval); + put(m, 2, SubtractPtg.class, TwoOperandNumericOperation.SubtractEval); + put(m, 1, UnaryMinusPtg.class, UnaryMinusEval.instance); + put(m, 1, UnaryPlusPtg.class, UnaryPlusEval.instance); + put(m, 2, RangePtg.class, RangeEval.instance); return m; } + private static void put(Map, OperationEval> m, int argCount, + Class ptgClass, Function instance) { + m.put(ptgClass, new OperationFunctionEval(instance, argCount)); + } + + /** + * Simple adapter from {@link OperationEval} to {@link Function} + */ + private static final class OperationFunctionEval implements OperationEval { + + private final Function _function; + private final int _numberOfOperands; + + public OperationFunctionEval(Function function, int argCount) { + _function = function; + _numberOfOperands = argCount; + } + + public ValueEval evaluate(ValueEval[] args, int rowIndex, short columnIndex) { + return _function.evaluate(args, rowIndex, columnIndex); + } + + public int getNumberOfOperands() { + return _numberOfOperands; + } + } + /** * returns the OperationEval concrete impl instance corresponding * to the supplied operationPtg diff --git a/src/testcases/org/apache/poi/hssf/record/formula/eval/EvalInstances.java b/src/testcases/org/apache/poi/hssf/record/formula/eval/EvalInstances.java new file mode 100644 index 0000000000..b6076938b3 --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/record/formula/eval/EvalInstances.java @@ -0,0 +1,53 @@ +/* ==================================================================== + 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.eval; + +import org.apache.poi.hssf.record.formula.functions.Function; + +/** + * Collects eval instances for easy access by tests in this package + * + * @author Josh Micich + */ +final class EvalInstances { + private EvalInstances() { + // no instances of this class + } + + public static final Function Add = TwoOperandNumericOperation.AddEval; + public static final Function Subtract = TwoOperandNumericOperation.SubtractEval; + public static final Function Multiply = TwoOperandNumericOperation.MultiplyEval; + public static final Function Divide = TwoOperandNumericOperation.DivideEval; + + public static final Function Power = TwoOperandNumericOperation.PowerEval; + + public static final Function Percent = PercentEval.instance; + + public static final Function UnaryMinus = UnaryMinusEval.instance; + public static final Function UnaryPlus = UnaryPlusEval.instance; + + public static final Function Equal = RelationalOperationEval.EqualEval; + public static final Function LessThan = RelationalOperationEval.LessThanEval; + public static final Function LessEqual = RelationalOperationEval.LessEqualEval; + public static final Function GreaterThan = RelationalOperationEval.GreaterThanEval; + public static final Function GreaterEqual = RelationalOperationEval.GreaterEqualEval; + public static final Function NotEqual = RelationalOperationEval.NotEqualEval; + + public static final Function Range = RangeEval.instance; + public static final Function Concat = ConcatEval.instance; +} diff --git a/src/testcases/org/apache/poi/hssf/record/formula/eval/TestDivideEval.java b/src/testcases/org/apache/poi/hssf/record/formula/eval/TestDivideEval.java index 0b093e7dec..eedcbf9761 100644 --- a/src/testcases/org/apache/poi/hssf/record/formula/eval/TestDivideEval.java +++ b/src/testcases/org/apache/poi/hssf/record/formula/eval/TestDivideEval.java @@ -34,7 +34,7 @@ public final class TestDivideEval extends TestCase { arg0, arg1, }; - double result = NumericFunctionInvoker.invoke(DivideEval.instance, args, 0, 0); + double result = NumericFunctionInvoker.invoke(EvalInstances.Divide, args, 0, 0); assertEquals(expectedResult, result, 0); } @@ -56,7 +56,7 @@ public final class TestDivideEval extends TestCase { ValueEval[] args = { new NumberEval(5), NumberEval.ZERO, }; - ValueEval result = DivideEval.instance.evaluate(args, 0, (short) 0); + ValueEval result = EvalInstances.Divide.evaluate(args, 0, (short) 0); assertEquals(ErrorEval.DIV_ZERO, result); } } diff --git a/src/testcases/org/apache/poi/hssf/record/formula/eval/TestEqualEval.java b/src/testcases/org/apache/poi/hssf/record/formula/eval/TestEqualEval.java index c64a2a7fd7..78ef47cfc6 100644 --- a/src/testcases/org/apache/poi/hssf/record/formula/eval/TestEqualEval.java +++ b/src/testcases/org/apache/poi/hssf/record/formula/eval/TestEqualEval.java @@ -21,6 +21,7 @@ import junit.framework.AssertionFailedError; import junit.framework.TestCase; import org.apache.poi.hssf.record.formula.functions.EvalFactory; +import org.apache.poi.hssf.record.formula.functions.Function; /** * Test for {@link EqualEval} @@ -28,6 +29,8 @@ import org.apache.poi.hssf.record.formula.functions.EvalFactory; * @author Josh Micich */ public final class TestEqualEval extends TestCase { + // convenient access to namepace + private static final EvalInstances EI = null; /** * Test for bug observable at svn revision 692218 (Sep 2008)
    @@ -40,7 +43,7 @@ public final class TestEqualEval extends TestCase { EvalFactory.createAreaEval("B1:B1", values), BoolEval.FALSE, }; - ValueEval result = EqualEval.instance.evaluate(args, 10, (short)20); + ValueEval result = evaluate(EI.Equal, args, 10, 10); if (result instanceof ErrorEval) { if (result == ErrorEval.VALUE_INVALID) { throw new AssertionFailedError("Identified bug in evaluation of 1x1 area"); @@ -58,7 +61,7 @@ public final class TestEqualEval extends TestCase { new StringEval(""), BlankEval.INSTANCE, }; - ValueEval result = EqualEval.instance.evaluate(args, 10, (short)20); + ValueEval result = evaluate(EI.Equal, args, 10, 10); assertEquals(BoolEval.class, result.getClass()); BoolEval be = (BoolEval) result; if (!be.getBooleanValue()) { @@ -71,17 +74,17 @@ public final class TestEqualEval extends TestCase { * Test for bug 46613 (observable at svn r737248) */ public void testStringInsensitive_bug46613() { - if (!evalStringCmp("abc", "aBc", EqualEval.instance)) { + if (!evalStringCmp("abc", "aBc", EI.Equal)) { throw new AssertionFailedError("Identified bug 46613"); } - assertTrue(evalStringCmp("abc", "aBc", EqualEval.instance)); - assertTrue(evalStringCmp("ABC", "azz", LessThanEval.instance)); - assertTrue(evalStringCmp("abc", "AZZ", LessThanEval.instance)); - assertTrue(evalStringCmp("ABC", "aaa", GreaterThanEval.instance)); - assertTrue(evalStringCmp("abc", "AAA", GreaterThanEval.instance)); + assertTrue(evalStringCmp("abc", "aBc", EI.Equal)); + assertTrue(evalStringCmp("ABC", "azz", EI.LessThan)); + assertTrue(evalStringCmp("abc", "AZZ", EI.LessThan)); + assertTrue(evalStringCmp("ABC", "aaa", EI.GreaterThan)); + assertTrue(evalStringCmp("abc", "AAA", EI.GreaterThan)); } - private static boolean evalStringCmp(String a, String b, OperationEval cmpOp) { + private static boolean evalStringCmp(String a, String b, Function cmpOp) { ValueEval[] args = { new StringEval(a), new StringEval(b), @@ -103,13 +106,12 @@ public final class TestEqualEval extends TestCase { */ public void testZeroEquality_bug47198() { NumberEval zero = new NumberEval(0.0); - NumberEval mZero = (NumberEval) UnaryMinusEval.instance.evaluate(new ValueEval[] { zero, }, 0, - (short) 0); + NumberEval mZero = (NumberEval) evaluate(UnaryMinusEval.instance, new ValueEval[] { zero, }, 0, 0); if (Double.doubleToLongBits(mZero.getNumberValue()) == 0x8000000000000000L) { throw new AssertionFailedError("Identified bug 47198: unary minus should convert -0.0 to 0.0"); } ValueEval[] args = { zero, mZero, }; - BoolEval result = (BoolEval) EqualEval.instance.evaluate(args, 0, (short) 0); + BoolEval result = (BoolEval) evaluate(EI.Equal, args, 0, 0); if (!result.getBooleanValue()) { throw new AssertionFailedError("Identified bug 47198: -0.0 != 0.0"); } @@ -124,9 +126,13 @@ public final class TestEqualEval extends TestCase { assertEquals("1.0055", b.getStringValue()); ValueEval[] args = { a, b, }; - BoolEval result = (BoolEval) EqualEval.instance.evaluate(args, 0, (short) 0); + BoolEval result = (BoolEval) evaluate(EI.Equal, args, 0, 0); if (!result.getBooleanValue()) { throw new AssertionFailedError("Identified bug 47598: 1+1.0028-0.9973 != 1.0055"); } } + + private static ValueEval evaluate(Function oper, ValueEval[] args, int srcRowIx, int srcColIx) { + return oper.evaluate(args, srcRowIx, (short) srcColIx); + } } diff --git a/src/testcases/org/apache/poi/hssf/record/formula/eval/TestMinusZeroResult.java b/src/testcases/org/apache/poi/hssf/record/formula/eval/TestMinusZeroResult.java index 73383effae..d2f4cc748d 100644 --- a/src/testcases/org/apache/poi/hssf/record/formula/eval/TestMinusZeroResult.java +++ b/src/testcases/org/apache/poi/hssf/record/formula/eval/TestMinusZeroResult.java @@ -20,6 +20,7 @@ package org.apache.poi.hssf.record.formula.eval; import junit.framework.ComparisonFailure; import junit.framework.TestCase; +import org.apache.poi.hssf.record.formula.functions.Function; import org.apache.poi.util.HexDump; /** @@ -39,6 +40,8 @@ import org.apache.poi.util.HexDump; public final class TestMinusZeroResult extends TestCase { private static final double MINUS_ZERO = -0.0; + // convenient access to namepace + private static final EvalInstances EI = null; public void testSimpleOperators() { @@ -46,15 +49,15 @@ public final class TestMinusZeroResult extends TestCase { checkEval(MINUS_ZERO, UnaryPlusEval.instance, MINUS_ZERO); // most simple operators convert -0.0 to +0.0 - checkEval(0.0, UnaryMinusEval.instance, 0.0); - checkEval(0.0, PercentEval.instance, MINUS_ZERO); - checkEval(0.0, MultiplyEval.instance, MINUS_ZERO, 1.0); - checkEval(0.0, DivideEval.instance, MINUS_ZERO, 1.0); - checkEval(0.0, PowerEval.instance, MINUS_ZERO, 1.0); + checkEval(0.0, EI.UnaryMinus, 0.0); + checkEval(0.0, EI.Percent, MINUS_ZERO); + checkEval(0.0, EI.Multiply, MINUS_ZERO, 1.0); + checkEval(0.0, EI.Divide, MINUS_ZERO, 1.0); + checkEval(0.0, EI.Power, MINUS_ZERO, 1.0); // but SubtractEval does not convert -0.0, so '-' and '+' work like java - checkEval(MINUS_ZERO, SubtractEval.instance, MINUS_ZERO, 0.0); // this is the main point of bug 47198 - checkEval(0.0, AddEval.instance, MINUS_ZERO, 0.0); + checkEval(MINUS_ZERO, EI.Subtract, MINUS_ZERO, 0.0); // this is the main point of bug 47198 + checkEval(0.0, EI.Add, MINUS_ZERO, 0.0); } /** @@ -62,9 +65,9 @@ public final class TestMinusZeroResult extends TestCase { * gets to the comparison operator) */ public void testComparisonOperators() { - checkEval(false, EqualEval.instance, 0.0, MINUS_ZERO); - checkEval(true, GreaterThanEval.instance, 0.0, MINUS_ZERO); - checkEval(true, LessThanEval.instance, MINUS_ZERO, 0.0); + checkEval(false, EI.Equal, 0.0, MINUS_ZERO); + checkEval(true, EI.GreaterThan, 0.0, MINUS_ZERO); + checkEval(true, EI.LessThan, MINUS_ZERO, 0.0); } public void testTextRendering() { @@ -78,20 +81,20 @@ public final class TestMinusZeroResult extends TestCase { */ private static void confirmTextRendering(String expRendering, double d) { ValueEval[] args = { StringEval.EMPTY_INSTANCE, new NumberEval(d), }; - StringEval se = (StringEval) ConcatEval.instance.evaluate(args, -1, (short)-1); + StringEval se = (StringEval) EI.Concat.evaluate(args, -1, (short)-1); String result = se.getStringValue(); assertEquals(expRendering, result); } - private static void checkEval(double expectedResult, OperationEval instance, double... dArgs) { + private static void checkEval(double expectedResult, Function instance, double... dArgs) { NumberEval result = (NumberEval) evaluate(instance, dArgs); assertDouble(expectedResult, result.getNumberValue()); } - private static void checkEval(boolean expectedResult, OperationEval instance, double... dArgs) { + private static void checkEval(boolean expectedResult, Function instance, double... dArgs) { BoolEval result = (BoolEval) evaluate(instance, dArgs); assertEquals(expectedResult, result.getBooleanValue()); } - private static ValueEval evaluate(OperationEval instance, double... dArgs) { + private static ValueEval evaluate(Function instance, double... dArgs) { ValueEval[] evalArgs; evalArgs = new ValueEval[dArgs.length]; for (int i = 0; i < evalArgs.length; i++) { diff --git a/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java b/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java index 46b193def9..ae6524e882 100755 --- a/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java +++ b/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java @@ -41,8 +41,7 @@ public final class TestPercentEval extends TestCase { arg, }; - OperationEval opEval = PercentEval.instance; - double result = NumericFunctionInvoker.invoke(opEval, args, 0, 0); + double result = NumericFunctionInvoker.invoke(PercentEval.instance, args, 0, 0); assertEquals(expectedResult, result, 0); } diff --git a/src/testcases/org/apache/poi/hssf/record/formula/functions/NumericFunctionInvoker.java b/src/testcases/org/apache/poi/hssf/record/formula/functions/NumericFunctionInvoker.java index 31b45f622c..1d43923b2e 100755 --- a/src/testcases/org/apache/poi/hssf/record/formula/functions/NumericFunctionInvoker.java +++ b/src/testcases/org/apache/poi/hssf/record/formula/functions/NumericFunctionInvoker.java @@ -21,7 +21,6 @@ import junit.framework.AssertionFailedError; import org.apache.poi.hssf.record.formula.eval.ErrorEval; import org.apache.poi.hssf.record.formula.eval.NumericValueEval; -import org.apache.poi.hssf.record.formula.eval.OperationEval; import org.apache.poi.hssf.record.formula.eval.ValueEval; import org.apache.poi.ss.formula.eval.NotImplementedException; @@ -53,13 +52,7 @@ public final class NumericFunctionInvoker { * result causes the current junit test to fail. */ public static double invoke(Function f, ValueEval[] args) { - try { - return invokeInternal(f, args, -1, -1); - } catch (NumericEvalEx e) { - throw new AssertionFailedError("Evaluation of function (" + f.getClass().getName() - + ") failed: " + e.getMessage()); - } - + return invoke(f, args, -1, -1); } /** * Invokes the specified operator with the arguments. @@ -67,30 +60,22 @@ public final class NumericFunctionInvoker { * This method cannot be used for confirming error return codes. Any non-numeric evaluation * result causes the current junit test to fail. */ - public static double invoke(OperationEval f, ValueEval[] args, int srcCellRow, int srcCellCol) { + public static double invoke(Function f, ValueEval[] args, int srcCellRow, int srcCellCol) { try { return invokeInternal(f, args, srcCellRow, srcCellCol); } catch (NumericEvalEx e) { throw new AssertionFailedError("Evaluation of function (" + f.getClass().getName() + ") failed: " + e.getMessage()); } - } /** * Formats nicer error messages for the junit output */ - private static double invokeInternal(Object target, ValueEval[] args, int srcCellRow, int srcCellCol) + private static double invokeInternal(Function target, ValueEval[] args, int srcCellRow, int srcCellCol) throws NumericEvalEx { ValueEval evalResult; - // TODO - make OperationEval extend Function try { - if (target instanceof Function) { - Function ff = (Function) target; - evalResult = ff.evaluate(args, srcCellRow, (short)srcCellCol); - } else { - OperationEval ff = (OperationEval) target; - evalResult = ff.evaluate(args, srcCellRow, (short)srcCellCol); - } + evalResult = target.evaluate(args, srcCellRow, (short)srcCellCol); } catch (NotImplementedException e) { throw new NumericEvalEx("Not implemented:" + e.getMessage()); } -- 2.39.5