diff options
Diffstat (limited to 'calc_test.go')
-rw-r--r-- | calc_test.go | 317 |
1 files changed, 222 insertions, 95 deletions
diff --git a/calc_test.go b/calc_test.go index fc107cb..7592078 100644 --- a/calc_test.go +++ b/calc_test.go @@ -77,13 +77,16 @@ func TestCalcCellValue(t *testing.T) { "=CEILING(-22.25,-0.1)": "-22.3", "=CEILING(-22.25,-1)": "-23", "=CEILING(-22.25,-5)": "-25", + "=CEILING(22.25)": "23", // _xlfn.CEILING.MATH - "=_xlfn.CEILING.MATH(15.25,1)": "16", - "=_xlfn.CEILING.MATH(15.25,0.1)": "15.3", - "=_xlfn.CEILING.MATH(15.25,5)": "20", - "=_xlfn.CEILING.MATH(-15.25,1)": "-15", - "=_xlfn.CEILING.MATH(-15.25,1,1)": "-15", // should be 16 - "=_xlfn.CEILING.MATH(-15.25,10)": "-10", + "=_xlfn.CEILING.MATH(15.25,1)": "16", + "=_xlfn.CEILING.MATH(15.25,0.1)": "15.3", + "=_xlfn.CEILING.MATH(15.25,5)": "20", + "=_xlfn.CEILING.MATH(-15.25,1)": "-15", + "=_xlfn.CEILING.MATH(-15.25,1,1)": "-15", // should be 16 + "=_xlfn.CEILING.MATH(-15.25,10)": "-10", + "=_xlfn.CEILING.MATH(-15.25)": "-15", + "=_xlfn.CEILING.MATH(-15.25,-5,-1)": "-10", // _xlfn.CEILING.PRECISE "=_xlfn.CEILING.PRECISE(22.25,0.1)": "22.3", "=_xlfn.CEILING.PRECISE(22.25,0.5)": "22.5", @@ -101,6 +104,7 @@ func TestCalcCellValue(t *testing.T) { "=COMBIN(6,4)": "15", "=COMBIN(6,5)": "6", "=COMBIN(6,6)": "1", + "=COMBIN(0,0)": "1", // _xlfn.COMBINA "=_xlfn.COMBINA(6,1)": "6", "=_xlfn.COMBINA(6,2)": "21", @@ -108,6 +112,7 @@ func TestCalcCellValue(t *testing.T) { "=_xlfn.COMBINA(6,4)": "126", "=_xlfn.COMBINA(6,5)": "252", "=_xlfn.COMBINA(6,6)": "462", + "=_xlfn.COMBINA(0,0)": "0", // COS "=COS(0.785398163)": "0.707106781467586", "=COS(0)": "1", @@ -125,10 +130,11 @@ func TestCalcCellValue(t *testing.T) { // _xlfn.CSCH "=_xlfn.CSCH(-3.14159265358979)": "-0.08658953753004724", // _xlfn.DECIMAL - `=_xlfn.DECIMAL("1100",2)`: "12", - `=_xlfn.DECIMAL("186A0",16)`: "100000", - `=_xlfn.DECIMAL("31L0",32)`: "100000", - `=_xlfn.DECIMAL("70122",8)`: "28754", + `=_xlfn.DECIMAL("1100",2)`: "12", + `=_xlfn.DECIMAL("186A0",16)`: "100000", + `=_xlfn.DECIMAL("31L0",32)`: "100000", + `=_xlfn.DECIMAL("70122",8)`: "28754", + `=_xlfn.DECIMAL("0x70122",8)`: "28754", // DEGREES "=DEGREES(1)": "57.29577951308232", "=DEGREES(2.5)": "143.2394487827058", @@ -181,6 +187,9 @@ func TestCalcCellValue(t *testing.T) { "=_xlfn.FLOOR.PRECISE(-26.75,-1)": "-27", "=_xlfn.FLOOR.PRECISE(-26.75,-5)": "-30", // GCD + "=GCD(0)": "0", + `=GCD("",1)`: "1", + "=GCD(1,0)": "1", "=GCD(1,5)": "1", "=GCD(15,10,25)": "5", "=GCD(0,8,12)": "4", @@ -199,11 +208,15 @@ func TestCalcCellValue(t *testing.T) { "=ISO.CEILING(-22.25,1)": "-22", "=ISO.CEILING(-22.25,0.1)": "-22.200000000000003", "=ISO.CEILING(-22.25,5)": "-20", + "=ISO.CEILING(-22.25,0)": "0", // LCM "=LCM(1,5)": "5", "=LCM(15,10,25)": "150", "=LCM(1,8,12)": "24", "=LCM(7,2)": "14", + "=LCM(7)": "7", + `=LCM("",1)`: "1", + `=LCM(0,0)`: "0", // LN "=LN(1)": "0", "=LN(100)": "4.605170185988092", @@ -219,10 +232,11 @@ func TestCalcCellValue(t *testing.T) { "=LOG10(0.001)": "-3", "=LOG10(25)": "1.3979400086720375", // MOD - "=MOD(6,4)": "2", - "=MOD(6,3)": "0", - "=MOD(6,2.5)": "1", - "=MOD(6,1.333)": "0.6680000000000001", + "=MOD(6,4)": "2", + "=MOD(6,3)": "0", + "=MOD(6,2.5)": "1", + "=MOD(6,1.333)": "0.6680000000000001", + "=MOD(-10.23,1)": "0.7699999999999996", // MROUND "=MROUND(333.7,0.5)": "333.5", "=MROUND(333.8,1)": "334", @@ -233,7 +247,8 @@ func TestCalcCellValue(t *testing.T) { "=MROUND(-555.4,-1)": "-555", "=MROUND(-1555,-1000)": "-2000", // MULTINOMIAL - "=MULTINOMIAL(3,1,2,5)": "27720", + "=MULTINOMIAL(3,1,2,5)": "27720", + `=MULTINOMIAL("",3,1,2,5)`: "27720", // _xlfn.MUNIT "=_xlfn.MUNIT(4)": "", // not support currently // ODD @@ -249,7 +264,8 @@ func TestCalcCellValue(t *testing.T) { // POWER "=POWER(4,2)": "16", // PRODUCT - "=PRODUCT(3,6)": "18", + "=PRODUCT(3,6)": "18", + `=PRODUCT("",3,6)`: "18", // QUOTIENT "=QUOTIENT(5,2)": "2", "=QUOTIENT(4.5,3.1)": "1", @@ -260,12 +276,14 @@ func TestCalcCellValue(t *testing.T) { "=RADIANS(180)": "3.141592653589793", "=RADIANS(360)": "6.283185307179586", // ROMAN - "=ROMAN(499,0)": "CDXCIX", - "=ROMAN(1999,0)": "MCMXCIX", - "=ROMAN(1999,1)": "MLMVLIV", - "=ROMAN(1999,2)": "MXMIX", - "=ROMAN(1999,3)": "MVMIV", - "=ROMAN(1999,4)": "MIM", + "=ROMAN(499,0)": "CDXCIX", + "=ROMAN(1999,0)": "MCMXCIX", + "=ROMAN(1999,1)": "MLMVLIV", + "=ROMAN(1999,2)": "MXMIX", + "=ROMAN(1999,3)": "MVMIV", + "=ROMAN(1999,4)": "MIM", + "=ROMAN(1999,-1)": "MCMXCIX", + "=ROMAN(1999,5)": "MIM", // ROUND "=ROUND(100.319,1)": "100.30000000000001", "=ROUND(5.28,1)": "5.300000000000001", @@ -317,6 +335,7 @@ func TestCalcCellValue(t *testing.T) { "=SQRTPI(0)": "0", // SUM "=SUM(1,2)": "3", + `=SUM("",1,2)`: "3", "=SUM(1,2+3)": "6", "=SUM(SUM(1,2),2)": "5", "=(-2-SUM(-4+7))*5": "-25", @@ -330,8 +349,9 @@ func TestCalcCellValue(t *testing.T) { "=1+SUM(SUM(1,2*3),4)*-4/2+5+(4+2)*3": "2", "=1+SUM(SUM(1,2*3),4)*4/3+5+(4+2)*3": "38.666666666666664", // SUMSQ - "=SUMSQ(A1:A4)": "14", - "=SUMSQ(A1,B1,A2,B2,6)": "82", + "=SUMSQ(A1:A4)": "14", + "=SUMSQ(A1,B1,A2,B2,6)": "82", + `=SUMSQ("",A1,B1,A2,B2,6)`: "82", // TAN "=TAN(1.047197551)": "1.732050806782486", "=TAN(0)": "0", @@ -356,173 +376,269 @@ func TestCalcCellValue(t *testing.T) { } mathCalcError := map[string]string{ // ABS - "=ABS()": "ABS requires 1 numeric argument", - "=ABS(~)": `cannot convert cell "~" to coordinates: invalid cell name "~"`, + "=ABS()": "ABS requires 1 numeric argument", + `=ABS("X")`: "#VALUE!", + "=ABS(~)": `cannot convert cell "~" to coordinates: invalid cell name "~"`, // ACOS - "=ACOS()": "ACOS requires 1 numeric argument", + "=ACOS()": "ACOS requires 1 numeric argument", + `=ACOS("X")`: "#VALUE!", // ACOSH - "=ACOSH()": "ACOSH requires 1 numeric argument", + "=ACOSH()": "ACOSH requires 1 numeric argument", + `=ACOSH("X")`: "#VALUE!", // _xlfn.ACOT - "=_xlfn.ACOT()": "ACOT requires 1 numeric argument", + "=_xlfn.ACOT()": "ACOT requires 1 numeric argument", + `=_xlfn.ACOT("X")`: "#VALUE!", // _xlfn.ACOTH - "=_xlfn.ACOTH()": "ACOTH requires 1 numeric argument", + "=_xlfn.ACOTH()": "ACOTH requires 1 numeric argument", + `=_xlfn.ACOTH("X")`: "#VALUE!", // _xlfn.ARABIC "=_xlfn.ARABIC()": "ARABIC requires 1 numeric argument", // ASIN - "=ASIN()": "ASIN requires 1 numeric argument", + "=ASIN()": "ASIN requires 1 numeric argument", + `=ASIN("X")`: "#VALUE!", // ASINH - "=ASINH()": "ASINH requires 1 numeric argument", + "=ASINH()": "ASINH requires 1 numeric argument", + `=ASINH("X")`: "#VALUE!", // ATAN - "=ATAN()": "ATAN requires 1 numeric argument", + "=ATAN()": "ATAN requires 1 numeric argument", + `=ATAN("X")`: "#VALUE!", // ATANH - "=ATANH()": "ATANH requires 1 numeric argument", + "=ATANH()": "ATANH requires 1 numeric argument", + `=ATANH("X")`: "#VALUE!", // ATAN2 - "=ATAN2()": "ATAN2 requires 2 numeric arguments", + "=ATAN2()": "ATAN2 requires 2 numeric arguments", + `=ATAN2("X",0)`: "#VALUE!", + `=ATAN2(0,"X")`: "#VALUE!", // BASE "=BASE()": "BASE requires at least 2 arguments", "=BASE(1,2,3,4)": "BASE allows at most 3 arguments", "=BASE(1,1)": "radix must be an integer >= 2 and <= 36", + `=BASE("X",2)`: "#VALUE!", + `=BASE(1,"X")`: "#VALUE!", + `=BASE(1,2,"X")`: "#VALUE!", // CEILING "=CEILING()": "CEILING requires at least 1 argument", "=CEILING(1,2,3)": "CEILING allows at most 2 arguments", "=CEILING(1,-1)": "negative sig to CEILING invalid", + `=CEILING("X",0)`: "#VALUE!", + `=CEILING(0,"X")`: "#VALUE!", // _xlfn.CEILING.MATH "=_xlfn.CEILING.MATH()": "CEILING.MATH requires at least 1 argument", "=_xlfn.CEILING.MATH(1,2,3,4)": "CEILING.MATH allows at most 3 arguments", + `=_xlfn.CEILING.MATH("X")`: "#VALUE!", + `=_xlfn.CEILING.MATH(1,"X")`: "#VALUE!", + `=_xlfn.CEILING.MATH(1,2,"X")`: "#VALUE!", // _xlfn.CEILING.PRECISE "=_xlfn.CEILING.PRECISE()": "CEILING.PRECISE requires at least 1 argument", "=_xlfn.CEILING.PRECISE(1,2,3)": "CEILING.PRECISE allows at most 2 arguments", + `=_xlfn.CEILING.PRECISE("X",2)`: "#VALUE!", + `=_xlfn.CEILING.PRECISE(1,"X")`: "#VALUE!", // COMBIN - "=COMBIN()": "COMBIN requires 2 argument", - "=COMBIN(-1,1)": "COMBIN requires number >= number_chosen", + "=COMBIN()": "COMBIN requires 2 argument", + "=COMBIN(-1,1)": "COMBIN requires number >= number_chosen", + `=COMBIN("X",1)`: "#VALUE!", + `=COMBIN(-1,"X")`: "#VALUE!", // _xlfn.COMBINA - "=_xlfn.COMBINA()": "COMBINA requires 2 argument", - "=_xlfn.COMBINA(-1,1)": "COMBINA requires number > number_chosen", - "=_xlfn.COMBINA(-1,-1)": "COMBIN requires number >= number_chosen", + "=_xlfn.COMBINA()": "COMBINA requires 2 argument", + "=_xlfn.COMBINA(-1,1)": "COMBINA requires number > number_chosen", + "=_xlfn.COMBINA(-1,-1)": "COMBIN requires number >= number_chosen", + `=_xlfn.COMBINA("X",1)`: "#VALUE!", + `=_xlfn.COMBINA(-1,"X")`: "#VALUE!", // COS - "=COS()": "COS requires 1 numeric argument", + "=COS()": "COS requires 1 numeric argument", + `=COS("X")`: "#VALUE!", // COSH - "=COSH()": "COSH requires 1 numeric argument", + "=COSH()": "COSH requires 1 numeric argument", + `=COSH("X")`: "#VALUE!", // _xlfn.COT - "=COT()": "COT requires 1 numeric argument", + "=COT()": "COT requires 1 numeric argument", + `=COT("X")`: "#VALUE!", + "=COT(0)": "#DIV/0!", // _xlfn.COTH - "=COTH()": "COTH requires 1 numeric argument", + "=COTH()": "COTH requires 1 numeric argument", + `=COTH("X")`: "#VALUE!", + "=COTH(0)": "#DIV/0!", // _xlfn.CSC - "=_xlfn.CSC()": "CSC requires 1 numeric argument", - "=_xlfn.CSC(0)": "#NAME?", + "=_xlfn.CSC()": "CSC requires 1 numeric argument", + `=_xlfn.CSC("X")`: "#VALUE!", + "=_xlfn.CSC(0)": "#DIV/0!", // _xlfn.CSCH - "=_xlfn.CSCH()": "CSCH requires 1 numeric argument", - "=_xlfn.CSCH(0)": "#NAME?", + "=_xlfn.CSCH()": "CSCH requires 1 numeric argument", + `=_xlfn.CSCH("X")`: "#VALUE!", + "=_xlfn.CSCH(0)": "#DIV/0!", // _xlfn.DECIMAL "=_xlfn.DECIMAL()": "DECIMAL requires 2 numeric arguments", - `=_xlfn.DECIMAL("2000", 2)`: "#NUM!", + `=_xlfn.DECIMAL("X", 2)`: "#VALUE!", + `=_xlfn.DECIMAL(2000, "X")`: "#VALUE!", // DEGREES - "=DEGREES()": "DEGREES requires 1 numeric argument", + "=DEGREES()": "DEGREES requires 1 numeric argument", + `=DEGREES("X")`: "#VALUE!", + "=DEGREES(0)": "#DIV/0!", // EVEN - "=EVEN()": "EVEN requires 1 numeric argument", + "=EVEN()": "EVEN requires 1 numeric argument", + `=EVEN("X")`: "#VALUE!", // EXP - "=EXP()": "EXP requires 1 numeric argument", + "=EXP()": "EXP requires 1 numeric argument", + `=EXP("X")`: "#VALUE!", // FACT - "=FACT()": "FACT requires 1 numeric argument", - "=FACT(-1)": "#NUM!", + "=FACT()": "FACT requires 1 numeric argument", + `=FACT("X")`: "#VALUE!", + "=FACT(-1)": "#NUM!", // FACTDOUBLE - "=FACTDOUBLE()": "FACTDOUBLE requires 1 numeric argument", - "=FACTDOUBLE(-1)": "#NUM!", + "=FACTDOUBLE()": "FACTDOUBLE requires 1 numeric argument", + `=FACTDOUBLE("X")`: "#VALUE!", + "=FACTDOUBLE(-1)": "#NUM!", // FLOOR - "=FLOOR()": "FLOOR requires 2 numeric arguments", - "=FLOOR(1,-1)": "#NUM!", + "=FLOOR()": "FLOOR requires 2 numeric arguments", + `=FLOOR("X",-1)`: "#VALUE!", + `=FLOOR(1,"X")`: "#VALUE!", + "=FLOOR(1,-1)": "#NUM!", // _xlfn.FLOOR.MATH "=_xlfn.FLOOR.MATH()": "FLOOR.MATH requires at least 1 argument", "=_xlfn.FLOOR.MATH(1,2,3,4)": "FLOOR.MATH allows at most 3 arguments", + `=_xlfn.FLOOR.MATH("X",2,3)`: "#VALUE!", + `=_xlfn.FLOOR.MATH(1,"X",3)`: "#VALUE!", + `=_xlfn.FLOOR.MATH(1,2,"X")`: "#VALUE!", // _xlfn.FLOOR.PRECISE "=_xlfn.FLOOR.PRECISE()": "FLOOR.PRECISE requires at least 1 argument", "=_xlfn.FLOOR.PRECISE(1,2,3)": "FLOOR.PRECISE allows at most 2 arguments", + `=_xlfn.FLOOR.PRECISE("X",2)`: "#VALUE!", + `=_xlfn.FLOOR.PRECISE(1,"X")`: "#VALUE!", // GCD "=GCD()": "GCD requires at least 1 argument", "=GCD(-1)": "GCD only accepts positive arguments", "=GCD(1,-1)": "GCD only accepts positive arguments", + `=GCD("X")`: "#VALUE!", // INT - "=INT()": "INT requires 1 numeric argument", + "=INT()": "INT requires 1 numeric argument", + `=INT("X")`: "#VALUE!", // ISO.CEILING "=ISO.CEILING()": "ISO.CEILING requires at least 1 argument", "=ISO.CEILING(1,2,3)": "ISO.CEILING allows at most 2 arguments", + `=ISO.CEILING("X",2)`: "#VALUE!", + `=ISO.CEILING(1,"X")`: "#VALUE!", // LCM "=LCM()": "LCM requires at least 1 argument", "=LCM(-1)": "LCM only accepts positive arguments", "=LCM(1,-1)": "LCM only accepts positive arguments", + `=LCM("X")`: "#VALUE!", // LN - "=LN()": "LN requires 1 numeric argument", + "=LN()": "LN requires 1 numeric argument", + `=LN("X")`: "#VALUE!", // LOG "=LOG()": "LOG requires at least 1 argument", "=LOG(1,2,3)": "LOG allows at most 2 arguments", + `=LOG("X",1)`: "#VALUE!", + `=LOG(1,"X")`: "#VALUE!", "=LOG(0,0)": "#NUM!", "=LOG(1,0)": "#NUM!", "=LOG(1,1)": "#DIV/0!", // LOG10 - "=LOG10()": "LOG10 requires 1 numeric argument", + "=LOG10()": "LOG10 requires 1 numeric argument", + `=LOG10("X")`: "#VALUE!", // MOD - "=MOD()": "MOD requires 2 numeric arguments", - "=MOD(6,0)": "#DIV/0!", + "=MOD()": "MOD requires 2 numeric arguments", + "=MOD(6,0)": "#DIV/0!", + `=MOD("X",0)`: "#VALUE!", + `=MOD(6,"X")`: "#VALUE!", // MROUND - "=MROUND()": "MROUND requires 2 numeric arguments", - "=MROUND(1,0)": "#NUM!", + "=MROUND()": "MROUND requires 2 numeric arguments", + "=MROUND(1,0)": "#NUM!", + "=MROUND(1,-1)": "#NUM!", + `=MROUND("X",0)`: "#VALUE!", + `=MROUND(1,"X")`: "#VALUE!", + // MULTINOMIAL + `=MULTINOMIAL("X")`: "#VALUE!", // _xlfn.MUNIT - "=_xlfn.MUNIT()": "MUNIT requires 1 numeric argument", // not support currently + "=_xlfn.MUNIT()": "MUNIT requires 1 numeric argument", // not support currently + `=_xlfn.MUNIT("X")`: "#VALUE!", // not support currently // ODD - "=ODD()": "ODD requires 1 numeric argument", + "=ODD()": "ODD requires 1 numeric argument", + `=ODD("X")`: "#VALUE!", // PI "=PI(1)": "PI accepts no arguments", // POWER - "=POWER(0,0)": "#NUM!", - "=POWER(0,-1)": "#DIV/0!", - "=POWER(1)": "POWER requires 2 numeric arguments", + `=POWER("X",1)`: "#VALUE!", + `=POWER(1,"X")`: "#VALUE!", + "=POWER(0,0)": "#NUM!", + "=POWER(0,-1)": "#DIV/0!", + "=POWER(1)": "POWER requires 2 numeric arguments", + // PRODUCT + `=PRODUCT("X")`: "#VALUE!", // QUOTIENT - "=QUOTIENT(1,0)": "#DIV/0!", - "=QUOTIENT(1)": "QUOTIENT requires 2 numeric arguments", + `=QUOTIENT("X",1)`: "#VALUE!", + `=QUOTIENT(1,"X")`: "#VALUE!", + "=QUOTIENT(1,0)": "#DIV/0!", + "=QUOTIENT(1)": "QUOTIENT requires 2 numeric arguments", // RADIANS - "=RADIANS()": "RADIANS requires 1 numeric argument", + `=RADIANS("X")`: "#VALUE!", + "=RADIANS()": "RADIANS requires 1 numeric argument", // RAND "=RAND(1)": "RAND accepts no arguments", // RANDBETWEEN - "=RANDBETWEEN()": "RANDBETWEEN requires 2 numeric arguments", - "=RANDBETWEEN(2,1)": "#NUM!", + `=RANDBETWEEN("X",1)`: "#VALUE!", + `=RANDBETWEEN(1,"X")`: "#VALUE!", + "=RANDBETWEEN()": "RANDBETWEEN requires 2 numeric arguments", + "=RANDBETWEEN(2,1)": "#NUM!", // ROMAN "=ROMAN()": "ROMAN requires at least 1 argument", "=ROMAN(1,2,3)": "ROMAN allows at most 2 arguments", + `=ROMAN("X")`: "#VALUE!", + `=ROMAN("X",1)`: "#VALUE!", // ROUND - "=ROUND()": "ROUND requires 2 numeric arguments", + "=ROUND()": "ROUND requires 2 numeric arguments", + `=ROUND("X",1)`: "#VALUE!", + `=ROUND(1,"X")`: "#VALUE!", // ROUNDDOWN - "=ROUNDDOWN()": "ROUNDDOWN requires 2 numeric arguments", + "=ROUNDDOWN()": "ROUNDDOWN requires 2 numeric arguments", + `=ROUNDDOWN("X",1)`: "#VALUE!", + `=ROUNDDOWN(1,"X")`: "#VALUE!", // ROUNDUP - "=ROUNDUP()": "ROUNDUP requires 2 numeric arguments", + "=ROUNDUP()": "ROUNDUP requires 2 numeric arguments", + `=ROUNDUP("X",1)`: "#VALUE!", + `=ROUNDUP(1,"X")`: "#VALUE!", // SEC - "=_xlfn.SEC()": "SEC requires 1 numeric argument", + "=_xlfn.SEC()": "SEC requires 1 numeric argument", + `=_xlfn.SEC("X")`: "#VALUE!", // _xlfn.SECH - "=_xlfn.SECH()": "SECH requires 1 numeric argument", + "=_xlfn.SECH()": "SECH requires 1 numeric argument", + `=_xlfn.SECH("X")`: "#VALUE!", // SIGN - "=SIGN()": "SIGN requires 1 numeric argument", + "=SIGN()": "SIGN requires 1 numeric argument", + `=SIGN("X")`: "#VALUE!", // SIN - "=SIN()": "SIN requires 1 numeric argument", + "=SIN()": "SIN requires 1 numeric argument", + `=SIN("X")`: "#VALUE!", // SINH - "=SINH()": "SINH requires 1 numeric argument", + "=SINH()": "SINH requires 1 numeric argument", + `=SINH("X")`: "#VALUE!", // SQRT - "=SQRT()": "SQRT requires 1 numeric argument", - "=SQRT(-1)": "#NUM!", + "=SQRT()": "SQRT requires 1 numeric argument", + `=SQRT("X")`: "#VALUE!", + "=SQRT(-1)": "#NUM!", // SQRTPI - "=SQRTPI()": "SQRTPI requires 1 numeric argument", + "=SQRTPI()": "SQRTPI requires 1 numeric argument", + `=SQRTPI("X")`: "#VALUE!", // SUM - "=SUM((": "formula not valid", - "=SUM(-)": "formula not valid", - "=SUM(1+)": "formula not valid", - "=SUM(1-)": "formula not valid", - "=SUM(1*)": "formula not valid", - "=SUM(1/)": "formula not valid", + "=SUM((": "formula not valid", + "=SUM(-)": "formula not valid", + "=SUM(1+)": "formula not valid", + "=SUM(1-)": "formula not valid", + "=SUM(1*)": "formula not valid", + "=SUM(1/)": "formula not valid", + `=SUM("X")`: "#VALUE!", + // SUMSQ + `=SUMSQ("X")`: "#VALUE!", // TAN - "=TAN()": "TAN requires 1 numeric argument", + "=TAN()": "TAN requires 1 numeric argument", + `=TAN("X")`: "#VALUE!", // TANH - "=TANH()": "TANH requires 1 numeric argument", + "=TANH()": "TANH requires 1 numeric argument", + `=TANH("X")`: "#VALUE!", // TRUNC - "=TRUNC()": "TRUNC requires at least 1 argument", + "=TRUNC()": "TRUNC requires at least 1 argument", + `=TRUNC("X")`: "#VALUE!", + `=TRUNC(1,"X")`: "#VALUE!", } for formula, expected := range mathCalcError { f := prepareData() @@ -570,6 +686,17 @@ func TestCalcCellValue(t *testing.T) { assert.Equal(t, "", result, formula) } + volatileFuncs := []string{ + "=RAND()", + "=RANDBETWEEN(1,2)", + } + for _, formula := range volatileFuncs { + f := prepareData() + assert.NoError(t, f.SetCellFormula("Sheet1", "C1", formula)) + _, err := f.CalcCellValue("Sheet1", "C1") + assert.NoError(t, err) + } + // Test get calculated cell value on not formula cell. f := prepareData() result, err := f.CalcCellValue("Sheet1", "A1") |