Replaced obsolete Eval with ValueEval in signature of Function.evaluate()

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@805119 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Josh Micich 2009-08-17 20:04:45 +00:00
parent b25137db49
commit e72a30c440
63 changed files with 338 additions and 476 deletions

View File

@ -20,7 +20,6 @@ package org.apache.poi.hssf.record.formula.atp;
import java.util.HashMap;
import java.util.Map;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.record.formula.functions.FreeRefFunction;
import org.apache.poi.ss.formula.EvaluationWorkbook;

View File

@ -20,7 +20,63 @@ package org.apache.poi.hssf.record.formula.eval;
import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
import org.apache.poi.hssf.record.formula.function.FunctionMetadata;
import org.apache.poi.hssf.record.formula.function.FunctionMetadataRegistry;
import org.apache.poi.hssf.record.formula.functions.*;
import org.apache.poi.hssf.record.formula.functions.AggregateFunction;
import org.apache.poi.hssf.record.formula.functions.And;
import org.apache.poi.hssf.record.formula.functions.CalendarFieldFunction;
import org.apache.poi.hssf.record.formula.functions.Choose;
import org.apache.poi.hssf.record.formula.functions.Column;
import org.apache.poi.hssf.record.formula.functions.Columns;
import org.apache.poi.hssf.record.formula.functions.Count;
import org.apache.poi.hssf.record.formula.functions.Counta;
import org.apache.poi.hssf.record.formula.functions.Countif;
import org.apache.poi.hssf.record.formula.functions.DateFunc;
import org.apache.poi.hssf.record.formula.functions.Errortype;
import org.apache.poi.hssf.record.formula.functions.Even;
import org.apache.poi.hssf.record.formula.functions.False;
import org.apache.poi.hssf.record.formula.functions.FinanceFunction;
import org.apache.poi.hssf.record.formula.functions.Find;
import org.apache.poi.hssf.record.formula.functions.FreeRefFunction;
import org.apache.poi.hssf.record.formula.functions.Function;
import org.apache.poi.hssf.record.formula.functions.Hlookup;
import org.apache.poi.hssf.record.formula.functions.Hyperlink;
import org.apache.poi.hssf.record.formula.functions.If;
import org.apache.poi.hssf.record.formula.functions.Index;
import org.apache.poi.hssf.record.formula.functions.Indirect;
import org.apache.poi.hssf.record.formula.functions.IsError;
import org.apache.poi.hssf.record.formula.functions.IsNa;
import org.apache.poi.hssf.record.formula.functions.Isblank;
import org.apache.poi.hssf.record.formula.functions.Isref;
import org.apache.poi.hssf.record.formula.functions.LogicalFunction;
import org.apache.poi.hssf.record.formula.functions.Lookup;
import org.apache.poi.hssf.record.formula.functions.Match;
import org.apache.poi.hssf.record.formula.functions.MinaMaxa;
import org.apache.poi.hssf.record.formula.functions.Mode;
import org.apache.poi.hssf.record.formula.functions.Na;
import org.apache.poi.hssf.record.formula.functions.Not;
import org.apache.poi.hssf.record.formula.functions.NotImplementedFunction;
import org.apache.poi.hssf.record.formula.functions.Now;
import org.apache.poi.hssf.record.formula.functions.NumericFunction;
import org.apache.poi.hssf.record.formula.functions.Odd;
import org.apache.poi.hssf.record.formula.functions.Offset;
import org.apache.poi.hssf.record.formula.functions.Or;
import org.apache.poi.hssf.record.formula.functions.Pi;
import org.apache.poi.hssf.record.formula.functions.Rand;
import org.apache.poi.hssf.record.formula.functions.Replace;
import org.apache.poi.hssf.record.formula.functions.Row;
import org.apache.poi.hssf.record.formula.functions.Rows;
import org.apache.poi.hssf.record.formula.functions.Substitute;
import org.apache.poi.hssf.record.formula.functions.Sumif;
import org.apache.poi.hssf.record.formula.functions.Sumproduct;
import org.apache.poi.hssf.record.formula.functions.Sumx2my2;
import org.apache.poi.hssf.record.formula.functions.Sumx2py2;
import org.apache.poi.hssf.record.formula.functions.Sumxmy2;
import org.apache.poi.hssf.record.formula.functions.T;
import org.apache.poi.hssf.record.formula.functions.TextFunction;
import org.apache.poi.hssf.record.formula.functions.Time;
import org.apache.poi.hssf.record.formula.functions.Today;
import org.apache.poi.hssf.record.formula.functions.True;
import org.apache.poi.hssf.record.formula.functions.Value;
import org.apache.poi.hssf.record.formula.functions.Vlookup;
import org.apache.poi.ss.formula.eval.NotImplementedException;
/**
@ -151,8 +207,8 @@ public final class FunctionEval implements OperationEval {
retval[124] = new Find();
retval[127] = new Istext();
retval[128] = new Isnumber();
retval[127] = LogicalFunction.IsText;
retval[128] = LogicalFunction.IsNumber;
retval[129] = new Isblank();
retval[130] = new T();
@ -163,9 +219,9 @@ public final class FunctionEval implements OperationEval {
retval[183] = AggregateFunction.PRODUCT;
retval[184] = NumericFunction.FACT;
retval[190] = new Isnontext();
retval[190] = LogicalFunction.IsNonText;
retval[198] = new Islogical();
retval[198] = LogicalFunction.IsLogical;
retval[212] = NumericFunction.ROUNDUP;
retval[213] = NumericFunction.ROUNDDOWN;
@ -248,7 +304,7 @@ public final class FunctionEval implements OperationEval {
if (f == null) {
throw new NotImplementedException("FuncIx=" + getFunctionIndex());
}
return (ValueEval) f.evaluate(operands, srcRow, srcCol);
return f.evaluate(operands, srcRow, srcCol);
}
public int getNumberOfOperands() {

View File

@ -39,7 +39,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
*/
public abstract class BooleanFunction implements Function {
public final Eval evaluate(Eval[] args, int srcRow, short srcCol) {
public final ValueEval evaluate(ValueEval[] args, int srcRow, short srcCol) {
if (args.length < 1) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -22,7 +22,6 @@ import java.util.Date;
import java.util.GregorianCalendar;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
@ -49,7 +48,7 @@ public final class CalendarFieldFunction implements Function {
_needsOneBaseAdjustment = needsOneBaseAdjustment;
}
public Eval evaluate(Eval[] operands, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] operands, int srcCellRow, short srcCellCol) {
if (operands.length != 1) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -18,7 +18,6 @@
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.Eval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
@ -29,7 +28,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
*/
public final class Choose implements Function {
public Eval evaluate(Eval[] args, int srcRowIndex, short srcColumnIndex) {
public ValueEval evaluate(ValueEval[] args, int srcRowIndex, short srcColumnIndex) {
if (args.length < 2) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -19,13 +19,12 @@ package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.AreaEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
public final class Column implements Function {
public Eval evaluate(Eval[] evals, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] evals, int srcCellRow, short srcCellCol) {
ValueEval retval = null;
int cnum = -1;

View File

@ -22,6 +22,7 @@ import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
/**
* Implementation for Excel COLUMNS function.
@ -30,7 +31,7 @@ import org.apache.poi.hssf.record.formula.eval.RefEval;
*/
public final class Columns implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
switch(args.length) {
case 1:
// expected

View File

@ -21,6 +21,7 @@ import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.MissingArgEval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.record.formula.functions.CountUtils.I_MatchPredicate;
/**
@ -36,7 +37,7 @@ import org.apache.poi.hssf.record.formula.functions.CountUtils.I_MatchPredicate;
*/
public final class Count implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
int nArgs = args.length;
if (nArgs < 1) {
// too few arguments

View File

@ -21,6 +21,7 @@ import org.apache.poi.hssf.record.formula.eval.BlankEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.record.formula.functions.CountUtils.I_MatchPredicate;
/**
@ -34,7 +35,7 @@ import org.apache.poi.hssf.record.formula.functions.CountUtils.I_MatchPredicate;
*/
public final class Counta implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
int nArgs = args.length;
if (nArgs < 1) {
// too few arguments

View File

@ -29,6 +29,7 @@ import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.StringEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.record.formula.functions.CountUtils.I_MatchPredicate;
import org.apache.poi.ss.usermodel.ErrorConstants;
@ -400,7 +401,7 @@ public final class Countif implements Function {
}
}
public Eval evaluate(Eval[] args, int srcRowIndex, short srcColumnIndex) {
public ValueEval evaluate(ValueEval[] args, int srcRowIndex, short srcColumnIndex) {
switch(args.length) {
case 2:
// expected

View File

@ -18,10 +18,10 @@
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.Eval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
/**
@ -52,7 +52,7 @@ import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
*/
public final class Errortype implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
try {
OperandResolver.getSingleValue(args[0], srcCellRow, srcCellCol);

View File

@ -19,7 +19,6 @@ package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
/**
@ -28,7 +27,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
*/
public final class False implements Function {
public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
public ValueEval evaluate(ValueEval[] operands, int srcRow, short srcCol) {
ValueEval retval;
switch (operands.length) {
default:

View File

@ -19,7 +19,6 @@ package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.BlankEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.MissingArgEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
@ -31,16 +30,14 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
public interface Function {
/**
* @param args the evaluated function arguments. Elements of this array typically implement
* {@link ValueEval}. Empty values are represented with {@link BlankEval} or {@link
* MissingArgEval}, never <code>null</code>.
* @param args the evaluated function arguments. Empty values are represented with
* {@link BlankEval} or {@link MissingArgEval}, never <code>null</code>.
* @param srcRowIndex row index of the cell containing the formula under evaluation
* @param srcColumnIndex column index of the cell containing the formula under evaluation
* @return The evaluated result, possibly an {@link ErrorEval}, never <code>null</code>.
* <b>Note</b> - Excel uses the error code <i>#NUM!</i> instead of IEEE <i>NaN</i>, so when
* numeric functions evaluate to {@link Double#NaN} be sure to translate the result to {@link
* ErrorEval#NUM_ERROR}.
*
*/
Eval evaluate(Eval[] args, int srcRowIndex, short srcColumnIndex);
ValueEval evaluate(ValueEval[] args, int srcRowIndex, short srcColumnIndex);
}

View File

@ -42,7 +42,7 @@ import org.apache.poi.hssf.record.formula.functions.LookupUtils.ValueVector;
*/
public final class Hlookup implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
Eval arg3 = null;
switch(args.length) {
case 4:

View File

@ -18,10 +18,10 @@
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.Eval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.StringEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
/**
* Implementation of Excel HYPERLINK function.<p/>
@ -41,7 +41,7 @@ import org.apache.poi.hssf.record.formula.eval.StringEval;
*/
public final class Hyperlink implements Function {
public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
public ValueEval evaluate(ValueEval[] operands, int srcRow, short srcCol) {
int lastArgIx = operands.length - 1;
if (lastArgIx < 0 || lastArgIx > 1) {
return ErrorEval.VALUE_INVALID;

View File

@ -19,7 +19,6 @@ package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
@ -30,8 +29,8 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
*/
public final class If implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
Eval falseResult;
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
ValueEval falseResult;
switch (args.length) {
case 3:
falseResult = args[2];
@ -54,7 +53,7 @@ public final class If implements Function {
return falseResult;
}
private static boolean evaluateFirstArg(Eval arg, int srcCellRow, short srcCellCol)
private static boolean evaluateFirstArg(ValueEval arg, int srcCellRow, short srcCellCol)
throws EvaluationException {
ValueEval ve = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol);
Boolean b = OperandResolver.coerceValueToBoolean(ve, false);

View File

@ -47,7 +47,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
*/
public final class Index implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
int nArgs = args.length;
if(nArgs < 2) {
// too few arguments

View File

@ -20,7 +20,6 @@ package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.AreaEval;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
@ -30,7 +29,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
*/
public final class IsError implements Function {
public Eval evaluate(Eval[] operands, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] operands, int srcCellRow, short srcCellCol) {
ValueEval retval = null;
boolean b = false;

View File

@ -22,6 +22,7 @@ import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.ss.usermodel.ErrorConstants;
/**
@ -38,7 +39,7 @@ import org.apache.poi.ss.usermodel.ErrorConstants;
*/
public final class IsNa implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
if(args.length != 1) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -31,7 +31,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
*/
public final class Isblank implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
if(args.length != 1) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -1,53 +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.functions;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
/**
* @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
*
*/
public final class Islogical extends LogicalFunction {
public Eval evaluate(Eval[] operands, int srcCellRow, short srcCellCol) {
Eval retval = BoolEval.FALSE;
switch (operands.length) {
default:
retval = ErrorEval.VALUE_INVALID;
break;
case 1:
Eval eval = operands[0];
if (eval instanceof BoolEval) {
retval = BoolEval.TRUE;
}
else if (eval instanceof RefEval) {
Eval xlatedEval = xlateRefEval((RefEval) eval);
if (xlatedEval instanceof BoolEval) {
retval = BoolEval.TRUE;
}
}
}
return retval;
}
}

View File

@ -1,53 +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.functions;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.StringEval;
/**
* @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
*
*/
public final class Isnontext extends LogicalFunction {
public Eval evaluate(Eval[] operands, int srcCellRow, short srcCellCol) {
Eval retval = BoolEval.TRUE;
switch (operands.length) {
default:
retval = ErrorEval.VALUE_INVALID;
break;
case 1:
Eval eval = operands[0];
if (eval instanceof StringEval) {
retval = BoolEval.FALSE;
}
else if (eval instanceof RefEval) {
Eval xlatedEval = xlateRefEval((RefEval) eval);
if (xlatedEval instanceof StringEval) {
retval = BoolEval.FALSE;
}
}
}
return retval;
}
}

View File

@ -1,53 +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.functions;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
/**
* @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
*
*/
public final class Isnumber extends LogicalFunction {
public Eval evaluate(Eval[] operands, int srcCellRow, short srcCellCol) {
Eval retval = BoolEval.FALSE;
switch (operands.length) {
default:
retval = ErrorEval.VALUE_INVALID;
break;
case 1:
Eval eval = operands[0];
if (eval instanceof NumberEval) {
retval = BoolEval.TRUE;
}
else if (eval instanceof RefEval) {
Eval xlatedEval = xlateRefEval((RefEval) eval);
if (xlatedEval instanceof NumberEval) {
retval = BoolEval.TRUE;
}
}
}
return retval;
}
}

View File

@ -22,26 +22,22 @@ import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
/**
* @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
*
*/
public final class Isref implements Function {
public Eval evaluate(Eval[] operands, int srcCellRow, short srcCellCol) {
Eval retval = BoolEval.FALSE;
public ValueEval evaluate(ValueEval[] operands, int srcCellRow, short srcCellCol) {
if (operands.length != 1) {
return ErrorEval.VALUE_INVALID;
}
switch (operands.length) {
default:
retval = ErrorEval.VALUE_INVALID;
break;
case 1:
Eval eval = operands[0];
if (eval instanceof RefEval || eval instanceof AreaEval) {
retval = BoolEval.TRUE;
}
}
Eval eval = operands[0];
if (eval instanceof RefEval || eval instanceof AreaEval) {
return BoolEval.TRUE;
}
return retval;
}
return BoolEval.FALSE;
}
}

View File

@ -1,53 +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.functions;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.StringEval;
/**
* @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
*
*/
public final class Istext extends LogicalFunction {
public Eval evaluate(Eval[] operands, int srcCellRow, short srcCellCol) {
Eval retval = BoolEval.FALSE;
switch (operands.length) {
default:
retval = ErrorEval.VALUE_INVALID;
break;
case 1:
Eval eval = operands[0];
if (eval instanceof StringEval) {
retval = BoolEval.TRUE;
}
else if (eval instanceof RefEval) {
Eval xlatedEval = xlateRefEval((RefEval) eval);
if (xlatedEval instanceof StringEval) {
retval = BoolEval.TRUE;
}
}
}
return retval;
}
}

View File

@ -17,28 +17,76 @@
package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.StringEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
/**
* @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
*
*/
public abstract class LogicalFunction implements Function {
/**
* recursively evaluate any RefEvals
* TODO - use {@link OperandResolver}
*/
protected ValueEval xlateRefEval(RefEval reval) {
ValueEval retval = reval.getInnerValueEval();
/**
* recursively evaluate any RefEvals TODO - use {@link OperandResolver}
*/
private static ValueEval xlateRefEval(RefEval reval) {
ValueEval retval = reval.getInnerValueEval();
if (retval instanceof RefEval) {
RefEval re = (RefEval) retval;
retval = xlateRefEval(re);
}
if (retval instanceof RefEval) {
RefEval re = (RefEval) retval;
retval = xlateRefEval(re);
}
return retval;
}
return retval;
}
public final ValueEval evaluate(ValueEval[] operands, int srcCellRow, short srcCellCol) {
if (operands.length != 1) {
return ErrorEval.VALUE_INVALID;
}
ValueEval ve;
try {
ve = OperandResolver.getSingleValue(operands[0], srcCellRow, srcCellCol);
} catch (EvaluationException e) {
if (false) {
// Note - it is more usual to propagate error codes straight to the result like this:
return e.getErrorEval();
// but logical functions behave a little differently
}
// this will usually cause a 'FALSE' result except for ISNONTEXT()
ve = e.getErrorEval();
}
if (ve instanceof RefEval) {
ve = xlateRefEval((RefEval) ve);
}
return BoolEval.valueOf(evaluate(ve));
}
protected abstract boolean evaluate(ValueEval arg);
public static final Function IsLogical = new LogicalFunction() {
protected boolean evaluate(ValueEval arg) {
return arg instanceof BoolEval;
}
};
public static final Function IsNonText = new LogicalFunction() {
protected boolean evaluate(ValueEval arg) {
return !(arg instanceof StringEval);
}
};
public static final Function IsNumber = new LogicalFunction() {
protected boolean evaluate(ValueEval arg) {
return arg instanceof NumberEval;
}
};
public static final Function IsText = new LogicalFunction() {
protected boolean evaluate(ValueEval arg) {
return arg instanceof StringEval;
}
};
}

View File

@ -19,7 +19,6 @@ package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.AreaEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
@ -41,7 +40,7 @@ import org.apache.poi.hssf.record.formula.functions.LookupUtils.ValueVector;
*/
public final class Lookup implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
switch(args.length) {
case 3:
break;

View File

@ -67,7 +67,7 @@ import org.apache.poi.hssf.record.formula.functions.LookupUtils.ValueVector;
public final class Match implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
double match_type = 1; // default

View File

@ -74,7 +74,7 @@ public final class Mode implements Function {
}
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
double result;
try {
List<Double> temp = new ArrayList<Double>();

View File

@ -83,7 +83,7 @@ public abstract class MultiOperandNumericFunction implements Function {
private static final int DEFAULT_MAX_NUM_OPERANDS = 30;
public final Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public final ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
double d;
try {

View File

@ -18,7 +18,7 @@
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.Eval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
/**
* Implementation of Excel function NA()
@ -27,7 +27,7 @@ import org.apache.poi.hssf.record.formula.eval.Eval;
*/
public final class Na implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
return ErrorEval.NA;
}

View File

@ -19,7 +19,6 @@ package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
@ -33,7 +32,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
*/
public final class Not implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
if (args.length != 1) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -17,7 +17,7 @@
package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.ss.formula.eval.NotImplementedException;
/**
@ -38,7 +38,7 @@ public final class NotImplementedFunction implements Function {
_functionName = name;
}
public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
public ValueEval evaluate(ValueEval[] operands, int srcRow, short srcCol) {
throw new NotImplementedException(_functionName);
}
public String getFunctionName() {

View File

@ -20,8 +20,8 @@ package org.apache.poi.hssf.record.formula.functions;
import java.util.Date;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
/**
@ -31,7 +31,7 @@ import org.apache.poi.hssf.usermodel.HSSFDateUtil;
*/
public final class Now implements Function {
public Eval evaluate(Eval[] evals, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] evals, int srcCellRow, short srcCellCol) {
if (evals.length > 0) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -46,7 +46,7 @@ public abstract class NumericFunction implements Function {
}
}
public final Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public final ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
double result;
try {
result = eval(args, srcCellRow, srcCellCol);

View File

@ -164,7 +164,7 @@ public final class Offset implements Function {
}
}
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
if(args.length < 3 || args.length > 5) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -18,7 +18,6 @@
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.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
@ -30,7 +29,7 @@ public final class Pi implements Function {
private static final NumberEval PI_EVAL = new NumberEval(Math.PI);
public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
public ValueEval evaluate(ValueEval[] operands, int srcRow, short srcCol) {
ValueEval retval;
switch (operands.length) {
default:

View File

@ -18,7 +18,6 @@
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.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
@ -28,7 +27,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
*/
public final class Rand implements Function {
public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
public ValueEval evaluate(ValueEval[] operands, int srcRow, short srcCol) {
ValueEval retval;
switch (operands.length) {
default:

View File

@ -19,14 +19,13 @@ package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.AreaEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
public final class Row implements Function {
public Eval evaluate(Eval[] evals, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] evals, int srcCellRow, short srcCellCol) {
ValueEval retval = null;
int rnum = -1;

View File

@ -22,6 +22,7 @@ import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
/**
* Implementation for Excel ROWS function.
@ -30,7 +31,7 @@ import org.apache.poi.hssf.record.formula.eval.RefEval;
*/
public final class Rows implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
switch(args.length) {
case 1:
// expected

View File

@ -41,7 +41,7 @@ import org.apache.poi.hssf.record.formula.functions.CountUtils.I_MatchPredicate;
*/
public final class Sumif implements Function {
public Eval evaluate(Eval[] args, int srcRowIndex, short srcColumnIndex) {
public ValueEval evaluate(ValueEval[] args, int srcRowIndex, short srcColumnIndex) {
if (args.length < 2) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -20,7 +20,6 @@ package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.AreaEval;
import org.apache.poi.hssf.record.formula.eval.BlankEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
@ -54,14 +53,14 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
public final class Sumproduct implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
int maxN = args.length;
if(maxN < 1) {
return ErrorEval.VALUE_INVALID;
}
Eval firstArg = args[0];
ValueEval firstArg = args[0];
try {
if(firstArg instanceof NumericValueEval) {
return evaluateSingleProduct(args);
@ -83,7 +82,7 @@ public final class Sumproduct implements Function {
+ firstArg.getClass().getName() + ")");
}
private static Eval evaluateSingleProduct(Eval[] evalArgs) throws EvaluationException {
private static ValueEval evaluateSingleProduct(ValueEval[] evalArgs) throws EvaluationException {
int maxN = evalArgs.length;
double term = 1D;
@ -94,9 +93,9 @@ public final class Sumproduct implements Function {
return new NumberEval(term);
}
private static double getScalarValue(Eval arg) throws EvaluationException {
private static double getScalarValue(ValueEval arg) throws EvaluationException {
Eval eval;
ValueEval eval;
if (arg instanceof RefEval) {
RefEval re = (RefEval) arg;
eval = re.getInnerValueEval();
@ -116,15 +115,10 @@ public final class Sumproduct implements Function {
eval = ae.getRelativeValue(0, 0);
}
if (!(eval instanceof ValueEval)) {
throw new RuntimeException("Unexpected value eval class ("
+ eval.getClass().getName() + ")");
}
return getProductTerm((ValueEval) eval, true);
return getProductTerm(eval, true);
}
private static Eval evaluateAreaSumProduct(Eval[] evalArgs) throws EvaluationException {
private static ValueEval evaluateAreaSumProduct(ValueEval[] evalArgs) throws EvaluationException {
int maxN = evalArgs.length;
AreaEval[] args = new AreaEval[maxN];
try {

View File

@ -18,20 +18,20 @@
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.Eval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.StringEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
public final class T implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
switch (args.length) {
default:
return ErrorEval.VALUE_INVALID;
case 1:
break;
}
Eval arg = args[0];
ValueEval arg = args[0];
if (arg instanceof RefEval) {
RefEval re = (RefEval) arg;
arg = re.getInnerValueEval();

View File

@ -43,7 +43,7 @@ public abstract class TextFunction implements Function {
return OperandResolver.coerceValueToInt(ve);
}
public final Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public final ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
try {
return evaluateFunc(args, srcCellRow, srcCellCol);
} catch (EvaluationException e) {

View File

@ -38,7 +38,7 @@ public final class Time implements Function {
private static final int SECONDS_PER_DAY = HOURS_PER_DAY * SECONDS_PER_HOUR;
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
if (args.length != 3) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -21,8 +21,8 @@ import java.util.Calendar;
import java.util.GregorianCalendar;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
/**
@ -32,7 +32,7 @@ import org.apache.poi.hssf.usermodel.HSSFDateUtil;
*/
public final class Today implements Function {
public Eval evaluate(Eval[] evals, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] evals, int srcCellRow, short srcCellCol) {
if (evals.length > 0) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -19,7 +19,6 @@ package org.apache.poi.hssf.record.formula.functions;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
/**
@ -28,7 +27,7 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
*/
public final class True implements Function {
public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
public ValueEval evaluate(ValueEval[] operands, int srcRow, short srcCol) {
ValueEval retval;
switch (operands.length) {
default:

View File

@ -18,7 +18,6 @@
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.Eval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
@ -42,7 +41,7 @@ public final class Value implements Function {
private static final int MIN_DISTANCE_BETWEEN_THOUSANDS_SEPARATOR = 4;
private static final Double ZERO = new Double(0.0);
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
if (args.length != 1) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -42,7 +42,7 @@ import org.apache.poi.hssf.record.formula.functions.LookupUtils.ValueVector;
*/
public final class Vlookup implements Function {
public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
Eval arg3 = null;
switch(args.length) {
case 4:

View File

@ -97,7 +97,7 @@ public abstract class XYNumericFunction implements Function {
*/
protected abstract Accumulator createAccumulator();
public final Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
public final ValueEval evaluate(ValueEval[] args, int srcCellRow, short srcCellCol) {
if (args.length != 2) {
return ErrorEval.VALUE_INVALID;
}

View File

@ -22,7 +22,6 @@ import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.eval.BlankEval;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
/**
@ -32,18 +31,18 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
*/
public final class TestAverage extends TestCase {
private static Eval invokeAverage(Eval[] args) {
private static ValueEval invokeAverage(ValueEval[] args) {
return AggregateFunction.AVERAGE.evaluate(args, -1, (short)-1);
}
private void confirmAverage(Eval[] args, double expected) {
Eval result = invokeAverage(args);
private void confirmAverage(ValueEval[] args, double expected) {
ValueEval result = invokeAverage(args);
assertEquals(NumberEval.class, result.getClass());
assertEquals(expected, ((NumberEval)result).getNumberValue(), 0);
}
private void confirmAverage(Eval[] args, ErrorEval expectedError) {
Eval result = invokeAverage(args);
private void confirmAverage(ValueEval[] args, ErrorEval expectedError) {
ValueEval result = invokeAverage(args);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(expectedError.getErrorCode(), ((ErrorEval)result).getErrorCode());
}

View File

@ -101,7 +101,7 @@ public final class TestIndex extends TestCase {
ValueEval[] args = new ValueEval[] { arg0, MissingArgEval.instance, new NumberEval(2), };
ValueEval actualResult;
try {
actualResult = (ValueEval) FUNC_INST.evaluate(args, 1, (short)1);
actualResult = FUNC_INST.evaluate(args, 1, (short)1);
} catch (RuntimeException e) {
if (e.getMessage().equals("Unexpected arg eval type (org.apache.poi.hssf.record.formula.eval.MissingArgEval")) {
throw new AssertionFailedError("Identified bug 47048b - INDEX() should support missing-arg");

View File

@ -22,45 +22,44 @@ import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.eval.BlankEval;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
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;
/**
* Tests for Excel function LEN()
*
*
* @author Josh Micich
*/
public final class TestLen extends TestCase {
private static Eval invokeLen(Eval text) {
Eval[] args = new Eval[] { text, };
private static ValueEval invokeLen(ValueEval text) {
ValueEval[] args = new ValueEval[] { text, };
return TextFunction.LEN.evaluate(args, -1, (short)-1);
}
private void confirmLen(Eval text, int expected) {
Eval result = invokeLen(text);
private void confirmLen(ValueEval text, int expected) {
ValueEval result = invokeLen(text);
assertEquals(NumberEval.class, result.getClass());
assertEquals(expected, ((NumberEval)result).getNumberValue(), 0);
}
private void confirmLen(Eval text, ErrorEval expectedError) {
Eval result = invokeLen(text);
private void confirmLen(ValueEval text, ErrorEval expectedError) {
ValueEval result = invokeLen(text);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(expectedError.getErrorCode(), ((ErrorEval)result).getErrorCode());
}
public void testBasic() {
confirmLen(new StringEval("galactic"), 8);
}
/**
* Valid cases where text arg is not exactly a string
*/
public void testUnusualArgs() {
// text (first) arg type is number, other args are strings with fractional digits
// text (first) arg type is number, other args are strings with fractional digits
confirmLen(new NumberEval(123456), 6);
confirmLen(BoolEval.FALSE, 5);
confirmLen(BoolEval.TRUE, 4);

View File

@ -22,7 +22,6 @@ import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.eval.AreaEval;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
import org.apache.poi.hssf.record.formula.eval.StringEval;
@ -41,11 +40,11 @@ public final class TestMatch extends TestCase {
private static final NumberEval MATCH_SMALLEST_GTE = new NumberEval(-1);
private static Eval invokeMatch(Eval lookup_value, Eval lookup_array, Eval match_type) {
Eval[] args = { lookup_value, lookup_array, match_type, };
private static ValueEval invokeMatch(ValueEval lookup_value, ValueEval lookup_array, ValueEval match_type) {
ValueEval[] args = { lookup_value, lookup_array, match_type, };
return new Match().evaluate(args, -1, (short)-1);
}
private static void confirmInt(int expected, Eval actualEval) {
private static void confirmInt(int expected, ValueEval actualEval) {
if(!(actualEval instanceof NumericValueEval)) {
fail("Expected numeric result");
}

View File

@ -23,7 +23,6 @@ import org.apache.poi.hssf.record.formula.eval.AreaEval;
import org.apache.poi.hssf.record.formula.eval.BlankEval;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
import org.apache.poi.hssf.record.formula.eval.StringEval;
@ -36,19 +35,19 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
public final class TestMid extends TestCase {
private static Eval invokeMid(Eval text, Eval startPos, Eval numChars) {
Eval[] args = new Eval[] { text, startPos, numChars, };
private static ValueEval invokeMid(ValueEval text, ValueEval startPos, ValueEval numChars) {
ValueEval[] args = new ValueEval[] { text, startPos, numChars, };
return TextFunction.MID.evaluate(args, -1, (short)-1);
}
private void confirmMid(Eval text, Eval startPos, Eval numChars, String expected) {
Eval result = invokeMid(text, startPos, numChars);
private void confirmMid(ValueEval text, ValueEval startPos, ValueEval numChars, String expected) {
ValueEval result = invokeMid(text, startPos, numChars);
assertEquals(StringEval.class, result.getClass());
assertEquals(expected, ((StringEval)result).getStringValue());
}
private void confirmMid(Eval text, Eval startPos, Eval numChars, ErrorEval expectedError) {
Eval result = invokeMid(text, startPos, numChars);
private void confirmMid(ValueEval text, ValueEval startPos, ValueEval numChars, ErrorEval expectedError) {
ValueEval result = invokeMid(text, startPos, numChars);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(expectedError.getErrorCode(), ((ErrorEval)result).getErrorCode());
}

View File

@ -19,8 +19,8 @@ package org.apache.poi.hssf.record.formula.functions;
import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
@ -29,18 +29,18 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* Tests for {@link FinanceFunction#NPER}
*
*
* @author Josh Micich
*/
public final class TestNper extends TestCase {
public void testSimpleEvaluate() {
Eval[] args = {
ValueEval[] args = {
new NumberEval(0.05),
new NumberEval(250),
new NumberEval(-1000),
};
Eval result = FinanceFunction.NPER.evaluate(args, 0, (short)0);
ValueEval result = FinanceFunction.NPER.evaluate(args, 0, (short)0);
assertEquals(NumberEval.class, result.getClass());
assertEquals(4.57353557, ((NumberEval)result).getNumberValue(), 0.00000001);

View File

@ -21,12 +21,11 @@ import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
/**
*
* @author Josh Micich
*/
public final class TestPmt extends TestCase {
@ -35,14 +34,14 @@ public final class TestPmt extends TestCase {
// only asserting accuracy to 4 fractional digits
assertEquals(expected, ne.getNumberValue(), 0.00005);
}
private static Eval invoke(Eval[] args) {
private static ValueEval invoke(ValueEval[] args) {
return FinanceFunction.PMT.evaluate(args, -1, (short)-1);
}
/**
* Invocation when not expecting an error result
*/
private static NumberEval invokeNormal(Eval[] args) {
Eval ev = invoke(args);
private static NumberEval invokeNormal(ValueEval[] args) {
ValueEval ev = invoke(args);
if(ev instanceof ErrorEval) {
throw new AssertionFailedError("Normal evaluation failed with error code: "
+ ev.toString());
@ -51,7 +50,7 @@ public final class TestPmt extends TestCase {
}
private static void confirm(double expected, double rate, double nper, double pv, double fv, boolean isBeginning) {
Eval[] args = {
ValueEval[] args = {
new NumberEval(rate),
new NumberEval(nper),
new NumberEval(pv),
@ -68,20 +67,20 @@ public final class TestPmt extends TestCase {
}
public void test3args() {
Eval[] args = {
ValueEval[] args = {
new NumberEval(0.005),
new NumberEval(24),
new NumberEval(1000),
};
Eval ev = invoke(args);
ValueEval ev = invoke(args);
if(ev instanceof ErrorEval) {
ErrorEval err = (ErrorEval) ev;
if(err.getErrorCode() == HSSFErrorConstants.ERROR_VALUE) {
throw new AssertionFailedError("Identified bug 44691");
}
}
confirm(-44.3206, invokeNormal(args));
}
}

View File

@ -20,31 +20,31 @@ package org.apache.poi.hssf.record.formula.functions;
import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.StringEval;
/**
* Test cases for ROUND(), ROUNDUP(), ROUNDDOWN()
*
*
* @author Josh Micich
*/
public final class TestRoundFuncs extends TestCase {
private static final NumericFunction F = null;
public void testRounddownWithStringArg() {
Eval strArg = new StringEval("abc");
Eval[] args = { strArg, new NumberEval(2), };
Eval result = F.ROUNDDOWN.evaluate(args, -1, (short)-1);
ValueEval strArg = new StringEval("abc");
ValueEval[] args = { strArg, new NumberEval(2), };
ValueEval result = F.ROUNDDOWN.evaluate(args, -1, (short)-1);
assertEquals(ErrorEval.VALUE_INVALID, result);
}
public void testRoundupWithStringArg() {
Eval strArg = new StringEval("abc");
Eval[] args = { strArg, new NumberEval(2), };
Eval result = F.ROUNDUP.evaluate(args, -1, (short)-1);
ValueEval strArg = new StringEval("abc");
ValueEval[] args = { strArg, new NumberEval(2), };
ValueEval result = F.ROUNDUP.evaluate(args, -1, (short)-1);
assertEquals(ErrorEval.VALUE_INVALID, result);
}
}

View File

@ -21,7 +21,6 @@ import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.eval.AreaEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
import org.apache.poi.hssf.record.formula.eval.RefEval;
@ -29,16 +28,16 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
/**
* Test cases for SUMPRODUCT()
*
*
* @author Josh Micich
*/
public final class TestSumproduct extends TestCase {
private static Eval invokeSumproduct(Eval[] args) {
private static ValueEval invokeSumproduct(ValueEval[] args) {
// srcCellRow and srcCellColumn are ignored by SUMPRODUCT
return new Sumproduct().evaluate(args, -1, (short)-1);
}
private static void confirmDouble(double expected, Eval actualEval) {
private static void confirmDouble(double expected, ValueEval actualEval) {
if(!(actualEval instanceof NumericValueEval)) {
fail("Expected numeric result");
}
@ -49,11 +48,11 @@ public final class TestSumproduct extends TestCase {
public void testScalarSimple() {
RefEval refEval = EvalFactory.createRefEval("A1", new NumberEval(3));
Eval[] args = {
refEval,
ValueEval[] args = {
refEval,
new NumberEval(2),
};
Eval result = invokeSumproduct(args);
ValueEval result = invokeSumproduct(args);
confirmDouble(6D, result);
}
@ -70,9 +69,9 @@ public final class TestSumproduct extends TestCase {
};
AreaEval aeA = EvalFactory.createAreaEval("A1:A3", aValues);
AreaEval aeB = EvalFactory.createAreaEval("B1:B3", bValues);
Eval[] args = { aeA, aeB, };
Eval result = invokeSumproduct(args);
ValueEval[] args = { aeA, aeB, };
ValueEval result = invokeSumproduct(args);
confirmDouble(65D, result);
}
@ -83,27 +82,27 @@ public final class TestSumproduct extends TestCase {
AreaEval ae = EvalFactory.createAreaEval("A1:A1", new ValueEval[] { new NumberEval(7), });
Eval[] args = {
ae,
ValueEval[] args = {
ae,
new NumberEval(2),
};
Eval result = invokeSumproduct(args);
ValueEval result = invokeSumproduct(args);
confirmDouble(14D, result);
}
public void testMismatchAreaDimensions() {
AreaEval aeA = EvalFactory.createAreaEval("A1:A3", new ValueEval[3]);
AreaEval aeB = EvalFactory.createAreaEval("B1:D1", new ValueEval[3]);
Eval[] args;
args = new Eval[] { aeA, aeB, };
ValueEval[] args;
args = new ValueEval[] { aeA, aeB, };
assertEquals(ErrorEval.VALUE_INVALID, invokeSumproduct(args));
args = new Eval[] { aeA, new NumberEval(5), };
args = new ValueEval[] { aeA, new NumberEval(5), };
assertEquals(ErrorEval.VALUE_INVALID, invokeSumproduct(args));
}
public void testAreaWithErrorCell() {
ValueEval[] aValues = {
ErrorEval.REF_INVALID,
@ -112,7 +111,7 @@ public final class TestSumproduct extends TestCase {
AreaEval aeA = EvalFactory.createAreaEval("A1:A2", aValues);
AreaEval aeB = EvalFactory.createAreaEval("B1:B2", new ValueEval[2]);
Eval[] args = { aeA, aeB, };
ValueEval[] args = { aeA, aeB, };
assertEquals(ErrorEval.REF_INVALID, invokeSumproduct(args));
}
}

View File

@ -22,14 +22,13 @@ import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.eval.BlankEval;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
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;
/**
* Test cases for Excel function T()
*
*
* @author Josh Micich
*/
public final class TestTFunc extends TestCase {
@ -37,9 +36,9 @@ public final class TestTFunc extends TestCase {
/**
* @return the result of calling function T() with the specified argument
*/
private static Eval invokeT(Eval arg) {
Eval[] args = { arg, };
Eval result = new T().evaluate(args, -1, (short)-1);
private static ValueEval invokeT(ValueEval arg) {
ValueEval[] args = { arg, };
ValueEval result = new T().evaluate(args, -1, (short)-1);
assertNotNull("result may never be null", result);
return result;
}
@ -47,20 +46,20 @@ public final class TestTFunc extends TestCase {
* Simulates call: T(A1)
* where cell A1 has the specified innerValue
*/
private Eval invokeTWithReference(ValueEval innerValue) {
Eval arg = EvalFactory.createRefEval("$B$2", innerValue);
private ValueEval invokeTWithReference(ValueEval innerValue) {
ValueEval arg = EvalFactory.createRefEval("$B$2", innerValue);
return invokeT(arg);
}
private static void confirmText(String text) {
Eval arg = new StringEval(text);
Eval eval = invokeT(arg);
ValueEval arg = new StringEval(text);
ValueEval eval = invokeT(arg);
StringEval se = (StringEval) eval;
assertEquals(text, se.getStringValue());
}
public void testTextValues() {
confirmText("abc");
confirmText("");
confirmText(" ");
@ -68,26 +67,26 @@ public final class TestTFunc extends TestCase {
confirmText("123");
confirmText("TRUE");
}
private static void confirmError(Eval arg) {
Eval eval = invokeT(arg);
private static void confirmError(ValueEval arg) {
ValueEval eval = invokeT(arg);
assertTrue(arg == eval);
}
public void testErrorValues() {
confirmError(ErrorEval.VALUE_INVALID);
confirmError(ErrorEval.NA);
confirmError(ErrorEval.REF_INVALID);
}
private static void confirmString(Eval eval, String expected) {
private static void confirmString(ValueEval eval, String expected) {
assertTrue(eval instanceof StringEval);
assertEquals(expected, ((StringEval)eval).getStringValue());
}
private static void confirmOther(Eval arg) {
Eval eval = invokeT(arg);
private static void confirmOther(ValueEval arg) {
ValueEval eval = invokeT(arg);
confirmString(eval, "");
}
@ -98,8 +97,8 @@ public final class TestTFunc extends TestCase {
}
public void testRefValues() {
Eval eval;
ValueEval eval;
eval = invokeTWithReference(new StringEval("def"));
confirmString(eval, "def");
eval = invokeTWithReference(new StringEval(" "));
@ -109,7 +108,7 @@ public final class TestTFunc extends TestCase {
confirmString(eval, "");
eval = invokeTWithReference(BoolEval.TRUE);
confirmString(eval, "");
eval = invokeTWithReference(ErrorEval.NAME_INVALID);
assertTrue(eval == ErrorEval.NAME_INVALID);
}

View File

@ -22,36 +22,36 @@ import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.eval.BlankEval;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
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;
/**
* Tests for Excel function TRIM()
*
*
* @author Josh Micich
*/
public final class TestTrim extends TestCase {
private static Eval invokeTrim(Eval text) {
Eval[] args = new Eval[] { text, };
private static ValueEval invokeTrim(ValueEval text) {
ValueEval[] args = new ValueEval[] { text, };
return TextFunction.TRIM.evaluate(args, -1, (short)-1);
}
private void confirmTrim(Eval text, String expected) {
Eval result = invokeTrim(text);
private void confirmTrim(ValueEval text, String expected) {
ValueEval result = invokeTrim(text);
assertEquals(StringEval.class, result.getClass());
assertEquals(expected, ((StringEval)result).getStringValue());
}
private void confirmTrim(Eval text, ErrorEval expectedError) {
Eval result = invokeTrim(text);
private void confirmTrim(ValueEval text, ErrorEval expectedError) {
ValueEval result = invokeTrim(text);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(expectedError.getErrorCode(), ((ErrorEval)result).getErrorCode());
}
public void testBasic() {
confirmTrim(new StringEval(" hi "), "hi");
confirmTrim(new StringEval("hi "), "hi");
confirmTrim(new StringEval(" hi"), "hi");
@ -59,13 +59,13 @@ public final class TestTrim extends TestCase {
confirmTrim(new StringEval(""), "");
confirmTrim(new StringEval(" "), "");
}
/**
* Valid cases where text arg is not exactly a string
*/
public void testUnusualArgs() {
// text (first) arg type is number, other args are strings with fractional digits
// text (first) arg type is number, other args are strings with fractional digits
confirmTrim(new NumberEval(123456), "123456");
confirmTrim(BoolEval.FALSE, "FALSE");
confirmTrim(BoolEval.TRUE, "TRUE");

View File

@ -20,30 +20,30 @@ package org.apache.poi.hssf.record.formula.functions;
import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
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;
/**
* Tests for {@link Value}
*
*
* @author Josh Micich
*/
public final class TestValue extends TestCase {
private static Eval invokeValue(String strText) {
Eval[] args = new Eval[] { new StringEval(strText), };
private static ValueEval invokeValue(String strText) {
ValueEval[] args = new ValueEval[] { new StringEval(strText), };
return new Value().evaluate(args, -1, (short) -1);
}
private static void confirmValue(String strText, double expected) {
Eval result = invokeValue(strText);
ValueEval result = invokeValue(strText);
assertEquals(NumberEval.class, result.getClass());
assertEquals(expected, ((NumberEval) result).getNumberValue(), 0.0);
}
private static void confirmValueError(String strText) {
Eval result = invokeValue(strText);
ValueEval result = invokeValue(strText);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.VALUE_INVALID, result);
}

View File

@ -20,45 +20,44 @@ package org.apache.poi.hssf.record.formula.functions;
import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.Eval;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
/**
* Tests for Excel functions SUMX2MY2(), SUMX2PY2(), SUMXMY2()
*
*
* @author Josh Micich
*/
public final class TestXYNumericFunction extends TestCase {
private static final Function SUM_SQUARES = new Sumx2py2();
private static final Function DIFF_SQUARES = new Sumx2my2();
private static final Function SUM_SQUARES_OF_DIFFS = new Sumxmy2();
private static Eval invoke(Function function, Eval xArray, Eval yArray) {
Eval[] args = new Eval[] { xArray, yArray, };
private static ValueEval invoke(Function function, ValueEval xArray, ValueEval yArray) {
ValueEval[] args = new ValueEval[] { xArray, yArray, };
return function.evaluate(args, -1, (short)-1);
}
private void confirm(Function function, Eval xArray, Eval yArray, double expected) {
Eval result = invoke(function, xArray, yArray);
private void confirm(Function function, ValueEval xArray, ValueEval yArray, double expected) {
ValueEval result = invoke(function, xArray, yArray);
assertEquals(NumberEval.class, result.getClass());
assertEquals(expected, ((NumberEval)result).getNumberValue(), 0);
}
private void confirmError(Function function, Eval xArray, Eval yArray, ErrorEval expectedError) {
Eval result = invoke(function, xArray, yArray);
private void confirmError(Function function, ValueEval xArray, ValueEval yArray, ErrorEval expectedError) {
ValueEval result = invoke(function, xArray, yArray);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(expectedError.getErrorCode(), ((ErrorEval)result).getErrorCode());
}
private void confirmError(Eval xArray, Eval yArray, ErrorEval expectedError) {
private void confirmError(ValueEval xArray, ValueEval yArray, ErrorEval expectedError) {
confirmError(SUM_SQUARES, xArray, yArray, expectedError);
confirmError(DIFF_SQUARES, xArray, yArray, expectedError);
confirmError(SUM_SQUARES_OF_DIFFS, xArray, yArray, expectedError);
}
public void testBasic() {
ValueEval[] xValues = {
new NumberEval(1),
new NumberEval(2),
new NumberEval(1),
new NumberEval(2),
};
ValueEval areaEvalX = createAreaEval(xValues);
confirm(SUM_SQUARES, areaEvalX, areaEvalX, 10.0);
@ -66,27 +65,27 @@ public final class TestXYNumericFunction extends TestCase {
confirm(SUM_SQUARES_OF_DIFFS, areaEvalX, areaEvalX, 0.0);
ValueEval[] yValues = {
new NumberEval(3),
new NumberEval(4),
new NumberEval(3),
new NumberEval(4),
};
ValueEval areaEvalY = createAreaEval(yValues);
confirm(SUM_SQUARES, areaEvalX, areaEvalY, 30.0);
confirm(DIFF_SQUARES, areaEvalX, areaEvalY, -20.0);
confirm(SUM_SQUARES_OF_DIFFS, areaEvalX, areaEvalY, 8.0);
}
/**
* number of items in array is not limited to 30
*/
public void testLargeArrays() {
ValueEval[] xValues = createMockNumberArray(100, 3);
ValueEval[] yValues = createMockNumberArray(100, 2);
confirm(SUM_SQUARES, createAreaEval(xValues), createAreaEval(yValues), 1300.0);
confirm(DIFF_SQUARES, createAreaEval(xValues), createAreaEval(yValues), 500.0);
confirm(SUM_SQUARES_OF_DIFFS, createAreaEval(xValues), createAreaEval(yValues), 100.0);
}
private ValueEval[] createMockNumberArray(int size, double value) {
ValueEval[] result = new ValueEval[size];
@ -103,20 +102,20 @@ public final class TestXYNumericFunction extends TestCase {
public void testErrors() {
ValueEval[] xValues = {
ErrorEval.REF_INVALID,
new NumberEval(2),
ErrorEval.REF_INVALID,
new NumberEval(2),
};
ValueEval areaEvalX = createAreaEval(xValues);
ValueEval[] yValues = {
new NumberEval(2),
ErrorEval.NULL_INTERSECTION,
new NumberEval(2),
ErrorEval.NULL_INTERSECTION,
};
ValueEval areaEvalY = createAreaEval(yValues);
ValueEval[] zValues = { // wrong size
new NumberEval(2),
new NumberEval(2),
};
ValueEval areaEvalZ = createAreaEval(zValues);
// if either arg is an error, that error propagates
confirmError(ErrorEval.REF_INVALID, ErrorEval.NAME_INVALID, ErrorEval.REF_INVALID);
confirmError(areaEvalX, ErrorEval.NAME_INVALID, ErrorEval.NAME_INVALID);
@ -128,10 +127,9 @@ public final class TestXYNumericFunction extends TestCase {
// any error in an array item propagates up
confirmError(areaEvalX, areaEvalX, ErrorEval.REF_INVALID);
// search for errors array by array, not pair by pair
confirmError(areaEvalX, areaEvalY, ErrorEval.REF_INVALID);
confirmError(areaEvalY, areaEvalX, ErrorEval.NULL_INTERSECTION);
}
}