caxlsx 3.0.4 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -9
  3. data/.yardopts_guide +18 -18
  4. data/CHANGELOG.md +354 -334
  5. data/LICENSE +21 -21
  6. data/README.md +168 -170
  7. data/Rakefile +29 -29
  8. data/examples/generate.rb +15 -15
  9. data/lib/axlsx/content_type/abstract_content_type.rb +32 -32
  10. data/lib/axlsx/content_type/content_type.rb +26 -26
  11. data/lib/axlsx/content_type/default.rb +25 -25
  12. data/lib/axlsx/content_type/override.rb +25 -25
  13. data/lib/axlsx/doc_props/app.rb +235 -235
  14. data/lib/axlsx/doc_props/core.rb +39 -39
  15. data/lib/axlsx/drawing/area_chart.rb +99 -99
  16. data/lib/axlsx/drawing/area_series.rb +110 -110
  17. data/lib/axlsx/drawing/ax_data_source.rb +26 -26
  18. data/lib/axlsx/drawing/axes.rb +61 -61
  19. data/lib/axlsx/drawing/axis.rb +190 -190
  20. data/lib/axlsx/drawing/bar_3D_chart.rb +148 -151
  21. data/lib/axlsx/drawing/bar_chart.rb +138 -143
  22. data/lib/axlsx/drawing/bar_series.rb +97 -80
  23. data/lib/axlsx/drawing/bubble_chart.rb +59 -59
  24. data/lib/axlsx/drawing/bubble_series.rb +63 -63
  25. data/lib/axlsx/drawing/cat_axis.rb +85 -85
  26. data/lib/axlsx/drawing/chart.rb +276 -276
  27. data/lib/axlsx/drawing/d_lbls.rb +90 -90
  28. data/lib/axlsx/drawing/drawing.rb +167 -167
  29. data/lib/axlsx/drawing/graphic_frame.rb +54 -54
  30. data/lib/axlsx/drawing/hyperlink.rb +100 -100
  31. data/lib/axlsx/drawing/line_3D_chart.rb +68 -68
  32. data/lib/axlsx/drawing/line_chart.rb +99 -99
  33. data/lib/axlsx/drawing/line_series.rb +110 -110
  34. data/lib/axlsx/drawing/marker.rb +84 -84
  35. data/lib/axlsx/drawing/num_data.rb +52 -52
  36. data/lib/axlsx/drawing/num_data_source.rb +62 -62
  37. data/lib/axlsx/drawing/num_val.rb +34 -34
  38. data/lib/axlsx/drawing/one_cell_anchor.rb +99 -99
  39. data/lib/axlsx/drawing/pic.rb +211 -211
  40. data/lib/axlsx/drawing/picture_locking.rb +42 -42
  41. data/lib/axlsx/drawing/pie_3D_chart.rb +47 -47
  42. data/lib/axlsx/drawing/pie_series.rb +74 -74
  43. data/lib/axlsx/drawing/scaling.rb +60 -60
  44. data/lib/axlsx/drawing/scatter_chart.rb +74 -74
  45. data/lib/axlsx/drawing/scatter_series.rb +129 -98
  46. data/lib/axlsx/drawing/ser_axis.rb +45 -45
  47. data/lib/axlsx/drawing/series.rb +69 -69
  48. data/lib/axlsx/drawing/series_title.rb +25 -25
  49. data/lib/axlsx/drawing/str_data.rb +42 -42
  50. data/lib/axlsx/drawing/str_val.rb +34 -34
  51. data/lib/axlsx/drawing/title.rb +97 -97
  52. data/lib/axlsx/drawing/two_cell_anchor.rb +97 -97
  53. data/lib/axlsx/drawing/val_axis.rb +37 -37
  54. data/lib/axlsx/drawing/view_3D.rb +115 -115
  55. data/lib/axlsx/drawing/vml_drawing.rb +42 -42
  56. data/lib/axlsx/drawing/vml_shape.rb +66 -66
  57. data/lib/axlsx/package.rb +388 -363
  58. data/lib/axlsx/rels/relationship.rb +130 -130
  59. data/lib/axlsx/rels/relationships.rb +32 -32
  60. data/lib/axlsx/stylesheet/border.rb +73 -71
  61. data/lib/axlsx/stylesheet/border_pr.rb +71 -71
  62. data/lib/axlsx/stylesheet/cell_alignment.rb +132 -132
  63. data/lib/axlsx/stylesheet/cell_protection.rb +41 -41
  64. data/lib/axlsx/stylesheet/cell_style.rb +72 -72
  65. data/lib/axlsx/stylesheet/color.rb +76 -76
  66. data/lib/axlsx/stylesheet/dxf.rb +79 -79
  67. data/lib/axlsx/stylesheet/fill.rb +35 -35
  68. data/lib/axlsx/stylesheet/font.rb +156 -156
  69. data/lib/axlsx/stylesheet/gradient_fill.rb +103 -103
  70. data/lib/axlsx/stylesheet/gradient_stop.rb +37 -37
  71. data/lib/axlsx/stylesheet/num_fmt.rb +86 -86
  72. data/lib/axlsx/stylesheet/pattern_fill.rb +73 -73
  73. data/lib/axlsx/stylesheet/styles.rb +494 -420
  74. data/lib/axlsx/stylesheet/table_style.rb +54 -54
  75. data/lib/axlsx/stylesheet/table_style_element.rb +77 -77
  76. data/lib/axlsx/stylesheet/table_styles.rb +46 -46
  77. data/lib/axlsx/stylesheet/xf.rb +147 -147
  78. data/lib/axlsx/util/accessors.rb +64 -64
  79. data/lib/axlsx/util/constants.rb +410 -401
  80. data/lib/axlsx/util/mime_type_utils.rb +11 -11
  81. data/lib/axlsx/util/options_parser.rb +16 -16
  82. data/lib/axlsx/util/serialized_attributes.rb +89 -89
  83. data/lib/axlsx/util/simple_typed_list.rb +179 -179
  84. data/lib/axlsx/util/storage.rb +146 -146
  85. data/lib/axlsx/util/validators.rb +312 -312
  86. data/lib/axlsx/util/zip_command.rb +73 -73
  87. data/lib/axlsx/version.rb +5 -5
  88. data/lib/axlsx/workbook/defined_name.rb +128 -128
  89. data/lib/axlsx/workbook/defined_names.rb +21 -21
  90. data/lib/axlsx/workbook/shared_strings_table.rb +77 -77
  91. data/lib/axlsx/workbook/workbook.rb +395 -370
  92. data/lib/axlsx/workbook/workbook_view.rb +80 -80
  93. data/lib/axlsx/workbook/workbook_views.rb +22 -22
  94. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -77
  95. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -94
  96. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +244 -244
  97. data/lib/axlsx/workbook/worksheet/break.rb +35 -35
  98. data/lib/axlsx/workbook/worksheet/cell.rb +506 -505
  99. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +164 -164
  100. data/lib/axlsx/workbook/worksheet/cfvo.rb +60 -60
  101. data/lib/axlsx/workbook/worksheet/cfvos.rb +18 -18
  102. data/lib/axlsx/workbook/worksheet/col.rb +145 -145
  103. data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -35
  104. data/lib/axlsx/workbook/worksheet/color_scale.rb +110 -110
  105. data/lib/axlsx/workbook/worksheet/cols.rb +23 -23
  106. data/lib/axlsx/workbook/worksheet/comment.rb +91 -91
  107. data/lib/axlsx/workbook/worksheet/comments.rb +82 -82
  108. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -82
  109. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +220 -220
  110. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -25
  111. data/lib/axlsx/workbook/worksheet/data_bar.rb +129 -129
  112. data/lib/axlsx/workbook/worksheet/data_validation.rb +246 -246
  113. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -28
  114. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +30 -30
  115. data/lib/axlsx/workbook/worksheet/dimension.rb +64 -64
  116. data/lib/axlsx/workbook/worksheet/header_footer.rb +52 -52
  117. data/lib/axlsx/workbook/worksheet/icon_set.rb +81 -81
  118. data/lib/axlsx/workbook/worksheet/merged_cells.rb +37 -37
  119. data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -33
  120. data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -97
  121. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -44
  122. data/lib/axlsx/workbook/worksheet/page_setup.rb +240 -240
  123. data/lib/axlsx/workbook/worksheet/pane.rb +139 -139
  124. data/lib/axlsx/workbook/worksheet/pivot_table.rb +296 -289
  125. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -66
  126. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -24
  127. data/lib/axlsx/workbook/worksheet/print_options.rb +39 -39
  128. data/lib/axlsx/workbook/worksheet/protected_range.rb +47 -47
  129. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +37 -37
  130. data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -55
  131. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -250
  132. data/lib/axlsx/workbook/worksheet/row.rb +164 -162
  133. data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -33
  134. data/lib/axlsx/workbook/worksheet/selection.rb +101 -101
  135. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -29
  136. data/lib/axlsx/workbook/worksheet/sheet_data.rb +27 -27
  137. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +87 -87
  138. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +118 -118
  139. data/lib/axlsx/workbook/worksheet/sheet_view.rb +213 -213
  140. data/lib/axlsx/workbook/worksheet/table.rb +102 -102
  141. data/lib/axlsx/workbook/worksheet/table_style_info.rb +49 -49
  142. data/lib/axlsx/workbook/worksheet/tables.rb +34 -34
  143. data/lib/axlsx/workbook/worksheet/worksheet.rb +786 -764
  144. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -58
  145. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +58 -58
  146. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -74
  147. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -38
  148. data/lib/axlsx.rb +185 -170
  149. data/lib/caxlsx.rb +2 -2
  150. data/lib/schema/dc.xsd +118 -118
  151. data/lib/schema/dcmitype.xsd +51 -51
  152. data/lib/schema/dcterms.xsd +331 -331
  153. data/lib/schema/dml-chartDrawing.xsd +146 -146
  154. data/lib/schema/dml-compatibility.xsd +14 -14
  155. data/lib/schema/dml-lockedCanvas.xsd +11 -11
  156. data/lib/schema/dml-main.xsd +3048 -3048
  157. data/lib/schema/dml-picture.xsd +23 -23
  158. data/lib/schema/dml-spreadsheetDrawing.xsd +185 -185
  159. data/lib/schema/dml-wordprocessingDrawing.xsd +185 -185
  160. data/lib/schema/shared-additionalCharacteristics.xsd +28 -28
  161. data/lib/schema/shared-bibliography.xsd +144 -144
  162. data/lib/schema/shared-commonSimpleTypes.xsd +166 -166
  163. data/lib/schema/shared-customXmlDataProperties.xsd +25 -25
  164. data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -18
  165. data/lib/schema/shared-documentPropertiesCustom.xsd +59 -59
  166. data/lib/schema/shared-documentPropertiesExtended.xsd +56 -56
  167. data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -195
  168. data/lib/schema/shared-relationshipReference.xsd +25 -25
  169. data/lib/schema/vml-main.xsd +569 -569
  170. data/lib/schema/vml-officeDrawing.xsd +509 -509
  171. data/lib/schema/vml-presentationDrawing.xsd +12 -12
  172. data/lib/schema/vml-spreadsheetDrawing.xsd +108 -108
  173. data/lib/schema/vml-wordprocessingDrawing.xsd +96 -96
  174. data/lib/schema/xml.xsd +116 -116
  175. data/test/benchmark.rb +72 -72
  176. data/test/content_type/tc_content_type.rb +76 -76
  177. data/test/content_type/tc_default.rb +16 -16
  178. data/test/content_type/tc_override.rb +14 -14
  179. data/test/doc_props/tc_app.rb +43 -43
  180. data/test/doc_props/tc_core.rb +42 -42
  181. data/test/drawing/tc_area_chart.rb +39 -39
  182. data/test/drawing/tc_area_series.rb +71 -71
  183. data/test/drawing/tc_axes.rb +7 -7
  184. data/test/drawing/tc_axis.rb +112 -112
  185. data/test/drawing/tc_bar_3D_chart.rb +86 -71
  186. data/test/drawing/tc_bar_chart.rb +86 -71
  187. data/test/drawing/tc_bar_series.rb +46 -37
  188. data/test/drawing/tc_bubble_chart.rb +44 -44
  189. data/test/drawing/tc_bubble_series.rb +21 -21
  190. data/test/drawing/tc_cat_axis.rb +31 -31
  191. data/test/drawing/tc_cat_axis_data.rb +27 -27
  192. data/test/drawing/tc_chart.rb +123 -123
  193. data/test/drawing/tc_d_lbls.rb +57 -57
  194. data/test/drawing/tc_data_source.rb +23 -23
  195. data/test/drawing/tc_drawing.rb +80 -80
  196. data/test/drawing/tc_graphic_frame.rb +27 -27
  197. data/test/drawing/tc_hyperlink.rb +64 -64
  198. data/test/drawing/tc_line_3d_chart.rb +47 -47
  199. data/test/drawing/tc_line_chart.rb +39 -39
  200. data/test/drawing/tc_line_series.rb +71 -71
  201. data/test/drawing/tc_marker.rb +44 -44
  202. data/test/drawing/tc_named_axis_data.rb +27 -27
  203. data/test/drawing/tc_num_data.rb +31 -31
  204. data/test/drawing/tc_num_val.rb +29 -29
  205. data/test/drawing/tc_one_cell_anchor.rb +66 -66
  206. data/test/drawing/tc_pic.rb +103 -103
  207. data/test/drawing/tc_picture_locking.rb +72 -72
  208. data/test/drawing/tc_pie_3D_chart.rb +28 -28
  209. data/test/drawing/tc_pie_series.rb +33 -33
  210. data/test/drawing/tc_scaling.rb +36 -36
  211. data/test/drawing/tc_scatter_chart.rb +48 -48
  212. data/test/drawing/tc_scatter_series.rb +74 -56
  213. data/test/drawing/tc_ser_axis.rb +31 -31
  214. data/test/drawing/tc_series.rb +23 -23
  215. data/test/drawing/tc_series_title.rb +54 -54
  216. data/test/drawing/tc_str_data.rb +18 -18
  217. data/test/drawing/tc_str_val.rb +30 -30
  218. data/test/drawing/tc_title.rb +70 -70
  219. data/test/drawing/tc_two_cell_anchor.rb +36 -36
  220. data/test/drawing/tc_val_axis.rb +24 -24
  221. data/test/drawing/tc_view_3D.rb +54 -54
  222. data/test/drawing/tc_vml_drawing.rb +25 -25
  223. data/test/drawing/tc_vml_shape.rb +106 -106
  224. data/test/profile.rb +24 -24
  225. data/test/rels/tc_relationship.rb +52 -52
  226. data/test/rels/tc_relationships.rb +37 -37
  227. data/test/stylesheet/tc_border.rb +37 -37
  228. data/test/stylesheet/tc_border_pr.rb +32 -32
  229. data/test/stylesheet/tc_cell_alignment.rb +81 -81
  230. data/test/stylesheet/tc_cell_protection.rb +29 -29
  231. data/test/stylesheet/tc_cell_style.rb +57 -57
  232. data/test/stylesheet/tc_color.rb +43 -43
  233. data/test/stylesheet/tc_dxf.rb +81 -81
  234. data/test/stylesheet/tc_fill.rb +18 -18
  235. data/test/stylesheet/tc_font.rb +133 -133
  236. data/test/stylesheet/tc_gradient_fill.rb +72 -72
  237. data/test/stylesheet/tc_gradient_stop.rb +31 -31
  238. data/test/stylesheet/tc_num_fmt.rb +30 -30
  239. data/test/stylesheet/tc_pattern_fill.rb +43 -43
  240. data/test/stylesheet/tc_styles.rb +309 -261
  241. data/test/stylesheet/tc_table_style.rb +44 -44
  242. data/test/stylesheet/tc_table_style_element.rb +45 -45
  243. data/test/stylesheet/tc_table_styles.rb +29 -29
  244. data/test/stylesheet/tc_xf.rb +120 -120
  245. data/test/tc_axlsx.rb +109 -109
  246. data/test/tc_helper.rb +10 -12
  247. data/test/tc_package.rb +317 -264
  248. data/test/util/tc_mime_type_utils.rb +13 -13
  249. data/test/util/tc_serialized_attributes.rb +19 -19
  250. data/test/util/tc_simple_typed_list.rb +77 -77
  251. data/test/util/tc_validators.rb +210 -210
  252. data/test/workbook/tc_defined_name.rb +49 -49
  253. data/test/workbook/tc_shared_strings_table.rb +59 -59
  254. data/test/workbook/tc_workbook.rb +165 -160
  255. data/test/workbook/tc_workbook_view.rb +50 -50
  256. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -38
  257. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -76
  258. data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -50
  259. data/test/workbook/worksheet/tc_break.rb +49 -49
  260. data/test/workbook/worksheet/tc_cell.rb +465 -453
  261. data/test/workbook/worksheet/tc_cfvo.rb +31 -31
  262. data/test/workbook/worksheet/tc_col.rb +93 -93
  263. data/test/workbook/worksheet/tc_color_scale.rb +58 -58
  264. data/test/workbook/worksheet/tc_comment.rb +72 -72
  265. data/test/workbook/worksheet/tc_comments.rb +57 -57
  266. data/test/workbook/worksheet/tc_conditional_formatting.rb +224 -224
  267. data/test/workbook/worksheet/tc_data_bar.rb +46 -46
  268. data/test/workbook/worksheet/tc_data_validation.rb +265 -265
  269. data/test/workbook/worksheet/tc_date_time_converter.rb +124 -124
  270. data/test/workbook/worksheet/tc_header_footer.rb +151 -151
  271. data/test/workbook/worksheet/tc_icon_set.rb +45 -45
  272. data/test/workbook/worksheet/tc_outline_pr.rb +19 -19
  273. data/test/workbook/worksheet/tc_page_margins.rb +97 -97
  274. data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -15
  275. data/test/workbook/worksheet/tc_page_setup.rb +143 -143
  276. data/test/workbook/worksheet/tc_pane.rb +54 -54
  277. data/test/workbook/worksheet/tc_pivot_table.rb +180 -135
  278. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +62 -54
  279. data/test/workbook/worksheet/tc_print_options.rb +72 -72
  280. data/test/workbook/worksheet/tc_protected_range.rb +17 -17
  281. data/test/workbook/worksheet/tc_rich_text.rb +44 -44
  282. data/test/workbook/worksheet/tc_rich_text_run.rb +173 -173
  283. data/test/workbook/worksheet/tc_row.rb +160 -139
  284. data/test/workbook/worksheet/tc_selection.rb +55 -55
  285. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -18
  286. data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -88
  287. data/test/workbook/worksheet/tc_sheet_pr.rb +49 -49
  288. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -117
  289. data/test/workbook/worksheet/tc_sheet_view.rb +214 -214
  290. data/test/workbook/worksheet/tc_table.rb +77 -67
  291. data/test/workbook/worksheet/tc_table_style_info.rb +53 -53
  292. data/test/workbook/worksheet/tc_worksheet.rb +632 -601
  293. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -55
  294. metadata +11 -11
@@ -1,261 +1,309 @@
1
- require 'tc_helper.rb'
2
-
3
- class TestStyles < Test::Unit::TestCase
4
- def setup
5
- @styles = Axlsx::Styles.new
6
- end
7
- def teardown
8
- end
9
-
10
- def test_valid_document
11
- schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
12
- doc = Nokogiri::XML(@styles.to_xml_string)
13
- errors = []
14
- schema.validate(doc).each do |error|
15
- errors.push error
16
- puts error.message
17
- end
18
- assert(errors.size == 0)
19
- end
20
- def test_add_style_border_hash
21
- border_count = @styles.borders.size
22
- @styles.add_style :border => {:style => :thin, :color => "FFFF0000"}
23
- assert_equal(@styles.borders.size, border_count + 1)
24
- assert_equal(@styles.borders.last.prs.last.color.rgb, "FFFF0000")
25
- assert_raise(ArgumentError) { @styles.add_style :border => {:color => "FFFF0000"} }
26
- assert_equal @styles.borders.last.prs.size, 4
27
- end
28
-
29
- def test_add_style_border_edges
30
- @styles.add_style :border => { :style => :thin, :color => "0000FFFF", :edges => [:top, :bottom] }
31
- parts = @styles.borders.last.prs
32
- parts.each { |pr| assert_equal(pr.color.rgb, "0000FFFF", "Style is applied to #{pr.name} properly") }
33
- assert((parts.map { |pr| pr.name.to_s }.sort && ['bottom', 'top']).size == 2, "specify two edges, and you get two border prs")
34
- end
35
-
36
- def test_do_not_alter_options_in_add_style
37
- #This should test all options, but for now - just the bits that we know caused some pain
38
- options = { :border => { :style => :thin, :color =>"FF000000" } }
39
- @styles.add_style options
40
- assert_equal options[:border][:style], :thin, 'thin style is stil in option'
41
- assert_equal options[:border][:color], "FF000000", 'color is stil in option'
42
- end
43
-
44
- def test_parse_num_fmt
45
- f_code = {:format_code => "YYYY/MM"}
46
- num_fmt = {:num_fmt => 5}
47
- assert_equal(@styles.parse_num_fmt_options, nil, 'noop if neither :format_code or :num_fmt exist')
48
- max = @styles.numFmts.map{ |nf| nf.numFmtId }.max
49
- @styles.parse_num_fmt_options(f_code)
50
- assert_equal(@styles.numFmts.last.numFmtId, max + 1, "new numfmts gets next available id")
51
- assert(@styles.parse_num_fmt_options(num_fmt).is_a?(Integer), "Should return the provided num_fmt if not dxf")
52
- assert(@styles.parse_num_fmt_options(num_fmt.merge({:type => :dxf})).is_a?(Axlsx::NumFmt), "Makes a new NumFmt if dxf")
53
- end
54
-
55
- def test_parse_border_options_hash_required_keys
56
- assert_raise(ArgumentError, "Require color key") { @styles.parse_border_options(:border => { :style => :thin }) }
57
- assert_raise(ArgumentError, "Require style key") { @styles.parse_border_options(:border => { :color => "FF0d0d0d" }) }
58
- assert_nothing_raised { @styles.parse_border_options(:border => { :style => :thin, :color => "FF000000"} ) }
59
- end
60
-
61
- def test_parse_border_basic_options
62
- b_opts = {:border => { :diagonalUp => 1, :edges => [:left, :right], :color => "FFDADADA", :style => :thick } }
63
- b = @styles.parse_border_options b_opts
64
- assert(b.is_a? Integer)
65
- assert_equal(@styles.parse_border_options(b_opts.merge({:type => :dxf})).class,Axlsx::Border)
66
- assert(@styles.borders.last.diagonalUp == 1, "border options are passed in to the initializer")
67
- end
68
-
69
- def test_parse_border_options_edges
70
- b_opts = {:border => { :diagonalUp => 1, :edges => [:left, :right], :color => "FFDADADA", :style => :thick } }
71
- @styles.parse_border_options b_opts
72
- b = @styles.borders.last
73
- left = b.prs.select { |bpr| bpr.name == :left }[0]
74
- right = b.prs.select { |bpr| bpr.name == :right }[0]
75
- top = b.prs.select { |bpr| bpr.name == :top }[0]
76
- bottom = b.prs.select { |bpr| bpr.name == :bottom }[0]
77
- assert_equal(top, nil, "unspecified top edge should not be created")
78
- assert_equal(bottom, nil, "unspecified bottom edge should not be created")
79
- assert(left.is_a?(Axlsx::BorderPr), "specified left edge is set")
80
- assert(right.is_a?(Axlsx::BorderPr), "specified right edge is set")
81
- assert_equal(left.style,right.style, "edge parts have the same style")
82
- assert_equal(left.style, :thick, "the style is THICK")
83
- assert_equal(right.color.rgb,left.color.rgb, "edge parts are colors are the same")
84
- assert_equal(right.color.rgb,"FFDADADA", "edge color rgb is correct")
85
- end
86
-
87
- def test_parse_border_options_noop
88
- assert_equal(@styles.parse_border_options({}), nil, "noop if the border key is not in options")
89
- end
90
-
91
- def test_parse_border_options_integer_xf
92
- assert_equal(@styles.parse_border_options(:border => 1), 1)
93
- assert_raise(ArgumentError, "unknown border index") {@styles.parse_border_options(:border => 100) }
94
- end
95
-
96
- def test_parse_border_options_integer_dxf
97
- b_opts = { :border => { :edges => [:left, :right], :color => "FFFFFFFF", :style=> :thick } }
98
- b = @styles.parse_border_options(b_opts)
99
- b2 = @styles.parse_border_options(:border => b, :type => :dxf)
100
- assert(b2.is_a?(Axlsx::Border), "Cloned existing border object")
101
- end
102
-
103
- def test_parse_alignment_options
104
- assert_equal(@styles.parse_alignment_options {}, nil, "noop if :alignment is not set")
105
- assert(@styles.parse_alignment_options(:alignment => {}).is_a?(Axlsx::CellAlignment))
106
- end
107
-
108
- def test_parse_font_using_defaults
109
- original = @styles.fonts.first
110
- @styles.add_style :b => 1, :sz => 99
111
- created = @styles.fonts.last
112
- original_attributes = original.instance_values
113
- assert_equal(1, created.b)
114
- assert_equal(99, created.sz)
115
- copied = original_attributes.reject{ |key, value| %w(b sz).include? key }
116
- copied.each do |key, value|
117
- assert_equal(created.instance_values[key], value)
118
- end
119
- end
120
-
121
- def test_parse_font_options
122
- options = {
123
- :fg_color => "FF050505",
124
- :sz => 20,
125
- :b => 1,
126
- :i => 1,
127
- :u => :single,
128
- :strike => 1,
129
- :outline => 1,
130
- :shadow => 1,
131
- :charset => 9,
132
- :family => 1,
133
- :font_name => "woot font"
134
- }
135
- assert_equal(@styles.parse_font_options {}, nil, "noop if no font keys are set")
136
- assert(@styles.parse_font_options(:b=>1).is_a?(Integer), "return index of font if not :dxf type")
137
- assert_equal(@styles.parse_font_options(:b=>1, :type => :dxf).class, Axlsx::Font, "return font object if :dxf type")
138
-
139
- f = @styles.parse_font_options(options.merge(:type => :dxf))
140
- color = options.delete(:fg_color)
141
- options[:name] = options.delete(:font_name)
142
- options.each do |key, value|
143
- assert_equal(f.send(key), value, "assert that #{key} was parsed")
144
- end
145
- assert_equal(f.color.rgb, color)
146
- end
147
-
148
- def test_parse_fill_options
149
- assert_equal(@styles.parse_fill_options {}, nil, "noop if no fill keys are set")
150
- assert(@styles.parse_fill_options(:bg_color => "DE").is_a?(Integer), "return index of fill if not :dxf type")
151
- assert_equal(@styles.parse_fill_options(:bg_color => "DE", :type => :dxf).class, Axlsx::Fill, "return fill object if :dxf type")
152
- f = @styles.parse_fill_options(:bg_color => "DE", :type => :dxf)
153
- assert(f.fill_type.bgColor.rgb == "FFDEDEDE")
154
- end
155
-
156
- def test_parse_protection_options
157
- assert_equal(@styles.parse_protection_options {}, nil, "noop if no protection keys are set")
158
- assert_equal(@styles.parse_protection_options(:hidden => 1).class, Axlsx::CellProtection, "creates a new cell protection object")
159
- end
160
-
161
- def test_add_style
162
- fill_count = @styles.fills.size
163
- font_count = @styles.fonts.size
164
- xf_count = @styles.cellXfs.size
165
-
166
- @styles.add_style :bg_color=>"FF000000", :fg_color=>"FFFFFFFF", :sz=>13, :num_fmt=>Axlsx::NUM_FMT_PERCENT, :alignment=>{:horizontal=>:left}, :border=>Axlsx::STYLE_THIN_BORDER, :hidden=>true, :locked=>true
167
- assert_equal(@styles.fills.size, fill_count+1)
168
- assert_equal(@styles.fonts.size, font_count+1)
169
- assert_equal(@styles.cellXfs.size, xf_count+1)
170
- xf = @styles.cellXfs.last
171
- assert_equal(xf.fillId, (@styles.fills.size-1), "points to the last created fill")
172
- assert_equal(@styles.fills.last.fill_type.fgColor.rgb, "FF000000", "fill created with color")
173
-
174
- assert_equal(xf.fontId, (@styles.fonts.size-1), "points to the last created font")
175
- assert_equal(@styles.fonts.last.sz, 13, "font sz applied")
176
- assert_equal(@styles.fonts.last.color.rgb, "FFFFFFFF", "font color applied")
177
-
178
- assert_equal(xf.borderId, Axlsx::STYLE_THIN_BORDER, "border id is set")
179
- assert_equal(xf.numFmtId, Axlsx::NUM_FMT_PERCENT, "number format id is set")
180
-
181
- assert(xf.alignment.is_a?(Axlsx::CellAlignment), "alignment was created")
182
- assert_equal(xf.alignment.horizontal, :left, "horizontal alignment applied")
183
- assert_equal(xf.protection.hidden, true, "hidden protection set")
184
- assert_equal(xf.protection.locked, true, "cell locking set")
185
- assert_raise(ArgumentError, "should reject invalid borderId") { @styles.add_style :border => 2 }
186
-
187
-
188
- assert_equal(xf.applyProtection, true, "protection applied")
189
- assert_equal(xf.applyBorder, true, "border applied")
190
- assert_equal(xf.applyNumberFormat,true, "number format applied")
191
- assert_equal(xf.applyAlignment, true, "alignment applied")
192
- end
193
-
194
- def test_basic_add_style_dxf
195
- border_count = @styles.borders.size
196
- @styles.add_style :border => {:style => :thin, :color => "FFFF0000"}, :type => :dxf
197
- assert_equal(@styles.borders.size, border_count, "styles borders not affected")
198
- assert_equal(@styles.dxfs.last.border.prs.last.color.rgb, "FFFF0000")
199
- assert_raise(ArgumentError) { @styles.add_style :border => {:color => "FFFF0000"}, :type => :dxf }
200
- assert_equal @styles.borders.last.prs.size, 4
201
- end
202
-
203
- def test_add_style_dxf
204
- fill_count = @styles.fills.size
205
- font_count = @styles.fonts.size
206
- dxf_count = @styles.dxfs.size
207
-
208
- style = @styles.add_style :bg_color=>"FF000000", :fg_color=>"FFFFFFFF", :sz=>13, :alignment=>{:horizontal=>:left}, :border=>{:style => :thin, :color => "FFFF0000"}, :hidden=>true, :locked=>true, :type => :dxf
209
- assert_equal(@styles.dxfs.size, dxf_count+1)
210
- assert_equal(0, style, "returns the zero-based dxfId")
211
-
212
- dxf = @styles.dxfs.last
213
- assert_equal(@styles.dxfs.last.fill.fill_type.bgColor.rgb, "FF000000", "fill created with color")
214
-
215
- assert_equal(font_count, (@styles.fonts.size), "font not created under styles")
216
- assert_equal(fill_count, (@styles.fills.size), "fill not created under styles")
217
-
218
- assert(dxf.border.is_a?(Axlsx::Border), "border is set")
219
- assert_equal(nil, dxf.numFmt, "number format is not set")
220
-
221
- assert(dxf.alignment.is_a?(Axlsx::CellAlignment), "alignment was created")
222
- assert_equal(dxf.alignment.horizontal, :left, "horizontal alignment applied")
223
- assert_equal(dxf.protection.hidden, true, "hidden protection set")
224
- assert_equal(dxf.protection.locked, true, "cell locking set")
225
- assert_raise(ArgumentError, "should reject invalid borderId") { @styles.add_style :border => 3 }
226
- end
227
-
228
- def test_multiple_dxf
229
- # add a second style
230
- style = @styles.add_style :bg_color=>"00000000", :fg_color=>"FFFFFFFF", :sz=>13, :alignment=>{:horizontal=>:left}, :border=>{:style => :thin, :color => "FFFF0000"}, :hidden=>true, :locked=>true, :type => :dxf
231
- assert_equal(0, style, "returns the first dxfId")
232
- style = @styles.add_style :bg_color=>"FF000000", :fg_color=>"FFFFFFFF", :sz=>13, :alignment=>{:horizontal=>:left}, :border=>{:style => :thin, :color => "FFFF0000"}, :hidden=>true, :locked=>true, :type => :dxf
233
- assert_equal(1, style, "returns the second dxfId")
234
- end
235
-
236
- def test_valid_document_with_font_options
237
- font_options = {
238
- :fg_color => "FF050505",
239
- :sz => 20,
240
- :b => 1,
241
- :i => 1,
242
- :u => :single,
243
- :strike => 1,
244
- :outline => 1,
245
- :shadow => 1,
246
- :charset => 9,
247
- :family => 1,
248
- :font_name => "woot font"
249
- }
250
- @styles.add_style font_options
251
-
252
- schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
253
- doc = Nokogiri::XML(@styles.to_xml_string)
254
- errors = []
255
- schema.validate(doc).each do |error|
256
- errors.push error
257
- puts error.message
258
- end
259
- assert(errors.size == 0)
260
- end
261
- end
1
+ require 'tc_helper.rb'
2
+
3
+ class TestStyles < Test::Unit::TestCase
4
+ def setup
5
+ @styles = Axlsx::Styles.new
6
+ end
7
+ def teardown
8
+ end
9
+
10
+ def test_valid_document
11
+ schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
12
+ doc = Nokogiri::XML(@styles.to_xml_string)
13
+ errors = []
14
+ schema.validate(doc).each do |error|
15
+ errors.push error
16
+ puts error.message
17
+ end
18
+ assert(errors.size == 0)
19
+ end
20
+
21
+ def test_add_style_border_hash
22
+ border_count = @styles.borders.size
23
+ @styles.add_style :border => {:style => :thin, :color => "FFFF0000"}
24
+ assert_equal(@styles.borders.size, border_count + 1)
25
+ assert_equal(@styles.borders.last.prs.last.color.rgb, "FFFF0000")
26
+ assert_raise(ArgumentError) { @styles.add_style :border => {:color => "FFFF0000"} }
27
+ assert_equal @styles.borders.last.prs.size, 4
28
+ end
29
+
30
+ def test_add_style_border_array
31
+ prev_border_count = @styles.borders.size
32
+
33
+ borders_array = [
34
+ {:style => :thin, :color => "DDDDDD"},
35
+ {:edges => [:top], :style => :thin, :color => "000000"},
36
+ {:edges => [:bottom], :style => :thick, :color => "FF0000"},
37
+ {:edges => [:left], :style => :dotted, :color => "FFFF00"},
38
+ {:edges => [:right], :style => :dashed, :color => "FFFFFF"},
39
+ {:style => :thick, :color => "CCCCCC"},
40
+ ]
41
+
42
+ @styles.add_style(border: borders_array)
43
+
44
+ assert_equal(@styles.borders.size, (prev_border_count+1))
45
+
46
+ current_border = @styles.borders.last
47
+
48
+ borders_array.each do |b_opts|
49
+ if b_opts[:edges]
50
+ border_pr = current_border.prs.detect{|x| x.name == b_opts[:edges].first }
51
+ assert_equal(border_pr.color.rgb, "FF#{b_opts[:color]}")
52
+ end
53
+ end
54
+ end
55
+
56
+ def test_add_style_border_edges
57
+ @styles.add_style :border => { :style => :thin, :color => "0000FFFF", :edges => [:top, :bottom] }
58
+ parts = @styles.borders.last.prs
59
+ parts.each { |pr| assert_equal(pr.color.rgb, "0000FFFF", "Style is applied to #{pr.name} properly") }
60
+ assert((parts.map { |pr| pr.name.to_s }.sort && ['bottom', 'top']).size == 2, "specify two edges, and you get two border prs")
61
+ end
62
+
63
+ def test_do_not_alter_options_in_add_style
64
+ #This should test all options, but for now - just the bits that we know caused some pain
65
+ options = { :border => { :style => :thin, :color =>"FF000000" } }
66
+ @styles.add_style options
67
+ assert_equal options[:border][:style], :thin, 'thin style is stil in option'
68
+ assert_equal options[:border][:color], "FF000000", 'color is stil in option'
69
+ end
70
+
71
+ def test_parse_num_fmt
72
+ f_code = {:format_code => "YYYY/MM"}
73
+ num_fmt = {:num_fmt => 5}
74
+ assert_equal(@styles.parse_num_fmt_options, nil, 'noop if neither :format_code or :num_fmt exist')
75
+ max = @styles.numFmts.map{ |nf| nf.numFmtId }.max
76
+ @styles.parse_num_fmt_options(f_code)
77
+ assert_equal(@styles.numFmts.last.numFmtId, max + 1, "new numfmts gets next available id")
78
+ assert(@styles.parse_num_fmt_options(num_fmt).is_a?(Integer), "Should return the provided num_fmt if not dxf")
79
+ assert(@styles.parse_num_fmt_options(num_fmt.merge({:type => :dxf})).is_a?(Axlsx::NumFmt), "Makes a new NumFmt if dxf")
80
+ end
81
+
82
+ def test_parse_border_options_hash_required_keys
83
+ assert_raise(ArgumentError, "Require color key") { @styles.parse_border_options(:border => { :style => :thin }) }
84
+ assert_raise(ArgumentError, "Require style key") { @styles.parse_border_options(:border => { :color => "FF0d0d0d" }) }
85
+ assert_nothing_raised { @styles.parse_border_options(:border => { :style => :thin, :color => "FF000000"} ) }
86
+ end
87
+
88
+ def test_parse_border_basic_options
89
+ b_opts = {:border => { :diagonalUp => 1, :edges => [:left, :right], :color => "FFDADADA", :style => :thick } }
90
+ b = @styles.parse_border_options b_opts
91
+ assert(b.is_a? Integer)
92
+ assert_equal(@styles.parse_border_options(b_opts.merge({:type => :dxf})).class,Axlsx::Border)
93
+ assert(@styles.borders.last.diagonalUp == 1, "border options are passed in to the initializer")
94
+ end
95
+
96
+ def test_parse_border_options_edges
97
+ b_opts = {:border => { :diagonalUp => 1, :edges => [:left, :right], :color => "FFDADADA", :style => :thick } }
98
+ @styles.parse_border_options b_opts
99
+ b = @styles.borders.last
100
+ left = b.prs.select { |bpr| bpr.name == :left }[0]
101
+ right = b.prs.select { |bpr| bpr.name == :right }[0]
102
+ top = b.prs.select { |bpr| bpr.name == :top }[0]
103
+ bottom = b.prs.select { |bpr| bpr.name == :bottom }[0]
104
+ assert_equal(top, nil, "unspecified top edge should not be created")
105
+ assert_equal(bottom, nil, "unspecified bottom edge should not be created")
106
+ assert(left.is_a?(Axlsx::BorderPr), "specified left edge is set")
107
+ assert(right.is_a?(Axlsx::BorderPr), "specified right edge is set")
108
+ assert_equal(left.style,right.style, "edge parts have the same style")
109
+ assert_equal(left.style, :thick, "the style is THICK")
110
+ assert_equal(right.color.rgb,left.color.rgb, "edge parts are colors are the same")
111
+ assert_equal(right.color.rgb,"FFDADADA", "edge color rgb is correct")
112
+ end
113
+
114
+ def test_parse_border_options_noop
115
+ assert_equal(@styles.parse_border_options({}), nil, "noop if the border key is not in options")
116
+ end
117
+
118
+ def test_parse_border_options_integer_xf
119
+ assert_equal(@styles.parse_border_options(:border => 1), 1)
120
+ assert_raise(ArgumentError, "unknown border index") {@styles.parse_border_options(:border => 100) }
121
+ end
122
+
123
+ def test_parse_border_options_integer_dxf
124
+ b_opts = { :border => { :edges => [:left, :right], :color => "FFFFFFFF", :style=> :thick } }
125
+ b = @styles.parse_border_options(b_opts)
126
+ b2 = @styles.parse_border_options(:border => b, :type => :dxf)
127
+ assert(b2.is_a?(Axlsx::Border), "Cloned existing border object")
128
+ end
129
+
130
+ def test_parse_alignment_options
131
+ assert_equal(@styles.parse_alignment_options {}, nil, "noop if :alignment is not set")
132
+ assert(@styles.parse_alignment_options(:alignment => {}).is_a?(Axlsx::CellAlignment))
133
+ end
134
+
135
+ def test_parse_font_using_defaults
136
+ original = @styles.fonts.first
137
+ @styles.add_style :b => 1, :sz => 99
138
+ created = @styles.fonts.last
139
+ original_attributes = original.instance_values
140
+ assert_equal(1, created.b)
141
+ assert_equal(99, created.sz)
142
+ copied = original_attributes.reject{ |key, value| %w(b sz).include? key }
143
+ copied.each do |key, value|
144
+ assert_equal(created.instance_values[key], value)
145
+ end
146
+ end
147
+
148
+ def test_parse_font_options
149
+ options = {
150
+ :fg_color => "FF050505",
151
+ :sz => 20,
152
+ :b => 1,
153
+ :i => 1,
154
+ :u => :single,
155
+ :strike => 1,
156
+ :outline => 1,
157
+ :shadow => 1,
158
+ :charset => 9,
159
+ :family => 1,
160
+ :font_name => "woot font"
161
+ }
162
+ assert_equal(@styles.parse_font_options {}, nil, "noop if no font keys are set")
163
+ assert(@styles.parse_font_options(:b=>1).is_a?(Integer), "return index of font if not :dxf type")
164
+ assert_equal(@styles.parse_font_options(:b=>1, :type => :dxf).class, Axlsx::Font, "return font object if :dxf type")
165
+
166
+ f = @styles.parse_font_options(options.merge(:type => :dxf))
167
+ color = options.delete(:fg_color)
168
+ options[:name] = options.delete(:font_name)
169
+ options.each do |key, value|
170
+ assert_equal(f.send(key), value, "assert that #{key} was parsed")
171
+ end
172
+ assert_equal(f.color.rgb, color)
173
+ end
174
+
175
+ def test_parse_fill_options
176
+ assert_equal(@styles.parse_fill_options {}, nil, "noop if no fill keys are set")
177
+ assert(@styles.parse_fill_options(:bg_color => "DE").is_a?(Integer), "return index of fill if not :dxf type")
178
+ assert_equal(@styles.parse_fill_options(:bg_color => "DE", :type => :dxf).class, Axlsx::Fill, "return fill object if :dxf type")
179
+ f = @styles.parse_fill_options(:bg_color => "DE", :type => :dxf)
180
+ assert(f.fill_type.bgColor.rgb == "FFDEDEDE")
181
+ end
182
+
183
+ def test_parse_protection_options
184
+ assert_equal(@styles.parse_protection_options {}, nil, "noop if no protection keys are set")
185
+ assert_equal(@styles.parse_protection_options(:hidden => 1).class, Axlsx::CellProtection, "creates a new cell protection object")
186
+ end
187
+
188
+ def test_add_style
189
+ fill_count = @styles.fills.size
190
+ font_count = @styles.fonts.size
191
+ xf_count = @styles.cellXfs.size
192
+
193
+ @styles.add_style :bg_color=>"FF000000", :fg_color=>"FFFFFFFF", :sz=>13, :num_fmt=>Axlsx::NUM_FMT_PERCENT, :alignment=>{:horizontal=>:left}, :border=>Axlsx::STYLE_THIN_BORDER, :hidden=>true, :locked=>true
194
+ assert_equal(@styles.fills.size, fill_count+1)
195
+ assert_equal(@styles.fonts.size, font_count+1)
196
+ assert_equal(@styles.cellXfs.size, xf_count+1)
197
+ xf = @styles.cellXfs.last
198
+ assert_equal(xf.fillId, (@styles.fills.size-1), "points to the last created fill")
199
+ assert_equal(@styles.fills.last.fill_type.fgColor.rgb, "FF000000", "fill created with color")
200
+
201
+ assert_equal(xf.fontId, (@styles.fonts.size-1), "points to the last created font")
202
+ assert_equal(@styles.fonts.last.sz, 13, "font sz applied")
203
+ assert_equal(@styles.fonts.last.color.rgb, "FFFFFFFF", "font color applied")
204
+
205
+ assert_equal(xf.borderId, Axlsx::STYLE_THIN_BORDER, "border id is set")
206
+ assert_equal(xf.numFmtId, Axlsx::NUM_FMT_PERCENT, "number format id is set")
207
+
208
+ assert(xf.alignment.is_a?(Axlsx::CellAlignment), "alignment was created")
209
+ assert_equal(xf.alignment.horizontal, :left, "horizontal alignment applied")
210
+ assert_equal(xf.protection.hidden, true, "hidden protection set")
211
+ assert_equal(xf.protection.locked, true, "cell locking set")
212
+ assert_raise(ArgumentError, "should reject invalid borderId") { @styles.add_style :border => 2 }
213
+
214
+
215
+ assert_equal(xf.applyProtection, true, "protection applied")
216
+ assert_equal(xf.applyBorder, true, "border applied")
217
+ assert_equal(xf.applyNumberFormat,true, "number format applied")
218
+ assert_equal(xf.applyAlignment, true, "alignment applied")
219
+ end
220
+
221
+ def test_basic_add_style_dxf
222
+ border_count = @styles.borders.size
223
+ @styles.add_style :border => {:style => :thin, :color => "FFFF0000"}, :type => :dxf
224
+ assert_equal(@styles.borders.size, border_count, "styles borders not affected")
225
+ assert_equal(@styles.dxfs.last.border.prs.last.color.rgb, "FFFF0000")
226
+ assert_raise(ArgumentError) { @styles.add_style :border => {:color => "FFFF0000"}, :type => :dxf }
227
+ assert_equal @styles.borders.last.prs.size, 4
228
+ end
229
+
230
+ def test_add_style_dxf
231
+ fill_count = @styles.fills.size
232
+ font_count = @styles.fonts.size
233
+ dxf_count = @styles.dxfs.size
234
+
235
+ style = @styles.add_style :bg_color=>"FF000000", :fg_color=>"FFFFFFFF", :sz=>13, :alignment=>{:horizontal=>:left}, :border=>{:style => :thin, :color => "FFFF0000"}, :hidden=>true, :locked=>true, :type => :dxf
236
+ assert_equal(@styles.dxfs.size, dxf_count+1)
237
+ assert_equal(0, style, "returns the zero-based dxfId")
238
+
239
+ dxf = @styles.dxfs.last
240
+ assert_equal(@styles.dxfs.last.fill.fill_type.bgColor.rgb, "FF000000", "fill created with color")
241
+
242
+ assert_equal(font_count, (@styles.fonts.size), "font not created under styles")
243
+ assert_equal(fill_count, (@styles.fills.size), "fill not created under styles")
244
+
245
+ assert(dxf.border.is_a?(Axlsx::Border), "border is set")
246
+ assert_equal(nil, dxf.numFmt, "number format is not set")
247
+
248
+ assert(dxf.alignment.is_a?(Axlsx::CellAlignment), "alignment was created")
249
+ assert_equal(dxf.alignment.horizontal, :left, "horizontal alignment applied")
250
+ assert_equal(dxf.protection.hidden, true, "hidden protection set")
251
+ assert_equal(dxf.protection.locked, true, "cell locking set")
252
+ assert_raise(ArgumentError, "should reject invalid borderId") { @styles.add_style :border => 3 }
253
+ end
254
+
255
+ def test_multiple_dxf
256
+ # add a second style
257
+ style = @styles.add_style :bg_color=>"00000000", :fg_color=>"FFFFFFFF", :sz=>13, :alignment=>{:horizontal=>:left}, :border=>{:style => :thin, :color => "FFFF0000"}, :hidden=>true, :locked=>true, :type => :dxf
258
+ assert_equal(0, style, "returns the first dxfId")
259
+ style = @styles.add_style :bg_color=>"FF000000", :fg_color=>"FFFFFFFF", :sz=>13, :alignment=>{:horizontal=>:left}, :border=>{:style => :thin, :color => "FFFF0000"}, :hidden=>true, :locked=>true, :type => :dxf
260
+ assert_equal(1, style, "returns the second dxfId")
261
+ end
262
+
263
+ def test_valid_document_with_font_options
264
+ font_options = {
265
+ :fg_color => "FF050505",
266
+ :sz => 20,
267
+ :b => 1,
268
+ :i => 1,
269
+ :u => :single,
270
+ :strike => 1,
271
+ :outline => 1,
272
+ :shadow => 1,
273
+ :charset => 9,
274
+ :family => 1,
275
+ :font_name => "woot font"
276
+ }
277
+ @styles.add_style font_options
278
+
279
+ schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
280
+ doc = Nokogiri::XML(@styles.to_xml_string)
281
+ errors = []
282
+ schema.validate(doc).each do |error|
283
+ errors.push error
284
+ puts error.message
285
+ end
286
+ assert(errors.size == 0)
287
+ end
288
+
289
+ def test_border_top_without_border_regression
290
+ ### https://github.com/axlsx-styler-gem/axlsx_styler/issues/31
291
+
292
+ borders = {
293
+ top: { style: :double, color: '0000FF' },
294
+ right: { style: :thick, color: 'FF0000' },
295
+ bottom: { style: :double, color: '0000FF' },
296
+ left: { style: :thick, color: 'FF0000' }
297
+ }
298
+
299
+ borders.each do |edge, b_opts|
300
+ @styles.add_style("border_#{edge}".to_sym => b_opts)
301
+
302
+ current_border = @styles.borders.last
303
+
304
+ border_pr = current_border.prs.detect{|x| x.name == edge }
305
+ assert_equal(border_pr.color.rgb, "FF#{b_opts[:color]}")
306
+ end
307
+
308
+ end
309
+ end