xmlStyle_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. package xlsx
  2. import (
  3. . "gopkg.in/check.v1"
  4. )
  5. type XMLStyleSuite struct{}
  6. var _ = Suite(&XMLStyleSuite{})
  7. // Test we produce valid output for an empty style file.
  8. func (x *XMLStyleSuite) TestMarshalEmptyXlsxStyleSheet(c *C) {
  9. styles := newXlsxStyleSheet(nil)
  10. result, err := styles.Marshal()
  11. c.Assert(err, IsNil)
  12. c.Assert(string(result), Equals, `<?xml version="1.0" encoding="UTF-8"?>
  13. <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"></styleSheet>`)
  14. }
  15. // Test we produce valid output for a style file with one font definition.
  16. func (x *XMLStyleSuite) TestMarshalXlsxStyleSheetWithAFont(c *C) {
  17. styles := newXlsxStyleSheet(nil)
  18. styles.Fonts = xlsxFonts{}
  19. styles.Fonts.Count = 1
  20. styles.Fonts.Font = make([]xlsxFont, 1)
  21. font := xlsxFont{}
  22. font.Sz.Val = "10"
  23. font.Name.Val = "Andale Mono"
  24. font.B = &xlsxVal{}
  25. font.I = &xlsxVal{}
  26. font.U = &xlsxVal{}
  27. styles.Fonts.Font[0] = font
  28. expected := `<?xml version="1.0" encoding="UTF-8"?>
  29. <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><fonts count="1"><font><sz val="10"/><name val="Andale Mono"/><b/><i/><u/></font></fonts></styleSheet>`
  30. result, err := styles.Marshal()
  31. c.Assert(err, IsNil)
  32. c.Assert(string(result), Equals, expected)
  33. }
  34. // Test we produce valid output for a style file with one fill definition.
  35. func (x *XMLStyleSuite) TestMarshalXlsxStyleSheetWithAFill(c *C) {
  36. styles := newXlsxStyleSheet(nil)
  37. styles.Fills = xlsxFills{}
  38. styles.Fills.Count = 1
  39. styles.Fills.Fill = make([]xlsxFill, 1)
  40. fill := xlsxFill{}
  41. patternFill := xlsxPatternFill{
  42. PatternType: "solid",
  43. FgColor: xlsxColor{RGB: "#FFFFFF"},
  44. BgColor: xlsxColor{RGB: "#000000"}}
  45. fill.PatternFill = patternFill
  46. styles.Fills.Fill[0] = fill
  47. expected := `<?xml version="1.0" encoding="UTF-8"?>
  48. <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><fills count="1"><fill><patternFill patternType="solid"><fgColor rgb="#FFFFFF"/><bgColor rgb="#000000"/></patternFill></fill></fills></styleSheet>`
  49. result, err := styles.Marshal()
  50. c.Assert(err, IsNil)
  51. c.Assert(string(result), Equals, expected)
  52. }
  53. // Test we produce valid output for a style file with one border definition.
  54. // Empty elements are required to accommodate for Excel quirks.
  55. func (x *XMLStyleSuite) TestMarshalXlsxStyleSheetWithABorder(c *C) {
  56. styles := newXlsxStyleSheet(nil)
  57. styles.Borders = xlsxBorders{}
  58. styles.Borders.Count = 1
  59. styles.Borders.Border = make([]xlsxBorder, 1)
  60. border := xlsxBorder{}
  61. border.Left.Style = "solid"
  62. border.Top.Style = ""
  63. styles.Borders.Border[0] = border
  64. expected := `<?xml version="1.0" encoding="UTF-8"?>
  65. <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><borders count="1"><border><left style="solid"></left><right style=""></right><top style=""></top><bottom style=""></bottom></border></borders></styleSheet>`
  66. result, err := styles.Marshal()
  67. c.Assert(err, IsNil)
  68. c.Assert(string(result), Equals, expected)
  69. }
  70. // Test we produce valid output for a style file with one cellStyleXf definition.
  71. func (x *XMLStyleSuite) TestMarshalXlsxStyleSheetWithACellStyleXf(c *C) {
  72. styles := newXlsxStyleSheet(nil)
  73. styles.CellStyleXfs = xlsxCellStyleXfs{}
  74. styles.CellStyleXfs.Count = 1
  75. styles.CellStyleXfs.Xf = make([]xlsxXf, 1)
  76. xf := xlsxXf{}
  77. xf.ApplyAlignment = true
  78. xf.ApplyBorder = true
  79. xf.ApplyFont = true
  80. xf.ApplyFill = true
  81. xf.ApplyProtection = true
  82. xf.BorderId = 0
  83. xf.FillId = 0
  84. xf.FontId = 0
  85. xf.NumFmtId = 0
  86. xf.Alignment = xlsxAlignment{
  87. Horizontal: "left",
  88. Indent: 1,
  89. ShrinkToFit: true,
  90. TextRotation: 0,
  91. Vertical: "middle",
  92. WrapText: false}
  93. styles.CellStyleXfs.Xf[0] = xf
  94. expected := `<?xml version="1.0" encoding="UTF-8"?>
  95. <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><cellStyleXfs count="1"><xf applyAlignment="1" applyBorder="1" applyFont="1" applyFill="1" applyNumberFormat="0" applyProtection="1" borderId="0" fillId="0" fontId="0" numFmtId="0"><alignment horizontal="left" indent="1" shrinkToFit="1" textRotation="0" vertical="middle" wrapText="0"/></xf></cellStyleXfs></styleSheet>`
  96. result, err := styles.Marshal()
  97. c.Assert(err, IsNil)
  98. c.Assert(string(result), Equals, expected)
  99. }
  100. // Test we produce valid output for a style file with one cellXf
  101. // definition.
  102. func (x *XMLStyleSuite) TestMarshalXlsxStyleSheetWithACellXf(c *C) {
  103. styles := newXlsxStyleSheet(nil)
  104. styles.CellXfs = xlsxCellXfs{}
  105. styles.CellXfs.Count = 1
  106. styles.CellXfs.Xf = make([]xlsxXf, 1)
  107. xf := xlsxXf{}
  108. xf.ApplyAlignment = true
  109. xf.ApplyBorder = true
  110. xf.ApplyFont = true
  111. xf.ApplyFill = true
  112. xf.ApplyNumberFormat = true
  113. xf.ApplyProtection = true
  114. xf.BorderId = 0
  115. xf.FillId = 0
  116. xf.FontId = 0
  117. xf.NumFmtId = 0
  118. xf.Alignment = xlsxAlignment{
  119. Horizontal: "left",
  120. Indent: 1,
  121. ShrinkToFit: true,
  122. TextRotation: 0,
  123. Vertical: "middle",
  124. WrapText: false}
  125. styles.CellXfs.Xf[0] = xf
  126. expected := `<?xml version="1.0" encoding="UTF-8"?>
  127. <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><cellXfs count="1"><xf applyAlignment="1" applyBorder="1" applyFont="1" applyFill="1" applyNumberFormat="1" applyProtection="1" borderId="0" fillId="0" fontId="0" numFmtId="0"><alignment horizontal="left" indent="1" shrinkToFit="1" textRotation="0" vertical="middle" wrapText="0"/></xf></cellXfs></styleSheet>`
  128. result, err := styles.Marshal()
  129. c.Assert(err, IsNil)
  130. c.Assert(string(result), Equals, expected)
  131. }
  132. // Test we produce valid output for a style file with one NumFmt
  133. // definition.
  134. func (x *XMLStyleSuite) TestMarshalXlsxStyleSheetWithANumFmt(c *C) {
  135. styles := &xlsxStyleSheet{}
  136. styles.NumFmts = xlsxNumFmts{}
  137. styles.NumFmts.NumFmt = make([]xlsxNumFmt, 0)
  138. numFmt := xlsxNumFmt{NumFmtId: 164, FormatCode: "GENERAL"}
  139. styles.addNumFmt(numFmt)
  140. expected := `<?xml version="1.0" encoding="UTF-8"?>
  141. <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><numFmts count="1"><numFmt numFmtId="164" formatCode="GENERAL"/></numFmts></styleSheet>`
  142. result, err := styles.Marshal()
  143. c.Assert(err, IsNil)
  144. c.Assert(string(result), Equals, expected)
  145. }
  146. func (x *XMLStyleSuite) TestFontEquals(c *C) {
  147. fontA := xlsxFont{Sz: xlsxVal{Val: "11"},
  148. Color: xlsxColor{RGB: "FFFF0000"},
  149. Name: xlsxVal{Val: "Calibri"},
  150. Family: xlsxVal{Val: "2"},
  151. B: &xlsxVal{},
  152. I: &xlsxVal{},
  153. U: &xlsxVal{}}
  154. fontB := xlsxFont{Sz: xlsxVal{Val: "11"},
  155. Color: xlsxColor{RGB: "FFFF0000"},
  156. Name: xlsxVal{Val: "Calibri"},
  157. Family: xlsxVal{Val: "2"},
  158. B: &xlsxVal{},
  159. I: &xlsxVal{},
  160. U: &xlsxVal{}}
  161. c.Assert(fontA.Equals(fontB), Equals, true)
  162. fontB.Sz.Val = "12"
  163. c.Assert(fontA.Equals(fontB), Equals, false)
  164. fontB.Sz.Val = "11"
  165. fontB.Color.RGB = "12345678"
  166. c.Assert(fontA.Equals(fontB), Equals, false)
  167. fontB.Color.RGB = "FFFF0000"
  168. fontB.Name.Val = "Arial"
  169. c.Assert(fontA.Equals(fontB), Equals, false)
  170. fontB.Name.Val = "Calibri"
  171. fontB.Family.Val = "1"
  172. c.Assert(fontA.Equals(fontB), Equals, false)
  173. fontB.Family.Val = "2"
  174. fontB.B = nil
  175. c.Assert(fontA.Equals(fontB), Equals, false)
  176. fontB.B = &xlsxVal{}
  177. fontB.I = nil
  178. c.Assert(fontA.Equals(fontB), Equals, false)
  179. fontB.I = &xlsxVal{}
  180. fontB.U = nil
  181. c.Assert(fontA.Equals(fontB), Equals, false)
  182. fontB.U = &xlsxVal{}
  183. // For sanity
  184. c.Assert(fontA.Equals(fontB), Equals, true)
  185. }
  186. func (x *XMLStyleSuite) TestFillEquals(c *C) {
  187. fillA := xlsxFill{PatternFill: xlsxPatternFill{
  188. PatternType: "solid",
  189. FgColor: xlsxColor{RGB: "FFFF0000"},
  190. BgColor: xlsxColor{RGB: "0000FFFF"}}}
  191. fillB := xlsxFill{PatternFill: xlsxPatternFill{
  192. PatternType: "solid",
  193. FgColor: xlsxColor{RGB: "FFFF0000"},
  194. BgColor: xlsxColor{RGB: "0000FFFF"}}}
  195. c.Assert(fillA.Equals(fillB), Equals, true)
  196. fillB.PatternFill.PatternType = "gray125"
  197. c.Assert(fillA.Equals(fillB), Equals, false)
  198. fillB.PatternFill.PatternType = "solid"
  199. fillB.PatternFill.FgColor.RGB = "00FF00FF"
  200. c.Assert(fillA.Equals(fillB), Equals, false)
  201. fillB.PatternFill.FgColor.RGB = "FFFF0000"
  202. fillB.PatternFill.BgColor.RGB = "12456789"
  203. c.Assert(fillA.Equals(fillB), Equals, false)
  204. fillB.PatternFill.BgColor.RGB = "0000FFFF"
  205. // For sanity
  206. c.Assert(fillA.Equals(fillB), Equals, true)
  207. }
  208. func (x *XMLStyleSuite) TestBorderEquals(c *C) {
  209. borderA := xlsxBorder{Left: xlsxLine{Style: "none"},
  210. Right: xlsxLine{Style: "none"},
  211. Top: xlsxLine{Style: "none"},
  212. Bottom: xlsxLine{Style: "none"}}
  213. borderB := xlsxBorder{Left: xlsxLine{Style: "none"},
  214. Right: xlsxLine{Style: "none"},
  215. Top: xlsxLine{Style: "none"},
  216. Bottom: xlsxLine{Style: "none"}}
  217. c.Assert(borderA.Equals(borderB), Equals, true)
  218. borderB.Left.Style = "thin"
  219. c.Assert(borderA.Equals(borderB), Equals, false)
  220. borderB.Left.Style = "none"
  221. borderB.Right.Style = "thin"
  222. c.Assert(borderA.Equals(borderB), Equals, false)
  223. borderB.Right.Style = "none"
  224. borderB.Top.Style = "thin"
  225. c.Assert(borderA.Equals(borderB), Equals, false)
  226. borderB.Top.Style = "none"
  227. borderB.Bottom.Style = "thin"
  228. c.Assert(borderA.Equals(borderB), Equals, false)
  229. borderB.Bottom.Style = "none"
  230. // for sanity
  231. c.Assert(borderA.Equals(borderB), Equals, true)
  232. }
  233. func (x *XMLStyleSuite) TestXfEquals(c *C) {
  234. xfA := xlsxXf{
  235. ApplyAlignment: true,
  236. ApplyBorder: true,
  237. ApplyFont: true,
  238. ApplyFill: true,
  239. ApplyProtection: true,
  240. BorderId: 0,
  241. FillId: 0,
  242. FontId: 0,
  243. NumFmtId: 0}
  244. xfB := xlsxXf{
  245. ApplyAlignment: true,
  246. ApplyBorder: true,
  247. ApplyFont: true,
  248. ApplyFill: true,
  249. ApplyProtection: true,
  250. BorderId: 0,
  251. FillId: 0,
  252. FontId: 0,
  253. NumFmtId: 0}
  254. c.Assert(xfA.Equals(xfB), Equals, true)
  255. xfB.ApplyAlignment = false
  256. c.Assert(xfA.Equals(xfB), Equals, false)
  257. xfB.ApplyAlignment = true
  258. xfB.ApplyBorder = false
  259. c.Assert(xfA.Equals(xfB), Equals, false)
  260. xfB.ApplyBorder = true
  261. xfB.ApplyFont = false
  262. c.Assert(xfA.Equals(xfB), Equals, false)
  263. xfB.ApplyFont = true
  264. xfB.ApplyFill = false
  265. c.Assert(xfA.Equals(xfB), Equals, false)
  266. xfB.ApplyFill = true
  267. xfB.ApplyProtection = false
  268. c.Assert(xfA.Equals(xfB), Equals, false)
  269. xfB.ApplyProtection = true
  270. xfB.BorderId = 1
  271. c.Assert(xfA.Equals(xfB), Equals, false)
  272. xfB.BorderId = 0
  273. xfB.FillId = 1
  274. c.Assert(xfA.Equals(xfB), Equals, false)
  275. xfB.FillId = 0
  276. xfB.FontId = 1
  277. c.Assert(xfA.Equals(xfB), Equals, false)
  278. xfB.FontId = 0
  279. xfB.NumFmtId = 1
  280. c.Assert(xfA.Equals(xfB), Equals, false)
  281. xfB.NumFmtId = 0
  282. // for sanity
  283. c.Assert(xfA.Equals(xfB), Equals, true)
  284. }
  285. func (s *CellSuite) TestNewNumFmt(c *C) {
  286. styles := newXlsxStyleSheet(nil)
  287. styles.NumFmts = xlsxNumFmts{}
  288. styles.NumFmts.NumFmt = make([]xlsxNumFmt, 0)
  289. c.Assert(styles.newNumFmt("0"), DeepEquals, xlsxNumFmt{1, "0"})
  290. c.Assert(styles.newNumFmt("0.00e+00"), DeepEquals, xlsxNumFmt{11, "0.00e+00"})
  291. c.Assert(styles.newNumFmt("mm-dd-yy"), DeepEquals, xlsxNumFmt{14, "mm-dd-yy"})
  292. c.Assert(styles.newNumFmt("hh:mm:ss"), DeepEquals, xlsxNumFmt{164, "hh:mm:ss"})
  293. c.Assert(len(styles.NumFmts.NumFmt), Equals, 1)
  294. }
  295. func (s *CellSuite) TestAddNumFmt(c *C) {
  296. styles := &xlsxStyleSheet{}
  297. styles.NumFmts = xlsxNumFmts{}
  298. styles.NumFmts.NumFmt = make([]xlsxNumFmt, 0)
  299. styles.addNumFmt(xlsxNumFmt{1, "0"})
  300. c.Assert(styles.NumFmts.Count, Equals, 0)
  301. styles.addNumFmt(xlsxNumFmt{14, "mm-dd-yy"})
  302. c.Assert(styles.NumFmts.Count, Equals, 0)
  303. styles.addNumFmt(xlsxNumFmt{164, "hh:mm:ss"})
  304. c.Assert(styles.NumFmts.Count, Equals, 1)
  305. styles.addNumFmt(xlsxNumFmt{165, "yyyy/mm/dd"})
  306. c.Assert(styles.NumFmts.Count, Equals, 2)
  307. styles.addNumFmt(xlsxNumFmt{165, "yyyy/mm/dd"})
  308. c.Assert(styles.NumFmts.Count, Equals, 2)
  309. }