axlsx 1.1.4 → 1.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 (196) hide show
  1. data/.yardopts +5 -2
  2. data/CHANGELOG.md +39 -0
  3. data/README.md +108 -31
  4. data/Rakefile +11 -3
  5. data/examples/basic_charts.rb +54 -0
  6. data/examples/chart_colors.rb +17 -2
  7. data/examples/data_validation.rb +50 -0
  8. data/examples/example.rb +130 -47
  9. data/examples/example.xlsx +0 -0
  10. data/examples/example_streamed.xlsx +0 -0
  11. data/examples/extractive.pdf +0 -0
  12. data/examples/extractive.rb +3 -0
  13. data/examples/no-use_autowidth.xlsx +0 -0
  14. data/examples/scraping_html.rb +91 -0
  15. data/examples/shared_strings_example.xlsx +0 -0
  16. data/examples/sheet_protection.rb +10 -0
  17. data/examples/sheet_view.rb +34 -0
  18. data/examples/two_cell_anchor_image.rb +11 -0
  19. data/lib/axlsx/content_type/content_type.rb +2 -0
  20. data/lib/axlsx/content_type/default.rb +30 -15
  21. data/lib/axlsx/content_type/override.rb +29 -14
  22. data/lib/axlsx/doc_props/app.rb +161 -104
  23. data/lib/axlsx/doc_props/core.rb +9 -5
  24. data/lib/axlsx/drawing/ax_data_source.rb +7 -6
  25. data/lib/axlsx/drawing/axis.rb +82 -36
  26. data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
  27. data/lib/axlsx/drawing/bar_series.rb +2 -1
  28. data/lib/axlsx/drawing/cat_axis.rb +43 -39
  29. data/lib/axlsx/drawing/chart.rb +65 -54
  30. data/lib/axlsx/drawing/d_lbls.rb +100 -0
  31. data/lib/axlsx/drawing/drawing.rb +20 -8
  32. data/lib/axlsx/drawing/graphic_frame.rb +2 -1
  33. data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
  34. data/lib/axlsx/drawing/num_data.rb +2 -2
  35. data/lib/axlsx/drawing/num_data_source.rb +4 -1
  36. data/lib/axlsx/drawing/pic.rb +44 -4
  37. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
  38. data/lib/axlsx/drawing/scatter_chart.rb +2 -8
  39. data/lib/axlsx/drawing/title.rb +21 -9
  40. data/lib/axlsx/drawing/two_cell_anchor.rb +46 -9
  41. data/lib/axlsx/drawing/view_3D.rb +41 -31
  42. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  43. data/lib/axlsx/drawing/vml_shape.rb +125 -0
  44. data/lib/axlsx/package.rb +44 -16
  45. data/lib/axlsx/rels/relationship.rb +3 -3
  46. data/lib/axlsx/rels/relationships.rb +1 -11
  47. data/lib/axlsx/stylesheet/gradient_fill.rb +1 -1
  48. data/lib/axlsx/stylesheet/styles.rb +1 -1
  49. data/lib/axlsx/stylesheet/table_style.rb +3 -3
  50. data/lib/axlsx/util/constants.rb +28 -0
  51. data/lib/axlsx/util/simple_typed_list.rb +15 -21
  52. data/lib/axlsx/util/validators.rb +80 -7
  53. data/lib/axlsx/version.rb +2 -7
  54. data/lib/axlsx/workbook/defined_name.rb +174 -0
  55. data/lib/axlsx/workbook/defined_names.rb +21 -0
  56. data/lib/axlsx/workbook/workbook.rb +65 -13
  57. data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
  58. data/lib/axlsx/workbook/worksheet/cell.rb +35 -7
  59. data/lib/axlsx/workbook/worksheet/col.rb +15 -0
  60. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  61. data/lib/axlsx/workbook/worksheet/comment.rb +101 -0
  62. data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
  63. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  64. data/lib/axlsx/workbook/worksheet/data_bar.rb +1 -1
  65. data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
  66. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  67. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
  68. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  69. data/lib/axlsx/workbook/worksheet/page_setup.rb +113 -0
  70. data/lib/axlsx/workbook/worksheet/pane.rb +144 -0
  71. data/lib/axlsx/workbook/worksheet/print_options.rb +63 -0
  72. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
  73. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  74. data/lib/axlsx/workbook/worksheet/row.rb +36 -20
  75. data/lib/axlsx/workbook/worksheet/selection.rb +111 -0
  76. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  77. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
  78. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
  79. data/lib/axlsx/workbook/worksheet/sheet_view.rb +379 -0
  80. data/lib/axlsx/workbook/worksheet/table.rb +2 -2
  81. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  82. data/lib/axlsx/workbook/worksheet/worksheet.rb +377 -255
  83. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
  84. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
  85. data/lib/axlsx.rb +30 -15
  86. data/test/content_type/tc_content_type.rb +1 -6
  87. data/test/doc_props/tc_app.rb +31 -1
  88. data/test/doc_props/tc_core.rb +3 -1
  89. data/test/drawing/tc_axis.rb +38 -3
  90. data/test/drawing/tc_bar_3D_chart.rb +12 -12
  91. data/test/drawing/tc_bar_series.rb +1 -2
  92. data/test/drawing/tc_cat_axis.rb +3 -3
  93. data/test/drawing/tc_chart.rb +29 -9
  94. data/test/drawing/tc_d_lbls.rb +47 -0
  95. data/test/drawing/tc_drawing.rb +11 -5
  96. data/test/drawing/tc_hyperlink.rb +4 -5
  97. data/test/drawing/tc_line_series.rb +7 -3
  98. data/test/drawing/tc_num_data.rb +5 -1
  99. data/test/drawing/tc_pic.rb +22 -2
  100. data/test/drawing/tc_pie_3D_chart.rb +4 -8
  101. data/test/drawing/tc_pie_series.rb +7 -2
  102. data/test/drawing/tc_scatter_chart.rb +6 -1
  103. data/test/drawing/tc_scatter_series.rb +1 -1
  104. data/test/drawing/tc_series.rb +1 -1
  105. data/test/drawing/tc_title.rb +16 -0
  106. data/test/drawing/tc_two_cell_anchor.rb +1 -2
  107. data/test/drawing/tc_view_3D.rb +18 -18
  108. data/test/drawing/tc_vml_drawing.rb +25 -0
  109. data/test/drawing/tc_vml_shape.rb +100 -0
  110. data/test/rels/tc_relationship.rb +1 -0
  111. data/test/stylesheet/tc_gradient_fill.rb +8 -0
  112. data/test/stylesheet/tc_pattern_fill.rb +7 -1
  113. data/test/stylesheet/tc_styles.rb +3 -4
  114. data/test/stylesheet/tc_table_style.rb +8 -0
  115. data/test/stylesheet/tc_table_style_element.rb +10 -1
  116. data/test/tc_helper.rb +1 -0
  117. data/test/tc_package.rb +93 -17
  118. data/test/util/tc_simple_typed_list.rb +13 -0
  119. data/test/util/tc_validators.rb +95 -9
  120. data/test/workbook/tc_defined_name.rb +41 -0
  121. data/test/workbook/tc_workbook.rb +5 -3
  122. data/test/workbook/worksheet/table/tc_table.rb +3 -11
  123. data/test/workbook/worksheet/tc_cell.rb +30 -6
  124. data/test/workbook/worksheet/tc_col.rb +9 -0
  125. data/test/workbook/worksheet/tc_comment.rb +57 -0
  126. data/test/workbook/worksheet/tc_comments.rb +57 -0
  127. data/test/workbook/worksheet/tc_conditional_formatting.rb +44 -0
  128. data/test/workbook/worksheet/tc_data_bar.rb +1 -1
  129. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  130. data/test/workbook/worksheet/tc_page_setup.rb +138 -0
  131. data/test/workbook/worksheet/tc_pane.rb +94 -0
  132. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  133. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  134. data/test/workbook/worksheet/tc_row.rb +32 -14
  135. data/test/workbook/worksheet/tc_selection.rb +94 -0
  136. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  137. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  138. data/test/workbook/worksheet/tc_worksheet.rb +138 -48
  139. metadata +140 -80
  140. data/examples/#extractive.csv# +0 -0
  141. data/examples/#extractive.rb# +0 -45
  142. data/examples/chart_colors.rb~ +0 -0
  143. data/examples/chart_colors.xlsx +0 -0
  144. data/examples/colored_series_data.xlsx +0 -0
  145. data/examples/conditional_formatting/getting_barred.xlsx +0 -0
  146. data/examples/example.csv +0 -1000
  147. data/examples/extractive.csv +0 -1
  148. data/examples/extractive.csv~ +0 -1
  149. data/examples/extractive.rb~ +0 -3
  150. data/examples/extractive.xlsx +0 -0
  151. data/examples/stack.rb +0 -21
  152. data/examples/stack.rb~ +0 -27
  153. data/examples/stack.xlsx +0 -0
  154. data/examples/~$chart_colors.xlsx +0 -0
  155. data/examples/~$extractive.xlsx +0 -0
  156. data/lib/axlsx/drawing/ax_data_source.rb~ +0 -55
  157. data/lib/axlsx/drawing/data_source.rb~ +0 -51
  158. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  159. data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
  160. data/lib/axlsx/drawing/num_data.rb~ +0 -51
  161. data/lib/axlsx/drawing/num_data_source.rb~ +0 -54
  162. data/lib/axlsx/drawing/num_val.rb~ +0 -40
  163. data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
  164. data/lib/axlsx/drawing/ref.rb~ +0 -41
  165. data/lib/axlsx/drawing/str_data.rb~ +0 -58
  166. data/lib/axlsx/drawing/str_val.rb~ +0 -35
  167. data/lib/axlsx/util/cbf.rb +0 -333
  168. data/lib/axlsx/util/cfb.rb~ +0 -201
  169. data/lib/axlsx/util/font_tables.rb~ +0 -0
  170. data/lib/axlsx/util/ms_off_crypto.rb +0 -189
  171. data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
  172. data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
  173. data/lib/axlsx/util/parser.rb~ +0 -6
  174. data/lib/axlsx/util/storage.rb~ +0 -0
  175. data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
  176. data/lib/axlsx/workbook/worksheet/cfvo.rb~ +0 -0
  177. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  178. data/lib/axlsx/workbook/worksheet/color_scale.rb~ +0 -46
  179. data/lib/axlsx/workbook/worksheet/data_bar.rb~ +0 -0
  180. data/lib/axlsx/workbook/worksheet/icon_set.rb~ +0 -95
  181. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  182. data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
  183. data/lib/schema/dc.xsd~ +0 -118
  184. data/lib/schema/dcterms.xsd~ +0 -331
  185. data/lib/schema/opc-coreProperties.xsd~ +0 -50
  186. data/test/drawing/tc_data_source.rb~ +0 -30
  187. data/test/drawing/tc_num_data.rb~ +0 -35
  188. data/test/drawing/tc_num_val.rb~ +0 -29
  189. data/test/drawing/tc_str_data.rb~ +0 -30
  190. data/test/drawing/tc_str_val.rb~ +0 -26
  191. data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
  192. data/test/workbook/worksheet/tc_cfvo.rb~ +0 -20
  193. data/test/workbook/worksheet/tc_col.rb~ +0 -10
  194. data/test/workbook/worksheet/tc_color_scale.rb~ +0 -0
  195. data/test/workbook/worksheet/tc_data_bar.rb~ +0 -0
  196. data/test/workbook/worksheet/tc_icon_set.rb~ +0 -0
@@ -14,6 +14,14 @@ class TestWorksheet < Test::Unit::TestCase
14
14
  assert_equal(ws.pn, "worksheets/sheet2.xml")
15
15
  end
16
16
 
17
+ def test_name_is_html_encoded
18
+ @ws.name = '<foo> & <bar>'
19
+ assert_equal(@ws.name, '&lt;foo&gt; &amp; &lt;bar&gt;')
20
+ end
21
+
22
+ def test_name_exception_on_colon
23
+ assert_raises(ArgumentError) { @ws.name = 'foo:bar' }
24
+ end
17
25
  def test_page_margins
18
26
  assert(@ws.page_margins.is_a? Axlsx::PageMargins)
19
27
  end
@@ -25,6 +33,28 @@ class TestWorksheet < Test::Unit::TestCase
25
33
  end
26
34
  end
27
35
 
36
+ def test_page_setup
37
+ assert(@ws.page_setup.is_a? Axlsx::PageSetup)
38
+ end
39
+
40
+ def test_page_setup_yield
41
+ @ws.page_setup do |ps|
42
+ assert(ps.is_a? Axlsx::PageSetup)
43
+ assert(@ws.page_setup == ps)
44
+ end
45
+ end
46
+
47
+ def test_print_options
48
+ assert(@ws.print_options.is_a? Axlsx::PrintOptions)
49
+ end
50
+
51
+ def test_print_options_yield
52
+ @ws.print_options do |po|
53
+ assert(po.is_a? Axlsx::PrintOptions)
54
+ assert(@ws.print_options == po)
55
+ end
56
+ end
57
+
28
58
  def test_no_autowidth
29
59
  @ws.workbook.use_autowidth = false
30
60
  @ws.add_row [1,2,3,4]
@@ -33,16 +63,22 @@ class TestWorksheet < Test::Unit::TestCase
33
63
 
34
64
  def test_initialization_options
35
65
  page_margins = {:left => 2, :right => 2, :bottom => 2, :top => 2, :header => 2, :footer => 2}
36
- optioned = @ws.workbook.add_worksheet(:name => 'bob', :page_margins => page_margins, :selected => true, :show_gridlines => false)
37
- assert_equal(optioned.page_margins.left, page_margins[:left])
38
- assert_equal(optioned.page_margins.right, page_margins[:right])
39
- assert_equal(optioned.page_margins.top, page_margins[:top])
40
- assert_equal(optioned.page_margins.bottom, page_margins[:bottom])
41
- assert_equal(optioned.page_margins.header, page_margins[:header])
42
- assert_equal(optioned.page_margins.footer, page_margins[:footer])
66
+ page_setup = {:fit_to_height => 1, :fit_to_width => 1, :orientation => :landscape, :paper_width => "210mm", :paper_height => "297mm", :scale => 80}
67
+ print_options = {:grid_lines => true, :headings => true, :horizontal_centered => true, :vertical_centered => true}
68
+ optioned = @ws.workbook.add_worksheet(:name => 'bob', :page_margins => page_margins, :page_setup => page_setup, :print_options => print_options, :selected => true, :show_gridlines => false)
69
+ page_margins.keys.each do |key|
70
+ assert_equal(page_margins[key], optioned.page_margins.send(key))
71
+ end
72
+ page_setup.keys.each do |key|
73
+ assert_equal(page_setup[key], optioned.page_setup.send(key))
74
+ end
75
+ print_options.keys.each do |key|
76
+ assert_equal(print_options[key], optioned.print_options.send(key))
77
+ end
43
78
  assert_equal(optioned.name, 'bob')
44
79
  assert_equal(optioned.selected, true)
45
80
  assert_equal(optioned.show_gridlines, false)
81
+
46
82
  end
47
83
 
48
84
 
@@ -77,7 +113,12 @@ class TestWorksheet < Test::Unit::TestCase
77
113
  def test_dimension
78
114
  @ws.add_row [1, 2, 3]
79
115
  @ws.add_row [4, 5, 6]
80
- assert_equal @ws.dimension, "A1:C2"
116
+ assert_equal @ws.dimension.sqref, "A1:C2"
117
+ end
118
+
119
+ def test_dimension_with_empty_row
120
+ @ws.add_row
121
+ assert_equal "A1:AA200", @ws.dimension.sqref
81
122
  end
82
123
 
83
124
  def test_referencing
@@ -107,7 +148,9 @@ class TestWorksheet < Test::Unit::TestCase
107
148
  end
108
149
 
109
150
  def test_drawing
110
- assert @ws.drawing.is_a? Axlsx::Drawing
151
+ assert @ws.drawing == nil
152
+ @ws.add_chart(Axlsx::Pie3DChart)
153
+ assert @ws.drawing.is_a?(Axlsx::Drawing)
111
154
  end
112
155
 
113
156
  def test_col_style
@@ -152,10 +195,16 @@ class TestWorksheet < Test::Unit::TestCase
152
195
  end
153
196
  assert_equal(@ws.rows[1].cells[0].style, 0)
154
197
  assert_equal(@ws.rows[2].cells[1].style, 0)
198
+ @ws.row_style( 1..2, 1, :col_offset => 2)
199
+ @ws.rows[(1..2)].each do |r|
200
+ r.cells[(2..-1)].each do |c|
201
+ assert_equal(c.style, 1)
202
+ end
203
+ end
155
204
  end
156
205
 
157
206
  def test_to_xml_string_fit_to_page
158
- @ws.fit_to_page = true
207
+ @ws.page_setup.fit_to_width = 1
159
208
  doc = Nokogiri::XML(@ws.to_xml_string)
160
209
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetPr/xmlns:pageSetUpPr[@fitToPage="true"]').size, 1)
161
210
  end
@@ -166,6 +215,11 @@ class TestWorksheet < Test::Unit::TestCase
166
215
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:dimension[@ref="A1:C1"]').size, 1)
167
216
  end
168
217
 
218
+ def test_fit_to_page_assignation_does_nothing
219
+ @ws.fit_to_page = true
220
+ assert_equal(@ws.fit_to_page?, false)
221
+ end
222
+
169
223
  def test_to_xml_string_selected
170
224
  @ws.selected = true
171
225
  doc = Nokogiri::XML(@ws.to_xml_string)
@@ -178,13 +232,6 @@ class TestWorksheet < Test::Unit::TestCase
178
232
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetViews/xmlns:sheetView[@showGridLines="false"]').size, 1)
179
233
  end
180
234
 
181
-
182
- def test_to_xml_string_show_selection
183
- doc = Nokogiri::XML(@ws.to_xml_string)
184
- assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetViews/xmlns:sheetView/xmlns:selection[@activeCell="A1"]').size, 1)
185
- assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetViews/xmlns:sheetView/xmlns:selection[@sqref="A1"]').size, 1)
186
- end
187
-
188
235
  def test_to_xml_string_auto_fit_data
189
236
  @ws.add_row [1, "two"]
190
237
  doc = Nokogiri::XML(@ws.to_xml_string)
@@ -213,6 +260,12 @@ class TestWorksheet < Test::Unit::TestCase
213
260
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:mergeCells/xmlns:mergeCell[@ref="E1:F1"]').size, 1)
214
261
  end
215
262
 
263
+ def test_to_xml_string_sheet_protection
264
+ @ws.sheet_protection.password = 'fish'
265
+ doc = Nokogiri::XML(@ws.to_xml_string)
266
+ assert(doc.xpath('//xmlns:sheetProtection'))
267
+ end
268
+
216
269
  def test_to_xml_string_page_margins
217
270
  @ws.page_margins do |pm|
218
271
  pm.left = 9
@@ -222,8 +275,26 @@ class TestWorksheet < Test::Unit::TestCase
222
275
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:pageMargins[@left="9"][@right="7"]').size, 1)
223
276
  end
224
277
 
278
+ def test_to_xml_string_page_setup
279
+ @ws.page_setup do |ps|
280
+ ps.paper_width = "210mm"
281
+ ps.scale = 80
282
+ end
283
+ doc = Nokogiri::XML(@ws.to_xml_string)
284
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:pageSetup[@paperWidth="210mm"][@scale="80"]').size, 1)
285
+ end
286
+
287
+ def test_to_xml_string_print_options
288
+ @ws.print_options do |po|
289
+ po.grid_lines = true
290
+ po.horizontal_centered = true
291
+ end
292
+ doc = Nokogiri::XML(@ws.to_xml_string)
293
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:printOptions[@gridLines="true"][@horizontalCentered="true"]').size, 1)
294
+ end
295
+
225
296
  def test_to_xml_string_drawing
226
- c = @ws.add_chart Axlsx::Pie3DChart
297
+ @ws.add_chart Axlsx::Pie3DChart
227
298
  doc = Nokogiri::XML(@ws.to_xml_string)
228
299
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:drawing[@r:id="rId1"]').size, 1)
229
300
  end
@@ -237,64 +308,64 @@ class TestWorksheet < Test::Unit::TestCase
237
308
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:tableParts/xmlns:tablePart[@r:id="rId1"]').size, 1)
238
309
  end
239
310
 
240
- def test_abs_auto_filter
241
- @ws.add_row [1, "two", 3]
242
- @ws.auto_filter = "A1:C1"
243
- assert_equal(@ws.abs_auto_filter, "'Sheet1'!$A$1:$C$1")
244
- end
245
-
246
311
  def test_to_xml_string
247
312
  schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
248
313
  doc = Nokogiri::XML(@ws.to_xml_string)
249
- errors = []
250
- schema.validate(doc).each do |error|
251
- errors.push error
252
- puts error.message
253
- end
254
- assert(errors.empty?, "error free validation")
314
+ assert(schema.validate(doc).map{ |e| puts e.message; e }.empty?, "error free validation")
255
315
  end
256
316
 
317
+ def test_styles
318
+ assert(@ws.styles.is_a?(Axlsx::Styles), 'worksheet provides access to styles')
319
+ end
320
+
321
+ def test_to_xml_string_with_illegal_chars
322
+ nasties = "\v\u2028\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u001f"
323
+ @ws.add_row [nasties]
324
+ assert_equal(0, @ws.rows.last.cells.last.value.index("\v"))
325
+ assert_equal(nil,@ws.to_xml_string.index("\v"))
326
+ end
257
327
  # Make sure the XML for all optional elements (like pageMargins, autoFilter, ...)
258
328
  # is generated in correct order.
259
329
  def test_valid_with_optional_elements
260
330
  @ws.page_margins.set :left => 9
331
+ @ws.page_setup.set :fit_to_width => 1
332
+ @ws.print_options.set :headings => true
261
333
  @ws.auto_filter = "A1:C3"
262
334
  @ws.merge_cells "A4:A5"
263
335
  @ws.add_chart Axlsx::Pie3DChart
264
336
  @ws.add_table "E1:F3"
265
337
  schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
266
338
  doc = Nokogiri::XML(@ws.to_xml_string)
267
- errors = []
268
- schema.validate(doc).each do |error|
269
- errors.push error
270
- puts error.message
271
- end
272
- assert(errors.empty?, "error free validation")
273
-
339
+ assert(schema.validate(doc).map { |e| puts e.message; e }.empty?, schema.validate(doc).map { |e| e.message }.join('\n'))
274
340
  end
275
341
 
276
342
  def test_relationships
343
+ @ws.add_row [1,2,3]
277
344
  assert(@ws.relationships.empty?, "No Drawing relationship until you add a chart")
278
345
  c = @ws.add_chart Axlsx::Pie3DChart
279
346
  assert_equal(@ws.relationships.size, 1, "adding a chart creates the relationship")
280
347
  c = @ws.add_chart Axlsx::Pie3DChart
281
348
  assert_equal(@ws.relationships.size, 1, "multiple charts still only result in one relationship")
349
+ c = @ws.add_comment :text => 'builder', :author => 'bob', :ref => @ws.rows.last.cells.last
350
+ assert_equal(@ws.relationships.size, 4, "adding a comment adds 3 relationships")
351
+ c = @ws.add_comment :text => 'not that is a comment!', :author => 'travis', :ref => "A1"
352
+ assert_equal(@ws.relationships.size, 4, "adding multiple comments in the same worksheet should not add any additional comment relationships")
282
353
  end
283
354
 
284
355
 
285
356
  def test_name_unique
286
- assert_raise(ArgumentError, "worksheet name must be unique") { n = @ws.name; @ws.workbook.add_worksheet(:name=> @ws) }
357
+ assert_raise(ArgumentError, "worksheet name must be unique") { n = @ws.name; @ws.workbook.add_worksheet(:name=> n) }
287
358
  end
288
359
 
289
360
  def test_name_size
290
- assert_raise(ArgumentError, "name too long!") { @ws.name = Array.new(32, "A").join('') }
291
- assert_nothing_raised { @ws.name = Array.new(31, "A").join('') }
361
+ assert_raise(ArgumentError, "name too long!") { @ws.name = Array.new(32, "A").join() }
362
+ assert_nothing_raised { @ws.name = Array.new(31, "A").join() }
292
363
  end
293
364
 
294
365
  def test_set_fixed_width_column
295
366
  @ws.add_row ["mule", "donkey", "horse"], :widths => [20, :ignore, nil]
296
367
  assert(@ws.column_info.size == 3, "a data item for each column")
297
- assert_equal(@ws.column_info[0].width, 20, "adding a row with fixed width updates :fixed attribute")
368
+ assert_equal(20, @ws.column_info[0].width, "adding a row with fixed width updates :fixed attribute")
298
369
  assert_equal(@ws.column_info[1].width, nil, ":ignore does not set any data")
299
370
  end
300
371
 
@@ -311,23 +382,42 @@ class TestWorksheet < Test::Unit::TestCase
311
382
  assert_raise(ArgumentError, 'only accept Integer, Float or Fixnum') { @ws.column_widths 2, 7, "-1" }
312
383
  end
313
384
 
385
+ def test_protect_range
386
+ assert(@ws.send(:protected_ranges).is_a?(Axlsx::SimpleTypedList))
387
+ assert_equal(0, @ws.send(:protected_ranges).size)
388
+ @ws.protect_range('A1:A3')
389
+ assert_equal('A1:A3', @ws.send(:protected_ranges).last.sqref)
390
+ end
391
+
392
+ def test_protect_range_with_cells
393
+ @ws.add_row [1, 2, 3]
394
+ assert_nothing_raised {@ws.protect_range(@ws.rows.first.cells) }
395
+ assert_equal('A1:C1', @ws.send(:protected_ranges).last.sqref)
396
+
397
+ end
314
398
  def test_merge_cells
315
- assert(@ws.merged_cells.is_a?(Array))
316
- assert_equal(@ws.merged_cells.size, 0)
317
399
  @ws.add_row [1,2,3]
318
400
  @ws.add_row [4,5,6]
319
401
  @ws.add_row [7,8,9]
320
402
  @ws.merge_cells "A1:A2"
321
403
  @ws.merge_cells "B2:C3"
322
404
  @ws.merge_cells @ws.rows.last.cells[(0..1)]
323
- assert_equal(@ws.merged_cells.size, 3)
324
- assert_equal(@ws.merged_cells.last, "A3:B3")
405
+ assert_equal(@ws.send(:merged_cells).size, 3)
406
+ assert_equal(@ws.send(:merged_cells).last, "A3:B3")
325
407
  end
326
-
408
+
409
+ def test_merge_cells_sorts_correctly_by_row_when_given_array
410
+ 10.times do |i|
411
+ @ws.add_row [i]
412
+ end
413
+ @ws.merge_cells [@ws.rows[8].cells.first, @ws.rows[9].cells.first]
414
+ assert_equal "A9:A10", @ws.send(:merged_cells).first
415
+ end
416
+
327
417
  def test_auto_filter
328
- assert(@ws.auto_filter.nil?)
418
+ assert(@ws.auto_filter.range.nil?)
329
419
  assert_raise(ArgumentError) { @ws.auto_filter = 123 }
330
420
  @ws.auto_filter = "A1:D9"
331
- assert_equal(@ws.auto_filter, "A1:D9")
421
+ assert_equal(@ws.auto_filter.range, "A1:D9")
332
422
  end
333
423
  end