xmlStyle_test.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  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. func (x *XMLStyleSuite) TestMarshalXlsxStyleSheetWithABorder(c *C) {
  55. styles := newXlsxStyleSheet(nil)
  56. styles.Borders = xlsxBorders{}
  57. styles.Borders.Count = 1
  58. styles.Borders.Border = make([]xlsxBorder, 1)
  59. border := xlsxBorder{}
  60. border.Left.Style = "solid"
  61. border.Top.Style = "none"
  62. styles.Borders.Border[0] = border
  63. expected := `<?xml version="1.0" encoding="UTF-8"?>
  64. <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><borders count="1"><border><left style="solid"/><top style="none"/></border></borders></styleSheet>`
  65. result, err := styles.Marshal()
  66. c.Assert(err, IsNil)
  67. c.Assert(string(result), Equals, expected)
  68. }
  69. // Test we produce valid output for a style file with one cellStyleXf definition.
  70. func (x *XMLStyleSuite) TestMarshalXlsxStyleSheetWithACellStyleXf(c *C) {
  71. styles := newXlsxStyleSheet(nil)
  72. styles.CellStyleXfs = xlsxCellStyleXfs{}
  73. styles.CellStyleXfs.Count = 1
  74. styles.CellStyleXfs.Xf = make([]xlsxXf, 1)
  75. xf := xlsxXf{}
  76. xf.ApplyAlignment = true
  77. xf.ApplyBorder = true
  78. xf.ApplyFont = true
  79. xf.ApplyFill = true
  80. xf.ApplyProtection = true
  81. xf.BorderId = 0
  82. xf.FillId = 0
  83. xf.FontId = 0
  84. xf.NumFmtId = 0
  85. xf.Alignment = xlsxAlignment{
  86. Horizontal: "left",
  87. Indent: 1,
  88. ShrinkToFit: true,
  89. TextRotation: 0,
  90. Vertical: "middle",
  91. WrapText: false}
  92. styles.CellStyleXfs.Xf[0] = xf
  93. expected := `<?xml version="1.0" encoding="UTF-8"?>
  94. <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><cellStyleXfs count="1"><xf applyAlignment="1" applyBorder="1" applyFont="1" applyFill="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></cellStyleXfs></styleSheet>`
  95. result, err := styles.Marshal()
  96. c.Assert(err, IsNil)
  97. c.Assert(string(result), Equals, expected)
  98. }
  99. // Test we produce valid output for a style file with one cellXf
  100. // definition.
  101. func (x *XMLStyleSuite) TestMarshalXlsxStyleSheetWithACellXf(c *C) {
  102. styles := newXlsxStyleSheet(nil)
  103. styles.CellXfs = xlsxCellXfs{}
  104. styles.CellXfs.Count = 1
  105. styles.CellXfs.Xf = make([]xlsxXf, 1)
  106. xf := xlsxXf{}
  107. xf.ApplyAlignment = true
  108. xf.ApplyBorder = true
  109. xf.ApplyFont = true
  110. xf.ApplyFill = true
  111. xf.ApplyProtection = true
  112. xf.BorderId = 0
  113. xf.FillId = 0
  114. xf.FontId = 0
  115. xf.NumFmtId = 0
  116. xf.Alignment = xlsxAlignment{
  117. Horizontal: "left",
  118. Indent: 1,
  119. ShrinkToFit: true,
  120. TextRotation: 0,
  121. Vertical: "middle",
  122. WrapText: false}
  123. styles.CellXfs.Xf[0] = xf
  124. expected := `<?xml version="1.0" encoding="UTF-8"?>
  125. <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><cellXfs count="1"><xf applyAlignment="1" applyBorder="1" applyFont="1" applyFill="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>`
  126. result, err := styles.Marshal()
  127. c.Assert(err, IsNil)
  128. c.Assert(string(result), Equals, expected)
  129. }
  130. // Test we produce valid output for a style file with one NumFmt
  131. // definition.
  132. func (x *XMLStyleSuite) TestMarshalXlsxStyleSheetWithANumFmt(c *C) {
  133. styles := &xlsxStyleSheet{}
  134. styles.NumFmts = xlsxNumFmts{}
  135. styles.NumFmts.NumFmt = make([]xlsxNumFmt, 0)
  136. numFmt := xlsxNumFmt{NumFmtId: 164, FormatCode: "GENERAL"}
  137. styles.addNumFmt(numFmt)
  138. expected := `<?xml version="1.0" encoding="UTF-8"?>
  139. <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><numFmts count="1"><numFmt numFmtId="164" formatCode="GENERAL"/></numFmts></styleSheet>`
  140. result, err := styles.Marshal()
  141. c.Assert(err, IsNil)
  142. c.Assert(string(result), Equals, expected)
  143. }
  144. func (x *XMLStyleSuite) TestFontEquals(c *C) {
  145. fontA := xlsxFont{Sz: xlsxVal{Val: "11"},
  146. Color: xlsxColor{RGB: "FFFF0000"},
  147. Name: xlsxVal{Val: "Calibri"},
  148. Family: xlsxVal{Val: "2"},
  149. B: &xlsxVal{},
  150. I: &xlsxVal{},
  151. U: &xlsxVal{}}
  152. fontB := xlsxFont{Sz: xlsxVal{Val: "11"},
  153. Color: xlsxColor{RGB: "FFFF0000"},
  154. Name: xlsxVal{Val: "Calibri"},
  155. Family: xlsxVal{Val: "2"},
  156. B: &xlsxVal{},
  157. I: &xlsxVal{},
  158. U: &xlsxVal{}}
  159. c.Assert(fontA.Equals(fontB), Equals, true)
  160. fontB.Sz.Val = "12"
  161. c.Assert(fontA.Equals(fontB), Equals, false)
  162. fontB.Sz.Val = "11"
  163. fontB.Color.RGB = "12345678"
  164. c.Assert(fontA.Equals(fontB), Equals, false)
  165. fontB.Color.RGB = "FFFF0000"
  166. fontB.Name.Val = "Arial"
  167. c.Assert(fontA.Equals(fontB), Equals, false)
  168. fontB.Name.Val = "Calibri"
  169. fontB.Family.Val = "1"
  170. c.Assert(fontA.Equals(fontB), Equals, false)
  171. fontB.Family.Val = "2"
  172. fontB.B = nil
  173. c.Assert(fontA.Equals(fontB), Equals, false)
  174. fontB.B = &xlsxVal{}
  175. fontB.I = nil
  176. c.Assert(fontA.Equals(fontB), Equals, false)
  177. fontB.I = &xlsxVal{}
  178. fontB.U = nil
  179. c.Assert(fontA.Equals(fontB), Equals, false)
  180. fontB.U = &xlsxVal{}
  181. // For sanity
  182. c.Assert(fontA.Equals(fontB), Equals, true)
  183. }
  184. func (x *XMLStyleSuite) TestFillEquals(c *C) {
  185. fillA := xlsxFill{PatternFill: xlsxPatternFill{
  186. PatternType: "solid",
  187. FgColor: xlsxColor{RGB: "FFFF0000"},
  188. BgColor: xlsxColor{RGB: "0000FFFF"}}}
  189. fillB := xlsxFill{PatternFill: xlsxPatternFill{
  190. PatternType: "solid",
  191. FgColor: xlsxColor{RGB: "FFFF0000"},
  192. BgColor: xlsxColor{RGB: "0000FFFF"}}}
  193. c.Assert(fillA.Equals(fillB), Equals, true)
  194. fillB.PatternFill.PatternType = "gray125"
  195. c.Assert(fillA.Equals(fillB), Equals, false)
  196. fillB.PatternFill.PatternType = "solid"
  197. fillB.PatternFill.FgColor.RGB = "00FF00FF"
  198. c.Assert(fillA.Equals(fillB), Equals, false)
  199. fillB.PatternFill.FgColor.RGB = "FFFF0000"
  200. fillB.PatternFill.BgColor.RGB = "12456789"
  201. c.Assert(fillA.Equals(fillB), Equals, false)
  202. fillB.PatternFill.BgColor.RGB = "0000FFFF"
  203. // For sanity
  204. c.Assert(fillA.Equals(fillB), Equals, true)
  205. }
  206. func (x *XMLStyleSuite) TestBorderEquals(c *C) {
  207. borderA := xlsxBorder{Left: xlsxLine{Style: "none"},
  208. Right: xlsxLine{Style: "none"},
  209. Top: xlsxLine{Style: "none"},
  210. Bottom: xlsxLine{Style: "none"}}
  211. borderB := xlsxBorder{Left: xlsxLine{Style: "none"},
  212. Right: xlsxLine{Style: "none"},
  213. Top: xlsxLine{Style: "none"},
  214. Bottom: xlsxLine{Style: "none"}}
  215. c.Assert(borderA.Equals(borderB), Equals, true)
  216. borderB.Left.Style = "thin"
  217. c.Assert(borderA.Equals(borderB), Equals, false)
  218. borderB.Left.Style = "none"
  219. borderB.Right.Style = "thin"
  220. c.Assert(borderA.Equals(borderB), Equals, false)
  221. borderB.Right.Style = "none"
  222. borderB.Top.Style = "thin"
  223. c.Assert(borderA.Equals(borderB), Equals, false)
  224. borderB.Top.Style = "none"
  225. borderB.Bottom.Style = "thin"
  226. c.Assert(borderA.Equals(borderB), Equals, false)
  227. borderB.Bottom.Style = "none"
  228. // for sanity
  229. c.Assert(borderA.Equals(borderB), Equals, true)
  230. }
  231. func (x *XMLStyleSuite) TestXfEquals(c *C) {
  232. xfA := xlsxXf{
  233. ApplyAlignment: true,
  234. ApplyBorder: true,
  235. ApplyFont: true,
  236. ApplyFill: true,
  237. ApplyProtection: true,
  238. BorderId: 0,
  239. FillId: 0,
  240. FontId: 0,
  241. NumFmtId: 0}
  242. xfB := xlsxXf{
  243. ApplyAlignment: true,
  244. ApplyBorder: true,
  245. ApplyFont: true,
  246. ApplyFill: true,
  247. ApplyProtection: true,
  248. BorderId: 0,
  249. FillId: 0,
  250. FontId: 0,
  251. NumFmtId: 0}
  252. c.Assert(xfA.Equals(xfB), Equals, true)
  253. xfB.ApplyAlignment = false
  254. c.Assert(xfA.Equals(xfB), Equals, false)
  255. xfB.ApplyAlignment = true
  256. xfB.ApplyBorder = false
  257. c.Assert(xfA.Equals(xfB), Equals, false)
  258. xfB.ApplyBorder = true
  259. xfB.ApplyFont = false
  260. c.Assert(xfA.Equals(xfB), Equals, false)
  261. xfB.ApplyFont = true
  262. xfB.ApplyFill = false
  263. c.Assert(xfA.Equals(xfB), Equals, false)
  264. xfB.ApplyFill = true
  265. xfB.ApplyProtection = false
  266. c.Assert(xfA.Equals(xfB), Equals, false)
  267. xfB.ApplyProtection = true
  268. xfB.BorderId = 1
  269. c.Assert(xfA.Equals(xfB), Equals, false)
  270. xfB.BorderId = 0
  271. xfB.FillId = 1
  272. c.Assert(xfA.Equals(xfB), Equals, false)
  273. xfB.FillId = 0
  274. xfB.FontId = 1
  275. c.Assert(xfA.Equals(xfB), Equals, false)
  276. xfB.FontId = 0
  277. xfB.NumFmtId = 1
  278. c.Assert(xfA.Equals(xfB), Equals, false)
  279. xfB.NumFmtId = 0
  280. // for sanity
  281. c.Assert(xfA.Equals(xfB), Equals, true)
  282. }