stream_test.go 3.3 KB
Newer Older
1 2 3
package excelize

import (
C
Cameron Howey 已提交
4 5
	"encoding/xml"
	"fmt"
6 7 8 9 10 11 12 13
	"math/rand"
	"path/filepath"
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"
)

C
Cameron Howey 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
func BenchmarkStreamWriter(b *testing.B) {
	file := NewFile()

	row := make([]interface{}, 10)
	for colID := 0; colID < 10; colID++ {
		row[colID] = colID
	}

	for n := 0; n < b.N; n++ {
		streamWriter, _ := file.NewStreamWriter("Sheet1")
		for rowID := 10; rowID <= 110; rowID++ {
			cell, _ := CoordinatesToCellName(1, rowID)
			streamWriter.SetRow(cell, row)
		}
	}

	b.ReportAllocs()
}

33 34 35 36 37 38 39 40
func TestStreamWriter(t *testing.T) {
	file := NewFile()
	streamWriter, err := file.NewStreamWriter("Sheet1")
	assert.NoError(t, err)

	// Test max characters in a cell.
	row := make([]interface{}, 1)
	row[0] = strings.Repeat("c", 32769)
C
Cameron Howey 已提交
41
	assert.NoError(t, streamWriter.SetRow("A1", row))
42 43 44 45

	// Test leading and ending space(s) character characters in a cell.
	row = make([]interface{}, 1)
	row[0] = " characters"
C
Cameron Howey 已提交
46
	assert.NoError(t, streamWriter.SetRow("A2", row))
47 48 49

	row = make([]interface{}, 1)
	row[0] = []byte("Word")
C
Cameron Howey 已提交
50
	assert.NoError(t, streamWriter.SetRow("A3", row))
51 52 53 54 55 56 57

	for rowID := 10; rowID <= 51200; rowID++ {
		row := make([]interface{}, 50)
		for colID := 0; colID < 50; colID++ {
			row[colID] = rand.Intn(640000)
		}
		cell, _ := CoordinatesToCellName(1, rowID)
C
Cameron Howey 已提交
58
		assert.NoError(t, streamWriter.SetRow(cell, row))
59 60
	}

xurime's avatar
xurime 已提交
61
	assert.NoError(t, streamWriter.Flush())
62 63 64
	// Save xlsx file by the given path.
	assert.NoError(t, file.SaveAs(filepath.Join("test", "TestStreamWriter.xlsx")))

xurime's avatar
xurime 已提交
65 66 67 68 69 70 71 72 73 74
	// Test close temporary file error
	file = NewFile()
	streamWriter, err = file.NewStreamWriter("Sheet1")
	assert.NoError(t, err)
	for rowID := 10; rowID <= 51200; rowID++ {
		row := make([]interface{}, 50)
		for colID := 0; colID < 50; colID++ {
			row[colID] = rand.Intn(640000)
		}
		cell, _ := CoordinatesToCellName(1, rowID)
C
Cameron Howey 已提交
75
		assert.NoError(t, streamWriter.SetRow(cell, row))
xurime's avatar
xurime 已提交
76
	}
C
Cameron Howey 已提交
77
	assert.NoError(t, streamWriter.rawData.Close())
xurime's avatar
xurime 已提交
78
	assert.Error(t, streamWriter.Flush())
79 80
}

C
Cameron Howey 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
func TestStreamTable(t *testing.T) {
	file := NewFile()
	streamWriter, err := file.NewStreamWriter("Sheet1")
	assert.NoError(t, err)

	// Write some rows. We want enough rows to force a temp file (>16MB).
	assert.NoError(t, streamWriter.SetRow("A1", []interface{}{"A", "B", "C"}))
	row := []interface{}{1, 2, 3}
	for r := 2; r < 10000; r++ {
		assert.NoError(t, streamWriter.SetRow(fmt.Sprintf("A%d", r), row))
	}

	// Write a table.
	assert.NoError(t, streamWriter.AddTable("A1", "C2", ``))
	assert.NoError(t, streamWriter.Flush())

	// Verify the table has names.
	var table xlsxTable
	assert.NoError(t, xml.Unmarshal(file.XLSX["xl/tables/table1.xml"], &table))
	assert.Equal(t, "A", table.TableColumns.TableColumn[0].Name)
	assert.Equal(t, "B", table.TableColumns.TableColumn[1].Name)
	assert.Equal(t, "C", table.TableColumns.TableColumn[2].Name)
}

func TestNewStreamWriter(t *testing.T) {
	// Test error exceptions
	file := NewFile()
	_, err := file.NewStreamWriter("Sheet1")
	assert.NoError(t, err)
	_, err = file.NewStreamWriter("SheetN")
	assert.EqualError(t, err, "sheet SheetN is not exist")
}

114 115 116 117 118
func TestSetRow(t *testing.T) {
	// Test error exceptions
	file := NewFile()
	streamWriter, err := file.NewStreamWriter("Sheet1")
	assert.NoError(t, err)
C
Cameron Howey 已提交
119
	assert.EqualError(t, streamWriter.SetRow("A", []interface{}{}), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
120
}