public void TestMissingArg() { ValueEval[] values = { new NumberEval(25.0), new NumberEval(26.0), new NumberEval(28.0), }; AreaEval arg0 = EvalFactory.CreateAreaEval("A10:C10", values); ValueEval[] args = new ValueEval[] { arg0, MissingArgEval.instance, new NumberEval(2), }; ValueEval actualResult; try { actualResult = FUNC_INST.Evaluate(args, -1, -1); } catch (Exception e) { if (e.Message.Equals("Unexpected arg eval type (Npoi.Core.hssf.Record.Formula.Eval.MissingArgEval")) { throw new AssertionException("Identified bug 47048b - INDEX() should support missing-arg"); } throw e; } // result should be an area eval "B10:B10" AreaEval ae = ConfirmAreaEval("B10:B10", actualResult); actualResult = ae.GetValue(0, 0); Assert.AreEqual(typeof(NumberEval), actualResult.GetType()); Assert.AreEqual(26.0, ((NumberEval)actualResult).NumberValue, 0.0); }
protected ValueEval SingleOperandEvaluate(Eval eval, int srcRow, short srcCol) { ValueEval retval; if (eval is AreaEval) { AreaEval ae = (AreaEval)eval; if (ae.Contains(srcRow, srcCol)) { // circular ref! retval = ErrorEval.CIRCULAR_REF_ERROR; } else if (ae.IsRow) { if (ae.ContainsColumn(srcCol)) { ValueEval ve = ae.GetValue(ae.FirstRow, srcCol); ve = Xlator.AttemptXlateToNumeric(ve); retval = Xlator.AttemptXlateToNumeric(ve); } else { retval = ErrorEval.VALUE_INVALID; } } else if (ae.IsColumn) { if (ae.ContainsRow(srcRow)) { ValueEval ve = ae.GetValue(srcRow, ae.FirstColumn); retval = Xlator.AttemptXlateToNumeric(ve); } else { retval = ErrorEval.VALUE_INVALID; } } else { retval = ErrorEval.VALUE_INVALID; } } else { retval = Xlator.AttemptXlateToNumeric((ValueEval)eval); } return(retval); }
/** * Returns an is StringValueEval or ErrorEval or BlankEval * * @param eval * @param srcRow * @param srcCol */ protected ValueEval SingleOperandEvaluate(Eval eval, int srcRow, short srcCol) { ValueEval retval; if (eval is AreaEval) { AreaEval ae = (AreaEval)eval; if (ae.Contains(srcRow, srcCol)) { // circular ref! retval = ErrorEval.CIRCULAR_REF_ERROR; } else if (ae.IsRow) { if (ae.ContainsColumn(srcCol)) { ValueEval ve = ae.GetValue(ae.FirstRow, srcCol); retval = InternalResolveEval(eval); } else { retval = ErrorEval.NAME_INVALID; } } else if (ae.IsColumn) { if (ae.ContainsRow(srcRow)) { ValueEval ve = ae.GetValue(srcRow, ae.FirstColumn); retval = InternalResolveEval(eval); } else { retval = ErrorEval.NAME_INVALID; } } else { retval = ErrorEval.NAME_INVALID; } } else { retval = InternalResolveEval(eval); } return(retval); }
/** * Resolve a ValueEval that's in an AreaEval. * * @param db AreaEval from which the cell to resolve is retrieved. * @param dbRow Relative row in the AreaEval. * @param dbCol Relative column in the AreaEval. * @return A ValueEval that is a NumberEval, StringEval, BoolEval, BlankEval or ErrorEval. */ private static ValueEval ResolveReference(AreaEval db, int dbRow, int dbCol) { try { return(OperandResolver.GetSingleValue(db.GetValue(dbRow, dbCol), db.FirstRow + dbRow, db.FirstColumn + dbCol)); } catch (EvaluationException e) { return(e.GetErrorEval()); } }