caxlsx 2.0.2 → 3.0.4

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 (210) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +125 -30
  3. data/README.md +65 -151
  4. data/Rakefile +9 -11
  5. data/examples/{image1.jpeg → assets/image1.jpeg} +0 -0
  6. data/examples/generate.rb +15 -0
  7. data/lib/axlsx.rb +35 -17
  8. data/lib/axlsx/content_type/abstract_content_type.rb +1 -1
  9. data/lib/axlsx/content_type/content_type.rb +1 -1
  10. data/lib/axlsx/doc_props/app.rb +1 -1
  11. data/lib/axlsx/doc_props/core.rb +5 -5
  12. data/lib/axlsx/drawing/area_chart.rb +99 -0
  13. data/lib/axlsx/drawing/area_series.rb +110 -0
  14. data/lib/axlsx/drawing/axes.rb +1 -1
  15. data/lib/axlsx/drawing/axis.rb +12 -9
  16. data/lib/axlsx/drawing/bar_3D_chart.rb +13 -13
  17. data/lib/axlsx/drawing/bar_chart.rb +143 -0
  18. data/lib/axlsx/drawing/bar_series.rb +12 -14
  19. data/lib/axlsx/drawing/bubble_chart.rb +59 -0
  20. data/lib/axlsx/drawing/bubble_series.rb +63 -0
  21. data/lib/axlsx/drawing/cat_axis.rb +5 -5
  22. data/lib/axlsx/drawing/chart.rb +52 -8
  23. data/lib/axlsx/drawing/d_lbls.rb +4 -4
  24. data/lib/axlsx/drawing/drawing.rb +6 -1
  25. data/lib/axlsx/drawing/graphic_frame.rb +3 -3
  26. data/lib/axlsx/drawing/hyperlink.rb +1 -3
  27. data/lib/axlsx/drawing/line_3D_chart.rb +2 -2
  28. data/lib/axlsx/drawing/line_chart.rb +10 -10
  29. data/lib/axlsx/drawing/line_series.rb +32 -3
  30. data/lib/axlsx/drawing/marker.rb +1 -1
  31. data/lib/axlsx/drawing/num_data.rb +4 -4
  32. data/lib/axlsx/drawing/num_data_source.rb +6 -6
  33. data/lib/axlsx/drawing/num_val.rb +3 -1
  34. data/lib/axlsx/drawing/one_cell_anchor.rb +3 -2
  35. data/lib/axlsx/drawing/pic.rb +25 -19
  36. data/lib/axlsx/drawing/picture_locking.rb +1 -3
  37. data/lib/axlsx/drawing/pie_3D_chart.rb +5 -6
  38. data/lib/axlsx/drawing/pie_series.rb +6 -6
  39. data/lib/axlsx/drawing/scaling.rb +6 -6
  40. data/lib/axlsx/drawing/scatter_chart.rb +10 -10
  41. data/lib/axlsx/drawing/scatter_series.rb +40 -7
  42. data/lib/axlsx/drawing/ser_axis.rb +2 -2
  43. data/lib/axlsx/drawing/series.rb +3 -3
  44. data/lib/axlsx/drawing/series_title.rb +4 -2
  45. data/lib/axlsx/drawing/str_data.rb +3 -3
  46. data/lib/axlsx/drawing/str_val.rb +3 -1
  47. data/lib/axlsx/drawing/title.rb +23 -4
  48. data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
  49. data/lib/axlsx/drawing/val_axis.rb +1 -1
  50. data/lib/axlsx/drawing/view_3D.rb +2 -2
  51. data/lib/axlsx/drawing/vml_drawing.rb +1 -1
  52. data/lib/axlsx/package.rb +58 -47
  53. data/lib/axlsx/rels/relationship.rb +27 -26
  54. data/lib/axlsx/rels/relationships.rb +7 -4
  55. data/lib/axlsx/stylesheet/border_pr.rb +2 -2
  56. data/lib/axlsx/stylesheet/cell_alignment.rb +1 -3
  57. data/lib/axlsx/stylesheet/cell_protection.rb +1 -3
  58. data/lib/axlsx/stylesheet/cell_style.rb +1 -3
  59. data/lib/axlsx/stylesheet/color.rb +1 -3
  60. data/lib/axlsx/stylesheet/font.rb +11 -3
  61. data/lib/axlsx/stylesheet/gradient_stop.rb +1 -1
  62. data/lib/axlsx/stylesheet/num_fmt.rb +10 -3
  63. data/lib/axlsx/stylesheet/pattern_fill.rb +1 -1
  64. data/lib/axlsx/stylesheet/styles.rb +7 -7
  65. data/lib/axlsx/stylesheet/table_style_element.rb +1 -3
  66. data/lib/axlsx/util/accessors.rb +6 -6
  67. data/lib/axlsx/util/constants.rb +108 -99
  68. data/lib/axlsx/util/mime_type_utils.rb +11 -0
  69. data/lib/axlsx/util/options_parser.rb +2 -1
  70. data/lib/axlsx/util/serialized_attributes.rb +16 -6
  71. data/lib/axlsx/util/simple_typed_list.rb +28 -52
  72. data/lib/axlsx/util/storage.rb +4 -4
  73. data/lib/axlsx/util/validators.rb +31 -19
  74. data/lib/axlsx/util/zip_command.rb +73 -0
  75. data/lib/axlsx/version.rb +1 -1
  76. data/lib/axlsx/workbook/defined_name.rb +11 -12
  77. data/lib/axlsx/workbook/defined_names.rb +2 -2
  78. data/lib/axlsx/workbook/shared_strings_table.rb +5 -5
  79. data/lib/axlsx/workbook/workbook.rb +36 -20
  80. data/lib/axlsx/workbook/workbook_view.rb +80 -0
  81. data/lib/axlsx/workbook/workbook_views.rb +22 -0
  82. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +2 -2
  83. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +1 -3
  84. data/lib/axlsx/workbook/worksheet/break.rb +1 -3
  85. data/lib/axlsx/workbook/worksheet/cell.rb +164 -75
  86. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +63 -43
  87. data/lib/axlsx/workbook/worksheet/cfvo.rb +1 -3
  88. data/lib/axlsx/workbook/worksheet/cfvos.rb +4 -1
  89. data/lib/axlsx/workbook/worksheet/col.rb +14 -13
  90. data/lib/axlsx/workbook/worksheet/col_breaks.rb +2 -2
  91. data/lib/axlsx/workbook/worksheet/cols.rb +5 -2
  92. data/lib/axlsx/workbook/worksheet/comment.rb +5 -6
  93. data/lib/axlsx/workbook/worksheet/comments.rb +9 -12
  94. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +1 -1
  95. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +1 -1
  96. data/lib/axlsx/workbook/worksheet/data_bar.rb +4 -6
  97. data/lib/axlsx/workbook/worksheet/data_validation.rb +8 -6
  98. data/lib/axlsx/workbook/worksheet/dimension.rb +2 -2
  99. data/lib/axlsx/workbook/worksheet/header_footer.rb +6 -8
  100. data/lib/axlsx/workbook/worksheet/icon_set.rb +3 -5
  101. data/lib/axlsx/workbook/worksheet/merged_cells.rb +4 -2
  102. data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
  103. data/lib/axlsx/workbook/worksheet/page_margins.rb +1 -3
  104. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +1 -1
  105. data/lib/axlsx/workbook/worksheet/page_setup.rb +21 -23
  106. data/lib/axlsx/workbook/worksheet/pane.rb +1 -3
  107. data/lib/axlsx/workbook/worksheet/pivot_table.rb +44 -28
  108. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +4 -4
  109. data/lib/axlsx/workbook/worksheet/print_options.rb +1 -3
  110. data/lib/axlsx/workbook/worksheet/protected_range.rb +1 -3
  111. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +5 -2
  112. data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -0
  113. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -0
  114. data/lib/axlsx/workbook/worksheet/row.rb +42 -52
  115. data/lib/axlsx/workbook/worksheet/row_breaks.rb +2 -2
  116. data/lib/axlsx/workbook/worksheet/selection.rb +1 -3
  117. data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
  118. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +21 -3
  119. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +1 -3
  120. data/lib/axlsx/workbook/worksheet/table.rb +6 -6
  121. data/lib/axlsx/workbook/worksheet/table_style_info.rb +1 -3
  122. data/lib/axlsx/workbook/worksheet/tables.rb +4 -1
  123. data/lib/axlsx/workbook/worksheet/worksheet.rb +76 -81
  124. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
  125. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +3 -3
  126. data/lib/caxlsx.rb +2 -0
  127. data/test/drawing/tc_area_chart.rb +39 -0
  128. data/test/drawing/tc_area_series.rb +71 -0
  129. data/test/drawing/tc_axis.rb +27 -0
  130. data/test/drawing/tc_bar_chart.rb +71 -0
  131. data/test/drawing/tc_bubble_chart.rb +44 -0
  132. data/test/drawing/tc_bubble_series.rb +21 -0
  133. data/test/drawing/tc_chart.rb +23 -10
  134. data/test/drawing/tc_data_source.rb +6 -0
  135. data/test/drawing/tc_drawing.rb +4 -4
  136. data/test/drawing/tc_hyperlink.rb +1 -1
  137. data/test/drawing/tc_line_chart.rb +5 -5
  138. data/test/drawing/tc_line_series.rb +47 -6
  139. data/test/drawing/tc_one_cell_anchor.rb +1 -1
  140. data/test/drawing/tc_pic.rb +11 -15
  141. data/test/drawing/tc_pie_series.rb +2 -1
  142. data/test/drawing/tc_scatter_series.rb +36 -1
  143. data/test/drawing/tc_series_title.rb +21 -0
  144. data/test/drawing/tc_str_val.rb +9 -0
  145. data/test/drawing/tc_title.rb +21 -0
  146. data/test/fixtures/image1.gif +0 -0
  147. data/test/fixtures/image1.jpeg +0 -0
  148. data/test/fixtures/image1.jpg +0 -0
  149. data/test/fixtures/image1.png +0 -0
  150. data/test/fixtures/image1_fake.jpg +0 -0
  151. data/test/rels/tc_relationship.rb +8 -0
  152. data/test/stylesheet/tc_font.rb +14 -2
  153. data/test/stylesheet/tc_styles.rb +29 -3
  154. data/test/tc_axlsx.rb +37 -0
  155. data/test/tc_helper.rb +2 -0
  156. data/test/tc_package.rb +50 -13
  157. data/test/util/tc_mime_type_utils.rb +13 -0
  158. data/test/util/tc_simple_typed_list.rb +2 -3
  159. data/test/util/tc_validators.rb +35 -11
  160. data/test/workbook/tc_defined_name.rb +12 -4
  161. data/test/workbook/tc_shared_strings_table.rb +16 -1
  162. data/test/workbook/tc_workbook.rb +38 -3
  163. data/test/workbook/tc_workbook_view.rb +50 -0
  164. data/test/workbook/worksheet/auto_filter/tc_filters.rb +1 -1
  165. data/test/workbook/worksheet/tc_break.rb +1 -1
  166. data/test/workbook/worksheet/tc_cell.rb +143 -9
  167. data/test/workbook/worksheet/tc_col.rb +18 -3
  168. data/test/workbook/worksheet/tc_conditional_formatting.rb +2 -2
  169. data/test/workbook/worksheet/tc_data_bar.rb +1 -1
  170. data/test/workbook/worksheet/tc_data_validation.rb +11 -11
  171. data/test/workbook/worksheet/tc_header_footer.rb +2 -2
  172. data/test/workbook/worksheet/tc_icon_set.rb +1 -1
  173. data/test/workbook/worksheet/tc_outline_pr.rb +19 -0
  174. data/test/workbook/worksheet/tc_page_setup.rb +3 -3
  175. data/test/workbook/worksheet/tc_pivot_table.rb +21 -6
  176. data/test/workbook/worksheet/tc_print_options.rb +1 -1
  177. data/test/workbook/worksheet/tc_rich_text.rb +44 -0
  178. data/test/workbook/worksheet/tc_rich_text_run.rb +173 -0
  179. data/test/workbook/worksheet/tc_row.rb +24 -2
  180. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +1 -1
  181. data/test/workbook/worksheet/tc_sheet_format_pr.rb +4 -4
  182. data/test/workbook/worksheet/tc_sheet_pr.rb +26 -4
  183. data/test/workbook/worksheet/tc_sheet_protection.rb +5 -5
  184. data/test/workbook/worksheet/tc_sheet_view.rb +4 -4
  185. data/test/workbook/worksheet/tc_table.rb +2 -3
  186. data/test/workbook/worksheet/tc_worksheet.rb +123 -60
  187. metadata +180 -128
  188. data/examples/2010_comments.rb +0 -17
  189. data/examples/anchor_swapping.rb +0 -28
  190. data/examples/auto_filter.rb +0 -16
  191. data/examples/basic_charts.rb +0 -58
  192. data/examples/chart_colors.rb +0 -88
  193. data/examples/colored_links.rb +0 -59
  194. data/examples/conditional_formatting/example_conditional_formatting.rb +0 -74
  195. data/examples/conditional_formatting/getting_barred.rb +0 -37
  196. data/examples/conditional_formatting/hitting_the_high_notes.rb +0 -37
  197. data/examples/conditional_formatting/scaled_colors.rb +0 -39
  198. data/examples/conditional_formatting/stop_and_go.rb +0 -37
  199. data/examples/data_validation.rb +0 -50
  200. data/examples/example.rb +0 -777
  201. data/examples/extractive.rb +0 -45
  202. data/examples/ios_preview.rb +0 -14
  203. data/examples/page_setup.rb +0 -11
  204. data/examples/pivot_table.rb +0 -39
  205. data/examples/sheet_protection.rb +0 -10
  206. data/examples/skydrive/real_example.rb +0 -63
  207. data/examples/styles.rb +0 -66
  208. data/examples/underline.rb +0 -13
  209. data/examples/wrap_text.rb +0 -21
  210. data/lib/axlsx/util/parser.rb +0 -44
@@ -23,7 +23,7 @@ class TestDrawing < Test::Unit::TestCase
23
23
  end
24
24
 
25
25
  def test_add_image
26
- src = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
26
+ src = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
27
27
  image = @ws.add_image(:image_src => src, :start_at=>[0,0], :width=>600, :height=>400)
28
28
  assert(@ws.drawing.anchors.last.is_a?(Axlsx::OneCellAnchor))
29
29
  assert(image.is_a?(Axlsx::Pic))
@@ -31,7 +31,7 @@ class TestDrawing < Test::Unit::TestCase
31
31
  assert_equal(400, image.height)
32
32
  end
33
33
  def test_add_two_cell_anchor_image
34
- src = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
34
+ src = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
35
35
  image = @ws.add_image(:image_src => src, :start_at=>[0,0], :end_at => [15,0])
36
36
  assert(@ws.drawing.anchors.last.is_a?(Axlsx::TwoCellAnchor))
37
37
  assert(image.is_a?(Axlsx::Pic))
@@ -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
 
@@ -5,7 +5,7 @@ class TestHyperlink < 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"
8
+ @test_img = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
9
9
  @image = ws.add_image :image_src => @test_img, :hyperlink => "http://axlsx.blogspot.com"
10
10
  @hyperlink = @image.hyperlink
11
11
  end
@@ -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,7 +5,7 @@ class TestOneCellAnchor < 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"
8
+ @test_img = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
9
9
  @image = @ws.add_image :image_src => @test_img
10
10
  @anchor = @image.anchor
11
11
  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__) + "/../fixtures/image1.jpeg"
9
+ @test_img_png = File.dirname(__FILE__) + "/../fixtures/image1.png"
10
+ @test_img_gif = File.dirname(__FILE__) + "/../fixtures/image1.gif"
11
+ @test_img_fake = File.dirname(__FILE__) + "/../fixtures/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
@@ -20,12 +20,13 @@ class TestPieSeries < Test::Unit::TestCase
20
20
  assert_raise(ArgumentError, "require valid explosion") { @series.explosion = :lots }
21
21
  assert_nothing_raised("allow valid explosion") { @series.explosion = 20 }
22
22
  assert(@series.explosion == 20)
23
+ # issue 58 - explosion caused to_xml_string to fail - now tested
24
+ assert_nothing_raised("allow to_xml_string") { @series.to_xml_string }
23
25
  end
24
26
 
25
27
  def test_to_xml_string
26
28
  doc = Nokogiri::XML(@series.to_xml_string)
27
29
  assert(doc.xpath("//srgbClr[@val='#{@series.colors[0]}']"))
28
-
29
30
  end
30
31
  #TODO test unique serialization parts
31
32
 
@@ -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
@@ -30,4 +30,25 @@ class TestSeriesTitle < Test::Unit::TestCase
30
30
  assert(@title.text == "one")
31
31
  end
32
32
 
33
+ def test_to_xml_string_for_special_characters
34
+ @chart.add_series(title: @title, data: [3, 7], labels: ['A', 'B'])
35
+
36
+ @title.text = "&><'\""
37
+
38
+ doc = Nokogiri::XML(@chart.to_xml_string)
39
+ errors = doc.errors
40
+ assert(errors.empty?, "invalid xml: #{errors.map(&:to_s).join(', ')}")
41
+ end
42
+
43
+ def test_to_xml_string_for_special_characters_in_cell
44
+ @chart.add_series(title: @title, data: [3, 7], labels: ['A', 'B'])
45
+
46
+ cell = @row.cells.first
47
+ cell.value = "&><'\""
48
+ @title.cell = cell
49
+
50
+ doc = Nokogiri::XML(@chart.to_xml_string)
51
+ errors = doc.errors
52
+ assert(errors.empty?, "invalid xml: #{errors.map(&:to_s).join(', ')}")
53
+ end
33
54
  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
@@ -46,4 +51,20 @@ class TestTitle < Test::Unit::TestCase
46
51
  assert_equal(1, doc.xpath('//c:v[text()="one"]').size)
47
52
  end
48
53
 
54
+ def test_to_xml_string_for_special_characters
55
+ @chart.title.text = "&><'\""
56
+ doc = Nokogiri::XML(@chart.to_xml_string)
57
+ errors = doc.errors
58
+ assert(errors.empty?, "invalid xml: #{errors.map(&:to_s).join(', ')}")
59
+ end
60
+
61
+ def test_to_xml_string_for_special_characters_in_cell
62
+ cell = @row.cells.first
63
+ cell.value = "&><'\""
64
+
65
+ @chart.title.cell = cell
66
+ doc = Nokogiri::XML(@chart.to_xml_string)
67
+ errors = doc.errors
68
+ assert(errors.empty?, "invalid xml: #{errors.map(&:to_s).join(', ')}")
69
+ end
49
70
  end
Binary file
Binary file
Binary file
Binary file
File without changes
@@ -13,6 +13,14 @@ class TestRelationships < Test::Unit::TestCase
13
13
  instance = Axlsx::Relationship.new(source_obj, Axlsx::WORKSHEET_R, 'target')
14
14
  assert_equal instance.Id, Axlsx::Relationship.new(source_obj, Axlsx::WORKSHEET_R, 'target').Id
15
15
  end
16
+
17
+ def test_ids_cache_is_thread_safe
18
+ cache1, cache2 = nil
19
+ t1 = Thread.new { cache1 = Axlsx::Relationship.ids_cache }
20
+ t2 = Thread.new { cache2 = Axlsx::Relationship.ids_cache }
21
+ [t1, t2].each(&:join)
22
+ assert_not_same(cache1, cache2)
23
+ end
16
24
 
17
25
  def test_target_is_only_considered_for_same_attributes_check_if_target_mode_is_external
18
26
  source_obj = Object.new
@@ -62,11 +62,23 @@ class TestFont < Test::Unit::TestCase
62
62
  assert_equal(@item.i, true)
63
63
  end
64
64
 
65
- # def u=(v) Axlsx::validate_boolean v; @u = v end
65
+ # def u=(v) Axlsx::validate_cell_u v; @u = v end
66
66
  def test_u
67
67
  assert_raise(ArgumentError) { @item.u = -7 }
68
+ assert_nothing_raised { @item.u = :single }
69
+ assert_equal(@item.u, :single)
70
+ doc = Nokogiri::XML(@item.to_xml_string)
71
+ assert(doc.xpath('//u[@val="single"]'))
72
+ end
73
+
74
+ def test_u_backward_compatibility
75
+ # backward compatibility for true
68
76
  assert_nothing_raised { @item.u = true }
69
- assert_equal(@item.u, true)
77
+ assert_equal(@item.u, :single)
78
+
79
+ # backward compatibility for false
80
+ assert_nothing_raised { @item.u = false }
81
+ assert_equal(@item.u, :none)
70
82
  end
71
83
 
72
84
  # def strike=(v) Axlsx::validate_boolean v; @strike = v end
@@ -124,7 +124,7 @@ class TestStyles < Test::Unit::TestCase
124
124
  :sz => 20,
125
125
  :b => 1,
126
126
  :i => 1,
127
- :u => 1,
127
+ :u => :single,
128
128
  :strike => 1,
129
129
  :outline => 1,
130
130
  :shadow => 1,
@@ -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")
@@ -232,4 +232,30 @@ class TestStyles < Test::Unit::TestCase
232
232
  style = @styles.add_style :bg_color=>"FF000000", :fg_color=>"FFFFFFFF", :sz=>13, :alignment=>{:horizontal=>:left}, :border=>{:style => :thin, :color => "FFFF0000"}, :hidden=>true, :locked=>true, :type => :dxf
233
233
  assert_equal(1, style, "returns the second dxfId")
234
234
  end
235
+
236
+ def test_valid_document_with_font_options
237
+ font_options = {
238
+ :fg_color => "FF050505",
239
+ :sz => 20,
240
+ :b => 1,
241
+ :i => 1,
242
+ :u => :single,
243
+ :strike => 1,
244
+ :outline => 1,
245
+ :shadow => 1,
246
+ :charset => 9,
247
+ :family => 1,
248
+ :font_name => "woot font"
249
+ }
250
+ @styles.add_style font_options
251
+
252
+ schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
253
+ doc = Nokogiri::XML(@styles.to_xml_string)
254
+ errors = []
255
+ schema.validate(doc).each do |error|
256
+ errors.push error
257
+ puts error.message
258
+ end
259
+ assert(errors.size == 0)
260
+ end
235
261
  end