@@ -682,8 +682,9 @@ func TestCalcCellValue(t *testing.T) {
682682 "IMPRODUCT(\" 1-i\" ,\" 5+10i\" ,2)" : "30+10i" ,
683683 "IMPRODUCT(COMPLEX(5,2),COMPLEX(0,1))" : "-2+5i" ,
684684 "IMPRODUCT(A1:C1)" : "4" ,
685+ "IMPRODUCT(Sheet1!A1:Sheet1!A1:A2,A2)" : "4" ,
685686 // MINVERSE
686- "MINVERSE(A1:B2)" : "-0 " ,
687+ "MINVERSE(A1:B2)" : "-1.66666666666667 " ,
687688 // MMULT
688689 "MMULT(0,0)" : "0" ,
689690 "MMULT(2,4)" : "8" ,
@@ -726,10 +727,11 @@ func TestCalcCellValue(t *testing.T) {
726727 "POWER(4,2)" : "16" ,
727728 "POWER(4,POWER(1,1))" : "4" ,
728729 // PRODUCT
729- "PRODUCT(3,6)" : "18" ,
730- "PRODUCT(\" 3\" ,\" 6\" )" : "18" ,
731- "PRODUCT(PRODUCT(1),3,6)" : "18" ,
732- "PRODUCT(C1:C2)" : "1" ,
730+ "PRODUCT(3,6)" : "18" ,
731+ "PRODUCT(\" 3\" ,\" 6\" )" : "18" ,
732+ "PRODUCT(PRODUCT(1),3,6)" : "18" ,
733+ "PRODUCT(C1:C2)" : "1" ,
734+ "PRODUCT(Sheet1!A1:Sheet1!A1:A2,A2)" : "4" ,
733735 // QUOTIENT
734736 "QUOTIENT(5,2)" : "2" ,
735737 "QUOTIENT(4.5,3.1)" : "1" ,
@@ -911,6 +913,23 @@ func TestCalcCellValue(t *testing.T) {
911913 "SUM(\" 5\" ,2)" : "7" ,
912914 "SUM({\" 5\" },\" 5\" )" : "5" ,
913915 "SUM(TRUE,1)" : "2" ,
916+ "SUM(INDEX(A1:B1,1))" : "5" ,
917+ "SUM(INDEX(A1:B1,1,0))" : "5" ,
918+ "SUM(INDEX(A1:B2,2,0))" : "7" ,
919+ "SUM(INDEX(A1:B4,0,2))" : "9" ,
920+ "SUM(INDEX(E1:F5,5,2))" : "34440" ,
921+ "A1/A3" : "0.333333333333333" ,
922+ "SUM(A1:A2)" : "3" ,
923+ "SUM(Sheet1!A1:Sheet1!A2)" : "3" ,
924+ "SUM(Sheet1!A1,A2)" : "3" ,
925+ "(-2-SUM(-4+A2))*5" : "0" ,
926+ "SUM(Sheet1!A1:Sheet1!A1:A2,A2)" : "5" ,
927+ "SUM(A1,A2,A3)*SUM(2,3)" : "30" ,
928+ "1+SUM(SUM(A1+A2/A3)*(2-3),2)" : "1.33333333333333" ,
929+ "A1/A2/SUM(A1:A2:B1)" : "0.0416666666666667" ,
930+ "A1/A2/SUM(A1:A2:B1)*A3" : "0.125" ,
931+ "SUM(B1:D1)" : "4" ,
932+ "SUM(\" X\" )" : "0" ,
914933 // SUMIF
915934 "SUMIF(F1:F5, \" \" )" : "0" ,
916935 "SUMIF(A1:A5, \" 3\" )" : "3" ,
@@ -1303,6 +1322,8 @@ func TestCalcCellValue(t *testing.T) {
13031322 "MAXA(A1:B4,MUNIT(1),INT(0),1,E1:F2,\" \" )" : "36693" ,
13041323 // MAXIFS
13051324 "MAXIFS(F2:F4,A2:A4,\" >0\" )" : "36693" ,
1325+ // MDETERM
1326+ "MDETERM(A1:B2)" : "-3" ,
13061327 // MEDIAN
13071328 "MEDIAN(A1:A5,12)" : "2" ,
13081329 "MEDIAN(A1:A5)" : "1.5" ,
@@ -2185,14 +2206,13 @@ func TestCalcCellValue(t *testing.T) {
21852206 "VLOOKUP(A1:A2,A1:A1,1)" : "1" ,
21862207 "VLOOKUP(MUNIT(1),MUNIT(1),1,FALSE)" : "1" ,
21872208 // INDEX
2188- "INDEX(0,0,0)" : "0" ,
2189- "INDEX(A1,0,0)" : "1" ,
2190- "INDEX(A1:A1,0,0)" : "1" ,
2191- "SUM(INDEX(A1:B1,1))" : "5" ,
2192- "SUM(INDEX(A1:B1,1,0))" : "5" ,
2193- "SUM(INDEX(A1:B2,2,0))" : "7" ,
2194- "SUM(INDEX(A1:B4,0,2))" : "9" ,
2195- "SUM(INDEX(E1:F5,5,2))" : "34440" ,
2209+ "INDEX(0,0,0)" : "0" ,
2210+ "INDEX(A1,0,0)" : "1" ,
2211+ "INDEX(A1:A1,0,0)" : "1" ,
2212+ "INDEX(MINVERSE(A1:B2),1,1)" : "-1.66666666666667" ,
2213+ "INDEX(MINVERSE(A1:B2),1,2)" : "1.33333333333333" ,
2214+ "INDEX(MINVERSE(A1:B2),2,1)" : "0.666666666666667" ,
2215+ "INDEX(MINVERSE(A1:B2),2,2)" : "-0.333333333333333" ,
21962216 // INDIRECT
21972217 "INDIRECT(\" E1\" )" : "Team" ,
21982218 "INDIRECT(\" E\" &1)" : "Team" ,
@@ -2936,7 +2956,8 @@ func TestCalcCellValue(t *testing.T) {
29362956 "LOG10()" : {"#VALUE!" , "LOG10 requires 1 numeric argument" },
29372957 "LOG10(\" X\" )" : {"#VALUE!" , "strconv.ParseFloat: parsing \" X\" : invalid syntax" },
29382958 // MDETERM
2939- "MDETERM()" : {"#VALUE!" , "MDETERM requires 1 argument" },
2959+ "MDETERM()" : {"#VALUE!" , "MDETERM requires 1 argument" },
2960+ "MDETERM(A1:B3)" : {"#VALUE!" , "#VALUE!" },
29402961 // MINVERSE
29412962 "MINVERSE()" : {"#VALUE!" , "MINVERSE requires 1 argument" },
29422963 "MINVERSE(B3:C4)" : {"#VALUE!" , "#VALUE!" },
@@ -3082,18 +3103,19 @@ func TestCalcCellValue(t *testing.T) {
30823103 "SUBTOTAL(0,A4:A5)" : {"#VALUE!" , "SUBTOTAL has invalid function_num" },
30833104 "SUBTOTAL(1,A5:A6)" : {"#DIV/0!" , "#DIV/0!" },
30843105 // SUM
3085- "SUM((" : {"" , ErrInvalidFormula .Error ()},
3086- "SUM(-)" : {ErrInvalidFormula .Error (), ErrInvalidFormula .Error ()},
3087- "SUM(1+)" : {ErrInvalidFormula .Error (), ErrInvalidFormula .Error ()},
3088- "SUM(1-)" : {ErrInvalidFormula .Error (), ErrInvalidFormula .Error ()},
3089- "SUM(1*)" : {ErrInvalidFormula .Error (), ErrInvalidFormula .Error ()},
3090- "SUM(1/)" : {ErrInvalidFormula .Error (), ErrInvalidFormula .Error ()},
3091- "SUM(0((;(0())),)" : {"" , ErrInvalidFormula .Error ()},
3092- "SUM((0(((;)))))" : {"" , ErrInvalidFormula .Error ()},
3093- "SUM(1*SUM(1/0))" : {"#DIV/0!" , "#DIV/0!" },
3094- "SUM(1*SUM(1/0)*1)" : {"#DIV/0!" , "#DIV/0!" },
3095- "SUM(0:2)" : {"#NAME?" , "invalid reference" },
3096- "SUM(1:1048577)" : {"#NAME?" , "invalid reference" },
3106+ "SUM((" : {"" , ErrInvalidFormula .Error ()},
3107+ "SUM(-)" : {ErrInvalidFormula .Error (), ErrInvalidFormula .Error ()},
3108+ "SUM(1+)" : {ErrInvalidFormula .Error (), ErrInvalidFormula .Error ()},
3109+ "SUM(1-)" : {ErrInvalidFormula .Error (), ErrInvalidFormula .Error ()},
3110+ "SUM(1*)" : {ErrInvalidFormula .Error (), ErrInvalidFormula .Error ()},
3111+ "SUM(1/)" : {ErrInvalidFormula .Error (), ErrInvalidFormula .Error ()},
3112+ "SUM(0((;(0())),)" : {"" , ErrInvalidFormula .Error ()},
3113+ "SUM((0(((;)))))" : {"" , ErrInvalidFormula .Error ()},
3114+ "SUM(1*SUM(1/0))" : {"#DIV/0!" , "#DIV/0!" },
3115+ "SUM(1*SUM(1/0)*1)" : {"#DIV/0!" , "#DIV/0!" },
3116+ "1+SUM(SUM(A1+A2/A4)*(2-3),2)" : {"#DIV/0!" , "#DIV/0!" },
3117+ "SUM(0:2)" : {"#NAME?" , "invalid reference" },
3118+ "SUM(1:1048577)" : {"#NAME?" , "invalid reference" },
30973119 // SUMIF
30983120 "SUMIF()" : {"#VALUE!" , "SUMIF requires at least 2 arguments" },
30993121 // SUMSQ
@@ -4876,50 +4898,6 @@ func TestCalcCellValue(t *testing.T) {
48764898 assert .Equal (t , expected [0 ], result , formula )
48774899 assert .EqualError (t , err , expected [1 ], formula )
48784900 }
4879-
4880- referenceCalc := map [string ]string {
4881- // MDETERM
4882- "MDETERM(A1:B2)" : "-3" ,
4883- // PRODUCT
4884- "PRODUCT(Sheet1!A1:Sheet1!A1:A2,A2)" : "4" ,
4885- // IMPRODUCT
4886- "IMPRODUCT(Sheet1!A1:Sheet1!A1:A2,A2)" : "4" ,
4887- // SUM
4888- "A1/A3" : "0.333333333333333" ,
4889- "SUM(A1:A2)" : "3" ,
4890- "SUM(Sheet1!A1:Sheet1!A2)" : "3" ,
4891- "SUM(Sheet1!A1,A2)" : "3" ,
4892- "(-2-SUM(-4+A2))*5" : "0" ,
4893- "SUM(Sheet1!A1:Sheet1!A1:A2,A2)" : "5" ,
4894- "SUM(A1,A2,A3)*SUM(2,3)" : "30" ,
4895- "1+SUM(SUM(A1+A2/A3)*(2-3),2)" : "1.33333333333333" ,
4896- "A1/A2/SUM(A1:A2:B1)" : "0.0416666666666667" ,
4897- "A1/A2/SUM(A1:A2:B1)*A3" : "0.125" ,
4898- "SUM(B1:D1)" : "4" ,
4899- "SUM(\" X\" )" : "0" ,
4900- }
4901- for formula , expected := range referenceCalc {
4902- f := prepareCalcData (cellData )
4903- assert .NoError (t , f .SetCellFormula ("Sheet1" , "C1" , formula ))
4904- result , err := f .CalcCellValue ("Sheet1" , "C1" )
4905- assert .NoError (t , err )
4906- assert .Equal (t , expected , result , formula )
4907- }
4908-
4909- referenceCalcError := map [string ][]string {
4910- // MDETERM
4911- "MDETERM(A1:B3)" : {"#VALUE!" , "#VALUE!" },
4912- // SUM
4913- "1+SUM(SUM(A1+A2/A4)*(2-3),2)" : {"#DIV/0!" , "#DIV/0!" },
4914- }
4915- for formula , expected := range referenceCalcError {
4916- f := prepareCalcData (cellData )
4917- assert .NoError (t , f .SetCellFormula ("Sheet1" , "C1" , formula ))
4918- result , err := f .CalcCellValue ("Sheet1" , "C1" )
4919- assert .Equal (t , expected [0 ], result , formula )
4920- assert .EqualError (t , err , expected [1 ], formula )
4921- }
4922-
49234901 volatileFuncs := []string {
49244902 "NOW()" ,
49254903 "RAND()" ,
@@ -5056,6 +5034,9 @@ func TestCalcDet(t *testing.T) {
50565034 {3 , 4 , 5 , 6 },
50575035 {4 , 5 , 6 , 7 },
50585036 }), float64 (0 ))
5037+ assert .Equal (t , 5.0 , det ([][]float64 {{5 }}))
5038+ assert .Equal (t , - 3.0 , det ([][]float64 {{- 3 }}))
5039+ assert .Equal (t , - 3.0 , det ([][]float64 {{1 , 4 }, {2 , 5 }}))
50595040}
50605041
50615042func TestCalcToBool (t * testing.T ) {
0 commit comments