axlsx 1.2.0 → 2.0.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 (208) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +3 -2
  3. data/.yardopts_guide +19 -0
  4. data/CHANGELOG.md +64 -1
  5. data/README.md +105 -87
  6. data/Rakefile +0 -5
  7. data/examples/2010_comments.rb +17 -0
  8. data/examples/anchor_swapping.rb +28 -0
  9. data/examples/auto_filter.rb +16 -0
  10. data/examples/basic_charts.rb +4 -0
  11. data/examples/colored_links.rb +59 -0
  12. data/examples/conditional_formatting/example_conditional_formatting.rb +4 -2
  13. data/examples/example.rb +569 -258
  14. data/examples/ios_preview.rb +14 -0
  15. data/examples/page_setup.rb +11 -0
  16. data/examples/pivot_table.rb +39 -0
  17. data/examples/skydrive/real_example.rb +8 -8
  18. data/examples/styles.rb +66 -0
  19. data/examples/underline.rb +13 -0
  20. data/examples/wrap_text.rb +21 -0
  21. data/lib/axlsx/content_type/abstract_content_type.rb +32 -0
  22. data/lib/axlsx/content_type/content_type.rb +1 -1
  23. data/lib/axlsx/content_type/default.rb +6 -37
  24. data/lib/axlsx/content_type/override.rb +6 -38
  25. data/lib/axlsx/doc_props/app.rb +10 -7
  26. data/lib/axlsx/doc_props/core.rb +6 -1
  27. data/lib/axlsx/drawing/axes.rb +61 -0
  28. data/lib/axlsx/drawing/axis.rb +20 -17
  29. data/lib/axlsx/drawing/bar_3D_chart.rb +31 -22
  30. data/lib/axlsx/drawing/cat_axis.rb +2 -10
  31. data/lib/axlsx/drawing/chart.rb +33 -6
  32. data/lib/axlsx/drawing/d_lbls.rb +21 -31
  33. data/lib/axlsx/drawing/drawing.rb +11 -17
  34. data/lib/axlsx/drawing/graphic_frame.rb +3 -3
  35. data/lib/axlsx/drawing/hyperlink.rb +42 -36
  36. data/lib/axlsx/drawing/line_3D_chart.rb +28 -70
  37. data/lib/axlsx/drawing/line_chart.rb +99 -0
  38. data/lib/axlsx/drawing/line_series.rb +20 -2
  39. data/lib/axlsx/drawing/marker.rb +38 -18
  40. data/lib/axlsx/drawing/num_data.rb +6 -6
  41. data/lib/axlsx/drawing/num_data_source.rb +17 -16
  42. data/lib/axlsx/drawing/one_cell_anchor.rb +28 -21
  43. data/lib/axlsx/drawing/pic.rb +43 -45
  44. data/lib/axlsx/drawing/picture_locking.rb +12 -44
  45. data/lib/axlsx/drawing/pie_3D_chart.rb +2 -1
  46. data/lib/axlsx/drawing/scaling.rb +13 -13
  47. data/lib/axlsx/drawing/scatter_chart.rb +32 -21
  48. data/lib/axlsx/drawing/ser_axis.rb +15 -16
  49. data/lib/axlsx/drawing/series.rb +3 -6
  50. data/lib/axlsx/drawing/str_data.rb +3 -3
  51. data/lib/axlsx/drawing/str_val.rb +7 -8
  52. data/lib/axlsx/drawing/two_cell_anchor.rb +7 -27
  53. data/lib/axlsx/drawing/val_axis.rb +14 -13
  54. data/lib/axlsx/drawing/view_3D.rb +52 -38
  55. data/lib/axlsx/drawing/vml_shape.rb +20 -79
  56. data/lib/axlsx/package.rb +58 -28
  57. data/lib/axlsx/rels/relationship.rb +75 -9
  58. data/lib/axlsx/rels/relationships.rb +8 -1
  59. data/lib/axlsx/stylesheet/border.rb +29 -20
  60. data/lib/axlsx/stylesheet/border_pr.rb +5 -4
  61. data/lib/axlsx/stylesheet/cell_alignment.rb +55 -29
  62. data/lib/axlsx/stylesheet/cell_protection.rb +7 -4
  63. data/lib/axlsx/stylesheet/cell_style.rb +19 -14
  64. data/lib/axlsx/stylesheet/color.rb +20 -17
  65. data/lib/axlsx/stylesheet/dxf.rb +4 -4
  66. data/lib/axlsx/stylesheet/font.rb +22 -22
  67. data/lib/axlsx/stylesheet/gradient_fill.rb +45 -21
  68. data/lib/axlsx/stylesheet/num_fmt.rb +23 -14
  69. data/lib/axlsx/stylesheet/pattern_fill.rb +12 -21
  70. data/lib/axlsx/stylesheet/styles.rb +37 -22
  71. data/lib/axlsx/stylesheet/table_style.rb +17 -16
  72. data/lib/axlsx/stylesheet/table_style_element.rb +15 -11
  73. data/lib/axlsx/stylesheet/table_styles.rb +14 -11
  74. data/lib/axlsx/stylesheet/xf.rb +28 -26
  75. data/lib/axlsx/util/accessors.rb +64 -0
  76. data/lib/axlsx/util/constants.rb +127 -6
  77. data/lib/axlsx/util/options_parser.rb +15 -0
  78. data/lib/axlsx/util/serialized_attributes.rb +79 -0
  79. data/lib/axlsx/util/simple_typed_list.rb +50 -15
  80. data/lib/axlsx/util/validators.rb +51 -16
  81. data/lib/axlsx/version.rb +2 -2
  82. data/lib/axlsx/workbook/defined_name.rb +14 -59
  83. data/lib/axlsx/workbook/shared_strings_table.rb +13 -4
  84. data/lib/axlsx/workbook/workbook.rb +85 -6
  85. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -0
  86. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -0
  87. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +246 -0
  88. data/lib/axlsx/workbook/worksheet/break.rb +37 -0
  89. data/lib/axlsx/workbook/worksheet/cell.rb +109 -107
  90. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +144 -0
  91. data/lib/axlsx/workbook/worksheet/cfvo.rb +15 -15
  92. data/lib/axlsx/workbook/worksheet/cfvos.rb +15 -0
  93. data/lib/axlsx/workbook/worksheet/col.rb +43 -29
  94. data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -0
  95. data/lib/axlsx/workbook/worksheet/color_scale.rb +62 -28
  96. data/lib/axlsx/workbook/worksheet/comment.rb +28 -37
  97. data/lib/axlsx/workbook/worksheet/comments.rb +3 -3
  98. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +11 -11
  99. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +31 -27
  100. data/lib/axlsx/workbook/worksheet/data_bar.rb +75 -41
  101. data/lib/axlsx/workbook/worksheet/data_validation.rb +61 -62
  102. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +6 -5
  103. data/lib/axlsx/workbook/worksheet/dimension.rb +0 -1
  104. data/lib/axlsx/workbook/worksheet/header_footer.rb +54 -0
  105. data/lib/axlsx/workbook/worksheet/icon_set.rb +20 -20
  106. data/lib/axlsx/workbook/worksheet/page_margins.rb +21 -19
  107. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -0
  108. data/lib/axlsx/workbook/worksheet/page_setup.rb +152 -23
  109. data/lib/axlsx/workbook/worksheet/pane.rb +48 -51
  110. data/lib/axlsx/workbook/worksheet/pivot_table.rb +273 -0
  111. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -0
  112. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -0
  113. data/lib/axlsx/workbook/worksheet/print_options.rb +8 -30
  114. data/lib/axlsx/workbook/worksheet/protected_range.rb +16 -13
  115. data/lib/axlsx/workbook/worksheet/row.rb +59 -83
  116. data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -0
  117. data/lib/axlsx/workbook/worksheet/selection.rb +30 -38
  118. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -0
  119. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +60 -0
  120. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +49 -4
  121. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +51 -155
  122. data/lib/axlsx/workbook/worksheet/sheet_view.rb +68 -234
  123. data/lib/axlsx/workbook/worksheet/table.rb +25 -19
  124. data/lib/axlsx/workbook/worksheet/table_style_info.rb +51 -0
  125. data/lib/axlsx/workbook/worksheet/tables.rb +1 -1
  126. data/lib/axlsx/workbook/worksheet/worksheet.rb +174 -35
  127. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +6 -5
  128. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +4 -10
  129. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -0
  130. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -0
  131. data/lib/axlsx.rb +55 -5
  132. data/lib/schema/sml.xsd +4 -0
  133. data/test/axlsx.qcachegrind +2226 -0
  134. data/test/benchmark.rb +2 -3
  135. data/test/content_type/tc_default.rb +0 -11
  136. data/test/content_type/tc_override.rb +0 -13
  137. data/test/doc_props/tc_core.rb +7 -0
  138. data/test/drawing/tc_axes.rb +8 -0
  139. data/test/drawing/tc_axis.rb +15 -17
  140. data/test/drawing/tc_bar_3D_chart.rb +6 -0
  141. data/test/drawing/tc_cat_axis.rb +9 -9
  142. data/test/drawing/tc_chart.rb +20 -0
  143. data/test/drawing/tc_d_lbls.rb +14 -4
  144. data/test/drawing/tc_drawing.rb +0 -5
  145. data/test/drawing/tc_graphic_frame.rb +5 -3
  146. data/test/drawing/tc_hyperlink.rb +0 -4
  147. data/test/drawing/tc_line_chart.rb +39 -0
  148. data/test/drawing/tc_line_series.rb +8 -2
  149. data/test/drawing/tc_pic.rb +14 -3
  150. data/test/drawing/tc_ser_axis.rb +13 -12
  151. data/test/drawing/tc_two_cell_anchor.rb +3 -3
  152. data/test/drawing/tc_val_axis.rb +6 -6
  153. data/test/drawing/tc_vml_shape.rb +9 -3
  154. data/test/profile.rb +11 -21
  155. data/test/rels/tc_relationship.rb +32 -9
  156. data/test/rels/tc_relationships.rb +12 -1
  157. data/test/stylesheet/tc_color.rb +6 -0
  158. data/test/stylesheet/tc_styles.rb +15 -2
  159. data/test/tc_axlsx.rb +35 -2
  160. data/test/tc_helper.rb +7 -1
  161. data/test/tc_package.rb +44 -5
  162. data/test/util/tc_serialized_attributes.rb +19 -0
  163. data/test/util/tc_validators.rb +26 -1
  164. data/test/workbook/tc_defined_name.rb +2 -2
  165. data/test/workbook/tc_shared_strings_table.rb +6 -0
  166. data/test/workbook/tc_workbook.rb +38 -1
  167. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -0
  168. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -0
  169. data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -0
  170. data/test/workbook/worksheet/tc_break.rb +49 -0
  171. data/test/workbook/worksheet/tc_cell.rb +40 -6
  172. data/test/workbook/worksheet/tc_col.rb +11 -1
  173. data/test/workbook/worksheet/tc_color_scale.rb +31 -2
  174. data/test/workbook/worksheet/tc_comment.rb +21 -6
  175. data/test/workbook/worksheet/tc_comments.rb +2 -2
  176. data/test/workbook/worksheet/tc_conditional_formatting.rb +7 -0
  177. data/test/workbook/worksheet/tc_data_bar.rb +7 -0
  178. data/test/workbook/worksheet/tc_date_time_converter.rb +3 -11
  179. data/test/workbook/worksheet/tc_header_footer.rb +151 -0
  180. data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -0
  181. data/test/workbook/worksheet/tc_page_setup.rb +6 -1
  182. data/test/workbook/worksheet/tc_pane.rb +5 -45
  183. data/test/workbook/worksheet/tc_pivot_table.rb +120 -0
  184. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +54 -0
  185. data/test/workbook/worksheet/tc_row.rb +4 -4
  186. data/test/workbook/worksheet/tc_selection.rb +9 -48
  187. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -0
  188. data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -0
  189. data/test/workbook/worksheet/tc_sheet_pr.rb +27 -0
  190. data/test/workbook/worksheet/tc_sheet_view.rb +39 -39
  191. data/test/workbook/worksheet/{table/tc_table.rb → tc_table.rb} +8 -3
  192. data/test/workbook/worksheet/tc_table_style_info.rb +53 -0
  193. data/test/workbook/worksheet/tc_worksheet.rb +131 -16
  194. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -0
  195. metadata +97 -64
  196. data/examples/example.xlsx +0 -0
  197. data/examples/example_streamed.xlsx +0 -0
  198. data/examples/extractive.pdf +0 -0
  199. data/examples/image1.gif +0 -0
  200. data/examples/image1.jpg +0 -0
  201. data/examples/image1.png +0 -0
  202. data/examples/no-use_autowidth.xlsx +0 -0
  203. data/examples/sample.png +0 -0
  204. data/examples/scraping_html.rb +0 -91
  205. data/examples/shared_strings_example.xlsx +0 -0
  206. data/examples/sheet_view.rb +0 -34
  207. data/examples/two_cell_anchor_image.rb +0 -11
  208. data/lib/axlsx/workbook/worksheet/auto_filter.rb +0 -34
@@ -1,21 +1,44 @@
1
1
  require 'tc_helper.rb'
2
2
 
3
3
  class TestRelationships < Test::Unit::TestCase
4
- def setup
4
+
5
+ def test_instances_with_different_attributes_have_unique_ids
6
+ rel_1 = Axlsx::Relationship.new(Object.new, Axlsx::WORKSHEET_R, 'target')
7
+ rel_2 = Axlsx::Relationship.new(Object.new, Axlsx::COMMENT_R, 'foobar')
8
+ assert_not_equal rel_1.Id, rel_2.Id
5
9
  end
6
-
7
- def teardown
10
+
11
+ def test_instances_with_same_attributes_share_id
12
+ source_obj = Object.new
13
+ instance = Axlsx::Relationship.new(source_obj, Axlsx::WORKSHEET_R, 'target')
14
+ assert_equal instance.Id, Axlsx::Relationship.new(source_obj, Axlsx::WORKSHEET_R, 'target').Id
8
15
  end
9
-
16
+
17
+ def test_target_is_only_considered_for_same_attributes_check_if_target_mode_is_external
18
+ source_obj = Object.new
19
+ rel_1 = Axlsx::Relationship.new(source_obj, Axlsx::WORKSHEET_R, 'target')
20
+ rel_2 = Axlsx::Relationship.new(source_obj, Axlsx::WORKSHEET_R, '../target')
21
+ assert_equal rel_1.Id, rel_2.Id
22
+
23
+ rel_3 = Axlsx::Relationship.new(source_obj, Axlsx::HYPERLINK_R, 'target', :target_mode => :External)
24
+ rel_4 = Axlsx::Relationship.new(source_obj, Axlsx::HYPERLINK_R, '../target', :target_mode => :External)
25
+ assert_not_equal rel_3.Id, rel_4.Id
26
+ end
27
+
10
28
  def test_type
11
- assert_raise(ArgumentError) { Axlsx::Relationship.new 'type', 'target' }
12
- assert_nothing_raised { Axlsx::Relationship.new Axlsx::WORKSHEET_R, 'target' }
13
- assert_nothing_raised { Axlsx::Relationship.new Axlsx::COMMENT_R, 'target' }
29
+ assert_raise(ArgumentError) { Axlsx::Relationship.new nil, 'type', 'target' }
30
+ assert_nothing_raised { Axlsx::Relationship.new nil, Axlsx::WORKSHEET_R, 'target' }
31
+ assert_nothing_raised { Axlsx::Relationship.new nil, Axlsx::COMMENT_R, 'target' }
14
32
  end
15
33
 
16
34
  def test_target_mode
17
- assert_raise(ArgumentError) { Axlsx::Relationship.new 'type', 'target', :target_mode => "FISH" }
18
- assert_nothing_raised { Axlsx::Relationship.new( Axlsx::WORKSHEET_R, 'target', :target_mode => :External) }
35
+ assert_raise(ArgumentError) { Axlsx::Relationship.new nil, 'type', 'target', :target_mode => "FISH" }
36
+ assert_nothing_raised { Axlsx::Relationship.new( nil, Axlsx::WORKSHEET_R, 'target', :target_mode => :External) }
19
37
  end
20
38
 
39
+ def test_ampersand_escaping_in_target
40
+ r = Axlsx::Relationship.new(nil, Axlsx::HYPERLINK_R, "http://example.com?foo=1&bar=2", :target_mod => :External)
41
+ doc = Nokogiri::XML(r.to_xml_string)
42
+ assert_equal(doc.xpath("//Relationship[@Target='http://example.com?foo=1&bar=2']").size, 1)
43
+ end
21
44
  end
@@ -2,6 +2,17 @@ require 'tc_helper.rb'
2
2
 
3
3
  class TestRelationships < Test::Unit::TestCase
4
4
 
5
+ def test_for
6
+ source_obj_1, source_obj_2 = Object.new, Object.new
7
+ rel_1 = Axlsx::Relationship.new(source_obj_1, Axlsx::WORKSHEET_R, "bar")
8
+ rel_2 = Axlsx::Relationship.new(source_obj_2, Axlsx::WORKSHEET_R, "bar")
9
+ rels = Axlsx::Relationships.new
10
+ rels << rel_1
11
+ rels << rel_2
12
+ assert_equal rel_1, rels.for(source_obj_1)
13
+ assert_equal rel_2, rels.for(source_obj_2)
14
+ end
15
+
5
16
  def test_valid_document
6
17
  @rels = Axlsx::Relationships.new
7
18
  schema = Nokogiri::XML::Schema(File.open(Axlsx::RELS_XSD))
@@ -12,7 +23,7 @@ class TestRelationships < Test::Unit::TestCase
12
23
  errors << error
13
24
  end
14
25
 
15
- @rels << Axlsx::Relationship.new(Axlsx::WORKSHEET_R, "bar")
26
+ @rels << Axlsx::Relationship.new(nil, Axlsx::WORKSHEET_R, "bar")
16
27
  doc = Nokogiri::XML(@rels.to_xml_string)
17
28
  errors = []
18
29
  schema.validate(doc).each do |error|
@@ -27,6 +27,12 @@ class TestColor < Test::Unit::TestCase
27
27
  assert_equal(@item.rgb, "FF00FF00" )
28
28
  end
29
29
 
30
+ def test_rgb_writer_doesnt_mutate_its_argument
31
+ my_rgb = 'ff00ff00'
32
+ @item.rgb = my_rgb
33
+ assert_equal 'ff00ff00', my_rgb
34
+ end
35
+
30
36
  def test_tint
31
37
  assert_raise(ArgumentError) { @item.tint = -1 }
32
38
  assert_nothing_raised { @item.tint = -1.0 }
@@ -105,6 +105,19 @@ class TestStyles < Test::Unit::TestCase
105
105
  assert(@styles.parse_alignment_options(:alignment => {}).is_a?(Axlsx::CellAlignment))
106
106
  end
107
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
+
108
121
  def test_parse_font_options
109
122
  options = {
110
123
  :fg_color => "FF050505",
@@ -137,7 +150,7 @@ class TestStyles < Test::Unit::TestCase
137
150
  assert_equal(@styles.parse_fill_options(:bg_color => "DE").class, Fixnum, "return index of fill if not :dxf type")
138
151
  assert_equal(@styles.parse_fill_options(:bg_color => "DE", :type => :dxf).class, Axlsx::Fill, "return fill object if :dxf type")
139
152
  f = @styles.parse_fill_options(:bg_color => "DE", :type => :dxf)
140
- assert(f.fill_type.fgColor.rgb == "FFDEDEDE")
153
+ assert(f.fill_type.bgColor.rgb == "FFDEDEDE")
141
154
  end
142
155
 
143
156
  def test_parse_protection_options
@@ -197,7 +210,7 @@ class TestStyles < Test::Unit::TestCase
197
210
  assert_equal(0, style, "returns the zero-based dxfId")
198
211
 
199
212
  dxf = @styles.dxfs.last
200
- assert_equal(@styles.dxfs.last.fill.fill_type.fgColor.rgb, "FF000000", "fill created with color")
213
+ assert_equal(@styles.dxfs.last.fill.fill_type.bgColor.rgb, "FF000000", "fill created with color")
201
214
 
202
215
  assert_equal(font_count, (@styles.fonts.size), "font not created under styles")
203
216
  assert_equal(fill_count, (@styles.fills.size), "fill not created under styles")
data/test/tc_axlsx.rb CHANGED
@@ -14,8 +14,35 @@ class TestAxlsx < Test::Unit::TestCase
14
14
  }
15
15
  end
16
16
 
17
- def test_cell_range
18
- #To do
17
+ def test_cell_range_empty_if_no_cell
18
+ assert_equal(Axlsx.cell_range([]), "")
19
+ end
20
+
21
+ def test_do_not_trust_input_by_default
22
+ assert_equal false, Axlsx.trust_input
23
+ end
24
+
25
+
26
+ def test_trust_input_can_be_set_to_true
27
+ Axlsx.trust_input = true
28
+ assert_equal true, Axlsx.trust_input
29
+ end
30
+ def test_cell_range_relative
31
+ p = Axlsx::Package.new
32
+ ws = p.workbook.add_worksheet
33
+ row = ws.add_row
34
+ c1 = row.add_cell
35
+ c2 = row.add_cell
36
+ assert_equal(Axlsx.cell_range([c2, c1], false), "A1:B1")
37
+ end
38
+
39
+ def test_cell_range_absolute
40
+ p = Axlsx::Package.new
41
+ ws = p.workbook.add_worksheet :name => "Sheet <'>\" 1"
42
+ row = ws.add_row
43
+ c1 = row.add_cell
44
+ c2 = row.add_cell
45
+ assert_equal(Axlsx.cell_range([c2, c1], true), "'Sheet &lt;''&gt;&quot; 1'!$A$1:$B$1")
19
46
  end
20
47
 
21
48
  def test_name_to_indices
@@ -36,4 +63,10 @@ class TestAxlsx < Test::Unit::TestCase
36
63
  # todo
37
64
  end
38
65
 
66
+ def test_range_to_a
67
+ assert_equal([['A1', 'B1', 'C1']], Axlsx::range_to_a('A1:C1'))
68
+ assert_equal([['A1', 'B1', 'C1'], ['A2', 'B2', 'C2']], Axlsx::range_to_a('A1:C2'))
69
+ assert_equal([['Z5', 'AA5', 'AB5'], ['Z6', 'AA6', 'AB6']], Axlsx::range_to_a('Z5:AB6'))
70
+ end
71
+
39
72
  end
data/test/tc_helper.rb CHANGED
@@ -1,4 +1,10 @@
1
1
  $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
2
- require 'cover_me' unless RUBY_VERSION == '1.8.7'
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter "/test/"
5
+ add_filter "/vendor/"
6
+ end
7
+
3
8
  require 'test/unit'
9
+ require "timecop"
4
10
  require "axlsx.rb"
data/test/tc_package.rb CHANGED
@@ -7,6 +7,9 @@ class TestPackage < Test::Unit::TestCase
7
7
  ws = @package.workbook.add_worksheet
8
8
  ws.add_row ['Can', 'we', 'build it?']
9
9
  ws.add_row ['Yes!', 'We', 'can!']
10
+ ws.outline_level_rows 0, 1
11
+ ws.outline_level_columns 0, 1
12
+ ws.add_hyperlink :ref => ws.rows.first.cells.last, :location => 'https://github.com/randym'
10
13
  ws.workbook.add_defined_name("#{ws.name}!A1:C2", :name => '_xlnm.Print_Titles', :hidden => true)
11
14
  ws.protect_range('A1:C1')
12
15
  ws.protect_range(ws.rows.last.cells)
@@ -37,15 +40,15 @@ class TestPackage < Test::Unit::TestCase
37
40
  ws.add_chart(Axlsx::Line3DChart, :title => "axis labels") do |chart|
38
41
  chart.valAxis.title = 'bob'
39
42
  chart.d_lbls.show_val = true
40
- end
41
-
43
+ end
44
+
42
45
  ws.add_chart(Axlsx::Bar3DChart, :title => 'bar chart') do |chart|
43
46
  chart.add_series :data => [1,4,5], :labels => %w(A B C)
44
47
  chart.d_lbls.show_percent = true
45
48
  end
46
49
 
47
50
  ws.add_chart(Axlsx::ScatterChart, :title => 'scat man') do |chart|
48
- chart.add_series :xData => [1,2,3,4], :yData => [4,3,2,1]
51
+ chart.add_series :xData => [1,2,3,4], :yData => [4,3,2,1]
49
52
  chart.d_lbls.show_val = true
50
53
  end
51
54
 
@@ -56,11 +59,12 @@ class TestPackage < Test::Unit::TestCase
56
59
  image.height=666
57
60
  image.hyperlink.tooltip = "Labeled Link"
58
61
  image.start_at 5, 5
62
+ image.end_at 10, 10
59
63
  end
60
64
  ws.add_image :image_src => File.expand_path('../../examples/image1.gif', __FILE__) do |image|
61
65
  image.start_at 0, 20
62
66
  image.width=360
63
- image.height=333
67
+ image.height=333
64
68
  end
65
69
  ws.add_image :image_src => File.expand_path('../../examples/image1.png', __FILE__) do |image|
66
70
  image.start_at 9, 20
@@ -68,6 +72,11 @@ class TestPackage < Test::Unit::TestCase
68
72
  image.height = 167
69
73
  end
70
74
  ws.add_table 'A1:C1'
75
+
76
+ ws.add_pivot_table 'G5:G6', 'A1:B3'
77
+
78
+ ws.add_page_break "B2"
79
+
71
80
  end
72
81
 
73
82
  def test_use_autowidth
@@ -99,6 +108,12 @@ class TestPackage < Test::Unit::TestCase
99
108
  assert(Axlsx::Package.new.workbook.worksheets.size == 0, 'Workbook should not have sheets by default')
100
109
  end
101
110
 
111
+ def test_created_at_is_propagated_to_core
112
+ time = Time.utc(2013, 1, 1, 12, 0)
113
+ p = Axlsx::Package.new :created_at => time
114
+ assert_equal(time, p.core.created)
115
+ end
116
+
102
117
  def test_serialization
103
118
  assert_nothing_raised do
104
119
  begin
@@ -111,6 +126,27 @@ class TestPackage < Test::Unit::TestCase
111
126
  end
112
127
  end
113
128
  end
129
+
130
+ # See comment for Package#zip_entry_for_part
131
+ def test_serialization_creates_identical_files_at_any_time_if_created_at_is_set
132
+ @package.core.created = Time.now
133
+ zip_content_now = @package.to_stream.string
134
+ Timecop.travel(3600) do
135
+ zip_content_then = @package.to_stream.string
136
+ assert zip_content_then == zip_content_now, "zip files are not identical"
137
+ end
138
+ end
139
+
140
+ def test_serialization_creates_identical_files_for_identical_packages
141
+ package_1, package_2 = 2.times.map do
142
+ Axlsx::Package.new(:created_at => Time.utc(2013, 1, 1)).tap do |p|
143
+ p.workbook.add_worksheet(:name => "Basic Worksheet") do |sheet|
144
+ sheet.add_row [1, 2, 3]
145
+ end
146
+ end
147
+ end
148
+ assert package_1.to_stream.string == package_2.to_stream.string, "zip files are not identical"
149
+ end
114
150
 
115
151
  def test_validation
116
152
  assert_equal(@package.validate.size, 0, @package.validate)
@@ -134,10 +170,13 @@ class TestPackage < Test::Unit::TestCase
134
170
  assert_equal(p.select{ |part| part[:entry] =~ /xl\/worksheets\/sheet\d\.xml/ }.size, @package.workbook.worksheets.size, "one or more sheet missing")
135
171
  assert_equal(p.select{ |part| part[:entry] =~ /xl\/worksheets\/_rels\/sheet\d\.xml\.rels/ }.size, @package.workbook.worksheets.size, "one or more sheet rels missing")
136
172
  assert_equal(p.select{ |part| part[:entry] =~ /xl\/comments\d\.xml/ }.size, @package.workbook.worksheets.size, "one or more sheet rels missing")
173
+ assert_equal(p.select{ |part| part[:entry] =~ /xl\/pivotTables\/pivotTable\d\.xml/ }.size, @package.workbook.worksheets.first.pivot_tables.size, "one or more pivot tables missing")
174
+ assert_equal(p.select{ |part| part[:entry] =~ /xl\/pivotTables\/_rels\/pivotTable\d\.xml.rels/ }.size, @package.workbook.worksheets.first.pivot_tables.size, "one or more pivot tables rels missing")
175
+ assert_equal(p.select{ |part| part[:entry] =~ /xl\/pivotCache\/pivotCacheDefinition\d\.xml/ }.size, @package.workbook.worksheets.first.pivot_tables.size, "one or more pivot tables missing")
137
176
 
138
177
 
139
178
  #no mystery parts
140
- assert_equal(p.size, 21)
179
+ assert_equal(24, p.size)
141
180
 
142
181
  end
143
182
 
@@ -0,0 +1,19 @@
1
+ require 'tc_helper.rb'
2
+ class Funk
3
+ include Axlsx::Accessors
4
+ include Axlsx::SerializedAttributes
5
+ serializable_attributes :camel_symbol, :boolean, :integer
6
+
7
+ attr_accessor :camel_symbol, :boolean, :integer
8
+ end
9
+
10
+ class TestSeralizedAttributes < Test::Unit::TestCase
11
+ def setup
12
+ @object = Funk.new
13
+ end
14
+
15
+ def test_camel_symbol
16
+ @object.camel_symbol = :foo_bar
17
+ assert_equal('camelSymbol="fooBar" ', @object.serialized_attributes)
18
+ end
19
+ end
@@ -158,4 +158,29 @@ class TestValidators < Test::Unit::TestCase
158
158
  assert_raise(ArgumentError) { Axlsx.validate_split_state_type 'frozen_split' }
159
159
  assert_raise(ArgumentError) { Axlsx.validate_split_state_type 0 }
160
160
  end
161
- end
161
+
162
+ def test_validate_integerish
163
+ assert_raise(ArgumentError) { Axlsx.validate_integerish Axlsx }
164
+ [1, 1.4, "a"].each { |test_value| assert_nothing_raised { Axlsx.validate_integerish test_value } }
165
+ end
166
+ def test_validate_family
167
+ assert_raise(ArgumentError) { Axlsx.validate_family 0 }
168
+ (1..5).each do |item|
169
+ assert_nothing_raised { Axlsx.validate_family item }
170
+ end
171
+ end
172
+
173
+ def test_validate_u
174
+ assert_raise(ArgumentError) { Axlsx.validate_cell_u :hoge }
175
+ [:none, :single, :double, :singleAccounting, :doubleAccounting].each do |sym|
176
+ assert_nothing_raised { Axlsx.validate_cell_u sym }
177
+ end
178
+ end
179
+
180
+ def test_range_validation
181
+ # exclusive
182
+ assert_raise(ArgumentError) { Axlsx::RangeValidator.validate('foo', 1, 10, 10, false) }
183
+ # inclusive by default
184
+ assert_nothing_raised { Axlsx::RangeValidator.validate('foo', 1, 10, 10) }
185
+ end
186
+ end
@@ -10,14 +10,14 @@ class TestDefinedNames < Test::Unit::TestCase
10
10
  end
11
11
 
12
12
  def test_string_attributes
13
- Axlsx::DefinedName::STRING_ATTRIBUTES.each do |attr|
13
+ %w(short_cut_key status_bar help description custom_menu comment).each do |attr|
14
14
  assert_raise(ArgumentError, 'only strings allowed in string attributes') { @dn.send("#{attr}=", 1) }
15
15
  assert_nothing_raised { @dn.send("#{attr}=", '_xlnm.Sheet_Title') }
16
16
  end
17
17
  end
18
18
 
19
19
  def test_boolean_attributes
20
- Axlsx::DefinedName::BOOLEAN_ATTRIBUTES.each do |attr|
20
+ %w(workbook_parameter publish_to_server xlm vb_proceedure function hidden).each do |attr|
21
21
  assert_raise(ArgumentError, 'only booleanish allowed in string attributes') { @dn.send("#{attr}=", 'foo') }
22
22
  assert_nothing_raised { @dn.send("#{attr}=", 1) }
23
23
  end
@@ -24,6 +24,12 @@ class TestSharedStringsTable < Test::Unit::TestCase
24
24
  assert_equal(sst.unique_count, 4)
25
25
  end
26
26
 
27
+ def test_uses_workbook_xml_space
28
+ assert_equal(@p.workbook.xml_space, @p.workbook.shared_strings.xml_space)
29
+ @p.workbook.xml_space = :default
30
+ assert_equal(:default, @p.workbook.shared_strings.xml_space)
31
+ end
32
+
27
33
  def test_valid_document
28
34
  schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
29
35
  doc = Nokogiri::XML(@p.workbook.shared_strings.to_xml_string)
@@ -9,6 +9,23 @@ class TestWorkbook < Test::Unit::TestCase
9
9
  def teardown
10
10
  end
11
11
 
12
+ def test_worksheet_users_xml_space
13
+ sheet = @wb.add_worksheet(:name => 'foo')
14
+ ws_xml = Nokogiri::XML(sheet.to_xml_string)
15
+ assert(ws_xml.xpath("//xmlns:worksheet/@xml:space='preserve'"))
16
+
17
+ @wb.xml_space = :default
18
+ ws_xml = Nokogiri::XML(sheet.to_xml_string)
19
+ assert(ws_xml.xpath("//xmlns:worksheet/@xml:space='default'"))
20
+ end
21
+
22
+ def test_xml_space
23
+ assert_equal(:preserve, @wb.xml_space)
24
+ @wb.xml_space = :default
25
+ assert_equal(:default, @wb.xml_space)
26
+ assert_raise(ArgumentError) { @wb.xml_space = :none }
27
+ end
28
+
12
29
  def test_no_autowidth
13
30
  assert_equal(@wb.use_autowidth, true)
14
31
  assert_raise(ArgumentError) {@wb.use_autowidth = 0.1}
@@ -16,6 +33,13 @@ class TestWorkbook < Test::Unit::TestCase
16
33
  assert_equal(@wb.use_autowidth, false)
17
34
  end
18
35
 
36
+
37
+ def test_sheet_by_name_retrieval
38
+ @wb.add_worksheet(:name=>'foo')
39
+ @wb.add_worksheet(:name=>'bar')
40
+ assert_equal('foo', @wb.sheet_by_name('foo').name)
41
+
42
+ end
19
43
  def test_date1904
20
44
  assert_equal(Axlsx::Workbook.date1904, @wb.date1904)
21
45
  @wb.date1904 = :false
@@ -42,6 +66,14 @@ class TestWorkbook < Test::Unit::TestCase
42
66
  assert_equal(@wb.worksheets.first, ws, "the worksheet returned is the worksheet added")
43
67
  assert_equal(ws.name, "bob", "name option gets passed to worksheet")
44
68
  end
69
+
70
+ def test_insert_worksheet
71
+ @wb.add_worksheet(:name => 'A')
72
+ @wb.add_worksheet(:name => 'B')
73
+ ws3 = @wb.insert_worksheet(0, :name => 'C')
74
+ assert_equal(ws3.name, @wb.worksheets.first.name)
75
+ end
76
+
45
77
  def test_relationships
46
78
  #current relationship size is 1 due to style relation
47
79
  assert(@wb.relationships.size == 1)
@@ -84,5 +116,10 @@ class TestWorkbook < Test::Unit::TestCase
84
116
  assert_equal(doc.xpath('//xmlns:workbook/xmlns:definedNames/xmlns:definedName').inner_text, @wb.worksheets[0].auto_filter.defined_name)
85
117
  end
86
118
 
87
-
119
+ def test_to_xml_uses_correct_rIds_for_pivotCache
120
+ ws = @wb.add_worksheet
121
+ pivot_table = ws.add_pivot_table('G5:G6', 'A1:D5')
122
+ doc = Nokogiri::XML(@wb.to_xml_string)
123
+ assert_equal pivot_table.cache_definition.rId, doc.xpath("//xmlns:pivotCache").first["r:id"]
124
+ end
88
125
  end
@@ -0,0 +1,38 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestAutoFilter < Test::Unit::TestCase
4
+
5
+ def setup
6
+ ws = Axlsx::Package.new.workbook.add_worksheet
7
+ 3.times { |index| ws.add_row [1*index,2*index,3*index] }
8
+ @auto_filter = ws.auto_filter
9
+ @auto_filter.range = 'A1:C3'
10
+ @auto_filter.add_column 0, :filters, :filter_items => [1]
11
+ end
12
+
13
+ def test_defined_name
14
+ assert_equal("'Sheet1'!$A$1:$C$3", @auto_filter.defined_name)
15
+ end
16
+
17
+ def test_to_xml_string
18
+ doc = Nokogiri::XML(@auto_filter.to_xml_string)
19
+ assert(doc.xpath("autoFilter[@ref='#{@auto_filter.range}']"))
20
+ end
21
+
22
+ def test_columns
23
+ assert @auto_filter.columns.is_a?(Axlsx::SimpleTypedList)
24
+ assert_equal @auto_filter.columns.allowed_types, [Axlsx::FilterColumn]
25
+ end
26
+
27
+ def test_add_column
28
+ @auto_filter.add_column(0, :filters) do |column|
29
+ assert column.is_a? FilterColumn
30
+ end
31
+ end
32
+
33
+ def test_applya
34
+ assert_equal nil, @auto_filter.worksheet.rows.last.hidden
35
+ @auto_filter.apply
36
+ assert_equal true, @auto_filter.worksheet.rows.last.hidden
37
+ end
38
+ end
@@ -0,0 +1,76 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestFilterColumn < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @filter_column = Axlsx::FilterColumn.new(0, :filters, :filter_items => [200])
7
+ end
8
+
9
+
10
+ def test_initialize_col_id
11
+ assert_raise ArgumentError do
12
+ Axlsx::FilterColumn.new(0, :bobs_house_of_filter)
13
+ end
14
+ assert_raise ArgumentError do
15
+ Axlsx::FilterColumn.new(:penut, :filters)
16
+ end
17
+ end
18
+
19
+ def test_initailize_filter_type
20
+ assert @filter_column.filter.is_a?(Axlsx::Filters)
21
+ assert_equal 1, @filter_column.filter.filter_items.size
22
+ end
23
+
24
+ def test_initialize_filter_type_filters_with_options
25
+ assert_equal 200, @filter_column.filter.filter_items.first.val
26
+ end
27
+
28
+ def test_initialize_with_block
29
+ filter_column = Axlsx::FilterColumn.new(0, :filters) do |filters|
30
+ filters.filter_items = [700, 100, 5]
31
+ end
32
+ assert_equal 3, filter_column.filter.filter_items.size
33
+ assert_equal 700, filter_column.filter.filter_items.first.val
34
+ assert_equal 5, filter_column.filter.filter_items.last.val
35
+ end
36
+
37
+ def test_default_show_button
38
+ assert_equal true, @filter_column.show_button
39
+ end
40
+
41
+ def test_default_hidden_button
42
+ assert_equal false, @filter_column.hidden_button
43
+ end
44
+
45
+ def test_show_button
46
+ assert_raise ArgumentError do
47
+ @filter_column.show_button = :foo
48
+ end
49
+ assert_nothing_raised { @filter_column.show_button = false }
50
+ end
51
+
52
+ def test_hidden_button
53
+ assert_raise ArgumentError do
54
+ @filter_column.hidden_button = :hoge
55
+ end
56
+ assert_nothing_raised { @filter_column.hidden_button = true }
57
+ end
58
+
59
+ def test_col_id=
60
+ assert_raise ArgumentError do
61
+ @filter_column.col_id = :bar
62
+ end
63
+ assert_nothing_raised { @filter_column.col_id = 7 }
64
+ end
65
+
66
+ def test_to_xml_string
67
+ doc = Nokogiri::XML(@filter_column.to_xml_string)
68
+ assert doc.xpath("//filterColumn[@colId=#{@filter_column.col_id}]")
69
+ assert doc.xpath("//filterColumn[@hiddenButton=#{@filter_column.hidden_button}]")
70
+ assert doc.xpath("//filterColumn[@showButton=#{@filter_column.show_button}]")
71
+
72
+
73
+
74
+ assert doc.xpath("//filterColumn/filters")
75
+ end
76
+ end
@@ -0,0 +1,50 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestFilters < Test::Unit::TestCase
4
+ def setup
5
+ @filters = Axlsx::Filters.new(:filter_items => [1, 'a'],
6
+ :date_group_items =>[ { :date_time_grouping => :year, :year => 2011, :month => 11, :day => 11, :hour => 0, :minute => 0, :second => 0 } ] ,
7
+ :blank => true)
8
+ end
9
+
10
+ def test_blank
11
+ assert_equal true, @filters.blank
12
+ assert_raise(ArgumentError) { @filters.blank = :only_if_you_want_it }
13
+ @filters.blank = true
14
+ assert_equal true, @filters.blank
15
+ end
16
+
17
+ def test_calendar_type
18
+ assert_raise(ArgumentError) { @filters.calendar_type = 'monkey calendar' }
19
+ @filters.calendar_type = 'japan'
20
+ assert_equal('japan', @filters.calendar_type)
21
+ end
22
+
23
+ def test_filters_items
24
+ assert @filters.filter_items.is_a?(Array)
25
+ assert_equal 2, @filters.filter_items.size
26
+ end
27
+
28
+ def test_date_group_items
29
+ assert @filters.date_group_items.is_a?(Array)
30
+ assert_equal 1, @filters.date_group_items.size
31
+ end
32
+
33
+ def test_apply_is_false_for_matching_values
34
+ keeper = Object.new
35
+ def keeper.value; 'a'; end
36
+ assert_equal false, @filters.apply(keeper)
37
+ end
38
+
39
+ def test_apply_is_true_for_non_matching_values
40
+ hidden = Object.new
41
+ def hidden.value; 'b'; end
42
+ assert_equal true, @filters.apply(hidden)
43
+ end
44
+
45
+ def test_to_xml_string
46
+ doc = Nokogiri::XML(@filters.to_xml_string)
47
+ assert_equal(1, doc.xpath('//filters[@blank="true"]').size)
48
+ end
49
+ end
50
+
@@ -0,0 +1,49 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestBreak < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @break = Axlsx::Break.new(:id => 1, :min => 1, :max => 10, :man => true, :pt => false)
7
+ end
8
+
9
+ def test_id
10
+ assert_equal(1, @break.id)
11
+ assert_raises ArgumentError do
12
+ Axlsx::Break.new(:hoge, {:id => -1})
13
+ end
14
+ end
15
+
16
+ def test_min
17
+ assert_equal(1, @break.min)
18
+ assert_raises ArgumentError do
19
+ Axlsx::Break.new(:hoge, :min => -1)
20
+ end
21
+ end
22
+
23
+ def test_max
24
+ assert_equal(10, @break.max)
25
+ assert_raises ArgumentError do
26
+ Axlsx::Break.new(:hoge, :max => -1)
27
+ end
28
+ end
29
+
30
+
31
+ def test_man
32
+ assert_equal(true, @break.man)
33
+ assert_raises ArgumentError do
34
+ Axlsx::Break.new(:man => -1)
35
+ end
36
+ end
37
+
38
+ def test_pt
39
+ assert_equal(false, @break.pt)
40
+ assert_raises ArgumentError do
41
+ Axlsx::Break.new(:pt => -1)
42
+ end
43
+ end
44
+
45
+ def test_to_xml_string
46
+ doc = Nokogiri::XML(@break.to_xml_string)
47
+ assert_equal(doc.xpath('//brk[@id="1"][@min="1"][@max="10"][@pt="false"][@man="true"]').size, 1)
48
+ end
49
+ end