axlsx 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. data/.yardopts +5 -2
  2. data/CHANGELOG.md +60 -0
  3. data/LICENSE +1 -1
  4. data/README.md +115 -415
  5. data/Rakefile +11 -3
  6. data/examples/basic_charts.rb +54 -0
  7. data/examples/chart_colors.rb +88 -0
  8. data/examples/data_validation.rb +50 -0
  9. data/examples/example.rb +299 -155
  10. data/examples/example.xlsx +0 -0
  11. data/examples/example_streamed.xlsx +0 -0
  12. data/examples/extractive.pdf +0 -0
  13. data/examples/extractive.rb +45 -0
  14. data/examples/no-use_autowidth.xlsx +0 -0
  15. data/examples/scraping_html.rb +91 -0
  16. data/examples/shared_strings_example.xlsx +0 -0
  17. data/examples/sheet_protection.rb +10 -0
  18. data/examples/sheet_view.rb +34 -0
  19. data/examples/two_cell_anchor_image.rb +11 -0
  20. data/lib/axlsx/content_type/content_type.rb +2 -0
  21. data/lib/axlsx/content_type/default.rb +30 -15
  22. data/lib/axlsx/content_type/override.rb +29 -14
  23. data/lib/axlsx/doc_props/app.rb +161 -104
  24. data/lib/axlsx/doc_props/core.rb +9 -5
  25. data/lib/axlsx/drawing/ax_data_source.rb +26 -0
  26. data/lib/axlsx/drawing/axis.rb +92 -37
  27. data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
  28. data/lib/axlsx/drawing/bar_series.rb +25 -7
  29. data/lib/axlsx/drawing/cat_axis.rb +50 -22
  30. data/lib/axlsx/drawing/chart.rb +69 -56
  31. data/lib/axlsx/drawing/d_lbls.rb +100 -0
  32. data/lib/axlsx/drawing/drawing.rb +28 -12
  33. data/lib/axlsx/drawing/graphic_frame.rb +2 -1
  34. data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
  35. data/lib/axlsx/drawing/line_series.rb +20 -4
  36. data/lib/axlsx/drawing/num_data.rb +52 -0
  37. data/lib/axlsx/drawing/num_data_source.rb +61 -0
  38. data/lib/axlsx/drawing/num_val.rb +32 -0
  39. data/lib/axlsx/drawing/pic.rb +44 -4
  40. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
  41. data/lib/axlsx/drawing/pie_series.rb +18 -4
  42. data/lib/axlsx/drawing/scatter_chart.rb +2 -8
  43. data/lib/axlsx/drawing/scatter_series.rb +28 -2
  44. data/lib/axlsx/drawing/ser_axis.rb +1 -1
  45. data/lib/axlsx/drawing/series.rb +1 -1
  46. data/lib/axlsx/drawing/str_data.rb +42 -0
  47. data/lib/axlsx/drawing/str_val.rb +33 -0
  48. data/lib/axlsx/drawing/title.rb +21 -9
  49. data/lib/axlsx/drawing/two_cell_anchor.rb +46 -9
  50. data/lib/axlsx/drawing/view_3D.rb +44 -31
  51. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  52. data/lib/axlsx/drawing/vml_shape.rb +125 -0
  53. data/lib/axlsx/package.rb +44 -16
  54. data/lib/axlsx/rels/relationship.rb +3 -3
  55. data/lib/axlsx/rels/relationships.rb +1 -11
  56. data/lib/axlsx/stylesheet/gradient_fill.rb +1 -1
  57. data/lib/axlsx/stylesheet/styles.rb +1 -1
  58. data/lib/axlsx/stylesheet/table_style.rb +3 -3
  59. data/lib/axlsx/util/constants.rb +28 -0
  60. data/lib/axlsx/util/simple_typed_list.rb +15 -21
  61. data/lib/axlsx/util/validators.rb +81 -8
  62. data/lib/axlsx/version.rb +2 -7
  63. data/lib/axlsx/workbook/defined_name.rb +174 -0
  64. data/lib/axlsx/workbook/defined_names.rb +21 -0
  65. data/lib/axlsx/workbook/workbook.rb +65 -13
  66. data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
  67. data/lib/axlsx/workbook/worksheet/cell.rb +35 -7
  68. data/lib/axlsx/workbook/worksheet/col.rb +17 -1
  69. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  70. data/lib/axlsx/workbook/worksheet/comment.rb +101 -0
  71. data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
  72. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  73. data/lib/axlsx/workbook/worksheet/data_bar.rb +1 -1
  74. data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
  75. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  76. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
  77. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  78. data/lib/axlsx/workbook/worksheet/page_setup.rb +113 -0
  79. data/lib/axlsx/workbook/worksheet/pane.rb +144 -0
  80. data/lib/axlsx/workbook/worksheet/print_options.rb +63 -0
  81. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
  82. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  83. data/lib/axlsx/workbook/worksheet/row.rb +67 -12
  84. data/lib/axlsx/workbook/worksheet/selection.rb +111 -0
  85. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  86. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
  87. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
  88. data/lib/axlsx/workbook/worksheet/sheet_view.rb +379 -0
  89. data/lib/axlsx/workbook/worksheet/table.rb +3 -3
  90. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  91. data/lib/axlsx/workbook/worksheet/worksheet.rb +377 -255
  92. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
  93. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
  94. data/lib/axlsx.rb +30 -15
  95. data/test/content_type/tc_content_type.rb +1 -6
  96. data/test/doc_props/tc_app.rb +31 -1
  97. data/test/doc_props/tc_core.rb +3 -1
  98. data/test/drawing/tc_axis.rb +38 -3
  99. data/test/drawing/tc_bar_3D_chart.rb +12 -12
  100. data/test/drawing/tc_bar_series.rb +17 -13
  101. data/test/drawing/tc_cat_axis.rb +3 -3
  102. data/test/drawing/tc_cat_axis_data.rb +23 -13
  103. data/test/drawing/tc_chart.rb +29 -11
  104. data/test/drawing/tc_d_lbls.rb +47 -0
  105. data/test/drawing/tc_data_source.rb +17 -0
  106. data/test/drawing/tc_drawing.rb +11 -5
  107. data/test/drawing/tc_hyperlink.rb +4 -5
  108. data/test/drawing/tc_line_series.rb +9 -11
  109. data/test/drawing/tc_named_axis_data.rb +27 -0
  110. data/test/drawing/tc_num_data.rb +31 -0
  111. data/test/drawing/tc_num_val.rb +29 -0
  112. data/test/drawing/tc_pic.rb +22 -2
  113. data/test/drawing/tc_pie_3D_chart.rb +4 -8
  114. data/test/drawing/tc_pie_series.rb +11 -13
  115. data/test/drawing/tc_scatter_chart.rb +6 -1
  116. data/test/drawing/tc_scatter_series.rb +6 -5
  117. data/test/drawing/tc_series.rb +1 -1
  118. data/test/drawing/tc_str_data.rb +18 -0
  119. data/test/drawing/tc_str_val.rb +21 -0
  120. data/test/drawing/tc_title.rb +16 -0
  121. data/test/drawing/tc_two_cell_anchor.rb +2 -3
  122. data/test/drawing/tc_view_3D.rb +18 -18
  123. data/test/drawing/tc_vml_drawing.rb +25 -0
  124. data/test/drawing/tc_vml_shape.rb +100 -0
  125. data/test/rels/tc_relationship.rb +1 -0
  126. data/test/stylesheet/tc_gradient_fill.rb +8 -0
  127. data/test/stylesheet/tc_pattern_fill.rb +7 -1
  128. data/test/stylesheet/tc_styles.rb +3 -4
  129. data/test/stylesheet/tc_table_style.rb +8 -0
  130. data/test/stylesheet/tc_table_style_element.rb +10 -1
  131. data/test/tc_helper.rb +1 -0
  132. data/test/tc_package.rb +93 -17
  133. data/test/util/tc_simple_typed_list.rb +13 -0
  134. data/test/util/tc_validators.rb +95 -9
  135. data/test/workbook/tc_defined_name.rb +41 -0
  136. data/test/workbook/tc_workbook.rb +5 -3
  137. data/test/workbook/worksheet/table/tc_table.rb +3 -11
  138. data/test/workbook/worksheet/tc_cell.rb +30 -6
  139. data/test/workbook/worksheet/tc_col.rb +9 -0
  140. data/test/workbook/worksheet/tc_comment.rb +57 -0
  141. data/test/workbook/worksheet/tc_comments.rb +57 -0
  142. data/test/workbook/worksheet/tc_conditional_formatting.rb +44 -0
  143. data/test/workbook/worksheet/tc_data_bar.rb +1 -1
  144. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  145. data/test/workbook/worksheet/tc_page_setup.rb +138 -0
  146. data/test/workbook/worksheet/tc_pane.rb +94 -0
  147. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  148. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  149. data/test/workbook/worksheet/tc_row.rb +36 -12
  150. data/test/workbook/worksheet/tc_selection.rb +94 -0
  151. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  152. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  153. data/test/workbook/worksheet/tc_worksheet.rb +138 -48
  154. metadata +164 -52
  155. data/examples/example.csv +0 -1000
  156. data/lib/axlsx/drawing/cat_axis_data.rb +0 -34
  157. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  158. data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
  159. data/lib/axlsx/drawing/named_axis_data.rb +0 -36
  160. data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
  161. data/lib/axlsx/drawing/val_axis_data.rb +0 -27
  162. data/lib/axlsx/util/cbf.rb +0 -333
  163. data/lib/axlsx/util/cfb.rb~ +0 -201
  164. data/lib/axlsx/util/font_tables.rb~ +0 -0
  165. data/lib/axlsx/util/ms_off_crypto.rb +0 -189
  166. data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
  167. data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
  168. data/lib/axlsx/util/parser.rb~ +0 -6
  169. data/lib/axlsx/util/storage.rb~ +0 -0
  170. data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
  171. data/lib/axlsx/workbook/worksheet/cfvo.rb~ +0 -0
  172. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  173. data/lib/axlsx/workbook/worksheet/color_scale.rb~ +0 -46
  174. data/lib/axlsx/workbook/worksheet/data_bar.rb~ +0 -0
  175. data/lib/axlsx/workbook/worksheet/icon_set.rb~ +0 -95
  176. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  177. data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
  178. data/lib/schema/dc.xsd~ +0 -118
  179. data/lib/schema/dcterms.xsd~ +0 -331
  180. data/lib/schema/opc-coreProperties.xsd~ +0 -50
  181. data/test/drawing/tc_val_axis_data.rb +0 -17
  182. data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
  183. data/test/workbook/worksheet/tc_cfvo.rb~ +0 -20
  184. data/test/workbook/worksheet/tc_col.rb~ +0 -10
  185. data/test/workbook/worksheet/tc_color_scale.rb~ +0 -0
  186. data/test/workbook/worksheet/tc_data_bar.rb~ +0 -0
  187. data/test/workbook/worksheet/tc_icon_set.rb~ +0 -0
@@ -0,0 +1,57 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestComments < Test::Unit::TestCase
4
+ def setup
5
+ p = Axlsx::Package.new
6
+ wb = p.workbook
7
+ @ws = wb.add_worksheet
8
+ @c1 = @ws.add_comment :ref => 'A1', :text => 'penut machine', :author => 'crank'
9
+ @c2 = @ws.add_comment :ref => 'C3', :text => 'rust bucket', :author => 'PO'
10
+ end
11
+
12
+ def test_initialize
13
+ assert_raise(ArgumentError) { Axlsx::Comments.new }
14
+ assert(@ws.comments.vml_drawing.is_a?(Axlsx::VmlDrawing))
15
+ end
16
+
17
+ def test_add_comment
18
+ assert_equal(@ws.comments.size, 2)
19
+ assert_raise(ArgumentError) { @ws.comments.add_comment() }
20
+ assert_raise(ArgumentError) { @ws.comments.add_comment(:text => 'Yes We Can', :ref => 'A1') }
21
+ assert_raise(ArgumentError) { @ws.comments.add_comment(:author => 'bob', :ref => 'A1') }
22
+ assert_raise(ArgumentError) { @ws.comments.add_comment(:author => 'bob', :text => 'Yes We Can')}
23
+ assert_nothing_raised { @ws.comments.add_comment(:author => 'bob', :text => 'Yes We Can', :ref => 'A1') }
24
+ assert_equal(@ws.comments.size, 3)
25
+ end
26
+ def test_authors
27
+ assert_equal(@ws.comments.authors.size, @ws.comments.size)
28
+ @ws.add_comment(:text => 'Yes We Can!', :author => :bob, :ref => 'F1')
29
+ assert_equal(@ws.comments.authors.size, 3)
30
+ @ws.add_comment(:text => 'Yes We Can!', :author => :bob, :ref => 'F1')
31
+ assert_equal(@ws.comments.authors.size, 3, 'only unique authors are returned')
32
+ end
33
+ def test_pn
34
+ assert_equal(@ws.comments.pn, Axlsx::COMMENT_PN % (@ws.index+1).to_s)
35
+ end
36
+
37
+ def test_index
38
+ assert_equal(@ws.index, @ws.comments.index)
39
+ end
40
+
41
+ def test_to_xml_string
42
+ doc = Nokogiri::XML(@ws.comments.to_xml_string)
43
+ schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
44
+ errors = []
45
+ schema.validate(doc).each do |error|
46
+ errors << error
47
+ end
48
+ assert_equal(0, errors.length)
49
+
50
+ # TODO figure out why these xpath expressions dont work!
51
+ # assert(doc.xpath("//comments"))
52
+ # assert_equal(doc.xpath("//xmlns:author").size, @ws.comments.authors.size)
53
+ # assert_equal(doc.xpath("//comment").size, @ws.comments.size)
54
+ end
55
+ end
56
+
57
+
@@ -15,6 +15,50 @@ class TestConditionalFormatting < Test::Unit::TestCase
15
15
  assert_equal("AA1:AB100", optioned.sqref)
16
16
  assert_equal([1, 2], optioned.rules)
17
17
  end
18
+ def test_add_as_rule
19
+
20
+ color_scale = Axlsx::ColorScale.new do |cs|
21
+ cs.colors.first.rgb = "FFDFDFDF"
22
+ cs.colors.last.rgb = "FF00FF00"
23
+ cs.value_objects.first.type = :percentile
24
+ cs.value_objects.first.val = 5
25
+ end
26
+
27
+ data_bar = Axlsx::DataBar.new :color => "FFFF0000"
28
+ icon_set = Axlsx::IconSet.new :iconSet => "5Rating"
29
+ cfr = Axlsx::ConditionalFormattingRule.new( { :type => :containsText, :text => "TRUE",
30
+ :dxfId => 0, :priority => 1,
31
+ :formula => 'NOT(ISERROR(SEARCH("FALSE",AB1)))',
32
+ :color_scale => color_scale,
33
+ :data_bar => data_bar,
34
+ :icon_set => icon_set})
35
+
36
+ assert(cfr.data_bar.is_a?(Axlsx::DataBar))
37
+ assert(cfr.icon_set.is_a?(Axlsx::IconSet))
38
+ assert(cfr.color_scale.is_a?(Axlsx::ColorScale))
39
+ cfs = @ws.add_conditional_formatting( "B2:B2", [cfr])
40
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
41
+ assert_equal(1, doc.xpath(".//conditionalFormatting[@sqref='B2:B2']//cfRule[@type='containsText'][@dxfId=0][@priority=1]").size)
42
+ assert doc.xpath(".//conditionalFormatting//cfRule[@type='containsText'][@dxfId=0][@priority=1]//formula='NOT(ISERROR(SEARCH(\"FALSE\",AB1)))'")
43
+
44
+ cfs.last.rules.last.type = :colorScale
45
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
46
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//colorScale//cfvo").size, 2)
47
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//colorScale//color").size, 2)
48
+
49
+ cfs.last.rules.last.type = :dataBar
50
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
51
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//dataBar").size, 1)
52
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//dataBar//cfvo").size, 2)
53
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//dataBar//color[@rgb='FFFF0000']").size, 1)
54
+
55
+ cfs.last.rules.last.type = :iconSet
56
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
57
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//iconSet//cfvo").size, 3)
58
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//iconSet[@iconSet='5Rating']").size, 1)
59
+
60
+ end
61
+
18
62
 
19
63
  def test_add_as_hash
20
64
 
@@ -23,7 +23,7 @@ class TestDataBar < Test::Unit::TestCase
23
23
  assert_equal(@data_bar.maxLength, 0)
24
24
  end
25
25
 
26
- def test_maxLength
26
+ def test_showValue
27
27
  assert_raise(ArgumentError) { @data_bar.showValue = :invalid_type }
28
28
  assert_nothing_raised { @data_bar.showValue = false}
29
29
  assert_equal(@data_bar.showValue, false)
@@ -0,0 +1,265 @@
1
+ # encoding: UTF-8
2
+ require 'tc_helper.rb'
3
+
4
+
5
+ class TestDataValidation < Test::Unit::TestCase
6
+ def setup
7
+ #inverse defaults
8
+ @boolean_options = { :allowBlank => false, :showDropDown => true, :showErrorMessage => false, :showInputMessage => true }
9
+ @nil_options = { :formula1 => 'foo', :formula2 => 'foo', :errorTitle => 'foo', :operator => :lessThan, :prompt => 'foo', :promptTitle => 'foo', :sqref => 'foo' }
10
+ @type_option = { :type => :whole }
11
+ @error_style_option = { :errorStyle => :warning }
12
+
13
+ @string_options = { :formula1 => 'foo', :formula2 => 'foo', :error => 'foo', :errorTitle => 'foo', :prompt => 'foo', :promptTitle => 'foo', :sqref => 'foo' }
14
+ @symbol_options = { :errorStyle => :warning, :operator => :lessThan, :type => :whole}
15
+
16
+ @options = @boolean_options.merge(@nil_options).merge(@type_option).merge(@error_style_option)
17
+
18
+ @dv = Axlsx::DataValidation.new(@options)
19
+ end
20
+
21
+ def test_initialize
22
+ dv = Axlsx::DataValidation.new
23
+
24
+ @boolean_options.each do |key, value|
25
+ assert_equal(!value, dv.send(key.to_sym), "initialized default #{key} should be #{!value}")
26
+ assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
27
+ end
28
+
29
+ @nil_options.each do |key, value|
30
+ assert_equal(nil, dv.send(key.to_sym), "initialized default #{key} should be nil")
31
+ assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
32
+ end
33
+
34
+ @type_option.each do |key, value|
35
+ assert_equal(:none, dv.send(key.to_sym), "initialized default #{key} should be :none")
36
+ assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
37
+ end
38
+
39
+ @error_style_option.each do |key, value|
40
+ assert_equal(:stop, dv.send(key.to_sym), "initialized default #{key} should be :stop")
41
+ assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
42
+ end
43
+ end
44
+
45
+ def test_boolean_attribute_validation
46
+ @boolean_options.each do |key, value|
47
+ assert_raise(ArgumentError, "#{key} must be boolean") { @dv.send("#{key}=".to_sym, 'A') }
48
+ assert_nothing_raised { @dv.send("#{key}=".to_sym, true) }
49
+ end
50
+ end
51
+
52
+ def test_string_attribute_validation
53
+ @string_options.each do |key, value|
54
+ assert_raise(ArgumentError, "#{key} must be string") { @dv.send("#{key}=".to_sym, :symbol) }
55
+ assert_nothing_raised { @dv.send("#{key}=".to_sym, "foo") }
56
+ end
57
+ end
58
+
59
+ def test_symbol_attribute_validation
60
+ @symbol_options.each do |key, value|
61
+ assert_raise(ArgumentError, "#{key} must be symbol") { @dv.send("#{key}=".to_sym, "foo") }
62
+ assert_nothing_raised { @dv.send("#{key}=".to_sym, value) }
63
+ end
64
+ end
65
+
66
+ def test_formula1
67
+ assert_raise(ArgumentError) { @dv.formula1 = 10 }
68
+ assert_nothing_raised { @dv.formula1 = "=SUM(A1:A1)" }
69
+ assert_equal(@dv.formula1, "=SUM(A1:A1)")
70
+ end
71
+
72
+ def test_formula2
73
+ assert_raise(ArgumentError) { @dv.formula2 = 10 }
74
+ assert_nothing_raised { @dv.formula2 = "=SUM(A1:A1)" }
75
+ assert_equal(@dv.formula2, "=SUM(A1:A1)")
76
+ end
77
+
78
+ def test_allowBlank
79
+ assert_raise(ArgumentError) { @dv.allowBlank = "foo´" }
80
+ assert_nothing_raised { @dv.allowBlank = false }
81
+ assert_equal(@dv.allowBlank, false)
82
+ end
83
+
84
+ def test_error
85
+ assert_raise(ArgumentError) { @dv.error = :symbol }
86
+ assert_nothing_raised { @dv.error = "This is a error message" }
87
+ assert_equal(@dv.error, "This is a error message")
88
+ end
89
+
90
+ def test_errorStyle
91
+ assert_raise(ArgumentError) { @dv.errorStyle = "foo" }
92
+ assert_nothing_raised { @dv.errorStyle = :information }
93
+ assert_equal(@dv.errorStyle, :information)
94
+ end
95
+
96
+ def test_errorTitle
97
+ assert_raise(ArgumentError) { @dv.errorTitle = :symbol }
98
+ assert_nothing_raised { @dv.errorTitle = "This is the error title" }
99
+ assert_equal(@dv.errorTitle, "This is the error title")
100
+ end
101
+
102
+ def test_operator
103
+ assert_raise(ArgumentError) { @dv.operator = "foo" }
104
+ assert_nothing_raised { @dv.operator = :greaterThan }
105
+ assert_equal(@dv.operator, :greaterThan)
106
+ end
107
+
108
+ def test_prompt
109
+ assert_raise(ArgumentError) { @dv.prompt = :symbol }
110
+ assert_nothing_raised { @dv.prompt = "This is a prompt message" }
111
+ assert_equal(@dv.prompt, "This is a prompt message")
112
+ end
113
+
114
+ def test_promptTitle
115
+ assert_raise(ArgumentError) { @dv.promptTitle = :symbol }
116
+ assert_nothing_raised { @dv.promptTitle = "This is the prompt title" }
117
+ assert_equal(@dv.promptTitle, "This is the prompt title")
118
+ end
119
+
120
+ def test_showDropDown
121
+ assert_raise(ArgumentError) { @dv.showDropDown = "foo´" }
122
+ assert_nothing_raised { @dv.showDropDown = false }
123
+ assert_equal(@dv.showDropDown, false)
124
+ end
125
+
126
+ def test_showErrorMessage
127
+ assert_raise(ArgumentError) { @dv.showErrorMessage = "foo´" }
128
+ assert_nothing_raised { @dv.showErrorMessage = false }
129
+ assert_equal(@dv.showErrorMessage, false)
130
+ end
131
+
132
+ def test_showInputMessage
133
+ assert_raise(ArgumentError) { @dv.showInputMessage = "foo´" }
134
+ assert_nothing_raised { @dv.showInputMessage = false }
135
+ assert_equal(@dv.showInputMessage, false)
136
+ end
137
+
138
+ def test_sqref
139
+ assert_raise(ArgumentError) { @dv.sqref = 10 }
140
+ assert_nothing_raised { @dv.sqref = "A1:A1" }
141
+ assert_equal(@dv.sqref, "A1:A1")
142
+ end
143
+
144
+ def test_type
145
+ assert_raise(ArgumentError) { @dv.type = "foo" }
146
+ assert_nothing_raised { @dv.type = :list }
147
+ assert_equal(@dv.type, :list)
148
+ end
149
+
150
+ def test_whole_decimal_data_time_textLength_to_xml
151
+ p = Axlsx::Package.new
152
+ @ws = p.workbook.add_worksheet :name=>"data_validation"
153
+ @ws.add_data_validation("A1", { :type => :whole, :operator => :between, :formula1 => '5', :formula2 => '10',
154
+ :showErrorMessage => true, :errorTitle => 'Wrong input', :error => 'Only values between 5 and 10',
155
+ :errorStyle => :information, :showInputMessage => true, :promptTitle => 'Be carful!',
156
+ :prompt => 'Only values between 5 and 10'})
157
+
158
+ doc = Nokogiri::XML.parse(@ws.to_xml_string)
159
+
160
+ #test attributes
161
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
162
+ [@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
163
+ [@error='Only values between 5 and 10'][@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@type='whole']
164
+ [@errorStyle='information']").size)
165
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
166
+ [@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
167
+ [@error='Only values between 5 and 10'][@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true']
168
+ [@type='whole'][@errorStyle='information']")
169
+
170
+ #test forumula1
171
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1").size)
172
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1='5'")
173
+
174
+ #test forumula2
175
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula2").size)
176
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula2='10'")
177
+ end
178
+
179
+ def test_list_to_xml
180
+ p = Axlsx::Package.new
181
+ @ws = p.workbook.add_worksheet :name=>"data_validation"
182
+ @ws.add_data_validation("A1", { :type => :list, :formula1 => 'A1:A5',
183
+ :showErrorMessage => true, :errorTitle => 'Wrong input', :error => 'Only values from list',
184
+ :errorStyle => :stop, :showInputMessage => true, :promptTitle => 'Be carful!',
185
+ :prompt => 'Only values from list', :showDropDown => true})
186
+
187
+ doc = Nokogiri::XML.parse(@ws.to_xml_string)
188
+
189
+ #test attributes
190
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
191
+ [@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
192
+ [@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@showDropDown='true'][@type='list']
193
+ [@errorStyle='stop']").size)
194
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
195
+ [@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
196
+ [@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@showDropDown='true'][@type='list'][@errorStyle='stop']")
197
+
198
+ #test forumula1
199
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1").size)
200
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1='A1:A5'")
201
+ end
202
+
203
+ def test_custom_to_xml
204
+ p = Axlsx::Package.new
205
+ @ws = p.workbook.add_worksheet :name=>"data_validation"
206
+ @ws.add_data_validation("A1", { :type => :custom, :formula1 => '=5/2',
207
+ :showErrorMessage => true, :errorTitle => 'Wrong input', :error => 'Only values corresponding formula',
208
+ :errorStyle => :stop, :showInputMessage => true, :promptTitle => 'Be carful!',
209
+ :prompt => 'Only values corresponding formula'})
210
+
211
+ doc = Nokogiri::XML.parse(@ws.to_xml_string)
212
+
213
+ #test attributes
214
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1'][@promptTitle='Be carful!']
215
+ [@prompt='Only values corresponding formula'][@errorTitle='Wrong input'][@error='Only values corresponding formula'][@showErrorMessage='true']
216
+ [@allowBlank='true'][@showInputMessage='true'][@type='custom'][@errorStyle='stop']").size)
217
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1'][@promptTitle='Be carful!']
218
+ [@prompt='Only values corresponding formula'][@errorTitle='Wrong input'][@error='Only values corresponding formula']
219
+ [@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@type='custom'][@errorStyle='stop']")
220
+
221
+ #test forumula1
222
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1").size)
223
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1='=5/2'")
224
+ end
225
+
226
+ def test_multiple_datavalidations_to_xml
227
+ p = Axlsx::Package.new
228
+ @ws = p.workbook.add_worksheet :name=>"data_validation"
229
+ @ws.add_data_validation("A1", { :type => :whole, :operator => :between, :formula1 => '5', :formula2 => '10',
230
+ :showErrorMessage => true, :errorTitle => 'Wrong input', :error => 'Only values between 5 and 10',
231
+ :errorStyle => :information, :showInputMessage => true, :promptTitle => 'Be carful!',
232
+ :prompt => 'Only values between 5 and 10'})
233
+ @ws.add_data_validation("B1", { :type => :list, :formula1 => 'A1:A5',
234
+ :showErrorMessage => true, :errorTitle => 'Wrong input', :error => 'Only values from list',
235
+ :errorStyle => :stop, :showInputMessage => true, :promptTitle => 'Be carful!',
236
+ :prompt => 'Only values from list', :showDropDown => true})
237
+
238
+ doc = Nokogiri::XML.parse(@ws.to_xml_string)
239
+
240
+ #test attributes
241
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='A1']
242
+ [@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
243
+ [@error='Only values between 5 and 10'][@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@type='whole']
244
+ [@errorStyle='information']").size)
245
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='A1']
246
+ [@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
247
+ [@error='Only values between 5 and 10'][@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true']
248
+ [@type='whole'][@errorStyle='information']")
249
+
250
+ #test attributes
251
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='B1']
252
+ [@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
253
+ [@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@showDropDown='true'][@type='list']
254
+ [@errorStyle='stop']").size)
255
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='B1']
256
+ [@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
257
+ [@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@showDropDown='true'][@type='list'][@errorStyle='stop']")
258
+ end
259
+
260
+ def test_empty_attributes
261
+ v = Axlsx::DataValidation.new
262
+ assert_equal(nil, v.send(:get_valid_attributes))
263
+
264
+ end
265
+ end
@@ -0,0 +1,138 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestPageSetup < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @p = Axlsx::Package.new
7
+ ws = @p.workbook.add_worksheet :name => "hmmm"
8
+ @ps = ws.page_setup
9
+ end
10
+
11
+ def test_initialize
12
+ assert_equal(nil, @ps.fit_to_height)
13
+ assert_equal(nil, @ps.fit_to_width)
14
+ assert_equal(nil, @ps.orientation)
15
+ assert_equal(nil, @ps.paper_height)
16
+ assert_equal(nil, @ps.paper_width)
17
+ assert_equal(nil, @ps.scale)
18
+ end
19
+
20
+ def test_initialize_with_options
21
+ page_setup = { :fit_to_height => 1,
22
+ :fit_to_width => 2,
23
+ :orientation => :landscape,
24
+ :paper_height => "297mm",
25
+ :paper_width => "210mm",
26
+ :scale => 50 }
27
+
28
+ optioned = @p.workbook.add_worksheet(:name => 'optioned', :page_setup => page_setup).page_setup
29
+ assert_equal(1, optioned.fit_to_height)
30
+ assert_equal(2, optioned.fit_to_width)
31
+ assert_equal(:landscape, optioned.orientation)
32
+ assert_equal("297mm", optioned.paper_height)
33
+ assert_equal("210mm", optioned.paper_width)
34
+ assert_equal(50, optioned.scale)
35
+ end
36
+
37
+ def test_set_all_values
38
+ @ps.set(:fit_to_height => 1, :fit_to_width => 2, :orientation => :landscape, :paper_height => "297mm", :paper_width => "210mm", :scale => 50)
39
+ assert_equal(1, @ps.fit_to_height)
40
+ assert_equal(2, @ps.fit_to_width)
41
+ assert_equal(:landscape, @ps.orientation)
42
+ assert_equal("297mm", @ps.paper_height)
43
+ assert_equal("210mm", @ps.paper_width)
44
+ assert_equal(50, @ps.scale)
45
+ end
46
+
47
+ def test_set_some_values
48
+ @ps.set(:fit_to_width => 2, :orientation => :portrait)
49
+ assert_equal(2, @ps.fit_to_width)
50
+ assert_equal(:portrait, @ps.orientation)
51
+ assert_equal(nil, @ps.fit_to_height)
52
+ assert_equal(nil, @ps.paper_height)
53
+ assert_equal(nil, @ps.paper_width)
54
+ assert_equal(nil, @ps.scale)
55
+ end
56
+
57
+ def test_default_fit_to_page?
58
+ assert(@ps.fit_to_width == nil && @ps.fit_to_height == nil)
59
+ assert(@ps.fit_to_page? == false)
60
+ end
61
+
62
+ def test_with_height_fit_to_page?
63
+ assert(@ps.fit_to_width == nil && @ps.fit_to_height == nil)
64
+ @ps.set(:fit_to_height => 1)
65
+ assert(@ps.fit_to_page?)
66
+ end
67
+
68
+ def test_with_width_fit_to_page?
69
+ assert(@ps.fit_to_width == nil && @ps.fit_to_height == nil)
70
+ @ps.set(:fit_to_width => 1)
71
+ assert(@ps.fit_to_page?)
72
+ end
73
+
74
+ def test_to_xml_all_values
75
+ @ps.set(:fit_to_height => 1, :fit_to_width => 2, :orientation => :landscape, :paper_height => "297mm", :paper_width => "210mm", :scale => 50)
76
+ doc = Nokogiri::XML.parse(@ps.to_xml_string)
77
+ assert_equal(1, doc.xpath(".//pageSetup[@fitToHeight='1'][@fitToWidth='2'][@orientation='landscape'][@paperHeight='297mm'][@paperWidth='210mm'][@scale='50']").size)
78
+ end
79
+
80
+ def test_to_xml_some_values
81
+ @ps.set(:orientation => :portrait)
82
+ doc = Nokogiri::XML.parse(@ps.to_xml_string)
83
+ assert_equal(1, doc.xpath(".//pageSetup[@orientation='portrait']").size)
84
+ assert_equal(0, doc.xpath(".//pageSetup[@fitToHeight]").size)
85
+ assert_equal(0, doc.xpath(".//pageSetup[@fitToWidth]").size)
86
+ assert_equal(0, doc.xpath(".//pageSetup[@paperHeight]").size)
87
+ assert_equal(0, doc.xpath(".//pageSetup[@paperWidth]").size)
88
+ assert_equal(0, doc.xpath(".//pageSetup[@scale]").size)
89
+ end
90
+
91
+ def test_fit_to_height
92
+ assert_raise(ArgumentError) { @ps.fit_to_height = 1.5 }
93
+ assert_nothing_raised { @ps.fit_to_height = 2 }
94
+ assert_equal(2, @ps.fit_to_height)
95
+ end
96
+
97
+ def test_fit_to_width
98
+ assert_raise(ArgumentError) { @ps.fit_to_width = false }
99
+ assert_nothing_raised { @ps.fit_to_width = 1 }
100
+ assert_equal(1, @ps.fit_to_width)
101
+ end
102
+
103
+ def test_orientation
104
+ assert_raise(ArgumentError) { @ps.orientation = "" }
105
+ assert_nothing_raised { @ps.orientation = :default }
106
+ assert_equal(:default, @ps.orientation)
107
+ end
108
+
109
+ def test_paper_height
110
+ assert_raise(ArgumentError) { @ps.paper_height = 99 }
111
+ assert_nothing_raised { @ps.paper_height = "11in" }
112
+ assert_equal("11in", @ps.paper_height)
113
+ end
114
+
115
+ def test_paper_width
116
+ assert_raise(ArgumentError) { @ps.paper_width = "22" }
117
+ assert_nothing_raised { @ps.paper_width = "29.7cm" }
118
+ assert_equal("29.7cm", @ps.paper_width)
119
+ end
120
+
121
+ def test_scale
122
+ assert_raise(ArgumentError) { @ps.scale = 50.5 }
123
+ assert_nothing_raised { @ps.scale = 99 }
124
+ assert_equal(99, @ps.scale)
125
+ end
126
+
127
+ def test_fit_to
128
+ fits = @ps.fit_to(:width => 1)
129
+ assert_equal([1, 9999], fits)
130
+ fits = @ps.fit_to :height => 1
131
+ assert_equal(fits, [9999,1])
132
+ fits = @ps.fit_to :height => 7, :width => 2
133
+ assert_equal(fits, [2, 7])
134
+ assert_raise(ArgumentError) { puts @ps.fit_to(:width => true)}
135
+
136
+
137
+ end
138
+ end
@@ -0,0 +1,94 @@
1
+ # encoding: UTF-8
2
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../"
3
+ require 'tc_helper.rb'
4
+
5
+ class TestPane < Test::Unit::TestCase
6
+ def setup
7
+ #inverse defaults for booleans
8
+ @nil_options = { :active_pane => :bottom_left, :state => :frozen, :top_left_cell => 'A2' }
9
+ @int_0_options = { :x_split => 2, :y_split => 2 }
10
+
11
+ @string_options = { :top_left_cell => 'A2' }
12
+ @integer_options = { :x_split => 2, :y_split => 2 }
13
+ @symbol_options = { :active_pane => :bottom_left, :state => :frozen }
14
+
15
+ @options = @nil_options.merge(@int_0_options)
16
+
17
+ @pane = Axlsx::Pane.new(@options)
18
+ end
19
+
20
+ def test_initialize
21
+ pane = Axlsx::Pane.new
22
+
23
+ @nil_options.each do |key, value|
24
+ assert_equal(nil, pane.send(key.to_sym), "initialized default #{key} should be nil")
25
+ assert_equal(value, @pane.send(key.to_sym), "initialized options #{key} should be #{value}")
26
+ end
27
+
28
+ @int_0_options.each do |key, value|
29
+ assert_equal(0, pane.send(key.to_sym), "initialized default #{key} should be 0")
30
+ assert_equal(value, @pane.send(key.to_sym), "initialized options #{key} should be #{value}")
31
+ end
32
+ end
33
+
34
+ def test_string_attribute_validation
35
+ @string_options.each do |key, value|
36
+ assert_raise(ArgumentError, "#{key} must be string") { @pane.send("#{key}=".to_sym, :symbol) }
37
+ assert_nothing_raised { @pane.send("#{key}=".to_sym, "foo") }
38
+ end
39
+ end
40
+
41
+ def test_symbol_attribute_validation
42
+ @symbol_options.each do |key, value|
43
+ assert_raise(ArgumentError, "#{key} must be symbol") { @pane.send("#{key}=".to_sym, "foo") }
44
+ assert_nothing_raised { @pane.send("#{key}=".to_sym, value) }
45
+ end
46
+ end
47
+
48
+ def test_integer_attribute_validation
49
+ @integer_options.each do |key, value|
50
+ assert_raise(ArgumentError, "#{key} must be integer") { @pane.send("#{key}=".to_sym, "foo") }
51
+ assert_nothing_raised { @pane.send("#{key}=".to_sym, value) }
52
+ end
53
+ end
54
+
55
+ def test_active_pane
56
+ assert_raise(ArgumentError) { @pane.active_pane = "10" }
57
+ assert_nothing_raised { @pane.active_pane = :top_left }
58
+ assert_equal(@pane.active_pane, :top_left)
59
+ end
60
+
61
+ def test_state
62
+ assert_raise(ArgumentError) { @pane.state = "foo" }
63
+ assert_nothing_raised { @pane.state = :frozen_split }
64
+ assert_equal(@pane.state, :frozen_split)
65
+ end
66
+
67
+ def test_x_split
68
+ assert_raise(ArgumentError) { @pane.x_split = "foo´" }
69
+ assert_nothing_raised { @pane.x_split = 200 }
70
+ assert_equal(@pane.x_split, 200)
71
+ end
72
+
73
+ def test_y_split
74
+ assert_raise(ArgumentError) { @pane.y_split = 'foo' }
75
+ assert_nothing_raised { @pane.y_split = 300 }
76
+ assert_equal(@pane.y_split, 300)
77
+ end
78
+
79
+ def test_top_left_cell
80
+ assert_raise(ArgumentError) { @pane.top_left_cell = :cell }
81
+ assert_nothing_raised { @pane.top_left_cell = "A2" }
82
+ assert_equal(@pane.top_left_cell, "A2")
83
+ end
84
+
85
+ def test_to_xml
86
+ doc = Nokogiri::XML.parse(@pane.to_xml_string)
87
+ assert_equal(1, doc.xpath("//pane[@ySplit=2][@xSplit='2'][@topLeftCell='A2'][@state='frozen'][@activePane='bottomLeft']").size)
88
+ end
89
+ def test_to_xml_frozen
90
+ pane = Axlsx::Pane.new :state => :frozen, :y_split => 2
91
+ doc = Nokogiri::XML(pane.to_xml_string)
92
+ assert_equal(1, doc.xpath("//pane[@topLeftCell='A3']").size)
93
+ end
94
+ end