sharedstrings_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package xlsx
  2. import (
  3. "bytes"
  4. "encoding/xml"
  5. . "gopkg.in/check.v1"
  6. )
  7. type SharedStringsSuite struct {
  8. SharedStringsXML *bytes.Buffer
  9. }
  10. var _ = Suite(&SharedStringsSuite{})
  11. func (s *SharedStringsSuite) SetUpTest(c *C) {
  12. s.SharedStringsXML = bytes.NewBufferString(
  13. `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  14. <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
  15. count="4"
  16. uniqueCount="4">
  17. <si>
  18. <t>Foo</t>
  19. </si>
  20. <si>
  21. <t>Bar</t>
  22. </si>
  23. <si>
  24. <t xml:space="preserve">Baz </t>
  25. </si>
  26. <si>
  27. <t>Quuk</t>
  28. </si>
  29. </sst>`)
  30. }
  31. // We can add a new string to the RefTable
  32. func (s *SharedStringsSuite) TestRefTableAddString(c *C) {
  33. refTable := NewSharedStringRefTable()
  34. index := refTable.AddString("Foo")
  35. c.Assert(index, Equals, 0)
  36. c.Assert(refTable.ResolveSharedString(0), Equals, "Foo")
  37. }
  38. func (s *SharedStringsSuite) TestCreateNewSharedStringRefTable(c *C) {
  39. refTable := NewSharedStringRefTable()
  40. refTable.AddString("Foo")
  41. refTable.AddString("Bar")
  42. c.Assert(refTable.ResolveSharedString(0), Equals, "Foo")
  43. c.Assert(refTable.ResolveSharedString(1), Equals, "Bar")
  44. }
  45. // Test we can correctly convert a xlsxSST into a reference table
  46. // using xlsx.MakeSharedStringRefTable().
  47. func (s *SharedStringsSuite) TestMakeSharedStringRefTable(c *C) {
  48. sst := new(xlsxSST)
  49. err := xml.NewDecoder(s.SharedStringsXML).Decode(sst)
  50. c.Assert(err, IsNil)
  51. reftable := MakeSharedStringRefTable(sst)
  52. c.Assert(reftable.Length(), Equals, 4)
  53. c.Assert(reftable.ResolveSharedString(0), Equals, "Foo")
  54. c.Assert(reftable.ResolveSharedString(1), Equals, "Bar")
  55. }
  56. // Test we can correctly resolve a numeric reference in the reference
  57. // table to a string value using RefTable.ResolveSharedString().
  58. func (s *SharedStringsSuite) TestResolveSharedString(c *C) {
  59. sst := new(xlsxSST)
  60. err := xml.NewDecoder(s.SharedStringsXML).Decode(sst)
  61. c.Assert(err, IsNil)
  62. reftable := MakeSharedStringRefTable(sst)
  63. c.Assert(reftable.ResolveSharedString(0), Equals, "Foo")
  64. }
  65. // Test we can correctly unmarshal an the sharedstrings.xml file into
  66. // an xlsx.xlsxSST struct and it's associated children.
  67. func (s *SharedStringsSuite) TestUnmarshallSharedStrings(c *C) {
  68. sst := new(xlsxSST)
  69. err := xml.NewDecoder(s.SharedStringsXML).Decode(sst)
  70. c.Assert(err, IsNil)
  71. c.Assert(sst.Count, Equals, 4)
  72. c.Assert(sst.UniqueCount, Equals, 4)
  73. c.Assert(sst.SI, HasLen, 4)
  74. si := sst.SI[0]
  75. c.Assert(si.T, Equals, "Foo")
  76. }
  77. // Test we can correctly create the xlsx.xlsxSST struct from a RefTable
  78. func (s *SharedStringsSuite) TestMakeXLSXSST(c *C) {
  79. refTable := NewSharedStringRefTable()
  80. refTable.AddString("Foo")
  81. refTable.AddString("Bar")
  82. sst := refTable.makeXLSXSST()
  83. c.Assert(sst, NotNil)
  84. c.Assert(sst.Count, Equals, 2)
  85. c.Assert(sst.UniqueCount, Equals, 2)
  86. c.Assert(sst.SI, HasLen, 2)
  87. si := sst.SI[0]
  88. c.Assert(si.T, Equals, "Foo")
  89. }
  90. func (s *SharedStringsSuite) TestMarshalSST(c *C) {
  91. refTable := NewSharedStringRefTable()
  92. refTable.AddString("Foo")
  93. sst := refTable.makeXLSXSST()
  94. output := bytes.NewBufferString(xml.Header)
  95. body, err := xml.MarshalIndent(sst, " ", " ")
  96. c.Assert(err, IsNil)
  97. c.Assert(body, NotNil)
  98. _, err = output.Write(body)
  99. c.Assert(err, IsNil)
  100. expectedXLSXSST := `<?xml version="1.0" encoding="UTF-8"?>
  101. <sst count="1" uniqueCount="1">
  102. <si>
  103. <t>Foo</t>
  104. </si>
  105. </sst>`
  106. c.Assert(output.String(), Equals, expectedXLSXSST)
  107. }