Skip to content

Commit efb5918

Browse files
authored
This closes #2413, fix incorrect result of formula functions MDETERM and MINVERSE (#2420)
- Update unit test
1 parent 4333037 commit efb5918

2 files changed

Lines changed: 54 additions & 70 deletions

File tree

‎calc.go‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4987,6 +4987,9 @@ func minor(sqMtx [][]float64, idx int) [][]float64 {
49874987

49884988
// det determinant of the 2x2 matrix.
49894989
func det(sqMtx [][]float64) float64 {
4990+
if len(sqMtx) == 1 {
4991+
return sqMtx[0][0]
4992+
}
49904993
if len(sqMtx) == 2 {
49914994
m00 := sqMtx[0][0]
49924995
m01 := sqMtx[0][1]

‎calc_test.go‎

Lines changed: 51 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -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

50615042
func TestCalcToBool(t *testing.T) {

0 commit comments

Comments
 (0)