summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--calc.go37
-rw-r--r--calc_test.go26
-rw-r--r--crypt_test.go12
-rw-r--r--rows_test.go2
-rw-r--r--sheet.go4
5 files changed, 54 insertions, 27 deletions
diff --git a/calc.go b/calc.go
index 54683a8..7b9785c 100644
--- a/calc.go
+++ b/calc.go
@@ -700,19 +700,19 @@ func formulaCriteriaParser(exp string) (fc *formulaCriteria) {
fc.Type, fc.Condition = criteriaEq, match[1]
return
}
- if match := regexp.MustCompile(`^<(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
+ if match := regexp.MustCompile(`^<=(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
fc.Type, fc.Condition = criteriaLe, match[1]
return
}
- if match := regexp.MustCompile(`^>(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
+ if match := regexp.MustCompile(`^>=(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
fc.Type, fc.Condition = criteriaGe, match[1]
return
}
- if match := regexp.MustCompile(`^<=(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
+ if match := regexp.MustCompile(`^<(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
fc.Type, fc.Condition = criteriaL, match[1]
return
}
- if match := regexp.MustCompile(`^>=(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
+ if match := regexp.MustCompile(`^>(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
fc.Type, fc.Condition = criteriaG, match[1]
return
}
@@ -732,8 +732,11 @@ func formulaCriteriaParser(exp string) (fc *formulaCriteria) {
// formulaCriteriaEval evaluate formula criteria expression.
func formulaCriteriaEval(val string, criteria *formulaCriteria) (result bool, err error) {
var value, expected float64
+ var e error
var prepareValue = func(val, cond string) (value float64, expected float64, err error) {
- value, _ = strconv.ParseFloat(val, 64)
+ if value, err = strconv.ParseFloat(val, 64); err != nil {
+ return
+ }
if expected, err = strconv.ParseFloat(criteria.Condition, 64); err != nil {
return
}
@@ -743,25 +746,17 @@ func formulaCriteriaEval(val string, criteria *formulaCriteria) (result bool, er
case criteriaEq:
return val == criteria.Condition, err
case criteriaLe:
- if value, expected, err = prepareValue(val, criteria.Condition); err != nil {
- return
- }
- return value <= expected, err
+ value, expected, e = prepareValue(val, criteria.Condition)
+ return value <= expected && e == nil, err
case criteriaGe:
- if value, expected, err = prepareValue(val, criteria.Condition); err != nil {
- return
- }
- return value >= expected, err
+ value, expected, e = prepareValue(val, criteria.Condition)
+ return value >= expected && e == nil, err
case criteriaL:
- if value, expected, err = prepareValue(val, criteria.Condition); err != nil {
- return
- }
- return value < expected, err
+ value, expected, e = prepareValue(val, criteria.Condition)
+ return value < expected && e == nil, err
case criteriaG:
- if value, expected, err = prepareValue(val, criteria.Condition); err != nil {
- return
- }
- return value > expected, err
+ value, expected, e = prepareValue(val, criteria.Condition)
+ return value > expected && e == nil, err
case criteriaBeg:
return strings.HasPrefix(val, criteria.Condition), err
case criteriaEnd:
diff --git a/calc_test.go b/calc_test.go
index 4298aa7..7d7b886 100644
--- a/calc_test.go
+++ b/calc_test.go
@@ -339,7 +339,8 @@ func TestCalcCellValue(t *testing.T) {
"=SINH(0.5)": "0.5210953054937474",
"=SINH(-2)": "-3.626860407847019",
// SQRT
- "=SQRT(4)": "2",
+ "=SQRT(4)": "2",
+ `=SQRT("")`: "0",
// SQRTPI
"=SQRTPI(5)": "3.963327297606011",
"=SQRTPI(0.2)": "0.7926654595212022",
@@ -361,7 +362,15 @@ 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",
// SUMIF
+ `=SUMIF(F1:F5, "")`: "0",
+ `=SUMIF(A1:A5, "3")`: "3",
+ `=SUMIF(F1:F5, "=36693")`: "36693",
+ `=SUMIF(F1:F5, "<100")`: "0",
+ `=SUMIF(F1:F5, "<=36693")`: "93233",
`=SUMIF(F1:F5, ">100")`: "146554",
+ `=SUMIF(F1:F5, ">=100")`: "146554",
+ `=SUMIF(F1:F5, ">=text")`: "0",
+ `=SUMIF(F1:F5, "*Jan",F2:F5)`: "0",
`=SUMIF(D3:D7,"Jan",F2:F5)`: "112114",
`=SUMIF(D2:D9,"Feb",F2:F9)`: "157559",
`=SUMIF(E2:E9,"North 1",F2:F9)`: "66582",
@@ -706,7 +715,8 @@ func TestCalcCellValue(t *testing.T) {
// ISERROR
"=ISERROR()": "ISERROR requires 1 argument",
// ISEVEN
- "=ISEVEN()": "ISEVEN requires 1 argument",
+ "=ISEVEN()": "ISEVEN requires 1 argument",
+ `=ISEVEN("text")`: "#VALUE!",
// ISNA
"=ISNA()": "ISNA requires 1 argument",
// ISNONTEXT
@@ -714,7 +724,8 @@ func TestCalcCellValue(t *testing.T) {
// ISNUMBER
"=ISNUMBER()": "ISNUMBER requires 1 argument",
// ISODD
- "=ISODD()": "ISODD requires 1 argument",
+ "=ISODD()": "ISODD requires 1 argument",
+ `=ISODD("text")`: "#VALUE!",
// NA
"=NA(1)": "NA accepts no arguments",
}
@@ -817,3 +828,12 @@ func TestCalcCellValueWithDefinedName(t *testing.T) {
// DefinedName with scope WorkSheet takes precedence over DefinedName with scope Workbook, so we should get B1 value
assert.Equal(t, "B1 value", result, "=defined_name1")
}
+
+func TestDet(t *testing.T) {
+ assert.Equal(t, det([][]float64{
+ {1, 2, 3, 4},
+ {2, 3, 4, 5},
+ {3, 4, 5, 6},
+ {4, 5, 6, 7},
+ }), float64(0))
+}
diff --git a/crypt_test.go b/crypt_test.go
index f9a3fb7..6f712c1 100644
--- a/crypt_test.go
+++ b/crypt_test.go
@@ -21,3 +21,15 @@ func TestEncrypt(t *testing.T) {
assert.NoError(t, err)
assert.EqualError(t, f.SaveAs(filepath.Join("test", "BadEncrypt.xlsx"), Options{Password: "password"}), "not support encryption currently")
}
+
+func TestEncryptionMechanism(t *testing.T) {
+ mechanism, err := encryptionMechanism([]byte{3, 0, 3, 0})
+ assert.Equal(t, mechanism, "extensible")
+ assert.EqualError(t, err, "unsupport encryption mechanism")
+ _, err = encryptionMechanism([]byte{})
+ assert.EqualError(t, err, "unknown encryption mechanism")
+}
+
+func TestHashing(t *testing.T) {
+ assert.Equal(t, hashing("unsupportHashAlgorithm", []byte{}), []uint8([]byte(nil)))
+}
diff --git a/rows_test.go b/rows_test.go
index 246233f..edbc4bd 100644
--- a/rows_test.go
+++ b/rows_test.go
@@ -835,7 +835,7 @@ func TestGetValueFromNumber(t *testing.T) {
assert.Equal(t, "2.22", val)
c = &xlsxC{T: "n", V: "2.220000ddsf0000000002-r"}
- val, err = c.getValueFrom(f, d)
+ _, err = c.getValueFrom(f, d)
assert.NotNil(t, err)
assert.Equal(t, "strconv.ParseFloat: parsing \"2.220000ddsf0000000002-r\": invalid syntax", err.Error())
}
diff --git a/sheet.go b/sheet.go
index dedd2d9..a44e391 100644
--- a/sheet.go
+++ b/sheet.go
@@ -360,8 +360,8 @@ func (f *File) getSheetID(name string) int {
}
// GetSheetIndex provides a function to get a sheet index of the workbook by
-// the given sheet name. If the given sheet name is invalid, it will return an
-// integer type value 0.
+// the given sheet name. If the given sheet name is invalid or sheet doesn't
+// exist, it will return an integer type value -1.
func (f *File) GetSheetIndex(name string) int {
var idx = -1
for index, sheet := range f.GetSheetList() {