diff options
author | xuri <xuri.me@gmail.com> | 2020-10-17 00:57:12 +0800 |
---|---|---|
committer | xuri <xuri.me@gmail.com> | 2020-10-17 01:18:22 +0800 |
commit | 02530e8c8ad94308458a33ac694e6ac9d3af4c87 (patch) | |
tree | 8724927b764b2abf3a779dd4d243c589f0086a2a /calc_test.go | |
parent | ac3dce0beaef6cbf2b08db4a1e2b2a8d100c77ca (diff) |
Fix #701, init new formula function AND and OR, prevent formula lexer panic on retrieving the top token type
Diffstat (limited to 'calc_test.go')
-rw-r--r-- | calc_test.go | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/calc_test.go b/calc_test.go index 7d7b886..02b5161 100644 --- a/calc_test.go +++ b/calc_test.go @@ -1,7 +1,9 @@ package excelize import ( + "container/list" "path/filepath" + "strings" "testing" "github.com/stretchr/testify/assert" @@ -31,6 +33,18 @@ func TestCalcCellValue(t *testing.T) { } mathCalc := map[string]string{ + "=2^3": "8", + "=1=1": "TRUE", + "=1=2": "FALSE", + "=1<2": "TRUE", + "=3<2": "FALSE", + "=2<=3": "TRUE", + "=2<=1": "FALSE", + "=2>1": "TRUE", + "=2>3": "FALSE", + "=2>=1": "TRUE", + "=2>=3": "FALSE", + "=1&2": "12", // ABS "=ABS(-1)": "1", "=ABS(-6.5)": "6.5", @@ -429,6 +443,20 @@ func TestCalcCellValue(t *testing.T) { "=ISODD(A2)": "FALSE", // NA "=NA()": "#N/A", + // AND + "=AND(0)": "FALSE", + "=AND(1)": "TRUE", + "=AND(1,0)": "FALSE", + "=AND(0,1)": "FALSE", + "=AND(1=1)": "TRUE", + "=AND(1<2)": "TRUE", + "=AND(1>2,2<3,2>0,3>1)": "FALSE", + "=AND(1=1),1=1": "TRUE", + // OR + "=OR(1)": "TRUE", + "=OR(0)": "FALSE", + "=OR(1=2,2=2)": "TRUE", + "=OR(1=2,2=3)": "FALSE", } for formula, expected := range mathCalc { f := prepareData() @@ -728,6 +756,16 @@ func TestCalcCellValue(t *testing.T) { `=ISODD("text")`: "#VALUE!", // NA "=NA(1)": "NA accepts no arguments", + // AND + `=AND("text")`: "#VALUE!", + `=AND(A1:B1)`: "#VALUE!", + "=AND()": "AND requires at least 1 argument", + "=AND(1" + strings.Repeat(",1", 30) + ")": "AND accepts at most 30 arguments", + // OR + `=OR("text")`: "#VALUE!", + `=OR(A1:B1)`: "#VALUE!", + "=OR()": "OR requires at least 1 argument", + "=OR(1" + strings.Repeat(",1", 30) + ")": "OR accepts at most 30 arguments", } for formula, expected := range mathCalcError { f := prepareData() @@ -829,6 +867,63 @@ func TestCalcCellValueWithDefinedName(t *testing.T) { assert.Equal(t, "B1 value", result, "=defined_name1") } +func TestCalcPow(t *testing.T) { + err := `strconv.ParseFloat: parsing "text": invalid syntax` + assert.EqualError(t, calcPow("1", "text", nil), err) + assert.EqualError(t, calcPow("text", "1", nil), err) + assert.EqualError(t, calcL("1", "text", nil), err) + assert.EqualError(t, calcL("text", "1", nil), err) + assert.EqualError(t, calcLe("1", "text", nil), err) + assert.EqualError(t, calcLe("text", "1", nil), err) + assert.EqualError(t, calcG("1", "text", nil), err) + assert.EqualError(t, calcG("text", "1", nil), err) + assert.EqualError(t, calcGe("1", "text", nil), err) + assert.EqualError(t, calcGe("text", "1", nil), err) + assert.EqualError(t, calcAdd("1", "text", nil), err) + assert.EqualError(t, calcAdd("text", "1", nil), err) + assert.EqualError(t, calcAdd("1", "text", nil), err) + assert.EqualError(t, calcAdd("text", "1", nil), err) + assert.EqualError(t, calcSubtract("1", "text", nil), err) + assert.EqualError(t, calcSubtract("text", "1", nil), err) + assert.EqualError(t, calcMultiply("1", "text", nil), err) + assert.EqualError(t, calcMultiply("text", "1", nil), err) + assert.EqualError(t, calcDiv("1", "text", nil), err) + assert.EqualError(t, calcDiv("text", "1", nil), err) +} + +func TestISBLANK(t *testing.T) { + argsList := list.New() + argsList.PushBack(formulaArg{ + Type: ArgUnknown, + }) + fn := formulaFuncs{} + result, err := fn.ISBLANK(argsList) + assert.Equal(t, result, "TRUE") + assert.NoError(t, err) +} + +func TestAND(t *testing.T) { + argsList := list.New() + argsList.PushBack(formulaArg{ + Type: ArgUnknown, + }) + fn := formulaFuncs{} + result, err := fn.AND(argsList) + assert.Equal(t, result, "TRUE") + assert.NoError(t, err) +} + +func TestOR(t *testing.T) { + argsList := list.New() + argsList.PushBack(formulaArg{ + Type: ArgUnknown, + }) + fn := formulaFuncs{} + result, err := fn.OR(argsList) + assert.Equal(t, result, "FALSE") + assert.NoError(t, err) +} + func TestDet(t *testing.T) { assert.Equal(t, det([][]float64{ {1, 2, 3, 4}, |