Skip to content

Commit 5f58354

Browse files
authoredMay 14, 2024
Add unit test for the stream writer to improved line of code coverage (qax-os#1898)
- Update dependencies modules - Using the workbook instead of XLSX in the function comments
1 parent a64efca commit 5f58354

8 files changed

+82
-31
lines changed
 

‎chart_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ func TestDeleteChart(t *testing.T) {
409409
}
410410

411411
func TestChartWithLogarithmicBase(t *testing.T) {
412-
// Create test XLSX file with data
412+
// Create test workbook with data
413413
f := NewFile()
414414
sheet1 := f.GetSheetName(0)
415415
categories := map[string]float64{
@@ -454,14 +454,14 @@ func TestChartWithLogarithmicBase(t *testing.T) {
454454
assert.NoError(t, f.AddChart(sheet1, c.cell, c.opts))
455455
}
456456

457-
// Export XLSX file for human confirmation
457+
// Export workbook for human confirmation
458458
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestChartWithLogarithmicBase10.xlsx")))
459459

460-
// Write the XLSX file to a buffer
460+
// Write the workbook to a buffer
461461
var buffer bytes.Buffer
462462
assert.NoError(t, f.Write(&buffer))
463463

464-
// Read back the XLSX file from the buffer
464+
// Read back the workbook from the buffer
465465
newFile, err := OpenReader(&buffer)
466466
assert.NoError(t, err)
467467

‎excelize.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ func (f *File) getOptions(opts ...Options) *Options {
228228
}
229229

230230
// CharsetTranscoder Set user defined codepage transcoder function for open
231-
// XLSX from non UTF-8 encoding.
231+
// workbook from non UTF-8 encoding.
232232
func (f *File) CharsetTranscoder(fn charsetTranscoderFn) *File { f.CharsetReader = fn; return f }
233233

234234
// Creates new XML decoder with charset reader.

‎excelize_test.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -365,11 +365,11 @@ func TestNewFile(t *testing.T) {
365365
f := NewFile()
366366
_, err := f.NewSheet("Sheet1")
367367
assert.NoError(t, err)
368-
_, err = f.NewSheet("XLSXSheet2")
368+
_, err = f.NewSheet("Sheet2")
369369
assert.NoError(t, err)
370-
_, err = f.NewSheet("XLSXSheet3")
370+
_, err = f.NewSheet("Sheet3")
371371
assert.NoError(t, err)
372-
assert.NoError(t, f.SetCellInt("XLSXSheet2", "A23", 56))
372+
assert.NoError(t, f.SetCellInt("Sheet2", "A23", 56))
373373
assert.NoError(t, f.SetCellStr("Sheet1", "B20", "42"))
374374
f.SetActiveSheet(0)
375375

@@ -962,7 +962,7 @@ func TestSetDeleteSheet(t *testing.T) {
962962
f, err := prepareTestBook3()
963963
assert.NoError(t, err)
964964

965-
assert.NoError(t, f.DeleteSheet("XLSXSheet3"))
965+
assert.NoError(t, f.DeleteSheet("Sheet3"))
966966
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetDeleteSheet.TestBook3.xlsx")))
967967
})
968968

@@ -1610,13 +1610,13 @@ func prepareTestBook1() (*File, error) {
16101610

16111611
func prepareTestBook3() (*File, error) {
16121612
f := NewFile()
1613-
if _, err := f.NewSheet("XLSXSheet2"); err != nil {
1613+
if _, err := f.NewSheet("Sheet2"); err != nil {
16141614
return nil, err
16151615
}
1616-
if _, err := f.NewSheet("XLSXSheet3"); err != nil {
1616+
if _, err := f.NewSheet("Sheet3"); err != nil {
16171617
return nil, err
16181618
}
1619-
if err := f.SetCellInt("XLSXSheet2", "A23", 56); err != nil {
1619+
if err := f.SetCellInt("Sheet2", "A23", 56); err != nil {
16201620
return nil, err
16211621
}
16221622
if err := f.SetCellStr("Sheet1", "B20", "42"); err != nil {

‎go.mod

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ require (
88
github.com/stretchr/testify v1.8.4
99
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d
1010
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7
11-
golang.org/x/crypto v0.22.0
11+
golang.org/x/crypto v0.23.0
1212
golang.org/x/image v0.14.0
13-
golang.org/x/net v0.24.0
14-
golang.org/x/text v0.14.0
13+
golang.org/x/net v0.25.0
14+
golang.org/x/text v0.15.0
1515
)
1616

1717
require (

‎go.sum

+6-6
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7
1515
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
1616
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A=
1717
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
18-
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
19-
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
18+
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
19+
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
2020
golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4=
2121
golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
22-
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
23-
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
24-
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
25-
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
22+
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
23+
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
24+
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
25+
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
2626
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
2727
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
2828
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

‎sparkline.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -359,9 +359,9 @@ var sparklineGroupPresets = []*xlsxX14SparklineGroup{
359359
// AddSparkline provides a function to add sparklines to the worksheet by
360360
// given formatting options. Sparklines are small charts that fit in a single
361361
// cell and are used to show trends in data. Sparklines are a feature of Excel
362-
// 2010 and later only. You can write them to an XLSX file that can be read by
363-
// Excel 2007, but they won't be displayed. For example, add a grouped
364-
// sparkline. Changes are applied to all three:
362+
// 2010 and later only. You can write them to workbook that can be read by Excel
363+
// 2007, but they won't be displayed. For example, add a grouped sparkline.
364+
// Changes are applied to all three:
365365
//
366366
// err := f.AddSparkline("Sheet1", &excelize.SparklineOptions{
367367
// Location: []string{"A1", "A2", "A3"},

‎stream.go

+3-5
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ func (sw *StreamWriter) getRowValues(hRow, hCol, vCol int) (res []string, err er
290290
}
291291
}
292292

293-
// Check if the token is an XLSX row with the matching row number.
293+
// Check if the token is an worksheet row with the matching row number.
294294
func getRowElement(token xml.Token, hRow int) (startElement xml.StartElement, ok bool) {
295295
startElement, ok = token.(xml.StartElement)
296296
if !ok {
@@ -527,7 +527,7 @@ func (sw *StreamWriter) setCellValFunc(c *xlsxC, val interface{}) error {
527527
var err error
528528
switch val := val.(type) {
529529
case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
530-
err = setCellIntFunc(c, val)
530+
setCellIntFunc(c, val)
531531
case float32:
532532
c.T, c.V = setCellFloat(float64(val), -1, 32)
533533
case float64:
@@ -554,7 +554,7 @@ func (sw *StreamWriter) setCellValFunc(c *xlsxC, val interface{}) error {
554554
}
555555

556556
// setCellIntFunc is a wrapper of SetCellInt.
557-
func setCellIntFunc(c *xlsxC, val interface{}) (err error) {
557+
func setCellIntFunc(c *xlsxC, val interface{}) {
558558
switch val := val.(type) {
559559
case int:
560560
c.T, c.V = setCellInt(val)
@@ -576,9 +576,7 @@ func setCellIntFunc(c *xlsxC, val interface{}) (err error) {
576576
c.T, c.V = setCellUint(uint64(val))
577577
case uint64:
578578
c.T, c.V = setCellUint(val)
579-
default:
580579
}
581-
return
582580
}
583581

584582
// writeCell constructs a cell XML and writes it to the buffer.

‎stream_test.go

+55-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package excelize
33
import (
44
"encoding/xml"
55
"fmt"
6+
"io"
67
"math/rand"
78
"os"
89
"path/filepath"
@@ -224,6 +225,8 @@ func TestStreamTable(t *testing.T) {
224225
assert.Equal(t, newCellNameToCoordinatesError("B", newInvalidCellNameError("B")), streamWriter.AddTable(&Table{Range: "A1:B"}))
225226
// Test add table with invalid table name
226227
assert.Equal(t, newInvalidNameError("1Table"), streamWriter.AddTable(&Table{Range: "A:B1", Name: "1Table"}))
228+
// Test add table with row number exceeds maximum limit
229+
assert.Equal(t, ErrMaxRows, streamWriter.AddTable(&Table{Range: "A1048576:C1048576"}))
227230
// Test add table with unsupported charset content types
228231
file.ContentTypes = nil
229232
file.Pkg.Store(defaultXMLPathContentTypes, MacintoshCyrillicCharset)
@@ -332,8 +335,7 @@ func TestStreamSetRowWithStyle(t *testing.T) {
332335
Cell{StyleID: blueStyleID, Value: "value3"},
333336
&Cell{StyleID: blueStyleID, Value: "value3"},
334337
}, RowOpts{StyleID: grayStyleID}))
335-
err = streamWriter.Flush()
336-
assert.NoError(t, err)
338+
assert.NoError(t, streamWriter.Flush())
337339

338340
ws, err := file.workSheetReader("Sheet1")
339341
assert.NoError(t, err)
@@ -398,3 +400,54 @@ func TestStreamWriterOutlineLevel(t *testing.T) {
398400
}
399401
assert.NoError(t, file.Close())
400402
}
403+
404+
func TestStreamWriterReader(t *testing.T) {
405+
var (
406+
err error
407+
sw = StreamWriter{
408+
rawData: bufferedWriter{},
409+
}
410+
)
411+
sw.rawData.tmp, err = os.CreateTemp(os.TempDir(), "excelize-")
412+
assert.NoError(t, err)
413+
assert.NoError(t, sw.rawData.tmp.Close())
414+
// Test reader stat a closed temp file
415+
_, err = sw.rawData.Reader()
416+
assert.Error(t, err)
417+
_, err = sw.getRowValues(1, 1, 1)
418+
assert.Error(t, err)
419+
os.Remove(sw.rawData.tmp.Name())
420+
421+
sw = StreamWriter{
422+
file: NewFile(),
423+
rawData: bufferedWriter{},
424+
}
425+
// Test getRowValues without expected row
426+
sw.rawData.buf.WriteString("<worksheet><row r=\"1\"><c r=\"B1\"></c></row><worksheet/>")
427+
_, err = sw.getRowValues(1, 1, 1)
428+
assert.NoError(t, err)
429+
sw.rawData.buf.Reset()
430+
// Test getRowValues with illegal cell reference
431+
sw.rawData.buf.WriteString("<worksheet><row r=\"1\"><c r=\"A\"></c></row><worksheet/>")
432+
_, err = sw.getRowValues(1, 1, 1)
433+
assert.Equal(t, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")), err)
434+
sw.rawData.buf.Reset()
435+
// Test getRowValues with invalid c element characters
436+
sw.rawData.buf.WriteString("<worksheet><row r=\"1\"><c></row><worksheet/>")
437+
_, err = sw.getRowValues(1, 1, 1)
438+
assert.EqualError(t, err, "XML syntax error on line 1: element <c> closed by </row>")
439+
sw.rawData.buf.Reset()
440+
}
441+
442+
func TestStreamWriterGetRowElement(t *testing.T) {
443+
// Test get row element without r attribute
444+
dec := xml.NewDecoder(strings.NewReader("<row ht=\"0\" />"))
445+
for {
446+
token, err := dec.Token()
447+
if err == io.EOF {
448+
break
449+
}
450+
_, ok := getRowElement(token, 0)
451+
assert.False(t, ok)
452+
}
453+
}

0 commit comments

Comments
 (0)