From 44a13aa402b0189b119635d2f0a26961795c6bda Mon Sep 17 00:00:00 2001 From: xuri Date: Tue, 7 Dec 2021 00:26:53 +0800 Subject: [PATCH] Export 7 errors so users can act differently on different type of errors --- adjust_test.go | 14 +++++++------- calc_test.go | 22 +++++++++++----------- cell_test.go | 20 ++++++++++---------- chart_test.go | 6 +++--- col_test.go | 32 ++++++++++++++++---------------- comment_test.go | 2 +- crypt_test.go | 6 +++--- datavalidation_test.go | 6 +++--- date_test.go | 2 +- errors.go | 26 ++++++++++++++++++++++++++ excelize_test.go | 28 ++++++++++++++-------------- file.go | 3 +-- lib.go | 7 ++----- lib_test.go | 2 +- merge_test.go | 6 +++--- picture_test.go | 12 ++++++------ pivotTable_test.go | 4 ++-- rows_test.go | 26 +++++++++++++------------- shape_test.go | 2 +- sheet_test.go | 12 ++++++------ sparkline.go | 11 +++++------ sparkline_test.go | 14 +++++++------- stream_test.go | 8 ++++---- table_test.go | 10 +++++----- 24 files changed, 151 insertions(+), 130 deletions(-) diff --git a/adjust_test.go b/adjust_test.go index 3509b5d5..7a482f71 100644 --- a/adjust_test.go +++ b/adjust_test.go @@ -17,7 +17,7 @@ func TestAdjustMergeCells(t *testing.T) { }, }, }, - }, rows, 0, 0), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + }, rows, 0, 0), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.EqualError(t, f.adjustMergeCells(&xlsxWorksheet{ MergeCells: &xlsxMergeCells{ Cells: []*xlsxMergeCell{ @@ -26,7 +26,7 @@ func TestAdjustMergeCells(t *testing.T) { }, }, }, - }, rows, 0, 0), `cannot convert cell "B" to coordinates: invalid cell name "B"`) + }, rows, 0, 0), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error()) assert.NoError(t, f.adjustMergeCells(&xlsxWorksheet{ MergeCells: &xlsxMergeCells{ Cells: []*xlsxMergeCell{ @@ -265,12 +265,12 @@ func TestAdjustAutoFilter(t *testing.T) { AutoFilter: &xlsxAutoFilter{ Ref: "A:B1", }, - }, rows, 0, 0), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + }, rows, 0, 0), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.EqualError(t, f.adjustAutoFilter(&xlsxWorksheet{ AutoFilter: &xlsxAutoFilter{ Ref: "A1:B", }, - }, rows, 0, 0), `cannot convert cell "B" to coordinates: invalid cell name "B"`) + }, rows, 0, 0), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error()) } func TestAdjustHelper(t *testing.T) { @@ -281,8 +281,8 @@ func TestAdjustHelper(t *testing.T) { f.Sheet.Store("xl/worksheets/sheet2.xml", &xlsxWorksheet{ AutoFilter: &xlsxAutoFilter{Ref: "A1:B"}}) // testing adjustHelper with illegal cell coordinates. - assert.EqualError(t, f.adjustHelper("Sheet1", rows, 0, 0), `cannot convert cell "A" to coordinates: invalid cell name "A"`) - assert.EqualError(t, f.adjustHelper("Sheet2", rows, 0, 0), `cannot convert cell "B" to coordinates: invalid cell name "B"`) + assert.EqualError(t, f.adjustHelper("Sheet1", rows, 0, 0), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) + assert.EqualError(t, f.adjustHelper("Sheet2", rows, 0, 0), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error()) // testing adjustHelper on not exists worksheet. assert.EqualError(t, f.adjustHelper("SheetN", rows, 0, 0), "sheet SheetN is not exist") } @@ -298,7 +298,7 @@ func TestAdjustCalcChain(t *testing.T) { assert.NoError(t, f.InsertRow("Sheet1", 1)) f.CalcChain.C[1].R = "invalid coordinates" - assert.EqualError(t, f.InsertCol("Sheet1", "A"), `cannot convert cell "invalid coordinates" to coordinates: invalid cell name "invalid coordinates"`) + assert.EqualError(t, f.InsertCol("Sheet1", "A"), newCellNameToCoordinatesError("invalid coordinates", newInvalidCellNameError("invalid coordinates")).Error()) f.CalcChain = nil assert.NoError(t, f.InsertCol("Sheet1", "A")) } diff --git a/calc_test.go b/calc_test.go index 4c4839a9..b1d4f26d 100644 --- a/calc_test.go +++ b/calc_test.go @@ -1857,7 +1857,7 @@ func TestCalcCellValue(t *testing.T) { // ABS "=ABS()": "ABS requires 1 numeric argument", `=ABS("X")`: "strconv.ParseFloat: parsing \"X\": invalid syntax", - "=ABS(~)": `invalid column name "~"`, + "=ABS(~)": newInvalidColumnNameError("~").Error(), // ACOS "=ACOS()": "ACOS requires 1 numeric argument", `=ACOS("X")`: "strconv.ParseFloat: parsing \"X\": invalid syntax", @@ -2699,15 +2699,15 @@ func TestCalcCellValue(t *testing.T) { // COLUMN "=COLUMN(1,2)": "COLUMN requires at most 1 argument", "=COLUMN(\"\")": "invalid reference", - "=COLUMN(Sheet1)": "invalid column name \"Sheet1\"", - "=COLUMN(Sheet1!A1!B1)": "invalid column name \"Sheet1\"", + "=COLUMN(Sheet1)": newInvalidColumnNameError("Sheet1").Error(), + "=COLUMN(Sheet1!A1!B1)": newInvalidColumnNameError("Sheet1").Error(), // COLUMNS "=COLUMNS()": "COLUMNS requires 1 argument", "=COLUMNS(1)": "invalid reference", "=COLUMNS(\"\")": "invalid reference", - "=COLUMNS(Sheet1)": "invalid column name \"Sheet1\"", - "=COLUMNS(Sheet1!A1!B1)": "invalid column name \"Sheet1\"", - "=COLUMNS(Sheet1!Sheet1)": "invalid column name \"Sheet1\"", + "=COLUMNS(Sheet1)": newInvalidColumnNameError("Sheet1").Error(), + "=COLUMNS(Sheet1!A1!B1)": newInvalidColumnNameError("Sheet1").Error(), + "=COLUMNS(Sheet1!Sheet1)": newInvalidColumnNameError("Sheet1").Error(), // HLOOKUP "=HLOOKUP()": "HLOOKUP requires at least 3 arguments", "=HLOOKUP(D2,D1,1,FALSE)": "HLOOKUP requires second argument of table array", @@ -2751,15 +2751,15 @@ func TestCalcCellValue(t *testing.T) { // ROW "=ROW(1,2)": "ROW requires at most 1 argument", "=ROW(\"\")": "invalid reference", - "=ROW(Sheet1)": "invalid column name \"Sheet1\"", - "=ROW(Sheet1!A1!B1)": "invalid column name \"Sheet1\"", + "=ROW(Sheet1)": newInvalidColumnNameError("Sheet1").Error(), + "=ROW(Sheet1!A1!B1)": newInvalidColumnNameError("Sheet1").Error(), // ROWS "=ROWS()": "ROWS requires 1 argument", "=ROWS(1)": "invalid reference", "=ROWS(\"\")": "invalid reference", - "=ROWS(Sheet1)": "invalid column name \"Sheet1\"", - "=ROWS(Sheet1!A1!B1)": "invalid column name \"Sheet1\"", - "=ROWS(Sheet1!Sheet1)": "invalid column name \"Sheet1\"", + "=ROWS(Sheet1)": newInvalidColumnNameError("Sheet1").Error(), + "=ROWS(Sheet1!A1!B1)": newInvalidColumnNameError("Sheet1").Error(), + "=ROWS(Sheet1!Sheet1)": newInvalidColumnNameError("Sheet1").Error(), // Web Functions // ENCODEURL "=ENCODEURL()": "ENCODEURL requires 1 argument", diff --git a/cell_test.go b/cell_test.go index e49212f6..4a78a067 100644 --- a/cell_test.go +++ b/cell_test.go @@ -108,11 +108,11 @@ func TestCheckCellInArea(t *testing.T) { } ok, err := f.checkCellInArea("A1", "A:B") - assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.False(t, ok) ok, err = f.checkCellInArea("AA0", "Z0:AB1") - assert.EqualError(t, err, `cannot convert cell "AA0" to coordinates: invalid cell name "AA0"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("AA0", newInvalidCellNameError("AA0")).Error()) assert.False(t, ok) } @@ -146,13 +146,13 @@ func TestSetCellFloat(t *testing.T) { assert.Equal(t, "123.42", val, "A1 should be 123.42") }) f := NewFile() - assert.EqualError(t, f.SetCellFloat(sheet, "A", 123.42, -1, 64), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.SetCellFloat(sheet, "A", 123.42, -1, 64), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) } func TestSetCellValue(t *testing.T) { f := NewFile() - assert.EqualError(t, f.SetCellValue("Sheet1", "A", time.Now().UTC()), `cannot convert cell "A" to coordinates: invalid cell name "A"`) - assert.EqualError(t, f.SetCellValue("Sheet1", "A", time.Duration(1e13)), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.SetCellValue("Sheet1", "A", time.Now().UTC()), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) + assert.EqualError(t, f.SetCellValue("Sheet1", "A", time.Duration(1e13)), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) } func TestSetCellValues(t *testing.T) { @@ -175,7 +175,7 @@ func TestSetCellValues(t *testing.T) { func TestSetCellBool(t *testing.T) { f := NewFile() - assert.EqualError(t, f.SetCellBool("Sheet1", "A", true), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.SetCellBool("Sheet1", "A", true), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) } func TestSetCellTime(t *testing.T) { @@ -336,7 +336,7 @@ func TestGetCellType(t *testing.T) { assert.NoError(t, err) assert.Equal(t, CellTypeString, cellType) _, err = f.GetCellType("Sheet1", "A") - assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) } func TestGetCellFormula(t *testing.T) { @@ -420,7 +420,7 @@ func TestSetCellFormula(t *testing.T) { assert.NoError(t, f.SetCellFormula("Sheet1", "C19", "SUM(Sheet2!D2,Sheet2!D9)")) // Test set cell formula with illegal rows number. - assert.EqualError(t, f.SetCellFormula("Sheet1", "C", "SUM(Sheet2!D2,Sheet2!D9)"), `cannot convert cell "C" to coordinates: invalid cell name "C"`) + assert.EqualError(t, f.SetCellFormula("Sheet1", "C", "SUM(Sheet2!D2,Sheet2!D9)"), newCellNameToCoordinatesError("C", newInvalidCellNameError("C")).Error()) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetCellFormula1.xlsx"))) assert.NoError(t, f.Close()) @@ -523,7 +523,7 @@ func TestGetCellRichText(t *testing.T) { assert.EqualError(t, err, "sheet SheetN is not exist") // Test set cell rich text with illegal cell coordinates _, err = f.GetCellRichText("Sheet1", "A") - assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) } func TestSetCellRichText(t *testing.T) { f := NewFile() @@ -603,7 +603,7 @@ func TestSetCellRichText(t *testing.T) { // Test set cell rich text on not exists worksheet assert.EqualError(t, f.SetCellRichText("SheetN", "A1", richTextRun), "sheet SheetN is not exist") // Test set cell rich text with illegal cell coordinates - assert.EqualError(t, f.SetCellRichText("Sheet1", "A", richTextRun), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.SetCellRichText("Sheet1", "A", richTextRun), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) richTextRun = []RichTextRun{{Text: strings.Repeat("s", TotalCellChars+1)}} // Test set cell rich text with characters over the maximum limit assert.EqualError(t, f.SetCellRichText("Sheet1", "A1", richTextRun), ErrCellCharsLength.Error()) diff --git a/chart_test.go b/chart_test.go index 2cd71316..c99bfb2c 100644 --- a/chart_test.go +++ b/chart_test.go @@ -94,7 +94,7 @@ func TestChartSize(t *testing.T) { func TestAddDrawingChart(t *testing.T) { f := NewFile() - assert.EqualError(t, f.addDrawingChart("SheetN", "", "", 0, 0, 0, nil), `cannot convert cell "" to coordinates: invalid cell name ""`) + assert.EqualError(t, f.addDrawingChart("SheetN", "", "", 0, 0, 0, nil), newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error()) } func TestAddChart(t *testing.T) { @@ -199,7 +199,7 @@ func TestAddChart(t *testing.T) { } assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddChart.xlsx"))) // Test with illegal cell coordinates - assert.EqualError(t, f.AddChart("Sheet2", "A", `{"type":"col","series":[{"name":"Sheet1!$A$30","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$30:$D$30"},{"name":"Sheet1!$A$31","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$31:$D$31"},{"name":"Sheet1!$A$32","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$32:$D$32"},{"name":"Sheet1!$A$33","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$33:$D$33"},{"name":"Sheet1!$A$34","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$34:$D$34"},{"name":"Sheet1!$A$35","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$35:$D$35"},{"name":"Sheet1!$A$36","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$36:$D$36"},{"name":"Sheet1!$A$37","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$37:$D$37"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"2D Column Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.AddChart("Sheet2", "A", `{"type":"col","series":[{"name":"Sheet1!$A$30","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$30:$D$30"},{"name":"Sheet1!$A$31","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$31:$D$31"},{"name":"Sheet1!$A$32","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$32:$D$32"},{"name":"Sheet1!$A$33","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$33:$D$33"},{"name":"Sheet1!$A$34","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$34:$D$34"},{"name":"Sheet1!$A$35","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$35:$D$35"},{"name":"Sheet1!$A$36","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$36:$D$36"},{"name":"Sheet1!$A$37","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$37:$D$37"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"2D Column Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) // Test with unsupported chart type assert.EqualError(t, f.AddChart("Sheet2", "BD32", `{"type":"unknown","series":[{"name":"Sheet1!$A$30","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$30:$D$30"},{"name":"Sheet1!$A$31","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$31:$D$31"},{"name":"Sheet1!$A$32","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$32:$D$32"},{"name":"Sheet1!$A$33","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$33:$D$33"},{"name":"Sheet1!$A$34","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$34:$D$34"},{"name":"Sheet1!$A$35","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$35:$D$35"},{"name":"Sheet1!$A$36","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$36:$D$36"},{"name":"Sheet1!$A$37","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$37:$D$37"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Bubble 3D Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`), "unsupported chart type unknown") // Test add combo chart with invalid format set @@ -252,7 +252,7 @@ func TestDeleteChart(t *testing.T) { // Test delete chart on not exists worksheet. assert.EqualError(t, f.DeleteChart("SheetN", "A1"), "sheet SheetN is not exist") // Test delete chart with invalid coordinates. - assert.EqualError(t, f.DeleteChart("Sheet1", ""), `cannot convert cell "" to coordinates: invalid cell name ""`) + assert.EqualError(t, f.DeleteChart("Sheet1", ""), newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error()) // Test delete chart on no chart worksheet. assert.NoError(t, NewFile().DeleteChart("Sheet1", "A1")) assert.NoError(t, f.Close()) diff --git a/col_test.go b/col_test.go index da46f785..2dd27dbf 100644 --- a/col_test.go +++ b/col_test.go @@ -120,7 +120,7 @@ func TestGetColsError(t *testing.T) { f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`B`)) _, err = f.GetCols("Sheet1") - assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) f = NewFile() cols, err := f.Cols("Sheet1") @@ -130,7 +130,7 @@ func TestGetColsError(t *testing.T) { cols.curCol = 1 cols.sheetXML = []byte(`A`) _, err = cols.Rows() - assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) } func TestColsRows(t *testing.T) { @@ -208,12 +208,12 @@ func TestColumnVisibility(t *testing.T) { // Test get column visible with illegal cell coordinates. _, err = f.GetColVisible("Sheet1", "*") - assert.EqualError(t, err, `invalid column name "*"`) - assert.EqualError(t, f.SetColVisible("Sheet1", "*", false), `invalid column name "*"`) + assert.EqualError(t, err, newInvalidColumnNameError("*").Error()) + assert.EqualError(t, f.SetColVisible("Sheet1", "*", false), newInvalidColumnNameError("*").Error()) f.NewSheet("Sheet3") assert.NoError(t, f.SetColVisible("Sheet3", "E", false)) - assert.EqualError(t, f.SetColVisible("Sheet1", "A:-1", true), "invalid column name \"-1\"") + assert.EqualError(t, f.SetColVisible("Sheet1", "A:-1", true), newInvalidColumnNameError("-1").Error()) assert.EqualError(t, f.SetColVisible("SheetN", "E", false), "sheet SheetN is not exist") assert.NoError(t, f.SaveAs(filepath.Join("test", "TestColumnVisibility.xlsx"))) }) @@ -258,20 +258,20 @@ func TestOutlineLevel(t *testing.T) { assert.EqualError(t, err, "sheet SheetN is not exist") // Test set and get column outline level with illegal cell coordinates. - assert.EqualError(t, f.SetColOutlineLevel("Sheet1", "*", 1), `invalid column name "*"`) + assert.EqualError(t, f.SetColOutlineLevel("Sheet1", "*", 1), newInvalidColumnNameError("*").Error()) _, err = f.GetColOutlineLevel("Sheet1", "*") - assert.EqualError(t, err, `invalid column name "*"`) + assert.EqualError(t, err, newInvalidColumnNameError("*").Error()) // Test set column outline level on not exists worksheet. assert.EqualError(t, f.SetColOutlineLevel("SheetN", "E", 2), "sheet SheetN is not exist") - assert.EqualError(t, f.SetRowOutlineLevel("Sheet1", 0, 1), "invalid row number 0") + assert.EqualError(t, f.SetRowOutlineLevel("Sheet1", 0, 1), newInvalidRowNumberError(0).Error()) level, err = f.GetRowOutlineLevel("Sheet1", 2) assert.NoError(t, err) assert.Equal(t, uint8(7), level) _, err = f.GetRowOutlineLevel("Sheet1", 0) - assert.EqualError(t, err, `invalid row number 0`) + assert.EqualError(t, err, newInvalidRowNumberError(0).Error()) level, err = f.GetRowOutlineLevel("Sheet1", 10) assert.NoError(t, err) @@ -293,8 +293,8 @@ func TestSetColStyle(t *testing.T) { // Test set column style on not exists worksheet. assert.EqualError(t, f.SetColStyle("SheetN", "E", style), "sheet SheetN is not exist") // Test set column style with illegal cell coordinates. - assert.EqualError(t, f.SetColStyle("Sheet1", "*", style), `invalid column name "*"`) - assert.EqualError(t, f.SetColStyle("Sheet1", "A:*", style), `invalid column name "*"`) + assert.EqualError(t, f.SetColStyle("Sheet1", "*", style), newInvalidColumnNameError("*").Error()) + assert.EqualError(t, f.SetColStyle("Sheet1", "A:*", style), newInvalidColumnNameError("*").Error()) assert.NoError(t, f.SetColStyle("Sheet1", "B", style)) // Test set column style with already exists column with style. @@ -317,9 +317,9 @@ func TestColWidth(t *testing.T) { // Test set and get column width with illegal cell coordinates. width, err = f.GetColWidth("Sheet1", "*") assert.Equal(t, defaultColWidth, width) - assert.EqualError(t, err, `invalid column name "*"`) - assert.EqualError(t, f.SetColWidth("Sheet1", "*", "B", 1), `invalid column name "*"`) - assert.EqualError(t, f.SetColWidth("Sheet1", "A", "*", 1), `invalid column name "*"`) + assert.EqualError(t, err, newInvalidColumnNameError("*").Error()) + assert.EqualError(t, f.SetColWidth("Sheet1", "*", "B", 1), newInvalidColumnNameError("*").Error()) + assert.EqualError(t, f.SetColWidth("Sheet1", "A", "*", 1), newInvalidColumnNameError("*").Error()) // Test set column width on not exists worksheet. assert.EqualError(t, f.SetColWidth("SheetN", "B", "A", 12), "sheet SheetN is not exist") @@ -345,7 +345,7 @@ func TestInsertCol(t *testing.T) { assert.NoError(t, f.InsertCol(sheet1, "A")) // Test insert column with illegal cell coordinates. - assert.EqualError(t, f.InsertCol("Sheet1", "*"), `invalid column name "*"`) + assert.EqualError(t, f.InsertCol("Sheet1", "*"), newInvalidColumnNameError("*").Error()) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertCol.xlsx"))) } @@ -366,7 +366,7 @@ func TestRemoveCol(t *testing.T) { assert.NoError(t, f.RemoveCol(sheet1, "A")) // Test remove column with illegal cell coordinates. - assert.EqualError(t, f.RemoveCol("Sheet1", "*"), `invalid column name "*"`) + assert.EqualError(t, f.RemoveCol("Sheet1", "*"), newInvalidColumnNameError("*").Error()) // Test remove column on not exists worksheet. assert.EqualError(t, f.RemoveCol("SheetN", "B"), "sheet SheetN is not exist") diff --git a/comment_test.go b/comment_test.go index fb36d290..9eb07f43 100644 --- a/comment_test.go +++ b/comment_test.go @@ -32,7 +32,7 @@ func TestAddComments(t *testing.T) { // Test add comment on not exists worksheet. assert.EqualError(t, f.AddComment("SheetN", "B7", `{"author":"Excelize: ","text":"This is a comment."}`), "sheet SheetN is not exist") // Test add comment on with illegal cell coordinates - assert.EqualError(t, f.AddComment("Sheet1", "A", `{"author":"Excelize: ","text":"This is a comment."}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.AddComment("Sheet1", "A", `{"author":"Excelize: ","text":"This is a comment."}`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) if assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddComments.xlsx"))) { assert.Len(t, f.GetComments(), 2) } diff --git a/crypt_test.go b/crypt_test.go index cb0b160b..0796482a 100644 --- a/crypt_test.go +++ b/crypt_test.go @@ -21,16 +21,16 @@ import ( func TestEncrypt(t *testing.T) { f, err := OpenFile(filepath.Join("test", "encryptSHA1.xlsx"), Options{Password: "password"}) assert.NoError(t, err) - assert.EqualError(t, f.SaveAs(filepath.Join("test", "BadEncrypt.xlsx"), Options{Password: "password"}), "not support encryption currently") + assert.EqualError(t, f.SaveAs(filepath.Join("test", "BadEncrypt.xlsx"), Options{Password: "password"}), ErrEncrypt.Error()) assert.NoError(t, f.Close()) } 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") + assert.EqualError(t, err, ErrUnsupportEncryptMechanism.Error()) _, err = encryptionMechanism([]byte{}) - assert.EqualError(t, err, "unknown encryption mechanism") + assert.EqualError(t, err, ErrUnknownEncryptMechanism.Error()) } func TestHashing(t *testing.T) { diff --git a/datavalidation_test.go b/datavalidation_test.go index c35693ce..56e7d735 100644 --- a/datavalidation_test.go +++ b/datavalidation_test.go @@ -164,13 +164,13 @@ func TestDeleteDataValidation(t *testing.T) { dvRange.Sqref = "A" assert.NoError(t, f.AddDataValidation("Sheet1", dvRange)) - assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) - assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1:A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1:A"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) ws, ok := f.Sheet.Load("xl/worksheets/sheet1.xml") assert.True(t, ok) ws.(*xlsxWorksheet).DataValidations.DataValidation[0].Sqref = "A1:A" - assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1:B2"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1:B2"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) // Test delete data validation on no exists worksheet. assert.EqualError(t, f.DeleteDataValidation("SheetN", "A1:B2"), "sheet SheetN is not exist") diff --git a/date_test.go b/date_test.go index cc516d57..cc21e58a 100644 --- a/date_test.go +++ b/date_test.go @@ -99,5 +99,5 @@ func TestExcelDateToTime(t *testing.T) { } // Check error case _, err := ExcelDateToTime(-1, false) - assert.EqualError(t, err, "invalid date value -1.000000, negative values are not supported") + assert.EqualError(t, err, newInvalidExcelDateError(-1).Error()) } diff --git a/errors.go b/errors.go index f9eedde7..4230c148 100644 --- a/errors.go +++ b/errors.go @@ -56,6 +56,12 @@ func newFieldLengthError(name string) error { return fmt.Errorf("field %s must be less or equal than 255 characters", name) } +// newCellNameToCoordinatesError defined the error message on converts +// alphanumeric cell name to coordinates. +func newCellNameToCoordinatesError(cell string, err error) error { + return fmt.Errorf("cannot convert cell %q to coordinates: %v", cell, err) +} + var ( // ErrStreamSetColWidth defined the error message on set column width in // stream writing mode. @@ -139,4 +145,24 @@ var ( // ErrOptionsUnzipSizeLimit defined the error message for receiving // invalid UnzipSizeLimit and WorksheetUnzipMemLimit. ErrOptionsUnzipSizeLimit = errors.New("the value of UnzipSizeLimit should be greater than or equal to WorksheetUnzipMemLimit") + // ErrSave defined the error message for saving file. + ErrSave = errors.New("no path defined for file, consider File.WriteTo or File.Write") + // ErrAttrValBool defined the error message on marshal and unmarshal + // boolean type XML attribute. + ErrAttrValBool = errors.New("unexpected child of attrValBool") + // ErrSparklineType defined the error message on receive the invalid + // sparkline Type parameters. + ErrSparklineType = errors.New("parameter 'Type' must be 'line', 'column' or 'win_loss'") + // ErrSparklineLocation defined the error message on missing Location + // parameters + ErrSparklineLocation = errors.New("parameter 'Location' is required") + // ErrSparklineRange defined the error message on missing sparkline Range + // parameters + ErrSparklineRange = errors.New("parameter 'Range' is required") + // ErrSparkline defined the error message on receive the invalid sparkline + // parameters. + ErrSparkline = errors.New("must have the same number of 'Location' and 'Range' parameters") + // ErrSparklineStyle defined the error message on receive the invalid + // sparkline Style parameters. + ErrSparklineStyle = errors.New("parameter 'Style' must betweent 0-35") ) diff --git a/excelize_test.go b/excelize_test.go index f556d83c..a15e8012 100644 --- a/excelize_test.go +++ b/excelize_test.go @@ -45,12 +45,12 @@ func TestOpenFile(t *testing.T) { // Test set cell value with illegal row number. assert.EqualError(t, f.SetCellDefault("Sheet2", "A", strconv.FormatFloat(float64(-100.1588), 'f', -1, 64)), - `cannot convert cell "A" to coordinates: invalid cell name "A"`) + newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.NoError(t, f.SetCellInt("Sheet2", "A1", 100)) // Test set cell integer value with illegal row number. - assert.EqualError(t, f.SetCellInt("Sheet2", "A", 100), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.SetCellInt("Sheet2", "A", 100), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.NoError(t, f.SetCellStr("Sheet2", "C11", "Knowns")) // Test max characters in a cell. @@ -63,7 +63,7 @@ func TestOpenFile(t *testing.T) { assert.EqualError(t, f.SetCellStr("Sheet10", "b230", "10"), "sheet Sheet10 is not exist") // Test set cell string value with illegal row number. - assert.EqualError(t, f.SetCellStr("Sheet1", "A", "10"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.SetCellStr("Sheet1", "A", "10"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) f.SetActiveSheet(2) // Test get cell formula with given rows number. @@ -77,7 +77,7 @@ func TestOpenFile(t *testing.T) { // Test get cell formula with illegal rows number. _, err = f.GetCellFormula("Sheet1", "B") - assert.EqualError(t, err, `cannot convert cell "B" to coordinates: invalid cell name "B"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error()) // Test get shared cell formula _, err = f.GetCellFormula("Sheet2", "H11") assert.NoError(t, err) @@ -87,9 +87,9 @@ func TestOpenFile(t *testing.T) { // Test read cell value with given illegal rows number. _, err = f.GetCellValue("Sheet2", "a-1") - assert.EqualError(t, err, `cannot convert cell "A-1" to coordinates: invalid cell name "A-1"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A-1", newInvalidCellNameError("A-1")).Error()) _, err = f.GetCellValue("Sheet2", "A") - assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) // Test read cell value with given lowercase column number. _, err = f.GetCellValue("Sheet2", "a5") @@ -324,7 +324,7 @@ func TestNewFile(t *testing.T) { func TestAddDrawingVML(t *testing.T) { // Test addDrawingVML with illegal cell coordinates. f := NewFile() - assert.EqualError(t, f.addDrawingVML(0, "", "*", 0, 0), `cannot convert cell "*" to coordinates: invalid cell name "*"`) + assert.EqualError(t, f.addDrawingVML(0, "", "*", 0, 0), newCellNameToCoordinatesError("*", newInvalidCellNameError("*")).Error()) } func TestSetCellHyperLink(t *testing.T) { @@ -368,7 +368,7 @@ func TestSetCellHyperLink(t *testing.T) { assert.True(t, ok) ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}} err = f.SetCellHyperLink("Sheet1", "A1", "https://github.com/xuri/excelize", "External") - assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) } func TestGetCellHyperLink(t *testing.T) { @@ -408,7 +408,7 @@ func TestGetCellHyperLink(t *testing.T) { assert.True(t, ok) ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}} link, target, err = f.GetCellHyperLink("Sheet1", "A1") - assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.Equal(t, link, false) assert.Equal(t, target, "") } @@ -570,13 +570,13 @@ func TestSetCellStyleAlignment(t *testing.T) { assert.NoError(t, f.SetCellStyle("Sheet1", "A22", "A22", style)) // Test set cell style with given illegal rows number. - assert.EqualError(t, f.SetCellStyle("Sheet1", "A", "A22", style), `cannot convert cell "A" to coordinates: invalid cell name "A"`) - assert.EqualError(t, f.SetCellStyle("Sheet1", "A22", "A", style), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.SetCellStyle("Sheet1", "A", "A22", style), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) + assert.EqualError(t, f.SetCellStyle("Sheet1", "A22", "A", style), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) // Test get cell style with given illegal rows number. index, err := f.GetCellStyle("Sheet1", "A") assert.Equal(t, 0, index) - assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetCellStyleAlignment.xlsx"))) } @@ -1109,7 +1109,7 @@ func TestSetSheetRow(t *testing.T) { assert.NoError(t, f.SetSheetRow("Sheet1", "B27", &[]interface{}{"cell", nil, int32(42), float64(42), time.Now().UTC()})) assert.EqualError(t, f.SetSheetRow("Sheet1", "", &[]interface{}{"cell", nil, 2}), - `cannot convert cell "" to coordinates: invalid cell name ""`) + newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error()) assert.EqualError(t, f.SetSheetRow("Sheet1", "B27", []interface{}{}), ErrParameterInvalid.Error()) assert.EqualError(t, f.SetSheetRow("Sheet1", "B27", &f), ErrParameterInvalid.Error()) @@ -1181,7 +1181,7 @@ func TestSetDefaultTimeStyle(t *testing.T) { assert.EqualError(t, f.setDefaultTimeStyle("SheetN", "", 0), "sheet SheetN is not exist") // Test set default time style on invalid cell - assert.EqualError(t, f.setDefaultTimeStyle("Sheet1", "", 42), "cannot convert cell \"\" to coordinates: invalid cell name \"\"") + assert.EqualError(t, f.setDefaultTimeStyle("Sheet1", "", 42), newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error()) } func TestAddVBAProject(t *testing.T) { diff --git a/file.go b/file.go index a430c5f4..e2aeb4a0 100644 --- a/file.go +++ b/file.go @@ -14,7 +14,6 @@ package excelize import ( "archive/zip" "bytes" - "fmt" "io" "os" "path/filepath" @@ -58,7 +57,7 @@ func NewFile() *File { // Save provides a function to override the spreadsheet with origin path. func (f *File) Save() error { if f.Path == "" { - return fmt.Errorf("no path defined for file, consider File.WriteTo or File.Write") + return ErrSave } return f.SaveAs(f.Path) } diff --git a/lib.go b/lib.go index ccb09ac6..0efc180c 100644 --- a/lib.go +++ b/lib.go @@ -16,7 +16,6 @@ import ( "bytes" "container/list" "encoding/xml" - "errors" "fmt" "io" "io/ioutil" @@ -240,11 +239,9 @@ func ColumnNumberToName(num int) (string, error) { // excelize.CellNameToCoordinates("Z3") // returns 26, 3, nil // func CellNameToCoordinates(cell string) (int, int, error) { - const msg = "cannot convert cell %q to coordinates: %v" - colname, row, err := SplitCellName(cell) if err != nil { - return -1, -1, fmt.Errorf(msg, cell, err) + return -1, -1, newCellNameToCoordinatesError(cell, err) } if row > TotalRows { return -1, -1, ErrMaxRows @@ -447,7 +444,7 @@ func (avb *attrValBool) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err found := false switch t.(type) { case xml.StartElement: - return errors.New("unexpected child of attrValBool") + return ErrAttrValBool case xml.EndElement: found = true } diff --git a/lib_test.go b/lib_test.go index 35dd2a01..3346acc6 100644 --- a/lib_test.go +++ b/lib_test.go @@ -184,7 +184,7 @@ func TestCellNameToCoordinates_Error(t *testing.T) { } } _, _, err := CellNameToCoordinates("A1048577") - assert.EqualError(t, err, "row number exceeds maximum limit") + assert.EqualError(t, err, ErrMaxRows.Error()) } func TestCoordinatesToCellName_OK(t *testing.T) { diff --git a/merge_test.go b/merge_test.go index 8d9ad41e..a28aeff3 100644 --- a/merge_test.go +++ b/merge_test.go @@ -12,7 +12,7 @@ func TestMergeCell(t *testing.T) { if !assert.NoError(t, err) { t.FailNow() } - assert.EqualError(t, f.MergeCell("Sheet1", "A", "B"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.MergeCell("Sheet1", "A", "B"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.NoError(t, f.MergeCell("Sheet1", "D9", "D9")) assert.NoError(t, f.MergeCell("Sheet1", "D9", "E9")) assert.NoError(t, f.MergeCell("Sheet1", "H14", "G13")) @@ -156,7 +156,7 @@ func TestUnmergeCell(t *testing.T) { mergeCellNum := len(sheet.MergeCells.Cells) - assert.EqualError(t, f.UnmergeCell("Sheet1", "A", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.UnmergeCell("Sheet1", "A", "A"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) // unmerge the mergecell that contains A1 assert.NoError(t, f.UnmergeCell(sheet1, "A1", "A1")) @@ -190,7 +190,7 @@ func TestUnmergeCell(t *testing.T) { ws, ok = f.Sheet.Load("xl/worksheets/sheet1.xml") assert.True(t, ok) ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}} - assert.EqualError(t, f.UnmergeCell("Sheet1", "A2", "B3"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.UnmergeCell("Sheet1", "A2", "B3"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) } func TestFlatMergedCells(t *testing.T) { diff --git a/picture_test.go b/picture_test.go index 29279768..5bf139d5 100644 --- a/picture_test.go +++ b/picture_test.go @@ -60,7 +60,7 @@ func TestAddPicture(t *testing.T) { // Test add picture to worksheet from bytes. assert.NoError(t, f.AddPictureFromBytes("Sheet1", "Q1", "", "Excel Logo", ".png", file)) // Test add picture to worksheet from bytes with illegal cell coordinates. - assert.EqualError(t, f.AddPictureFromBytes("Sheet1", "A", "", "Excel Logo", ".png", file), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.AddPictureFromBytes("Sheet1", "A", "", "Excel Logo", ".png", file), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.NoError(t, f.AddPicture("Sheet1", "Q8", filepath.Join("test", "images", "excel.gif"), "")) assert.NoError(t, f.AddPicture("Sheet1", "Q15", filepath.Join("test", "images", "excel.jpg"), "")) @@ -110,7 +110,7 @@ func TestGetPicture(t *testing.T) { // Try to get picture from a worksheet with illegal cell coordinates. _, _, err = f.GetPicture("Sheet1", "A") - assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) // Try to get picture from a worksheet that doesn't contain any images. file, raw, err = f.GetPicture("Sheet3", "I9") @@ -165,7 +165,7 @@ func TestGetPicture(t *testing.T) { func TestAddDrawingPicture(t *testing.T) { // testing addDrawingPicture with illegal cell coordinates. f := NewFile() - assert.EqualError(t, f.addDrawingPicture("sheet1", "", "A", "", 0, 0, 0, 0, nil), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.addDrawingPicture("sheet1", "", "A", "", 0, 0, 0, 0, nil), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) } func TestAddPictureFromBytes(t *testing.T) { @@ -195,7 +195,7 @@ func TestDeletePicture(t *testing.T) { // Test delete picture on not exists worksheet. assert.EqualError(t, f.DeletePicture("SheetN", "A1"), "sheet SheetN is not exist") // Test delete picture with invalid coordinates. - assert.EqualError(t, f.DeletePicture("Sheet1", ""), `cannot convert cell "" to coordinates: invalid cell name ""`) + assert.EqualError(t, f.DeletePicture("Sheet1", ""), newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error()) assert.NoError(t, f.Close()) // Test delete picture on no chart worksheet. assert.NoError(t, NewFile().DeletePicture("Sheet1", "A1")) @@ -208,9 +208,9 @@ func TestDrawingResize(t *testing.T) { assert.EqualError(t, err, "sheet SheetN is not exist") // Test calculate drawing resize with invalid coordinates. _, _, _, _, err = f.drawingResize("Sheet1", "", 1, 1, nil) - assert.EqualError(t, err, `cannot convert cell "" to coordinates: invalid cell name ""`) + assert.EqualError(t, err, newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error()) ws, ok := f.Sheet.Load("xl/worksheets/sheet1.xml") assert.True(t, ok) ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}} - assert.EqualError(t, f.AddPicture("Sheet1", "A1", filepath.Join("test", "images", "excel.jpg"), `{"autofit": true}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.AddPicture("Sheet1", "A1", filepath.Join("test", "images", "excel.jpg"), `{"autofit": true}`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) } diff --git a/pivotTable_test.go b/pivotTable_test.go index dbb82523..34877933 100644 --- a/pivotTable_test.go +++ b/pivotTable_test.go @@ -158,7 +158,7 @@ func TestAddPivotTable(t *testing.T) { })) // Test empty pivot table options - assert.EqualError(t, f.AddPivotTable(nil), "parameter is required") + assert.EqualError(t, f.AddPivotTable(nil), ErrParameterRequired.Error()) // Test invalid data range assert.EqualError(t, f.AddPivotTable(&PivotTableOption{ DataRange: "Sheet1!$A$1:$A$1", @@ -227,7 +227,7 @@ func TestAddPivotTable(t *testing.T) { // Test adjust range with invalid range _, _, err := f.adjustRange("") - assert.EqualError(t, err, "parameter is required") + assert.EqualError(t, err, ErrParameterRequired.Error()) // Test adjust range with incorrect range _, _, err = f.adjustRange("sheet1!") assert.EqualError(t, err, "parameter is invalid") diff --git a/rows_test.go b/rows_test.go index 9fee3d9e..0c154a46 100644 --- a/rows_test.go +++ b/rows_test.go @@ -111,10 +111,10 @@ func TestRowHeight(t *testing.T) { f := NewFile() sheet1 := f.GetSheetName(0) - assert.EqualError(t, f.SetRowHeight(sheet1, 0, defaultRowHeightPixels+1.0), "invalid row number 0") + assert.EqualError(t, f.SetRowHeight(sheet1, 0, defaultRowHeightPixels+1.0), newInvalidRowNumberError(0).Error()) _, err := f.GetRowHeight("Sheet1", 0) - assert.EqualError(t, err, "invalid row number 0") + assert.EqualError(t, err, newInvalidRowNumberError(0).Error()) assert.NoError(t, f.SetRowHeight(sheet1, 1, 111.0)) height, err := f.GetRowHeight(sheet1, 1) @@ -190,7 +190,7 @@ func TestColumns(t *testing.T) { rows.curRow = 3 rows.decoder = f.xmlNewDecoder(bytes.NewReader([]byte(`1`))) _, err = rows.Columns() - assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) // Test token is nil rows.decoder = f.xmlNewDecoder(bytes.NewReader(nil)) @@ -220,12 +220,12 @@ func TestRowVisibility(t *testing.T) { visiable, err = f.GetRowVisible("Sheet3", 25) assert.Equal(t, false, visiable) assert.NoError(t, err) - assert.EqualError(t, f.SetRowVisible("Sheet3", 0, true), "invalid row number 0") + assert.EqualError(t, f.SetRowVisible("Sheet3", 0, true), newInvalidRowNumberError(0).Error()) assert.EqualError(t, f.SetRowVisible("SheetN", 2, false), "sheet SheetN is not exist") visible, err := f.GetRowVisible("Sheet3", 0) assert.Equal(t, false, visible) - assert.EqualError(t, err, "invalid row number 0") + assert.EqualError(t, err, newInvalidRowNumberError(0).Error()) _, err = f.GetRowVisible("SheetN", 1) assert.EqualError(t, err, "sheet SheetN is not exist") @@ -245,9 +245,9 @@ func TestRemoveRow(t *testing.T) { assert.NoError(t, f.SetCellHyperLink(sheet1, "A5", "https://github.com/xuri/excelize", "External")) - assert.EqualError(t, f.RemoveRow(sheet1, -1), "invalid row number -1") + assert.EqualError(t, f.RemoveRow(sheet1, -1), newInvalidRowNumberError(-1).Error()) - assert.EqualError(t, f.RemoveRow(sheet1, 0), "invalid row number 0") + assert.EqualError(t, f.RemoveRow(sheet1, 0), newInvalidRowNumberError(0).Error()) assert.NoError(t, f.RemoveRow(sheet1, 4)) if !assert.Len(t, r.SheetData.Row, rowCount-1) { @@ -306,9 +306,9 @@ func TestInsertRow(t *testing.T) { assert.NoError(t, f.SetCellHyperLink(sheet1, "A5", "https://github.com/xuri/excelize", "External")) - assert.EqualError(t, f.InsertRow(sheet1, -1), "invalid row number -1") + assert.EqualError(t, f.InsertRow(sheet1, -1), newInvalidRowNumberError(-1).Error()) - assert.EqualError(t, f.InsertRow(sheet1, 0), "invalid row number 0") + assert.EqualError(t, f.InsertRow(sheet1, 0), newInvalidRowNumberError(0).Error()) assert.NoError(t, f.InsertRow(sheet1, 1)) if !assert.Len(t, r.SheetData.Row, rowCount+1) { @@ -484,7 +484,7 @@ func TestDuplicateRowZeroWithNoRows(t *testing.T) { t.Run("ZeroWithNoRows", func(t *testing.T) { f := NewFile() - assert.EqualError(t, f.DuplicateRow(sheet, 0), "invalid row number 0") + assert.EqualError(t, f.DuplicateRow(sheet, 0), newInvalidRowNumberError(0).Error()) if !assert.NoError(t, f.SaveAs(fmt.Sprintf(outFile, "ZeroWithNoRows"))) { t.FailNow() @@ -800,7 +800,7 @@ func TestDuplicateRowInvalidRowNum(t *testing.T) { assert.NoError(t, f.SetCellStr(sheet, col, val)) } - assert.EqualError(t, f.DuplicateRow(sheet, row), fmt.Sprintf("invalid row number %d", row)) + assert.EqualError(t, f.DuplicateRow(sheet, row), newInvalidRowNumberError(row).Error()) for col, val := range cells { v, err := f.GetCellValue(sheet, col) @@ -822,7 +822,7 @@ func TestDuplicateRowInvalidRowNum(t *testing.T) { assert.NoError(t, f.SetCellStr(sheet, col, val)) } - assert.EqualError(t, f.DuplicateRowTo(sheet, row1, row2), fmt.Sprintf("invalid row number %d", row1)) + assert.EqualError(t, f.DuplicateRowTo(sheet, row1, row2), newInvalidRowNumberError(row1).Error()) for col, val := range cells { v, err := f.GetCellValue(sheet, col) @@ -897,7 +897,7 @@ func TestCheckRow(t *testing.T) { f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`12345`)) f.Sheet.Delete("xl/worksheets/sheet1.xml") delete(f.checked, "xl/worksheets/sheet1.xml") - assert.EqualError(t, f.SetCellValue("Sheet1", "A1", false), `cannot convert cell "-" to coordinates: invalid cell name "-"`) + assert.EqualError(t, f.SetCellValue("Sheet1", "A1", false), newCellNameToCoordinatesError("-", newInvalidCellNameError("-")).Error()) } func TestSetRowStyle(t *testing.T) { diff --git a/shape_test.go b/shape_test.go index a02e53da..2f005894 100644 --- a/shape_test.go +++ b/shape_test.go @@ -56,7 +56,7 @@ func TestAddShape(t *testing.T) { "color": "2980B9" } }] - }`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + }`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddShape1.xlsx"))) // Test add first shape for given sheet. diff --git a/sheet_test.go b/sheet_test.go index d33ba99d..9bfee70a 100644 --- a/sheet_test.go +++ b/sheet_test.go @@ -207,7 +207,7 @@ func TestSearchSheet(t *testing.T) { f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`A`)) result, err = f.SearchSheet("Sheet1", "A") - assert.EqualError(t, err, "cannot convert cell \"A\" to coordinates: invalid cell name \"A\"") + assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.Equal(t, []string(nil), result) f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`A`)) @@ -236,7 +236,7 @@ func TestSetHeaderFooter(t *testing.T) { // Test set header and footer with illegal setting. assert.EqualError(t, f.SetHeaderFooter("Sheet1", &FormatHeaderFooter{ OddHeader: strings.Repeat("c", MaxFieldLength+1), - }), "field OddHeader must be less or equal than 255 characters") + }), newFieldLengthError("OddHeader").Error()) assert.NoError(t, f.SetHeaderFooter("Sheet1", nil)) text := strings.Repeat("δΈ€", MaxFieldLength) @@ -276,10 +276,10 @@ func TestDefinedName(t *testing.T) { Name: "Amount", RefersTo: "Sheet1!$A$2:$D$5", Comment: "defined name comment", - }), "the same name already exists on the scope") + }), ErrDefinedNameduplicate.Error()) assert.EqualError(t, f.DeleteDefinedName(&DefinedName{ Name: "No Exist Defined Name", - }), "no defined name on the scope") + }), ErrDefinedNameScope.Error()) assert.Exactly(t, "Sheet1!$A$2:$D$5", f.GetDefinedName()[1].RefersTo) assert.NoError(t, f.DeleteDefinedName(&DefinedName{ Name: "Amount", @@ -316,7 +316,7 @@ func TestInsertPageBreak(t *testing.T) { assert.NoError(t, f.InsertPageBreak("Sheet1", "B2")) assert.NoError(t, f.InsertPageBreak("Sheet1", "C3")) assert.NoError(t, f.InsertPageBreak("Sheet1", "C3")) - assert.EqualError(t, f.InsertPageBreak("Sheet1", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.InsertPageBreak("Sheet1", "A"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.EqualError(t, f.InsertPageBreak("SheetN", "C3"), "sheet SheetN is not exist") assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertPageBreak.xlsx"))) } @@ -342,7 +342,7 @@ func TestRemovePageBreak(t *testing.T) { assert.NoError(t, f.InsertPageBreak("Sheet2", "C2")) assert.NoError(t, f.RemovePageBreak("Sheet2", "B2")) - assert.EqualError(t, f.RemovePageBreak("Sheet1", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, f.RemovePageBreak("Sheet1", "A"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.EqualError(t, f.RemovePageBreak("SheetN", "C3"), "sheet SheetN is not exist") assert.NoError(t, f.SaveAs(filepath.Join("test", "TestRemovePageBreak.xlsx"))) } diff --git a/sparkline.go b/sparkline.go index 917383d9..0d5ef6e1 100644 --- a/sparkline.go +++ b/sparkline.go @@ -13,7 +13,6 @@ package excelize import ( "encoding/xml" - "errors" "io" "strings" ) @@ -410,7 +409,7 @@ func (f *File) AddSparkline(sheet string, opt *SparklineOption) (err error) { sparkTypes = map[string]string{"line": "line", "column": "column", "win_loss": "stacked"} if opt.Type != "" { if specifiedSparkTypes, ok = sparkTypes[opt.Type]; !ok { - err = errors.New("parameter 'Type' must be 'line', 'column' or 'win_loss'") + err = ErrSparklineType return } sparkType = specifiedSparkTypes @@ -470,17 +469,17 @@ func (f *File) parseFormatAddSparklineSet(sheet string, opt *SparklineOption) (* return ws, ErrParameterRequired } if len(opt.Location) < 1 { - return ws, errors.New("parameter 'Location' is required") + return ws, ErrSparklineLocation } if len(opt.Range) < 1 { - return ws, errors.New("parameter 'Range' is required") + return ws, ErrSparklineRange } // The ranges and locations must match.\ if len(opt.Location) != len(opt.Range) { - return ws, errors.New(`must have the same number of 'Location' and 'Range' parameters`) + return ws, ErrSparkline } if opt.Style < 0 || opt.Style > 35 { - return ws, errors.New("parameter 'Style' must betweent 0-35") + return ws, ErrSparklineStyle } if ws.ExtLst == nil { ws.ExtLst = &xlsxExtLst{} diff --git a/sparkline_test.go b/sparkline_test.go index 0777ee16..c21687cb 100644 --- a/sparkline_test.go +++ b/sparkline_test.go @@ -220,38 +220,38 @@ func TestAddSparkline(t *testing.T) { Range: []string{"Sheet2!A3:E3"}, }), "sheet SheetN is not exist") - assert.EqualError(t, f.AddSparkline("Sheet1", nil), "parameter is required") + assert.EqualError(t, f.AddSparkline("Sheet1", nil), ErrParameterRequired.Error()) assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ Range: []string{"Sheet2!A3:E3"}, - }), `parameter 'Location' is required`) + }), ErrSparklineLocation.Error()) assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ Location: []string{"F3"}, - }), `parameter 'Range' is required`) + }), ErrSparklineRange.Error()) assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ Location: []string{"F2", "F3"}, Range: []string{"Sheet2!A3:E3"}, - }), `must have the same number of 'Location' and 'Range' parameters`) + }), ErrSparkline.Error()) assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ Location: []string{"F3"}, Range: []string{"Sheet2!A3:E3"}, Type: "unknown_type", - }), `parameter 'Type' must be 'line', 'column' or 'win_loss'`) + }), ErrSparklineType.Error()) assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ Location: []string{"F3"}, Range: []string{"Sheet2!A3:E3"}, Style: -1, - }), `parameter 'Style' must betweent 0-35`) + }), ErrSparklineStyle.Error()) assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ Location: []string{"F3"}, Range: []string{"Sheet2!A3:E3"}, Style: -1, - }), `parameter 'Style' must betweent 0-35`) + }), ErrSparklineStyle.Error()) ws, ok := f.Sheet.Load("xl/worksheets/sheet1.xml") assert.True(t, ok) diff --git a/stream_test.go b/stream_test.go index 52cee4de..833a00ac 100644 --- a/stream_test.go +++ b/stream_test.go @@ -174,8 +174,8 @@ func TestStreamTable(t *testing.T) { // Test add table with illegal formatset. assert.EqualError(t, streamWriter.AddTable("B26", "A21", `{x}`), "invalid character 'x' looking for beginning of object key string") // Test add table with illegal cell coordinates. - assert.EqualError(t, streamWriter.AddTable("A", "B1", `{}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) - assert.EqualError(t, streamWriter.AddTable("A1", "B", `{}`), `cannot convert cell "B" to coordinates: invalid cell name "B"`) + assert.EqualError(t, streamWriter.AddTable("A", "B1", `{}`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) + assert.EqualError(t, streamWriter.AddTable("A1", "B", `{}`), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error()) } func TestStreamMergeCells(t *testing.T) { @@ -184,7 +184,7 @@ func TestStreamMergeCells(t *testing.T) { assert.NoError(t, err) assert.NoError(t, streamWriter.MergeCell("A1", "D1")) // Test merge cells with illegal cell coordinates. - assert.EqualError(t, streamWriter.MergeCell("A", "D1"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, streamWriter.MergeCell("A", "D1"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) assert.NoError(t, streamWriter.Flush()) // Save spreadsheet by the given path. assert.NoError(t, file.SaveAs(filepath.Join("test", "TestStreamMergeCells.xlsx"))) @@ -204,7 +204,7 @@ func TestSetRow(t *testing.T) { file := NewFile() streamWriter, err := file.NewStreamWriter("Sheet1") assert.NoError(t, err) - assert.EqualError(t, streamWriter.SetRow("A", []interface{}{}), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.EqualError(t, streamWriter.SetRow("A", []interface{}{}), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) } func TestSetCellValFunc(t *testing.T) { diff --git a/table_test.go b/table_test.go index 95738e13..0a74b1b5 100644 --- a/table_test.go +++ b/table_test.go @@ -34,8 +34,8 @@ func TestAddTable(t *testing.T) { // Test add table with illegal formatset. assert.EqualError(t, f.AddTable("Sheet1", "B26", "A21", `{x}`), "invalid character 'x' looking for beginning of object key string") // Test add table with illegal cell coordinates. - assert.EqualError(t, f.AddTable("Sheet1", "A", "B1", `{}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) - assert.EqualError(t, f.AddTable("Sheet1", "A1", "B", `{}`), `cannot convert cell "B" to coordinates: invalid cell name "B"`) + assert.EqualError(t, f.AddTable("Sheet1", "A", "B1", `{}`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) + assert.EqualError(t, f.AddTable("Sheet1", "A1", "B", `{}`), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error()) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddTable.xlsx"))) @@ -73,8 +73,8 @@ func TestAutoFilter(t *testing.T) { } // testing AutoFilter with illegal cell coordinates. - assert.EqualError(t, f.AutoFilter("Sheet1", "A", "B1", ""), `cannot convert cell "A" to coordinates: invalid cell name "A"`) - assert.EqualError(t, f.AutoFilter("Sheet1", "A1", "B", ""), `cannot convert cell "B" to coordinates: invalid cell name "B"`) + assert.EqualError(t, f.AutoFilter("Sheet1", "A", "B1", ""), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error()) + assert.EqualError(t, f.AutoFilter("Sheet1", "A1", "B", ""), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error()) } func TestAutoFilterError(t *testing.T) { @@ -109,7 +109,7 @@ func TestAutoFilterError(t *testing.T) { assert.EqualError(t, f.autoFilter("Sheet1", "A1", 1, 1, &formatAutoFilter{ Column: "-", Expression: "-", - }), `invalid column name "-"`) + }), newInvalidColumnNameError("-").Error()) assert.EqualError(t, f.autoFilter("Sheet1", "A1", 1, 100, &formatAutoFilter{ Column: "A", Expression: "-",