axlsx 1.1.0 → 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 (214) hide show
  1. data/.yardopts +5 -2
  2. data/CHANGELOG.md +78 -0
  3. data/LICENSE +1 -1
  4. data/README.md +132 -331
  5. data/Rakefile +17 -5
  6. data/examples/basic_charts.rb +54 -0
  7. data/examples/chart_colors.rb +88 -0
  8. data/examples/conditional_formatting/example_conditional_formatting.rb +72 -0
  9. data/examples/conditional_formatting/getting_barred.rb +37 -0
  10. data/examples/conditional_formatting/hitting_the_high_notes.rb +37 -0
  11. data/examples/conditional_formatting/scaled_colors.rb +39 -0
  12. data/examples/conditional_formatting/stop_and_go.rb +37 -0
  13. data/examples/data_validation.rb +50 -0
  14. data/examples/example.rb +300 -152
  15. data/examples/example.xlsx +0 -0
  16. data/examples/example_streamed.xlsx +0 -0
  17. data/examples/extractive.pdf +0 -0
  18. data/examples/extractive.rb +45 -0
  19. data/examples/no-use_autowidth.xlsx +0 -0
  20. data/examples/sample.png +0 -0
  21. data/examples/scraping_html.rb +91 -0
  22. data/examples/shared_strings_example.xlsx +0 -0
  23. data/examples/sheet_protection.rb +10 -0
  24. data/examples/sheet_view.rb +34 -0
  25. data/examples/skydrive/real_example.rb +63 -0
  26. data/examples/two_cell_anchor_image.rb +11 -0
  27. data/lib/axlsx/content_type/content_type.rb +2 -0
  28. data/lib/axlsx/content_type/default.rb +30 -15
  29. data/lib/axlsx/content_type/override.rb +29 -14
  30. data/lib/axlsx/doc_props/app.rb +161 -104
  31. data/lib/axlsx/doc_props/core.rb +9 -5
  32. data/lib/axlsx/drawing/ax_data_source.rb +26 -0
  33. data/lib/axlsx/drawing/axis.rb +106 -35
  34. data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
  35. data/lib/axlsx/drawing/bar_series.rb +25 -7
  36. data/lib/axlsx/drawing/cat_axis.rb +50 -22
  37. data/lib/axlsx/drawing/chart.rb +69 -56
  38. data/lib/axlsx/drawing/d_lbls.rb +100 -0
  39. data/lib/axlsx/drawing/drawing.rb +28 -12
  40. data/lib/axlsx/drawing/graphic_frame.rb +2 -1
  41. data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
  42. data/lib/axlsx/drawing/line_series.rb +20 -4
  43. data/lib/axlsx/drawing/num_data.rb +52 -0
  44. data/lib/axlsx/drawing/num_data_source.rb +61 -0
  45. data/lib/axlsx/drawing/num_val.rb +32 -0
  46. data/lib/axlsx/drawing/pic.rb +44 -4
  47. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
  48. data/lib/axlsx/drawing/pie_series.rb +18 -4
  49. data/lib/axlsx/drawing/scatter_chart.rb +12 -18
  50. data/lib/axlsx/drawing/scatter_series.rb +28 -2
  51. data/lib/axlsx/drawing/ser_axis.rb +1 -1
  52. data/lib/axlsx/drawing/series.rb +1 -1
  53. data/lib/axlsx/drawing/str_data.rb +42 -0
  54. data/lib/axlsx/drawing/str_val.rb +33 -0
  55. data/lib/axlsx/drawing/title.rb +21 -9
  56. data/lib/axlsx/drawing/two_cell_anchor.rb +46 -9
  57. data/lib/axlsx/drawing/view_3D.rb +44 -31
  58. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  59. data/lib/axlsx/drawing/vml_shape.rb +125 -0
  60. data/lib/axlsx/package.rb +44 -16
  61. data/lib/axlsx/rels/relationship.rb +3 -3
  62. data/lib/axlsx/rels/relationships.rb +1 -11
  63. data/lib/axlsx/stylesheet/color.rb +0 -1
  64. data/lib/axlsx/stylesheet/dxf.rb +79 -0
  65. data/lib/axlsx/stylesheet/font.rb +2 -1
  66. data/lib/axlsx/stylesheet/gradient_fill.rb +1 -1
  67. data/lib/axlsx/stylesheet/styles.rb +143 -50
  68. data/lib/axlsx/stylesheet/table_style.rb +3 -3
  69. data/lib/axlsx/stylesheet/xf.rb +2 -0
  70. data/lib/axlsx/util/constants.rb +36 -0
  71. data/lib/axlsx/util/simple_typed_list.rb +15 -21
  72. data/lib/axlsx/util/validators.rb +122 -5
  73. data/lib/axlsx/version.rb +2 -7
  74. data/lib/axlsx/workbook/defined_name.rb +174 -0
  75. data/lib/axlsx/workbook/defined_names.rb +21 -0
  76. data/lib/axlsx/workbook/shared_strings_table.rb +12 -13
  77. data/lib/axlsx/workbook/workbook.rb +71 -13
  78. data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
  79. data/lib/axlsx/workbook/worksheet/cell.rb +45 -36
  80. data/lib/axlsx/workbook/worksheet/cfvo.rb +62 -0
  81. data/lib/axlsx/workbook/worksheet/col.rb +17 -1
  82. data/lib/axlsx/workbook/worksheet/color_scale.rb +76 -0
  83. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  84. data/lib/axlsx/workbook/worksheet/comment.rb +101 -0
  85. data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
  86. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -0
  87. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +216 -0
  88. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  89. data/lib/axlsx/workbook/worksheet/data_bar.rb +97 -0
  90. data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
  91. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  92. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
  93. data/lib/axlsx/workbook/worksheet/icon_set.rb +83 -0
  94. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  95. data/lib/axlsx/workbook/worksheet/page_setup.rb +113 -0
  96. data/lib/axlsx/workbook/worksheet/pane.rb +144 -0
  97. data/lib/axlsx/workbook/worksheet/print_options.rb +63 -0
  98. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
  99. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  100. data/lib/axlsx/workbook/worksheet/row.rb +69 -12
  101. data/lib/axlsx/workbook/worksheet/selection.rb +111 -0
  102. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  103. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
  104. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
  105. data/lib/axlsx/workbook/worksheet/sheet_view.rb +379 -0
  106. data/lib/axlsx/workbook/worksheet/table.rb +3 -3
  107. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  108. data/lib/axlsx/workbook/worksheet/worksheet.rb +379 -233
  109. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
  110. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
  111. data/lib/axlsx.rb +31 -16
  112. data/test/benchmark.rb +30 -38
  113. data/test/content_type/tc_content_type.rb +1 -6
  114. data/test/doc_props/tc_app.rb +31 -1
  115. data/test/doc_props/tc_core.rb +3 -1
  116. data/test/drawing/tc_axis.rb +46 -3
  117. data/test/drawing/tc_bar_3D_chart.rb +12 -12
  118. data/test/drawing/tc_bar_series.rb +17 -13
  119. data/test/drawing/tc_cat_axis.rb +3 -3
  120. data/test/drawing/tc_cat_axis_data.rb +23 -13
  121. data/test/drawing/tc_chart.rb +29 -11
  122. data/test/drawing/tc_d_lbls.rb +47 -0
  123. data/test/drawing/tc_data_source.rb +17 -0
  124. data/test/drawing/tc_drawing.rb +11 -5
  125. data/test/drawing/tc_hyperlink.rb +4 -5
  126. data/test/drawing/tc_line_series.rb +9 -11
  127. data/test/drawing/tc_named_axis_data.rb +27 -0
  128. data/test/drawing/tc_num_data.rb +31 -0
  129. data/test/drawing/tc_num_val.rb +29 -0
  130. data/test/drawing/tc_pic.rb +22 -2
  131. data/test/drawing/tc_pie_3D_chart.rb +4 -8
  132. data/test/drawing/tc_pie_series.rb +11 -13
  133. data/test/drawing/tc_scatter_chart.rb +6 -1
  134. data/test/drawing/tc_scatter_series.rb +6 -5
  135. data/test/drawing/tc_series.rb +1 -1
  136. data/test/drawing/tc_str_data.rb +18 -0
  137. data/test/drawing/tc_str_val.rb +21 -0
  138. data/test/drawing/tc_title.rb +16 -0
  139. data/test/drawing/tc_two_cell_anchor.rb +2 -3
  140. data/test/drawing/tc_view_3D.rb +18 -18
  141. data/test/drawing/tc_vml_drawing.rb +25 -0
  142. data/test/drawing/tc_vml_shape.rb +100 -0
  143. data/test/profile.rb +2 -1
  144. data/test/rels/tc_relationship.rb +1 -0
  145. data/test/stylesheet/tc_dxf.rb +81 -0
  146. data/test/stylesheet/tc_gradient_fill.rb +8 -0
  147. data/test/stylesheet/tc_pattern_fill.rb +7 -1
  148. data/test/stylesheet/tc_styles.rb +163 -3
  149. data/test/stylesheet/tc_table_style.rb +8 -0
  150. data/test/stylesheet/tc_table_style_element.rb +10 -1
  151. data/test/tc_helper.rb +1 -0
  152. data/test/tc_package.rb +93 -17
  153. data/test/util/tc_simple_typed_list.rb +13 -0
  154. data/test/util/tc_validators.rb +95 -9
  155. data/test/workbook/tc_defined_name.rb +41 -0
  156. data/test/workbook/tc_workbook.rb +5 -3
  157. data/test/workbook/worksheet/table/tc_table.rb +3 -11
  158. data/test/workbook/worksheet/tc_cell.rb +52 -18
  159. data/test/workbook/worksheet/tc_cfvo.rb +31 -0
  160. data/test/workbook/worksheet/tc_col.rb +9 -0
  161. data/test/workbook/worksheet/tc_color_scale.rb +29 -0
  162. data/test/workbook/worksheet/tc_comment.rb +57 -0
  163. data/test/workbook/worksheet/tc_comments.rb +57 -0
  164. data/test/workbook/worksheet/tc_conditional_formatting.rb +217 -0
  165. data/test/workbook/worksheet/tc_data_bar.rb +39 -0
  166. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  167. data/test/workbook/worksheet/tc_date_time_converter.rb +11 -5
  168. data/test/workbook/worksheet/tc_icon_set.rb +45 -0
  169. data/test/workbook/worksheet/tc_page_setup.rb +138 -0
  170. data/test/workbook/worksheet/tc_pane.rb +94 -0
  171. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  172. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  173. data/test/workbook/worksheet/tc_row.rb +44 -13
  174. data/test/workbook/worksheet/tc_selection.rb +94 -0
  175. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  176. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  177. data/test/workbook/worksheet/tc_worksheet.rb +147 -50
  178. metadata +216 -148
  179. data/examples/example.csv +0 -1000
  180. data/examples/example.rb~ +0 -112
  181. data/lib/axlsx/drawing/cat_axis_data.rb +0 -34
  182. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  183. data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
  184. data/lib/axlsx/drawing/named_axis_data.rb +0 -36
  185. data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
  186. data/lib/axlsx/drawing/val_axis_data.rb +0 -27
  187. data/lib/axlsx/stylesheet/#num_fmt.rb# +0 -69
  188. data/lib/axlsx/util/cbf.rb +0 -333
  189. data/lib/axlsx/util/cfb.rb~ +0 -201
  190. data/lib/axlsx/util/ms_off_crypto.rb +0 -189
  191. data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
  192. data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
  193. data/lib/axlsx/util/parser.rb~ +0 -6
  194. data/lib/axlsx/util/storage.rb~ +0 -0
  195. data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
  196. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  197. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  198. data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
  199. data/lib/schema/dc.xsd~ +0 -118
  200. data/lib/schema/dcterms.xsd~ +0 -331
  201. data/lib/schema/opc-coreProperties.xsd~ +0 -50
  202. data/test/#benchmark.txt# +0 -7
  203. data/test/#tc_helper.rb# +0 -3
  204. data/test/benchmark.rb~ +0 -0
  205. data/test/benchmark.txt +0 -6
  206. data/test/benchmark.txt~ +0 -6
  207. data/test/drawing/tc_val_axis_data.rb +0 -17
  208. data/test/example.csv +0 -1000
  209. data/test/example.xlsx +0 -0
  210. data/test/example_streamed.xlsx +0 -0
  211. data/test/tc_axlsx.rb~ +0 -0
  212. data/test/tc_helper.rb~ +0 -3
  213. data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
  214. data/test/workbook/worksheet/tc_col.rb~ +0 -10
@@ -8,15 +8,15 @@ class TestValidators < Test::Unit::TestCase
8
8
  def test_validators
9
9
  #unsigned_int
10
10
  assert_nothing_raised { Axlsx.validate_unsigned_int 1 }
11
- assert_nothing_raised { Axlsx.validate_unsigned_int +1 }
12
- assert_raise(ArgumentError) { Axlsx.validate_unsigned_int -1 }
13
- assert_raise(ArgumentError) { Axlsx.validate_unsigned_int '1' }
11
+ assert_nothing_raised { Axlsx.validate_unsigned_int(+1) }
12
+ assert_raise(ArgumentError) { Axlsx.validate_unsigned_int(-1)}
13
+ assert_raise(ArgumentError) { Axlsx.validate_unsigned_int('1') }
14
14
 
15
15
  #int
16
- assert_nothing_raised { Axlsx.validate_int 1 }
17
- assert_nothing_raised { Axlsx.validate_int -1 }
18
- assert_raise(ArgumentError) { Axlsx.validate_int 'a' }
19
- assert_raise(ArgumentError) { Axlsx.validate_int Array }
16
+ assert_nothing_raised { Axlsx.validate_int(1) }
17
+ assert_nothing_raised { Axlsx.validate_int(-1) }
18
+ assert_raise(ArgumentError) { Axlsx.validate_int('a')}
19
+ assert_raise(ArgumentError) { Axlsx.validate_int(Array) }
20
20
 
21
21
  #boolean (as 0 or 1, :true, :false, true, false, or "true," "false")
22
22
  [0,1,:true, :false, true, false, "true", "false"].each do |v|
@@ -70,6 +70,92 @@ class TestValidators < Test::Unit::TestCase
70
70
  assert_raise(ArgumentError) { Axlsx.validate_relationship_type "http://some.url" }
71
71
  assert_raise(ArgumentError) { Axlsx.validate_relationship_type false }
72
72
 
73
- end
74
- end
73
+ #number_with_unit
74
+ assert_nothing_raised { Axlsx.validate_number_with_unit "210mm" }
75
+ assert_nothing_raised { Axlsx.validate_number_with_unit "8.5in" }
76
+ assert_nothing_raised { Axlsx.validate_number_with_unit "29.7cm" }
77
+ assert_nothing_raised { Axlsx.validate_number_with_unit "120pt" }
78
+ assert_nothing_raised { Axlsx.validate_number_with_unit "0pc" }
79
+ assert_nothing_raised { Axlsx.validate_number_with_unit "12.34pi" }
80
+ assert_raise(ArgumentError) { Axlsx.validate_number_with_unit nil }
81
+ assert_raise(ArgumentError) { Axlsx.validate_number_with_unit "210" }
82
+ assert_raise(ArgumentError) { Axlsx.validate_number_with_unit 210 }
83
+ assert_raise(ArgumentError) { Axlsx.validate_number_with_unit "mm" }
84
+ assert_raise(ArgumentError) { Axlsx.validate_number_with_unit "-29cm" }
75
85
 
86
+ #scale_10_400
87
+ assert_nothing_raised { Axlsx.validate_scale_10_400 10 }
88
+ assert_nothing_raised { Axlsx.validate_scale_10_400 100 }
89
+ assert_nothing_raised { Axlsx.validate_scale_10_400 400 }
90
+ assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 9 }
91
+ assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 10.0 }
92
+ assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 400.1 }
93
+ assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 "99" }
94
+
95
+ #scale_0_10_400
96
+ assert_nothing_raised { Axlsx.validate_scale_0_10_400 0 }
97
+ assert_nothing_raised { Axlsx.validate_scale_0_10_400 10 }
98
+ assert_nothing_raised { Axlsx.validate_scale_0_10_400 100 }
99
+ assert_nothing_raised { Axlsx.validate_scale_0_10_400 400 }
100
+ assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 9 }
101
+ assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 10.0 }
102
+ assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 400.1 }
103
+ assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 "99" }
104
+
105
+ #page_orientation
106
+ assert_nothing_raised { Axlsx.validate_page_orientation :default }
107
+ assert_nothing_raised { Axlsx.validate_page_orientation :landscape }
108
+ assert_nothing_raised { Axlsx.validate_page_orientation :portrait }
109
+ assert_raise(ArgumentError) { Axlsx.validate_page_orientation nil }
110
+ assert_raise(ArgumentError) { Axlsx.validate_page_orientation 1 }
111
+ assert_raise(ArgumentError) { Axlsx.validate_page_orientation "landscape" }
112
+
113
+ #data_validation_error_style
114
+ [:information, :stop, :warning].each do |sym|
115
+ assert_nothing_raised { Axlsx.validate_data_validation_error_style sym }
116
+ end
117
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
118
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'warning' }
119
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
120
+
121
+ #data_validation_operator
122
+ [:lessThan, :lessThanOrEqual, :equal, :notEqual, :greaterThanOrEqual, :greaterThan, :between, :notBetween].each do |sym|
123
+ assert_nothing_raised { Axlsx.validate_data_validation_operator sym }
124
+ end
125
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
126
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'lessThan' }
127
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
128
+
129
+ #data_validation_type
130
+ [:custom, :data, :decimal, :list, :none, :textLength, :time, :whole].each do |sym|
131
+ assert_nothing_raised { Axlsx.validate_data_validation_type sym }
132
+ end
133
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
134
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'decimal' }
135
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
136
+
137
+ #sheet_view_type
138
+ [:normal, :page_break_preview, :page_layout].each do |sym|
139
+ assert_nothing_raised { Axlsx.validate_sheet_view_type sym }
140
+ end
141
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
142
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'page_layout' }
143
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
144
+
145
+ #active_pane_type
146
+ [:bottom_left, :bottom_right, :top_left, :top_right].each do |sym|
147
+ assert_nothing_raised { Axlsx.validate_pane_type sym }
148
+ end
149
+ assert_raise(ArgumentError) { Axlsx.validate_pane_type :other_symbol }
150
+ assert_raise(ArgumentError) { Axlsx.validate_pane_type 'bottom_left' }
151
+ assert_raise(ArgumentError) { Axlsx.validate_pane_type 0 }
152
+
153
+ #split_state_type
154
+ [:frozen, :frozen_split, :split].each do |sym|
155
+ assert_nothing_raised { Axlsx.validate_split_state_type sym }
156
+ end
157
+ assert_raise(ArgumentError) { Axlsx.validate_split_state_type :other_symbol }
158
+ assert_raise(ArgumentError) { Axlsx.validate_split_state_type 'frozen_split' }
159
+ assert_raise(ArgumentError) { Axlsx.validate_split_state_type 0 }
160
+ end
161
+ end
@@ -0,0 +1,41 @@
1
+ require 'tc_helper'
2
+
3
+ class TestDefinedNames < Test::Unit::TestCase
4
+ def setup
5
+ @dn = Axlsx::DefinedName.new('Sheet1!A1:A1')
6
+ end
7
+
8
+ def test_initialize
9
+ assert_equal('Sheet1!A1:A1', @dn.formula)
10
+ end
11
+
12
+ def test_string_attributes
13
+ Axlsx::DefinedName::STRING_ATTRIBUTES.each do |attr|
14
+ assert_raise(ArgumentError, 'only strings allowed in string attributes') { @dn.send("#{attr}=", 1) }
15
+ assert_nothing_raised { @dn.send("#{attr}=", '_xlnm.Sheet_Title') }
16
+ end
17
+ end
18
+
19
+ def test_boolean_attributes
20
+ Axlsx::DefinedName::BOOLEAN_ATTRIBUTES.each do |attr|
21
+ assert_raise(ArgumentError, 'only booleanish allowed in string attributes') { @dn.send("#{attr}=", 'foo') }
22
+ assert_nothing_raised { @dn.send("#{attr}=", 1) }
23
+ end
24
+
25
+ end
26
+
27
+ def test_local_sheet_id
28
+ assert_raise(ArgumentError, 'local_sheet_id must be an unsigned int') { @dn.local_sheet_id = -1 }
29
+ assert_nothing_raised { @dn.local_sheet_id = 1 }
30
+ end
31
+
32
+ def test_to_xml_string
33
+ assert_raise(ArgumentError, 'name is required for serialization') { @dn.to_xml_string }
34
+ @dn.name = '_xlnm.Print_Titles'
35
+ @dn.hidden = true
36
+ doc = Nokogiri::XML(@dn.to_xml_string)
37
+ assert(doc.xpath("//definedName[@name='_xlnm.Print_Titles']"))
38
+ assert(doc.xpath("//definedName[@hidden='true']"))
39
+ assert_equal('Sheet1!A1:A1', doc.xpath('//definedName').text)
40
+ end
41
+ end
@@ -24,7 +24,10 @@ class TestWorkbook < Test::Unit::TestCase
24
24
  assert_equal(Axlsx::Workbook.date1904, @wb.date1904)
25
25
  end
26
26
 
27
-
27
+ def test_add_defined_name
28
+ @wb.add_defined_name 'Sheet1!1:1', :name => '_xlnm.Print_Titles', :hidden => true
29
+ assert_equal(1, @wb.defined_names.size)
30
+ end
28
31
 
29
32
  def test_shared_strings
30
33
  assert_equal(@wb.use_shared_strings, nil)
@@ -72,14 +75,13 @@ class TestWorkbook < Test::Unit::TestCase
72
75
  assert(@wb.worksheets.size == 1)
73
76
  end
74
77
 
75
-
76
78
  def test_to_xml_string_defined_names
77
79
  @wb.add_worksheet do |sheet|
78
80
  sheet.add_row [1, "two"]
79
81
  sheet.auto_filter = "A1:B1"
80
82
  end
81
83
  doc = Nokogiri::XML(@wb.to_xml_string)
82
- assert_equal(doc.xpath('//xmlns:workbook/xmlns:definedNames/xmlns:definedName').inner_text, @wb.worksheets[0].abs_auto_filter)
84
+ assert_equal(doc.xpath('//xmlns:workbook/xmlns:definedNames/xmlns:definedName').inner_text, @wb.worksheets[0].auto_filter.defined_name)
83
85
  end
84
86
 
85
87
 
@@ -25,26 +25,18 @@ class TestTable < Test::Unit::TestCase
25
25
 
26
26
  end
27
27
 
28
- def test_charts
29
- assert(@ws.drawing.charts.empty?)
30
- chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
31
- assert_equal(@ws.drawing.charts.last, chart, "add chart is returned")
32
- chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
33
- assert_equal(@ws.drawing.charts.last, chart, "add chart is returned")
34
- end
35
-
36
28
  def test_pn
37
- table = @ws.add_table("A1:D5")
29
+ @ws.add_table("A1:D5")
38
30
  assert_equal(@ws.tables.first.pn, "tables/table1.xml")
39
31
  end
40
32
 
41
33
  def test_rId
42
- table = @ws.add_table("A1:D5")
34
+ @ws.add_table("A1:D5")
43
35
  assert_equal(@ws.tables.first.rId, "rId1")
44
36
  end
45
37
 
46
38
  def test_index
47
- table = @ws.add_table("A1:D5")
39
+ @ws.add_table("A1:D5")
48
40
  assert_equal(@ws.tables.first.index, @ws.workbook.tables.index(@ws.tables.first))
49
41
  end
50
42
 
@@ -33,7 +33,7 @@ class TestCell < Test::Unit::TestCase
33
33
  assert_equal(@c.index, @row.cells.index(@c))
34
34
  end
35
35
 
36
- def test_index
36
+ def test_pos
37
37
  assert_equal(@c.pos, [@c.index, @c.row.index])
38
38
  end
39
39
 
@@ -197,31 +197,17 @@ class TestCell < Test::Unit::TestCase
197
197
  end
198
198
 
199
199
  def test_merge_with_string
200
- assert_equal(@c.row.worksheet.merged_cells.size, 0)
201
200
  @c.row.add_cell 2
202
201
  @c.row.add_cell 3
203
202
  @c.merge "A2"
204
- assert_equal(@c.row.worksheet.merged_cells.last, "A1:A2")
203
+ assert_equal(@c.row.worksheet.send(:merged_cells).last, "A1:A2")
205
204
  end
206
205
 
207
206
  def test_merge_with_cell
208
- assert_equal(@c.row.worksheet.merged_cells.size, 0)
209
207
  @c.row.add_cell 2
210
208
  @c.row.add_cell 3
211
209
  @c.merge @row.cells.last
212
- assert_equal(@c.row.worksheet.merged_cells.last, "A1:C1")
213
- end
214
-
215
- def test_equality
216
- c2 = @row.add_cell 1, :type=>:float, :style=>1
217
-
218
- assert_equal(c2.shareable_hash,@c.shareable_hash)
219
- c3 = @row.add_cell 2, :type=>:float, :style=>1
220
- c4 = @row.add_cell 1, :type=>:float, :style=>1, :color => "#FFFFFFFF"
221
- assert_equal(c4.shareable_hash == c2.shareable_hash,false)
222
- c5 = @row.add_cell 1, :type=>:float, :style=>1, :color => "#FFFFFFFF"
223
- assert_equal(c5.shareable_hash, c4.shareable_hash)
224
-
210
+ assert_equal(@c.row.worksheet.send(:merged_cells).last, "A1:C1")
225
211
  end
226
212
 
227
213
  def test_ssti
@@ -230,13 +216,61 @@ class TestCell < Test::Unit::TestCase
230
216
  assert_equal(@c.ssti, 1)
231
217
  end
232
218
 
219
+ def test_plain_string
220
+ @c.type = :integer
221
+ assert_equal(@c.plain_string?, false)
222
+
223
+ @c.type = :string
224
+ @c.value = 'plain string'
225
+ assert_equal(@c.plain_string?, true)
226
+
227
+ @c.value = nil
228
+ assert_equal(@c.plain_string?, false)
229
+
230
+ @c.value = ''
231
+ assert_equal(@c.plain_string?, false)
232
+
233
+ @c.value = '=sum'
234
+ assert_equal(@c.plain_string?, false)
235
+
236
+ @c.value = 'plain string'
237
+ @c.font_name = 'Arial'
238
+ assert_equal(@c.plain_string?, false)
239
+ end
240
+
233
241
  def test_to_xml_string
234
242
  c_xml = Nokogiri::XML(@c.to_xml_string(1,1))
235
243
  assert_equal(c_xml.xpath("/c[@s=1]").size, 1)
236
244
  end
245
+
246
+ def test_to_xml_string_nil
247
+ @c.value = nil
248
+ c_xml = Nokogiri::XML(@c.to_xml_string(1,1))
249
+ assert_equal(c_xml.xpath("/c[@s=1]").size, 1)
250
+ end
251
+
252
+ def test_to_xml_string_with_run
253
+ @c.b = true
254
+ @c.type = :string
255
+ @c.value = "a"
256
+ @c.font_name = 'arial'
257
+ @c.color = 'FF0000'
258
+ c_xml = Nokogiri::XML(@c.to_xml_string(1,1))
259
+ assert(c_xml.xpath("//b"))
260
+ end
261
+ def test_to_xml_string_formula
262
+ p = Axlsx::Package.new
263
+ ws = p.workbook.add_worksheet do |sheet|
264
+ sheet.add_row ["=IF(2+2=4,4,5)"]
265
+ end
266
+ doc = Nokogiri::XML(ws.to_xml_string)
267
+ assert(doc.xpath("//f[@text()='IF(2+2=4,4,5)']"))
268
+
269
+ end
270
+
237
271
  def test_to_xml
238
272
  # TODO This could use some much more stringent testing related to the xml content generated!
239
- row = @ws.add_row [Time.now, Date.today, true, 1, 1.0, "text", "=sum(A1:A2)"]
273
+ @ws.add_row [Time.now, Date.today, true, 1, 1.0, "text", "=sum(A1:A2)"]
240
274
  schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
241
275
  doc = Nokogiri::XML(@ws.to_xml_string)
242
276
  errors = []
@@ -0,0 +1,31 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestCfvo < Test::Unit::TestCase
4
+ def setup
5
+ @cfvo = Axlsx::Cfvo.new(:val => "0", :type => :min)
6
+ end
7
+
8
+ def test_val
9
+ assert_nothing_raised { @cfvo.val = "abc" }
10
+ assert_equal(@cfvo.val, "abc")
11
+ end
12
+
13
+ def test_type
14
+ assert_raise(ArgumentError) { @cfvo.type = :invalid_type }
15
+ assert_nothing_raised { @cfvo.type = :max }
16
+ assert_equal(@cfvo.type, :max)
17
+ end
18
+
19
+ def test_gte
20
+ assert_raise(ArgumentError) { @cfvo.gte = :bob }
21
+ assert_equal(@cfvo.gte, true)
22
+ assert_nothing_raised { @cfvo.gte = false }
23
+ assert_equal(@cfvo.gte, false)
24
+ end
25
+
26
+ def test_to_xml_string
27
+ doc = Nokogiri::XML.parse(@cfvo.to_xml_string)
28
+ assert doc.xpath(".//cfvo[@type='min'][@val=0][@gte=true]")
29
+ end
30
+
31
+ end
@@ -6,6 +6,13 @@ class TestCol < Test::Unit::TestCase
6
6
  @col = Axlsx::Col.new 1, 1
7
7
  end
8
8
 
9
+ def test_initialize
10
+ options = { :width => 12, :collapsed => true, :hidden => true, :outlineLevel => 1, :phonetic => true, :style => 1}
11
+
12
+ col = Axlsx::Col.new 0, 0, options
13
+ options.each{ |key, value| assert_equal(col.send(key.to_sym), value) }
14
+ end
15
+
9
16
  def test_min_max_required
10
17
  assert_raise(ArgumentError, 'min and max must be specified when creating a new column') { Axlsx::Col.new }
11
18
  assert_raise(ArgumentError, 'min and max must be specified when creating a new column') { Axlsx::Col.new nil, nil }
@@ -53,6 +60,8 @@ class TestCol < Test::Unit::TestCase
53
60
 
54
61
  def test_style
55
62
  assert_equal(@col.style, nil)
63
+ @col.style = 1
64
+ assert_equal(@col.style, 1)
56
65
  #TODO check that the style specified is actually in the styles xfs collection
57
66
  end
58
67
 
@@ -0,0 +1,29 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestColorScale < Test::Unit::TestCase
4
+ def setup
5
+ @color_scale = Axlsx::ColorScale.new
6
+ end
7
+
8
+ def test_add
9
+ @color_scale.add :type => :max, :val => 5, :color => "FFDEDEDE"
10
+ assert_equal(@color_scale.value_objects.size,3)
11
+ assert_equal(@color_scale.colors.size,3)
12
+ end
13
+
14
+ def test_delete_at
15
+ assert_raise(ArgumentError, "minimum two are protected") { @color_scale.delete_at 0 }
16
+ assert_raise(ArgumentError, "minimum two are protected") { @color_scale.delete_at 1 }
17
+ @color_scale.add :type => :max, :val => 5, :color => "FFDEDEDE"
18
+ assert_nothing_raised {@color_scale.delete_at 2}
19
+ assert_equal(@color_scale.value_objects.size,2)
20
+ assert_equal(@color_scale.colors.size,2)
21
+ end
22
+
23
+ def test_to_xml_string
24
+ doc = Nokogiri::XML.parse(@color_scale.to_xml_string)
25
+ assert_equal(doc.xpath(".//colorScale//cfvo").size, 2)
26
+ assert_equal(doc.xpath(".//colorScale//color").size, 2)
27
+ end
28
+
29
+ end
@@ -0,0 +1,57 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestComment < 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_initailize
13
+ assert_raise(ArgumentError) { Axlsx::Comment.new }
14
+ end
15
+
16
+ def test_author
17
+ assert(@c1.author == 'crank')
18
+ assert(@c2.author == 'PO')
19
+ end
20
+
21
+ def test_text
22
+ assert(@c1.text == 'penut machine')
23
+ assert(@c2.text == 'rust bucket')
24
+ end
25
+
26
+ def test_author_index
27
+ assert_equal(@c1.author_index, 1)
28
+ assert_equal(@c2.author_index, 0)
29
+ end
30
+
31
+ def test_ref
32
+ assert(@c1.ref == 'A1')
33
+ assert(@c2.ref == 'C3')
34
+ end
35
+
36
+ def test_vml_shape
37
+ pos = Axlsx::name_to_indices(@c1.ref)
38
+ assert(@c1.vml_shape.is_a?(Axlsx::VmlShape))
39
+ assert(@c1.vml_shape.column == pos[0])
40
+ assert(@c1.vml_shape.row == pos[1])
41
+ assert(@c1.vml_shape.row == pos[1])
42
+ assert_equal(pos[0], @c1.vml_shape.left_column)
43
+ assert(@c1.vml_shape.top_row == pos[1])
44
+ assert_equal(pos[0] + 2 , @c1.vml_shape.right_column)
45
+ assert(@c1.vml_shape.bottom_row == pos[1]+4)
46
+ end
47
+
48
+ def to_xml_string
49
+ doc = Nokogiri::XML(@c1.to_xml_string)
50
+ assert_equal(doc.xpath("//comment[@ref='#{@c1.ref}']").size, 1)
51
+ assert_equal(doc.xpath("//comment[@authorId='#{@c1.author_index.to}']").size, 1)
52
+ assert_equal(doc.xpath("//t[text()='#{@c1.author}']").size, 1)
53
+ assert_equal(doc.xpath("//t[text()='#{@c1.text}']").size, 1)
54
+ end
55
+
56
+ end
57
+
@@ -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
+