axlsx 2.0.1 → 3.0.0.pre

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 (180) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/README.md +23 -23
  4. data/Rakefile +9 -11
  5. data/examples/auto_filter.rb +10 -1
  6. data/examples/conditional_formatting/example_conditional_formatting.rb +18 -3
  7. data/examples/example.rb +102 -4
  8. data/examples/merge_cells.rb +17 -0
  9. data/examples/no_grid_with_borders.rb +18 -0
  10. data/examples/pivot_test.rb +63 -0
  11. data/examples/split.rb +16 -0
  12. data/lib/axlsx/content_type/abstract_content_type.rb +1 -1
  13. data/lib/axlsx/content_type/content_type.rb +1 -1
  14. data/lib/axlsx/doc_props/app.rb +1 -1
  15. data/lib/axlsx/doc_props/core.rb +5 -5
  16. data/lib/axlsx/drawing/area_chart.rb +99 -0
  17. data/lib/axlsx/drawing/area_series.rb +110 -0
  18. data/lib/axlsx/drawing/axes.rb +1 -1
  19. data/lib/axlsx/drawing/axis.rb +12 -9
  20. data/lib/axlsx/drawing/bar_3D_chart.rb +13 -13
  21. data/lib/axlsx/drawing/bar_chart.rb +143 -0
  22. data/lib/axlsx/drawing/bar_series.rb +9 -9
  23. data/lib/axlsx/drawing/bubble_chart.rb +59 -0
  24. data/lib/axlsx/drawing/bubble_series.rb +63 -0
  25. data/lib/axlsx/drawing/cat_axis.rb +5 -5
  26. data/lib/axlsx/drawing/chart.rb +52 -8
  27. data/lib/axlsx/drawing/d_lbls.rb +3 -3
  28. data/lib/axlsx/drawing/drawing.rb +6 -1
  29. data/lib/axlsx/drawing/graphic_frame.rb +3 -3
  30. data/lib/axlsx/drawing/hyperlink.rb +1 -3
  31. data/lib/axlsx/drawing/line_3D_chart.rb +2 -2
  32. data/lib/axlsx/drawing/line_chart.rb +10 -10
  33. data/lib/axlsx/drawing/line_series.rb +32 -3
  34. data/lib/axlsx/drawing/marker.rb +1 -1
  35. data/lib/axlsx/drawing/num_data.rb +4 -4
  36. data/lib/axlsx/drawing/num_data_source.rb +6 -6
  37. data/lib/axlsx/drawing/num_val.rb +3 -1
  38. data/lib/axlsx/drawing/one_cell_anchor.rb +3 -2
  39. data/lib/axlsx/drawing/pic.rb +25 -19
  40. data/lib/axlsx/drawing/picture_locking.rb +1 -3
  41. data/lib/axlsx/drawing/pie_3D_chart.rb +5 -6
  42. data/lib/axlsx/drawing/pie_series.rb +6 -6
  43. data/lib/axlsx/drawing/scaling.rb +6 -6
  44. data/lib/axlsx/drawing/scatter_chart.rb +10 -10
  45. data/lib/axlsx/drawing/scatter_series.rb +40 -7
  46. data/lib/axlsx/drawing/ser_axis.rb +2 -2
  47. data/lib/axlsx/drawing/series.rb +3 -3
  48. data/lib/axlsx/drawing/series_title.rb +2 -2
  49. data/lib/axlsx/drawing/str_data.rb +3 -3
  50. data/lib/axlsx/drawing/str_val.rb +3 -1
  51. data/lib/axlsx/drawing/title.rb +22 -4
  52. data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
  53. data/lib/axlsx/drawing/val_axis.rb +1 -1
  54. data/lib/axlsx/drawing/view_3D.rb +2 -2
  55. data/lib/axlsx/drawing/vml_drawing.rb +1 -1
  56. data/lib/axlsx/package.rb +34 -32
  57. data/lib/axlsx/rels/relationship.rb +1 -1
  58. data/lib/axlsx/rels/relationships.rb +7 -4
  59. data/lib/axlsx/stylesheet/border_pr.rb +2 -2
  60. data/lib/axlsx/stylesheet/cell_alignment.rb +1 -3
  61. data/lib/axlsx/stylesheet/cell_protection.rb +1 -3
  62. data/lib/axlsx/stylesheet/cell_style.rb +1 -3
  63. data/lib/axlsx/stylesheet/color.rb +1 -3
  64. data/lib/axlsx/stylesheet/font.rb +1 -1
  65. data/lib/axlsx/stylesheet/gradient_stop.rb +1 -1
  66. data/lib/axlsx/stylesheet/num_fmt.rb +10 -3
  67. data/lib/axlsx/stylesheet/pattern_fill.rb +1 -1
  68. data/lib/axlsx/stylesheet/styles.rb +7 -7
  69. data/lib/axlsx/stylesheet/table_style_element.rb +1 -3
  70. data/lib/axlsx/util/accessors.rb +6 -6
  71. data/lib/axlsx/util/constants.rb +107 -99
  72. data/lib/axlsx/util/mime_type_utils.rb +11 -0
  73. data/lib/axlsx/util/options_parser.rb +2 -1
  74. data/lib/axlsx/util/parser.rb +4 -4
  75. data/lib/axlsx/util/serialized_attributes.rb +16 -6
  76. data/lib/axlsx/util/simple_typed_list.rb +28 -52
  77. data/lib/axlsx/util/storage.rb +4 -4
  78. data/lib/axlsx/util/validators.rb +29 -17
  79. data/lib/axlsx/version.rb +1 -1
  80. data/lib/axlsx/workbook/defined_name.rb +11 -12
  81. data/lib/axlsx/workbook/defined_names.rb +2 -2
  82. data/lib/axlsx/workbook/shared_strings_table.rb +5 -5
  83. data/lib/axlsx/workbook/workbook.rb +36 -11
  84. data/lib/axlsx/workbook/workbook_view.rb +80 -0
  85. data/lib/axlsx/workbook/workbook_views.rb +22 -0
  86. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +2 -2
  87. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +1 -3
  88. data/lib/axlsx/workbook/worksheet/break.rb +1 -3
  89. data/lib/axlsx/workbook/worksheet/cell.rb +136 -74
  90. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +63 -43
  91. data/lib/axlsx/workbook/worksheet/cfvo.rb +1 -3
  92. data/lib/axlsx/workbook/worksheet/cfvos.rb +4 -1
  93. data/lib/axlsx/workbook/worksheet/col.rb +7 -10
  94. data/lib/axlsx/workbook/worksheet/col_breaks.rb +2 -2
  95. data/lib/axlsx/workbook/worksheet/cols.rb +5 -2
  96. data/lib/axlsx/workbook/worksheet/comment.rb +5 -6
  97. data/lib/axlsx/workbook/worksheet/comments.rb +9 -12
  98. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +1 -1
  99. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +1 -1
  100. data/lib/axlsx/workbook/worksheet/data_bar.rb +4 -6
  101. data/lib/axlsx/workbook/worksheet/data_validation.rb +6 -4
  102. data/lib/axlsx/workbook/worksheet/dimension.rb +2 -2
  103. data/lib/axlsx/workbook/worksheet/header_footer.rb +6 -8
  104. data/lib/axlsx/workbook/worksheet/icon_set.rb +3 -5
  105. data/lib/axlsx/workbook/worksheet/merged_cells.rb +4 -2
  106. data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
  107. data/lib/axlsx/workbook/worksheet/page_margins.rb +1 -3
  108. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +1 -1
  109. data/lib/axlsx/workbook/worksheet/page_setup.rb +21 -23
  110. data/lib/axlsx/workbook/worksheet/pane.rb +1 -3
  111. data/lib/axlsx/workbook/worksheet/pivot_table.rb +44 -28
  112. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +4 -4
  113. data/lib/axlsx/workbook/worksheet/print_options.rb +1 -3
  114. data/lib/axlsx/workbook/worksheet/protected_range.rb +1 -3
  115. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +5 -2
  116. data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -0
  117. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -0
  118. data/lib/axlsx/workbook/worksheet/row.rb +40 -51
  119. data/lib/axlsx/workbook/worksheet/row_breaks.rb +2 -2
  120. data/lib/axlsx/workbook/worksheet/selection.rb +1 -3
  121. data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
  122. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +21 -3
  123. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +1 -3
  124. data/lib/axlsx/workbook/worksheet/table.rb +6 -6
  125. data/lib/axlsx/workbook/worksheet/table_style_info.rb +1 -3
  126. data/lib/axlsx/workbook/worksheet/tables.rb +4 -1
  127. data/lib/axlsx/workbook/worksheet/worksheet.rb +64 -78
  128. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
  129. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +3 -3
  130. data/lib/axlsx.rb +34 -15
  131. data/test/drawing/tc_area_chart.rb +39 -0
  132. data/test/drawing/tc_area_series.rb +71 -0
  133. data/test/drawing/tc_axis.rb +27 -0
  134. data/test/drawing/tc_bar_chart.rb +71 -0
  135. data/test/drawing/tc_bubble_chart.rb +44 -0
  136. data/test/drawing/tc_bubble_series.rb +21 -0
  137. data/test/drawing/tc_chart.rb +23 -10
  138. data/test/drawing/tc_data_source.rb +6 -0
  139. data/test/drawing/tc_drawing.rb +2 -2
  140. data/test/drawing/tc_line_chart.rb +5 -5
  141. data/test/drawing/tc_line_series.rb +47 -6
  142. data/test/drawing/tc_pic.rb +11 -15
  143. data/test/drawing/tc_scatter_series.rb +36 -1
  144. data/test/drawing/tc_str_val.rb +9 -0
  145. data/test/drawing/tc_title.rb +5 -0
  146. data/test/stylesheet/tc_styles.rb +2 -2
  147. data/test/tc_axlsx.rb +31 -0
  148. data/test/tc_helper.rb +2 -0
  149. data/test/tc_package.rb +19 -1
  150. data/test/util/tc_mime_type_utils.rb +13 -0
  151. data/test/util/tc_simple_typed_list.rb +2 -3
  152. data/test/util/tc_validators.rb +34 -10
  153. data/test/workbook/tc_defined_name.rb +12 -4
  154. data/test/workbook/tc_shared_strings_table.rb +16 -1
  155. data/test/workbook/tc_workbook.rb +38 -3
  156. data/test/workbook/tc_workbook_view.rb +50 -0
  157. data/test/workbook/worksheet/auto_filter/tc_filters.rb +1 -1
  158. data/test/workbook/worksheet/tc_break.rb +1 -1
  159. data/test/workbook/worksheet/tc_cell.rb +76 -8
  160. data/test/workbook/worksheet/tc_col.rb +2 -2
  161. data/test/workbook/worksheet/tc_conditional_formatting.rb +2 -2
  162. data/test/workbook/worksheet/tc_data_bar.rb +1 -1
  163. data/test/workbook/worksheet/tc_data_validation.rb +11 -11
  164. data/test/workbook/worksheet/tc_header_footer.rb +2 -2
  165. data/test/workbook/worksheet/tc_icon_set.rb +1 -1
  166. data/test/workbook/worksheet/tc_outline_pr.rb +19 -0
  167. data/test/workbook/worksheet/tc_page_setup.rb +3 -3
  168. data/test/workbook/worksheet/tc_pivot_table.rb +21 -6
  169. data/test/workbook/worksheet/tc_print_options.rb +1 -1
  170. data/test/workbook/worksheet/tc_rich_text.rb +44 -0
  171. data/test/workbook/worksheet/tc_rich_text_run.rb +172 -0
  172. data/test/workbook/worksheet/tc_row.rb +7 -2
  173. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +1 -1
  174. data/test/workbook/worksheet/tc_sheet_format_pr.rb +4 -4
  175. data/test/workbook/worksheet/tc_sheet_pr.rb +26 -4
  176. data/test/workbook/worksheet/tc_sheet_protection.rb +5 -5
  177. data/test/workbook/worksheet/tc_sheet_view.rb +4 -4
  178. data/test/workbook/worksheet/tc_table.rb +2 -3
  179. data/test/workbook/worksheet/tc_worksheet.rb +99 -45
  180. metadata +142 -64
@@ -0,0 +1,71 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestBarChart < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @p = Axlsx::Package.new
7
+ ws = @p.workbook.add_worksheet
8
+ @row = ws.add_row ["one", 1, Time.now]
9
+ @chart = ws.add_chart Axlsx::BarChart, :title => "fishery"
10
+ end
11
+
12
+ def teardown
13
+ end
14
+
15
+ def test_initialization
16
+ assert_equal(@chart.grouping, :clustered, "grouping defualt incorrect")
17
+ assert_equal(@chart.series_type, Axlsx::BarSeries, "series type incorrect")
18
+ assert_equal(@chart.bar_dir, :bar, " bar direction incorrect")
19
+ assert(@chart.cat_axis.is_a?(Axlsx::CatAxis), "category axis not created")
20
+ assert(@chart.val_axis.is_a?(Axlsx::ValAxis), "value access not created")
21
+ end
22
+
23
+ def test_bar_direction
24
+ assert_raise(ArgumentError, "require valid bar direction") { @chart.bar_dir = :left }
25
+ assert_nothing_raised("allow valid bar direction") { @chart.bar_dir = :col }
26
+ assert(@chart.bar_dir == :col)
27
+ end
28
+
29
+ def test_grouping
30
+ assert_raise(ArgumentError, "require valid grouping") { @chart.grouping = :inverted }
31
+ assert_nothing_raised("allow valid grouping") { @chart.grouping = :standard }
32
+ assert(@chart.grouping == :standard)
33
+ end
34
+
35
+
36
+ def test_gapWidth
37
+ assert_raise(ArgumentError, "require valid gap width") { @chart.gap_width = 200 }
38
+ assert_nothing_raised("allow valid gapWidth") { @chart.gap_width = "200%" }
39
+ assert(@chart.gap_width == "200%")
40
+ end
41
+
42
+ def test_gapDepth
43
+ assert_raise(ArgumentError, "require valid gap_depth") { @chart.gap_depth = 200 }
44
+ assert_nothing_raised("allow valid gap_depth") { @chart.gap_depth = "200%" }
45
+ assert(@chart.gap_depth == "200%")
46
+ end
47
+
48
+ def test_shape
49
+ assert_raise(ArgumentError, "require valid shape") { @chart.shape = :star }
50
+ assert_nothing_raised("allow valid shape") { @chart.shape = :cone }
51
+ assert(@chart.shape == :cone)
52
+ end
53
+
54
+ def test_to_xml_string
55
+ schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
56
+ doc = Nokogiri::XML(@chart.to_xml_string)
57
+ errors = []
58
+ schema.validate(doc).each do |error|
59
+ errors.push error
60
+ puts error.message
61
+ end
62
+ assert(errors.empty?, "error free validation")
63
+ end
64
+
65
+ def test_to_xml_string_has_axes_in_correct_order
66
+ str = @chart.to_xml_string
67
+ cat_axis_position = str.index(@chart.axes[:cat_axis].id.to_s)
68
+ val_axis_position = str.index(@chart.axes[:val_axis].id.to_s)
69
+ assert(cat_axis_position < val_axis_position, "cat_axis must occur earlier than val_axis in the XML")
70
+ end
71
+ end
@@ -0,0 +1,44 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestBubbleChart < Test::Unit::TestCase
4
+ def setup
5
+ @p = Axlsx::Package.new
6
+ @chart = nil
7
+ @p.workbook.add_worksheet do |sheet|
8
+ sheet.add_row ["First", 1, 5, 7, 9]
9
+ sheet.add_row ["", 1, 25, 49, 81]
10
+ sheet.add_row ["", 1, 42, 60, 75]
11
+ sheet.add_row ["Second", 5, 2, 14, 9]
12
+ sheet.add_row ["", 5, 10, 15, 20]
13
+ sheet.add_row ["", 5, 28, 92, 13]
14
+ sheet.add_chart(Axlsx::BubbleChart, :title => "example: Bubble Chart") do |chart|
15
+ chart.start_at 0, 4
16
+ chart.end_at 10, 19
17
+ chart.add_series :xData => sheet["B1:E1"], :yData => sheet["B2:E2"], :bubbleSize => sheet["B3:E3"], :title => sheet["A1"]
18
+ chart.add_series :xData => sheet["B4:E4"], :yData => sheet["B5:E5"], :bubbleSize => sheet["B6:E6"], :title => sheet["A3"]
19
+ @chart = chart
20
+ end
21
+ end
22
+ end
23
+
24
+ def teardown
25
+ end
26
+
27
+ def test_initialization
28
+ assert_equal(@chart.series_type, Axlsx::BubbleSeries, "series type incorrect")
29
+ assert(@chart.xValAxis.is_a?(Axlsx::ValAxis), "independant value axis not created")
30
+ assert(@chart.yValAxis.is_a?(Axlsx::ValAxis), "dependant value axis not created")
31
+ end
32
+
33
+ def test_to_xml_string
34
+ schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
35
+ doc = Nokogiri::XML(@chart.to_xml_string)
36
+ errors = []
37
+ schema.validate(doc).each do |error|
38
+ errors.push error
39
+ puts error.message
40
+ end
41
+ assert(errors.empty?, "error free validation")
42
+ end
43
+
44
+ end
@@ -0,0 +1,21 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestBubbleSeries < Test::Unit::TestCase
4
+
5
+ def setup
6
+ p = Axlsx::Package.new
7
+ @ws = p.workbook.add_worksheet :name=>"hmmm"
8
+ @chart = @ws.add_chart Axlsx::BubbleChart, :title => "Bubble Chart"
9
+ @series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :bubbleSize=>[1,5,7], :title=>"GDP", :color => 'FF0000'
10
+ end
11
+
12
+ def test_initialize
13
+ assert_equal(@series.title.text, "GDP", "series title has been applied")
14
+ end
15
+
16
+ def test_to_xml_string
17
+ doc = Nokogiri::XML(@chart.to_xml_string)
18
+ assert_equal(doc.xpath("//a:srgbClr[@val='#{@series.color}']").size,2)
19
+ end
20
+
21
+ end
@@ -6,7 +6,7 @@ class TestChart < Test::Unit::TestCase
6
6
  @p = Axlsx::Package.new
7
7
  ws = @p.workbook.add_worksheet
8
8
  @row = ws.add_row ["one", 1, Time.now]
9
- @chart = ws.add_chart Axlsx::Bar3DChart, :title => "fishery"
9
+ @chart = ws.add_chart Axlsx::Bar3DChart, :title => "fishery", :bg_color => "000000"
10
10
  end
11
11
 
12
12
  def teardown
@@ -27,17 +27,30 @@ class TestChart < Test::Unit::TestCase
27
27
  assert_equal(@chart.title.cell, @row.cells.first)
28
28
  end
29
29
 
30
+ def test_style
31
+ assert_raise(ArgumentError) { @chart.style = 49 }
32
+ assert_nothing_raised { @chart.style = 2 }
33
+ assert_equal(@chart.style, 2)
34
+ end
35
+
30
36
  def test_to_from_marker_access
31
37
  assert(@chart.to.is_a?(Axlsx::Marker))
32
38
  assert(@chart.from.is_a?(Axlsx::Marker))
33
39
  end
34
40
 
35
- def test_style
36
- assert_raise(ArgumentError) { @chart.style = 49 }
37
- assert_nothing_raised { @chart.style = 2 }
38
- assert_equal(@chart.style, 2)
41
+ def test_bg_color
42
+ assert_raise(ArgumentError) { @chart.bg_color = 2 }
43
+ assert_nothing_raised { @chart.bg_color = "FFFFFF" }
44
+ assert_equal(@chart.bg_color, "FFFFFF")
45
+
39
46
  end
40
-
47
+
48
+ def test_title_size
49
+ assert_raise(ArgumentError) { @chart.title_size = 2 }
50
+ assert_nothing_raised { @chart.title_size = "100" }
51
+ assert_equal(@chart.title.text_size, "100")
52
+ end
53
+
41
54
  def test_vary_colors
42
55
  assert_equal(true, @chart.vary_colors)
43
56
  assert_raise(ArgumentError) { @chart.vary_colors = 7 }
@@ -63,7 +76,7 @@ class TestChart < Test::Unit::TestCase
63
76
  @chart.start_at [5,6]
64
77
  assert_equal(@chart.graphic_frame.anchor.from.col, 5)
65
78
  assert_equal(@chart.graphic_frame.anchor.from.row, 6)
66
-
79
+
67
80
  end
68
81
 
69
82
  def test_end_at
@@ -76,7 +89,7 @@ class TestChart < Test::Unit::TestCase
76
89
  @chart.end_at [10,11]
77
90
  assert_equal(@chart.graphic_frame.anchor.to.col, 10)
78
91
  assert_equal(@chart.graphic_frame.anchor.to.row, 11)
79
-
92
+
80
93
  end
81
94
 
82
95
  def test_add_series
@@ -88,13 +101,13 @@ class TestChart < Test::Unit::TestCase
88
101
  def test_pn
89
102
  assert_equal(@chart.pn, "charts/chart1.xml")
90
103
  end
91
-
104
+
92
105
  def test_d_lbls
93
106
  assert_equal(nil, @chart.instance_values[:d_lbls])
94
107
  @chart.d_lbls.d_lbl_pos = :t
95
108
  assert(@chart.d_lbls.is_a?(Axlsx::DLbls), 'DLbls instantiated on access')
96
109
  end
97
-
110
+
98
111
  def test_to_xml_string
99
112
  schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
100
113
  doc = Nokogiri::XML(@chart.to_xml_string)
@@ -6,6 +6,12 @@
6
6
  @data_source = Axlsx::NumDataSource.new :data => ["1", "2", "3"]
7
7
  end
8
8
 
9
+ def test_tag_name
10
+ assert_raise(ArgumentError) { @data_source.tag_name = :zVal }
11
+ assert_nothing_raised { @data_source.tag_name = :yVal }
12
+ assert_nothing_raised { @data_source.tag_name = :bubbleSize }
13
+ end
14
+
9
15
  def test_to_xml_string_strLit
10
16
  str = '<?xml version="1.0" encoding="UTF-8"?>'
11
17
  str << '<c:chartSpace xmlns:c="' << Axlsx::XML_NS_C << '">'
@@ -59,9 +59,9 @@ class TestDrawing < Test::Unit::TestCase
59
59
  end
60
60
 
61
61
  def test_relationships
62
- chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
62
+ @ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
63
63
  assert_equal(@ws.drawing.relationships.size, 1, "adding a chart adds a relationship")
64
- chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
64
+ @ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
65
65
  assert_equal(@ws.drawing.relationships.size, 2, "adding a chart adds a relationship")
66
66
  end
67
67
 
@@ -19,11 +19,11 @@ class TestLineChart < Test::Unit::TestCase
19
19
  assert(@chart.val_axis.is_a?(Axlsx::ValAxis), "value access not created")
20
20
  end
21
21
 
22
- def test_grouping
23
- assert_raise(ArgumentError, "require valid grouping") { @chart.grouping = :inverted }
24
- assert_nothing_raised("allow valid grouping") { @chart.grouping = :stacked }
25
- assert(@chart.grouping == :stacked)
26
- end
22
+ def test_grouping
23
+ assert_raise(ArgumentError, "require valid grouping") { @chart.grouping = :inverted }
24
+ assert_nothing_raised("allow valid grouping") { @chart.grouping = :stacked }
25
+ assert(@chart.grouping == :stacked)
26
+ end
27
27
 
28
28
  def test_to_xml
29
29
  schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
@@ -6,25 +6,66 @@ class TestLineSeries < Test::Unit::TestCase
6
6
  p = Axlsx::Package.new
7
7
  @ws = p.workbook.add_worksheet :name=>"hmmm"
8
8
  chart = @ws.add_chart Axlsx::Line3DChart, :title => "fishery"
9
- @series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob", :color => "#FF0000", :show_marker => true
9
+ @series = chart.add_series(
10
+ :data => [0,1,2],
11
+ :labels => ["zero", "one", "two"],
12
+ :title => "bob",
13
+ :color => "#FF0000",
14
+ :show_marker => true,
15
+ :smooth => true
16
+ )
10
17
  end
11
18
 
12
19
  def test_initialize
13
20
  assert_equal(@series.title.text, "bob", "series title has been applied")
14
21
  assert_equal(@series.labels.class, Axlsx::AxDataSource)
15
22
  assert_equal(@series.data.class, Axlsx::NumDataSource)
16
-
17
23
  end
18
24
 
19
25
  def test_show_marker
20
26
  assert_equal(true, @series.show_marker)
21
27
  @series.show_marker = false
22
28
  assert_equal(false, @series.show_marker)
23
- end
29
+ end
30
+
31
+ def test_smooth
32
+ assert_equal(true, @series.smooth)
33
+ @series.smooth = false
34
+ assert_equal(false, @series.smooth)
35
+ end
36
+
37
+ def test_marker_symbol
38
+ assert_equal(:default, @series.marker_symbol)
39
+ @series.marker_symbol = :circle
40
+ assert_equal(:circle, @series.marker_symbol)
41
+ end
42
+
24
43
  def test_to_xml_string
25
- doc = Nokogiri::XML(@series.to_xml_string)
44
+ doc = Nokogiri::XML(wrap_with_namespaces(@series))
26
45
  assert(doc.xpath("//srgbClr[@val='#{@series.color}']"))
27
- assert(doc.xpath("//marker"))
46
+ assert_equal(xpath_with_namespaces(doc, "//c:marker").size, 0)
47
+ assert(doc.xpath("//smooth"))
48
+
49
+ @series.marker_symbol = :diamond
50
+ doc = Nokogiri::XML(wrap_with_namespaces(@series))
51
+ assert_equal(xpath_with_namespaces(doc, "//c:marker/c:symbol[@val='diamond']").size, 1)
52
+
53
+ @series.show_marker = false
54
+ doc = Nokogiri::XML(wrap_with_namespaces(@series))
55
+ assert_equal(xpath_with_namespaces(doc, "//c:marker/c:symbol[@val='none']").size, 1)
56
+ end
57
+
58
+ def wrap_with_namespaces(series)
59
+ '<c:chartSpace xmlns:c="' <<
60
+ Axlsx::XML_NS_C <<
61
+ '" xmlns:a="' <<
62
+ Axlsx::XML_NS_A <<
63
+ '">' <<
64
+ series.to_xml_string <<
65
+ '</c:chartSpace>'
66
+ end
67
+
68
+ def xpath_with_namespaces(doc, xpath)
69
+ doc.xpath(xpath, "a" => Axlsx::XML_NS_A, "c" => Axlsx::XML_NS_C)
28
70
  end
29
- #TODO serialization testing
30
71
  end
@@ -5,12 +5,11 @@ class TestPic < Test::Unit::TestCase
5
5
  def setup
6
6
  @p = Axlsx::Package.new
7
7
  ws = @p.workbook.add_worksheet
8
- @test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
9
- @test_img_up = File.dirname(__FILE__) + "/../../examples/IMAGE1UP.JPEG"
10
- @image = ws.add_image :image_src => @test_img, :hyperlink => 'https://github.com/randym', :tooltip => "What's up doc?"
11
- end
12
-
13
- def teardown
8
+ @test_img = @test_img_jpg = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
9
+ @test_img_png = File.dirname(__FILE__) + "/../../examples/image1.png"
10
+ @test_img_gif = File.dirname(__FILE__) + "/../../examples/image1.gif"
11
+ @test_img_fake = File.dirname(__FILE__) + "/../../examples/image1_fake.jpg"
12
+ @image = ws.add_image :image_src => @test_img, :hyperlink => 'https://github.com/randym', :tooltip => "What's up doc?", :opacity => 5
14
13
  end
15
14
 
16
15
  def test_initialization
@@ -38,6 +37,7 @@ class TestPic < Test::Unit::TestCase
38
37
  assert_equal(200, @image.width)
39
38
 
40
39
  end
40
+
41
41
  def test_hyperlink
42
42
  assert_equal(@image.hyperlink.href, "https://github.com/randym")
43
43
  @image.hyperlink = "http://axlsx.blogspot.com"
@@ -70,15 +70,12 @@ class TestPic < Test::Unit::TestCase
70
70
  end
71
71
 
72
72
  def test_image_src
73
- assert_raise(ArgumentError) { @image.image_src = 49 }
74
- assert_raise(ArgumentError) { @image.image_src = 'Unknown' }
75
73
  assert_raise(ArgumentError) { @image.image_src = __FILE__ }
76
- assert_nothing_raised { @image.image_src = @test_img }
77
- assert_equal(@image.image_src, @test_img)
78
- end
79
-
80
- def test_image_src_downcase
81
- assert_nothing_raised { @image.image_src = @test_img_up }
74
+ assert_raise(ArgumentError) { @image.image_src = @test_img_fake }
75
+ assert_nothing_raised { @image.image_src = @test_img_gif }
76
+ assert_nothing_raised { @image.image_src = @test_img_png }
77
+ assert_nothing_raised { @image.image_src = @test_img_jpg }
78
+ assert_equal(@image.image_src, @test_img_jpg)
82
79
  end
83
80
 
84
81
  def test_descr
@@ -103,5 +100,4 @@ class TestPic < Test::Unit::TestCase
103
100
  doc = Nokogiri::XML(@image.anchor.drawing.to_xml_string)
104
101
  assert_equal r_id, doc.xpath("//a:blip").first["r:embed"]
105
102
  end
106
-
107
103
  end
@@ -6,16 +6,51 @@ class TestScatterSeries < Test::Unit::TestCase
6
6
  p = Axlsx::Package.new
7
7
  @ws = p.workbook.add_worksheet :name=>"hmmm"
8
8
  @chart = @ws.add_chart Axlsx::ScatterChart, :title => "Scatter Chart"
9
- @series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"exponents", :color => 'FF0000'
9
+ @series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"exponents", :color => 'FF0000', :smooth => true
10
10
  end
11
11
 
12
12
  def test_initialize
13
13
  assert_equal(@series.title.text, "exponents", "series title has been applied")
14
14
  end
15
15
 
16
+ def test_smoothed_chart_default_smoothing
17
+ @chart = @ws.add_chart Axlsx::ScatterChart, :title => "Smooth Chart", :scatter_style => :smoothMarker
18
+ @series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"smoothed exponents"
19
+ assert(@series.smooth, "series is smooth by default on smooth charts")
20
+ end
21
+
22
+ def test_unsmoothed_chart_default_smoothing
23
+ @chart = @ws.add_chart Axlsx::ScatterChart, :title => "Unsmooth Chart", :scatter_style => :line
24
+ @series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"unsmoothed exponents"
25
+ assert(!@series.smooth, "series is not smooth by default on non-smooth charts")
26
+ end
27
+
28
+ def test_explicit_smoothing
29
+ @chart = @ws.add_chart Axlsx::ScatterChart, :title => "Unsmooth Chart, Smooth Series", :scatter_style => :line
30
+ @series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"smoothed exponents", :smooth => true
31
+ assert(@series.smooth, "series is smooth when overriding chart default")
32
+ end
33
+
34
+ def test_explicit_unsmoothing
35
+ @chart = @ws.add_chart Axlsx::ScatterChart, :title => "Smooth Chart, Unsmooth Series", :scatter_style => :smoothMarker
36
+ @series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"unsmoothed exponents", :smooth => false
37
+ assert(!@series.smooth, "series is not smooth when overriding chart default")
38
+ end
39
+
40
+ def test_ln_width
41
+ @chart = @ws.add_chart Axlsx::ScatterChart, :title => "ln width", :scatter_style => :line
42
+ @series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"ln_width"
43
+ @series.ln_width = 12700
44
+ assert_equal(@series.ln_width, 12700, 'line width assigment is allowed')
45
+ end
46
+
16
47
  def test_to_xml_string
48
+ @chart.scatter_style = :line
49
+ @series.ln_width = 12700
17
50
  doc = Nokogiri::XML(@chart.to_xml_string)
51
+ assert_equal(12700, @series.ln_width)
18
52
  assert_equal(doc.xpath("//a:srgbClr[@val='#{@series.color}']").size,4)
53
+ assert_equal(doc.xpath("//a:ln[@w='#{@series.ln_width}']").length, 1)
19
54
  end
20
55
 
21
56
  end
@@ -4,6 +4,7 @@ class TestStrVal < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  @str_val = Axlsx::StrVal.new :v => "1"
7
+ @str_val_with_special_characters = Axlsx::StrVal.new :v => "a & b <c>"
7
8
  end
8
9
 
9
10
  def test_initialize
@@ -18,4 +19,12 @@ class TestStrVal < Test::Unit::TestCase
18
19
  assert_equal(doc.xpath("//c:pt/c:v[text()='1']").size, 1)
19
20
  end
20
21
 
22
+ def test_to_xml_string_special_characters
23
+ str = '<?xml version="1.0" encoding="UTF-8"?>'
24
+ str << '<c:chartSpace xmlns:c="' << Axlsx::XML_NS_C << '">'
25
+ str << @str_val_with_special_characters.to_xml_string(0)
26
+ doc = Nokogiri::XML(str)
27
+ assert_equal(doc.xpath("//c:pt/c:v[text()='a & b <c>']").size, 1)
28
+ end
29
+
21
30
  end
@@ -19,6 +19,11 @@ class TestTitle < Test::Unit::TestCase
19
19
  assert(@title.cell == nil)
20
20
  end
21
21
 
22
+ def test_initialize_title_size
23
+ title = Axlsx::Title.new 'bob', 90
24
+ assert_equal "90", title.text_size
25
+ end
26
+
22
27
  def test_text
23
28
  assert_raise(ArgumentError, "text must be a string") { @title.text = 123 }
24
29
  @title.cell = @row.cells.first
@@ -133,7 +133,7 @@ class TestStyles < Test::Unit::TestCase
133
133
  :font_name => "woot font"
134
134
  }
135
135
  assert_equal(@styles.parse_font_options {}, nil, "noop if no font keys are set")
136
- assert_equal(@styles.parse_font_options(:b=>1).class, Fixnum, "return index of font if not :dxf type")
136
+ assert(@styles.parse_font_options(:b=>1).is_a?(Integer), "return index of font if not :dxf type")
137
137
  assert_equal(@styles.parse_font_options(:b=>1, :type => :dxf).class, Axlsx::Font, "return font object if :dxf type")
138
138
 
139
139
  f = @styles.parse_font_options(options.merge(:type => :dxf))
@@ -147,7 +147,7 @@ class TestStyles < Test::Unit::TestCase
147
147
 
148
148
  def test_parse_fill_options
149
149
  assert_equal(@styles.parse_fill_options {}, nil, "noop if no fill keys are set")
150
- assert_equal(@styles.parse_fill_options(:bg_color => "DE").class, Fixnum, "return index of fill if not :dxf type")
150
+ assert(@styles.parse_fill_options(:bg_color => "DE").is_a?(Integer), "return index of fill if not :dxf type")
151
151
  assert_equal(@styles.parse_fill_options(:bg_color => "DE", :type => :dxf).class, Axlsx::Fill, "return fill object if :dxf type")
152
152
  f = @styles.parse_fill_options(:bg_color => "DE", :type => :dxf)
153
153
  assert(f.fill_type.bgColor.rgb == "FFDEDEDE")
data/test/tc_axlsx.rb CHANGED
@@ -45,6 +45,16 @@ class TestAxlsx < Test::Unit::TestCase
45
45
  assert_equal(Axlsx.cell_range([c2, c1], true), "'Sheet &lt;''&gt;&quot; 1'!$A$1:$B$1")
46
46
  end
47
47
 
48
+ def test_cell_range_row
49
+ p = Axlsx::Package.new
50
+ ws = p.workbook.add_worksheet
51
+ row = ws.add_row
52
+ row.add_cell
53
+ row.add_cell
54
+ row.add_cell
55
+ assert_equal("A1:C1", Axlsx.cell_range(row, false))
56
+ end
57
+
48
58
  def test_name_to_indices
49
59
  setup_wide
50
60
  @wide_test_points.each do |key, value|
@@ -69,4 +79,25 @@ class TestAxlsx < Test::Unit::TestCase
69
79
  assert_equal([['Z5', 'AA5', 'AB5'], ['Z6', 'AA6', 'AB6']], Axlsx::range_to_a('Z5:AB6'))
70
80
  end
71
81
 
82
+ def test_sanitize_frozen_control_strippped
83
+ needs_sanitize = "legit\x08".freeze # Backspace control char
84
+
85
+ assert_equal(Axlsx.sanitize(needs_sanitize), 'legit', 'should strip control chars')
86
+ end
87
+
88
+ def test_sanitize_unfrozen_control_strippped
89
+ needs_sanitize = "legit\x08" # Backspace control char
90
+ sanitized_str = Axlsx.sanitize(needs_sanitize)
91
+
92
+ assert_equal(sanitized_str, 'legit', 'should strip control chars')
93
+ assert_equal(sanitized_str.object_id, sanitized_str.object_id, 'should preserve object')
94
+ end
95
+
96
+ def test_sanitize_unfrozen_no_sanitize
97
+ legit_str = 'legit'
98
+ sanitized_str = Axlsx.sanitize(legit_str)
99
+
100
+ assert_equal(sanitized_str, legit_str, 'should preserve value')
101
+ assert_equal(sanitized_str.object_id, legit_str.object_id, 'should preserve object')
102
+ end
72
103
  end
data/test/tc_helper.rb CHANGED
@@ -8,3 +8,5 @@ end
8
8
  require 'test/unit'
9
9
  require "timecop"
10
10
  require "axlsx.rb"
11
+ # MIME detection for Microsoft Office 2007+ formats
12
+ require 'mimemagic/overlay'
data/test/tc_package.rb CHANGED
@@ -7,10 +7,17 @@ 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
+ @rt = Axlsx::RichText.new
11
+ @rt.add_run "run 1", :b => true, :i => false
12
+ ws.add_row [@rt]
13
+
14
+ ws.rows.last.add_cell('b', :type => :text)
15
+
10
16
  ws.outline_level_rows 0, 1
11
17
  ws.outline_level_columns 0, 1
12
18
  ws.add_hyperlink :ref => ws.rows.first.cells.last, :location => 'https://github.com/randym'
13
19
  ws.workbook.add_defined_name("#{ws.name}!A1:C2", :name => '_xlnm.Print_Titles', :hidden => true)
20
+ ws.workbook.add_view active_tab: 1, first_sheet: 0
14
21
  ws.protect_range('A1:C1')
15
22
  ws.protect_range(ws.rows.last.cells)
16
23
  ws.add_comment :author => 'alice', :text => 'Hi Bob', :ref => 'A12'
@@ -52,6 +59,11 @@ class TestPackage < Test::Unit::TestCase
52
59
  chart.d_lbls.show_val = true
53
60
  end
54
61
 
62
+ ws.add_chart(Axlsx::BubbleChart, :title => 'bubble chart') do |chart|
63
+ chart.add_series :xData => [1,2,3,4], :yData => [1,3,2,4]
64
+ chart.d_lbls.show_val = true
65
+ end
66
+
55
67
  @fname = 'axlsx_test_serialization.xlsx'
56
68
  img = File.expand_path('../../examples/image1.jpeg', __FILE__)
57
69
  ws.add_image(:image_src => img, :noSelect => true, :noMove => true, :hyperlink=>"http://axlsx.blogspot.com") do |image|
@@ -148,6 +160,11 @@ class TestPackage < Test::Unit::TestCase
148
160
  assert package_1.to_stream.string == package_2.to_stream.string, "zip files are not identical"
149
161
  end
150
162
 
163
+ def test_serialization_creates_files_with_excel_mime_type
164
+ assert_equal(MimeMagic.by_magic(@package.to_stream).type,
165
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
166
+ end
167
+
151
168
  def test_validation
152
169
  assert_equal(@package.validate.size, 0, @package.validate)
153
170
  Axlsx::Workbook.send(:class_variable_set, :@@date1904, 9900)
@@ -176,12 +193,13 @@ class TestPackage < Test::Unit::TestCase
176
193
 
177
194
 
178
195
  #no mystery parts
179
- assert_equal(24, p.size)
196
+ assert_equal(25, p.size)
180
197
 
181
198
  end
182
199
 
183
200
  def test_shared_strings_requires_part
184
201
  @package.use_shared_strings = true
202
+ @package.to_stream #ensure all cell_serializer paths are hit
185
203
  p = @package.send(:parts)
186
204
  assert_equal(p.select{ |part| part[:entry] =~/xl\/sharedStrings.xml/}.size, 1, "shared strings table missing")
187
205
  end
@@ -0,0 +1,13 @@
1
+ require 'tc_helper.rb'
2
+ class TestMimeTypeUtils < Test::Unit::TestCase
3
+ def setup
4
+ @test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
5
+ end
6
+
7
+ def teardown
8
+ end
9
+
10
+ def test_mime_type_utils
11
+ assert_equal(Axlsx::MimeTypeUtils::get_mime_type(@test_img), 'image/jpeg')
12
+ end
13
+ end
@@ -1,7 +1,7 @@
1
1
  require 'tc_helper.rb'
2
2
  class TestSimpleTypedList < Test::Unit::TestCase
3
3
  def setup
4
- @list = Axlsx::SimpleTypedList.new Fixnum
4
+ @list = Axlsx::SimpleTypedList.new Integer
5
5
  end
6
6
 
7
7
  def teardown
@@ -72,7 +72,6 @@ class TestSimpleTypedList < Test::Unit::TestCase
72
72
  def test_equality
73
73
  @list.push 1
74
74
  @list.push 2
75
- assert_equal(@list, [1,2])
76
-
75
+ assert_equal(@list.to_ary, [1,2])
77
76
  end
78
77
  end