@@ -3,6 +3,7 @@ package excelize
33import (
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