axlsx 2.1.0.pre → 3.0.0.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/README.md +17 -20
  4. data/Rakefile +0 -1
  5. data/examples/conditional_formatting/example_conditional_formatting.rb +15 -0
  6. data/examples/example.rb +31 -1
  7. data/lib/axlsx.rb +9 -4
  8. data/lib/axlsx/drawing/area_chart.rb +99 -0
  9. data/lib/axlsx/drawing/area_series.rb +110 -0
  10. data/lib/axlsx/drawing/bar_chart.rb +143 -0
  11. data/lib/axlsx/drawing/chart.rb +8 -1
  12. data/lib/axlsx/drawing/d_lbls.rb +3 -3
  13. data/lib/axlsx/drawing/drawing.rb +3 -0
  14. data/lib/axlsx/drawing/line_series.rb +18 -1
  15. data/lib/axlsx/drawing/num_val.rb +3 -1
  16. data/lib/axlsx/drawing/one_cell_anchor.rb +2 -1
  17. data/lib/axlsx/drawing/pic.rb +24 -17
  18. data/lib/axlsx/drawing/scaling.rb +2 -2
  19. data/lib/axlsx/drawing/scatter_series.rb +16 -2
  20. data/lib/axlsx/drawing/str_val.rb +3 -1
  21. data/lib/axlsx/drawing/title.rb +19 -1
  22. data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
  23. data/lib/axlsx/drawing/view_3D.rb +2 -2
  24. data/lib/axlsx/package.rb +7 -16
  25. data/lib/axlsx/rels/relationships.rb +5 -2
  26. data/lib/axlsx/stylesheet/num_fmt.rb +9 -0
  27. data/lib/axlsx/stylesheet/styles.rb +1 -1
  28. data/lib/axlsx/util/constants.rb +8 -5
  29. data/lib/axlsx/util/mime_type_utils.rb +11 -0
  30. data/lib/axlsx/util/simple_typed_list.rb +1 -1
  31. data/lib/axlsx/util/validators.rb +14 -9
  32. data/lib/axlsx/version.rb +1 -1
  33. data/lib/axlsx/workbook/workbook.rb +19 -1
  34. data/lib/axlsx/workbook/workbook_view.rb +5 -3
  35. data/lib/axlsx/workbook/worksheet/cell.rb +26 -19
  36. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +15 -5
  37. data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -0
  38. data/lib/axlsx/workbook/worksheet/cols.rb +5 -2
  39. data/lib/axlsx/workbook/worksheet/merged_cells.rb +2 -0
  40. data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
  41. data/lib/axlsx/workbook/worksheet/pivot_table.rb +36 -13
  42. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +4 -1
  43. data/lib/axlsx/workbook/worksheet/rich_text.rb +23 -3
  44. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +28 -32
  45. data/lib/axlsx/workbook/worksheet/row.rb +7 -0
  46. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +21 -3
  47. data/lib/axlsx/workbook/worksheet/tables.rb +3 -0
  48. data/lib/axlsx/workbook/worksheet/worksheet.rb +8 -51
  49. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
  50. data/test/axlsx.qcachegrind +2226 -0
  51. data/test/drawing/tc_area_chart.rb +39 -0
  52. data/test/drawing/tc_area_series.rb +71 -0
  53. data/test/drawing/tc_bar_chart.rb +71 -0
  54. data/test/drawing/tc_chart.rb +23 -10
  55. data/test/drawing/tc_drawing.rb +2 -2
  56. data/test/drawing/tc_line_series.rb +38 -5
  57. data/test/drawing/tc_pic.rb +11 -19
  58. data/test/drawing/tc_scatter_series.rb +16 -5
  59. data/test/drawing/tc_str_val.rb +9 -0
  60. data/test/drawing/tc_title.rb +5 -0
  61. data/test/stylesheet/tc_styles.rb +2 -2
  62. data/test/tc_axlsx.rb +31 -0
  63. data/test/tc_helper.rb +3 -1
  64. data/test/tc_package.rb +12 -0
  65. data/test/util/tc_mime_type_utils.rb +13 -0
  66. data/test/util/tc_simple_typed_list.rb +1 -1
  67. data/test/util/tc_validators.rb +34 -10
  68. data/test/workbook/tc_shared_strings_table.rb +16 -1
  69. data/test/workbook/tc_workbook.rb +22 -1
  70. data/test/workbook/worksheet/tc_cell.rb +53 -11
  71. data/test/workbook/worksheet/tc_outline_pr.rb +19 -0
  72. data/test/workbook/worksheet/tc_pivot_table.rb +21 -6
  73. data/test/workbook/worksheet/tc_rich_text_run.rb +11 -11
  74. data/test/workbook/worksheet/tc_row.rb +5 -0
  75. data/test/workbook/worksheet/tc_sheet_pr.rb +26 -4
  76. data/test/workbook/worksheet/tc_table.rb +2 -3
  77. data/test/workbook/worksheet/tc_worksheet.rb +53 -38
  78. metadata +72 -20
  79. data/examples/IMAGE1UP.JPEG +0 -0
  80. data/lib/axlsx/util/string.rb +0 -7
@@ -19,6 +19,11 @@ class TestTitle < Test::Unit::TestCase
19
19
  assert(@title.cell == nil)
20
20
  end
21
21
 
22
+ def test_initialize_title_size
23
+ title = Axlsx::Title.new 'bob', 90
24
+ assert_equal "90", title.text_size
25
+ end
26
+
22
27
  def test_text
23
28
  assert_raise(ArgumentError, "text must be a string") { @title.text = 123 }
24
29
  @title.cell = @row.cells.first
@@ -133,7 +133,7 @@ class TestStyles < Test::Unit::TestCase
133
133
  :font_name => "woot font"
134
134
  }
135
135
  assert_equal(@styles.parse_font_options {}, nil, "noop if no font keys are set")
136
- assert_equal(@styles.parse_font_options(:b=>1).class, Fixnum, "return index of font if not :dxf type")
136
+ assert(@styles.parse_font_options(:b=>1).is_a?(Integer), "return index of font if not :dxf type")
137
137
  assert_equal(@styles.parse_font_options(:b=>1, :type => :dxf).class, Axlsx::Font, "return font object if :dxf type")
138
138
 
139
139
  f = @styles.parse_font_options(options.merge(:type => :dxf))
@@ -147,7 +147,7 @@ class TestStyles < Test::Unit::TestCase
147
147
 
148
148
  def test_parse_fill_options
149
149
  assert_equal(@styles.parse_fill_options {}, nil, "noop if no fill keys are set")
150
- assert_equal(@styles.parse_fill_options(:bg_color => "DE").class, Fixnum, "return index of fill if not :dxf type")
150
+ assert(@styles.parse_fill_options(:bg_color => "DE").is_a?(Integer), "return index of fill if not :dxf type")
151
151
  assert_equal(@styles.parse_fill_options(:bg_color => "DE", :type => :dxf).class, Axlsx::Fill, "return fill object if :dxf type")
152
152
  f = @styles.parse_fill_options(:bg_color => "DE", :type => :dxf)
153
153
  assert(f.fill_type.bgColor.rgb == "FFDEDEDE")
@@ -45,6 +45,16 @@ class TestAxlsx < Test::Unit::TestCase
45
45
  assert_equal(Axlsx.cell_range([c2, c1], true), "'Sheet &lt;''&gt;&quot; 1'!$A$1:$B$1")
46
46
  end
47
47
 
48
+ def test_cell_range_row
49
+ p = Axlsx::Package.new
50
+ ws = p.workbook.add_worksheet
51
+ row = ws.add_row
52
+ row.add_cell
53
+ row.add_cell
54
+ row.add_cell
55
+ assert_equal("A1:C1", Axlsx.cell_range(row, false))
56
+ end
57
+
48
58
  def test_name_to_indices
49
59
  setup_wide
50
60
  @wide_test_points.each do |key, value|
@@ -69,4 +79,25 @@ class TestAxlsx < Test::Unit::TestCase
69
79
  assert_equal([['Z5', 'AA5', 'AB5'], ['Z6', 'AA6', 'AB6']], Axlsx::range_to_a('Z5:AB6'))
70
80
  end
71
81
 
82
+ def test_sanitize_frozen_control_strippped
83
+ needs_sanitize = "legit\x08".freeze # Backspace control char
84
+
85
+ assert_equal(Axlsx.sanitize(needs_sanitize), 'legit', 'should strip control chars')
86
+ end
87
+
88
+ def test_sanitize_unfrozen_control_strippped
89
+ needs_sanitize = "legit\x08" # Backspace control char
90
+ sanitized_str = Axlsx.sanitize(needs_sanitize)
91
+
92
+ assert_equal(sanitized_str, 'legit', 'should strip control chars')
93
+ assert_equal(sanitized_str.object_id, sanitized_str.object_id, 'should preserve object')
94
+ end
95
+
96
+ def test_sanitize_unfrozen_no_sanitize
97
+ legit_str = 'legit'
98
+ sanitized_str = Axlsx.sanitize(legit_str)
99
+
100
+ assert_equal(sanitized_str, legit_str, 'should preserve value')
101
+ assert_equal(sanitized_str.object_id, legit_str.object_id, 'should preserve object')
102
+ end
72
103
  end
@@ -7,4 +7,6 @@ end
7
7
 
8
8
  require 'test/unit'
9
9
  require "timecop"
10
- require "axlsx.rb"
10
+ require "axlsx.rb"
11
+ # MIME detection for Microsoft Office 2007+ formats
12
+ require 'mimemagic/overlay'
@@ -7,6 +7,12 @@ class TestPackage < Test::Unit::TestCase
7
7
  ws = @package.workbook.add_worksheet
8
8
  ws.add_row ['Can', 'we', 'build it?']
9
9
  ws.add_row ['Yes!', 'We', 'can!']
10
+ @rt = Axlsx::RichText.new
11
+ @rt.add_run "run 1", :b => true, :i => false
12
+ ws.add_row [@rt]
13
+
14
+ ws.rows.last.add_cell('b', :type => :text)
15
+
10
16
  ws.outline_level_rows 0, 1
11
17
  ws.outline_level_columns 0, 1
12
18
  ws.add_hyperlink :ref => ws.rows.first.cells.last, :location => 'https://github.com/randym'
@@ -154,6 +160,11 @@ class TestPackage < Test::Unit::TestCase
154
160
  assert package_1.to_stream.string == package_2.to_stream.string, "zip files are not identical"
155
161
  end
156
162
 
163
+ def test_serialization_creates_files_with_excel_mime_type
164
+ assert_equal(MimeMagic.by_magic(@package.to_stream).type,
165
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
166
+ end
167
+
157
168
  def test_validation
158
169
  assert_equal(@package.validate.size, 0, @package.validate)
159
170
  Axlsx::Workbook.send(:class_variable_set, :@@date1904, 9900)
@@ -188,6 +199,7 @@ class TestPackage < Test::Unit::TestCase
188
199
 
189
200
  def test_shared_strings_requires_part
190
201
  @package.use_shared_strings = true
202
+ @package.to_stream #ensure all cell_serializer paths are hit
191
203
  p = @package.send(:parts)
192
204
  assert_equal(p.select{ |part| part[:entry] =~/xl\/sharedStrings.xml/}.size, 1, "shared strings table missing")
193
205
  end
@@ -0,0 +1,13 @@
1
+ require 'tc_helper.rb'
2
+ class TestMimeTypeUtils < Test::Unit::TestCase
3
+ def setup
4
+ @test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
5
+ end
6
+
7
+ def teardown
8
+ end
9
+
10
+ def test_mime_type_utils
11
+ assert_equal(Axlsx::MimeTypeUtils::get_mime_type(@test_img), 'image/jpeg')
12
+ end
13
+ end
@@ -1,7 +1,7 @@
1
1
  require 'tc_helper.rb'
2
2
  class TestSimpleTypedList < Test::Unit::TestCase
3
3
  def setup
4
- @list = Axlsx::SimpleTypedList.new Fixnum
4
+ @list = Axlsx::SimpleTypedList.new Integer
5
5
  end
6
6
 
7
7
  def teardown
@@ -91,7 +91,7 @@ class TestValidators < Test::Unit::TestCase
91
91
  assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 10.0 }
92
92
  assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 400.1 }
93
93
  assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 "99" }
94
-
94
+
95
95
  #scale_0_10_400
96
96
  assert_nothing_raised { Axlsx.validate_scale_0_10_400 0 }
97
97
  assert_nothing_raised { Axlsx.validate_scale_0_10_400 10 }
@@ -101,7 +101,7 @@ class TestValidators < Test::Unit::TestCase
101
101
  assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 10.0 }
102
102
  assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 400.1 }
103
103
  assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 "99" }
104
-
104
+
105
105
  #page_orientation
106
106
  assert_nothing_raised { Axlsx.validate_page_orientation :default }
107
107
  assert_nothing_raised { Axlsx.validate_page_orientation :landscape }
@@ -109,7 +109,7 @@ class TestValidators < Test::Unit::TestCase
109
109
  assert_raise(ArgumentError) { Axlsx.validate_page_orientation nil }
110
110
  assert_raise(ArgumentError) { Axlsx.validate_page_orientation 1 }
111
111
  assert_raise(ArgumentError) { Axlsx.validate_page_orientation "landscape" }
112
-
112
+
113
113
  #data_validation_error_style
114
114
  [:information, :stop, :warning].each do |sym|
115
115
  assert_nothing_raised { Axlsx.validate_data_validation_error_style sym }
@@ -117,7 +117,7 @@ class TestValidators < Test::Unit::TestCase
117
117
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
118
118
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'warning' }
119
119
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
120
-
120
+
121
121
  #data_validation_operator
122
122
  [:lessThan, :lessThanOrEqual, :equal, :notEqual, :greaterThanOrEqual, :greaterThan, :between, :notBetween].each do |sym|
123
123
  assert_nothing_raised { Axlsx.validate_data_validation_operator sym }
@@ -125,7 +125,7 @@ class TestValidators < Test::Unit::TestCase
125
125
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
126
126
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'lessThan' }
127
127
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
128
-
128
+
129
129
  #data_validation_type
130
130
  [:custom, :data, :decimal, :list, :none, :textLength, :time, :whole].each do |sym|
131
131
  assert_nothing_raised { Axlsx.validate_data_validation_type sym }
@@ -133,7 +133,7 @@ class TestValidators < Test::Unit::TestCase
133
133
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
134
134
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'decimal' }
135
135
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
136
-
136
+
137
137
  #sheet_view_type
138
138
  [:normal, :page_break_preview, :page_layout].each do |sym|
139
139
  assert_nothing_raised { Axlsx.validate_sheet_view_type sym }
@@ -141,7 +141,7 @@ class TestValidators < Test::Unit::TestCase
141
141
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
142
142
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'page_layout' }
143
143
  assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
144
-
144
+
145
145
  #active_pane_type
146
146
  [:bottom_left, :bottom_right, :top_left, :top_right].each do |sym|
147
147
  assert_nothing_raised { Axlsx.validate_pane_type sym }
@@ -149,7 +149,7 @@ class TestValidators < Test::Unit::TestCase
149
149
  assert_raise(ArgumentError) { Axlsx.validate_pane_type :other_symbol }
150
150
  assert_raise(ArgumentError) { Axlsx.validate_pane_type 'bottom_left' }
151
151
  assert_raise(ArgumentError) { Axlsx.validate_pane_type 0 }
152
-
152
+
153
153
  #split_state_type
154
154
  [:frozen, :frozen_split, :split].each do |sym|
155
155
  assert_nothing_raised { Axlsx.validate_split_state_type sym }
@@ -157,8 +157,32 @@ class TestValidators < Test::Unit::TestCase
157
157
  assert_raise(ArgumentError) { Axlsx.validate_split_state_type :other_symbol }
158
158
  assert_raise(ArgumentError) { Axlsx.validate_split_state_type 'frozen_split' }
159
159
  assert_raise(ArgumentError) { Axlsx.validate_split_state_type 0 }
160
+
161
+ #display_blanks_as
162
+ [:gap, :span, :zero].each do |sym|
163
+ assert_nothing_raised { Axlsx.validate_display_blanks_as sym }
164
+ end
165
+ assert_raise(ArgumentError) { Axlsx.validate_display_blanks_as :other_symbol }
166
+ assert_raise(ArgumentError) { Axlsx.validate_display_blanks_as 'other_blank' }
167
+ assert_raise(ArgumentError) { Axlsx.validate_display_blanks_as 0 }
168
+
169
+ #view_visibility
170
+ [:visible, :hidden, :very_hidden].each do |sym|
171
+ assert_nothing_raised { Axlsx.validate_view_visibility sym }
172
+ end
173
+ assert_raise(ArgumentError) { Axlsx.validate_view_visibility :other_symbol }
174
+ assert_raise(ArgumentError) { Axlsx.validate_view_visibility 'other_visibility' }
175
+ assert_raise(ArgumentError) { Axlsx.validate_view_visibility 0 }
176
+
177
+ #marker_symbol
178
+ [:default, :circle, :dash, :diamond, :dot, :picture, :plus, :square, :star, :triangle, :x].each do |sym|
179
+ assert_nothing_raised { Axlsx.validate_marker_symbol sym }
180
+ end
181
+ assert_raise(ArgumentError) { Axlsx.validate_marker_symbol :other_symbol }
182
+ assert_raise(ArgumentError) { Axlsx.validate_marker_symbol 'other_marker' }
183
+ assert_raise(ArgumentError) { Axlsx.validate_marker_symbol 0 }
160
184
  end
161
-
185
+
162
186
  def test_validate_integerish
163
187
  assert_raise(ArgumentError) { Axlsx.validate_integerish Axlsx }
164
188
  [1, 1.4, "a"].each { |test_value| assert_nothing_raised { Axlsx.validate_integerish test_value } }
@@ -179,7 +203,7 @@ class TestValidators < Test::Unit::TestCase
179
203
 
180
204
  def test_range_validation
181
205
  # exclusive
182
- assert_raise(ArgumentError) { Axlsx::RangeValidator.validate('foo', 1, 10, 10, false) }
206
+ assert_raise(ArgumentError) { Axlsx::RangeValidator.validate('foo', 1, 10, 10, false) }
183
207
  # inclusive by default
184
208
  assert_nothing_raised { Axlsx::RangeValidator.validate('foo', 1, 10, 10) }
185
209
  end
@@ -4,10 +4,12 @@ class TestSharedStringsTable < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  @p = Axlsx::Package.new :use_shared_strings=>true
7
+
7
8
  ws = @p.workbook.add_worksheet
8
9
  ws.add_row ['a', 1, 'b']
9
10
  ws.add_row ['b', 1, 'c']
10
11
  ws.add_row ['c', 1, 'd']
12
+ ws.rows.last.add_cell('b', :type => :text)
11
13
  end
12
14
 
13
15
  def test_workbook_has_shared_strings
@@ -16,7 +18,7 @@ class TestSharedStringsTable < Test::Unit::TestCase
16
18
 
17
19
  def test_count
18
20
  sst = @p.workbook.shared_strings
19
- assert_equal(sst.count, 6)
21
+ assert_equal(sst.count, 7)
20
22
  end
21
23
 
22
24
  def test_unique_count
@@ -41,4 +43,17 @@ class TestSharedStringsTable < Test::Unit::TestCase
41
43
  assert_equal(errors.size, 0, "sharedStirngs.xml Invalid" + errors.map{ |e| e.message }.to_s)
42
44
  end
43
45
 
46
+ def test_remove_control_characters_in_xml_serialization
47
+ nasties = "hello\x10\x00\x1C\x1Eworld"
48
+ @p.workbook.worksheets[0].add_row [nasties]
49
+
50
+ # test that the nasty string was added to the shared strings
51
+ assert @p.workbook.shared_strings.unique_cells.has_key?(nasties)
52
+
53
+ # test that none of the control characters are in the XML output for shared strings
54
+ assert_no_match(/#{Axlsx::CONTROL_CHARS}/, @p.workbook.shared_strings.to_xml_string)
55
+
56
+ # assert that the shared string was normalized to remove the control characters
57
+ assert_not_nil @p.workbook.shared_strings.to_xml_string.index("helloworld")
58
+ end
44
59
  end
@@ -33,6 +33,12 @@ class TestWorkbook < Test::Unit::TestCase
33
33
  assert_equal(@wb.use_autowidth, false)
34
34
  end
35
35
 
36
+ def test_is_reversed
37
+ assert_equal(@wb.is_reversed, nil)
38
+ assert_raise(ArgumentError) {@wb.is_reversed = 0.1}
39
+ assert_nothing_raised {@wb.is_reversed = true }
40
+ assert_equal(@wb.use_autowidth, true)
41
+ end
36
42
 
37
43
  def test_sheet_by_name_retrieval
38
44
  @wb.add_worksheet(:name=>'foo')
@@ -98,7 +104,16 @@ class TestWorkbook < Test::Unit::TestCase
98
104
  end
99
105
  assert(errors.empty?, "error free validation")
100
106
  end
101
- def test_range_requires__valid_sheet
107
+
108
+ def test_to_xml_reversed
109
+ @wb.is_reversed = true
110
+ @wb.add_worksheet(:name => 'first')
111
+ second = @wb.add_worksheet(:name => 'second')
112
+ doc = Nokogiri::XML(@wb.to_xml_string)
113
+ assert_equal second.name, doc.xpath('//xmlns:workbook/xmlns:sheets/*[1]/@name').to_s
114
+ end
115
+
116
+ def test_range_requires_valid_sheet
102
117
  ws = @wb.add_worksheet :name=>'fish'
103
118
  ws.add_row [1,2,3]
104
119
  ws.add_row [4,5,6]
@@ -136,4 +151,10 @@ class TestWorkbook < Test::Unit::TestCase
136
151
  doc = Nokogiri::XML(@wb.to_xml_string)
137
152
  assert_equal pivot_table.cache_definition.rId, doc.xpath("//xmlns:pivotCache").first["r:id"]
138
153
  end
154
+
155
+ def test_worksheet_name_is_intact_after_serialized_into_xml
156
+ sheet = @wb.add_worksheet(:name => '_Example')
157
+ wb_xml = Nokogiri::XML(@wb.to_xml_string)
158
+ assert_equal sheet.name, wb_xml.xpath('//xmlns:workbook/xmlns:sheets/*[1]/@name').to_s
159
+ end
139
160
  end
@@ -4,6 +4,7 @@ class TestCell < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  p = Axlsx::Package.new
7
+ p.use_shared_strings = true
7
8
  @ws = p.workbook.add_worksheet :name=>"hmmm"
8
9
  p.workbook.styles.add_style :sz=>20
9
10
  @row = @ws.add_row
@@ -56,6 +57,19 @@ class TestCell < Test::Unit::TestCase
56
57
  assert_equal('foo', @ws.workbook.defined_names.last.name)
57
58
  end
58
59
 
60
+ def test_autowidth
61
+ style = @c.row.worksheet.workbook.styles.add_style({:alignment => {:horizontal => :center, :vertical => :center, :wrap_text => true}} )
62
+ @c.style = style
63
+ assert_equal(@c.autowidth, 5.5)
64
+ end
65
+
66
+ def test_time
67
+ @c.type = :time
68
+ now = DateTime.now
69
+ @c.value = now
70
+ assert_equal(@c.value, now.to_time)
71
+ end
72
+
59
73
  def test_style
60
74
  assert_raise(ArgumentError, "must reject invalid style indexes") { @c.style=@c.row.worksheet.workbook.styles.cellXfs.size }
61
75
  assert_nothing_raised("must allow valid style index changes") {@c.style=1}
@@ -119,6 +133,19 @@ class TestCell < Test::Unit::TestCase
119
133
  assert_equal("2012-10-10T12:24", @c.send(:cast_value, "2012-10-10T12:24"))
120
134
  end
121
135
 
136
+ def test_cast_time_subclass
137
+ subtime = Class.new(Time) do
138
+ def to_time
139
+ raise "#to_time of Time subclass should not be called"
140
+ end
141
+ end
142
+
143
+ time = subtime.now
144
+
145
+ @c.type = :time
146
+ assert_equal(time, @c.send(:cast_value, time))
147
+ end
148
+
122
149
  def test_color
123
150
  assert_raise(ArgumentError) { @c.color = -1.1 }
124
151
  assert_nothing_raised { @c.color = "FF00FF00" }
@@ -225,7 +252,7 @@ class TestCell < Test::Unit::TestCase
225
252
  @c.merge @row.cells.last
226
253
  assert_equal(@c.row.worksheet.send(:merged_cells).last, "A1:C1")
227
254
  end
228
-
255
+
229
256
  def test_reverse_merge_with_cell
230
257
  @c.row.add_cell 2
231
258
  @c.row.add_cell 3
@@ -271,7 +298,7 @@ class TestCell < Test::Unit::TestCase
271
298
  c_xml = Nokogiri::XML(@c.to_xml_string(1,1))
272
299
  assert_equal(c_xml.xpath("/c[@s=1]").size, 1)
273
300
  end
274
-
301
+
275
302
  def test_to_xml_string_with_run
276
303
  # Actually quite a number of similar run styles
277
304
  # but the processing should be the same
@@ -281,7 +308,7 @@ class TestCell < Test::Unit::TestCase
281
308
  @c.font_name = 'arial'
282
309
  @c.color = 'FF0000'
283
310
  c_xml = Nokogiri::XML(@c.to_xml_string(1,1))
284
- assert(c_xml.xpath("//b"))
311
+ assert(c_xml.xpath("//b").any?)
285
312
  end
286
313
 
287
314
  def test_to_xml_string_formula
@@ -290,8 +317,8 @@ class TestCell < Test::Unit::TestCase
290
317
  sheet.add_row ["=IF(2+2=4,4,5)"]
291
318
  end
292
319
  doc = Nokogiri::XML(ws.to_xml_string)
293
- assert(doc.xpath("//f[@text()='IF(2+2=4,4,5)']"))
294
-
320
+ doc.remove_namespaces!
321
+ assert(doc.xpath("//f[text()='IF(2+2=4,4,5)']").any?)
295
322
  end
296
323
 
297
324
  def test_to_xml_string_array_formula
@@ -301,9 +328,24 @@ class TestCell < Test::Unit::TestCase
301
328
  end
302
329
  doc = Nokogiri::XML(ws.to_xml_string)
303
330
  doc.remove_namespaces!
304
- assert(doc.xpath("//f[text()='SUM(C2:C11*D2:D11)']"))
305
- assert(doc.xpath("//f[@t='array']"))
306
- assert(doc.xpath("//f[@ref='A1']"))
331
+ assert(doc.xpath("//f[text()='SUM(C2:C11*D2:D11)']").any?)
332
+ assert(doc.xpath("//f[@t='array']").any?)
333
+ assert(doc.xpath("//f[@ref='A1']").any?)
334
+ end
335
+
336
+ def test_to_xml_string_text_formula
337
+ p = Axlsx::Package.new
338
+ ws = p.workbook.add_worksheet do |sheet|
339
+ sheet.add_row ["=1+1", "-1+1"], type: :text
340
+ end
341
+ doc = Nokogiri::XML(ws.to_xml_string)
342
+ doc.remove_namespaces!
343
+
344
+ assert(doc.xpath("//f[text()='1+1']").empty?)
345
+ assert(doc.xpath("//t[text()='=1+1']").any?)
346
+
347
+ assert(doc.xpath("//f[text()='1+1']").empty?)
348
+ assert(doc.xpath("//t[text()='-1+1']").any?)
307
349
  end
308
350
 
309
351
  def test_font_size_with_custom_style_and_no_sz
@@ -322,17 +364,17 @@ class TestCell < Test::Unit::TestCase
322
364
  sz = @c.send(:font_size)
323
365
  assert_equal(sz, 52)
324
366
  end
325
-
367
+
326
368
  def test_cell_with_sz
327
369
  @c.sz = 25
328
370
  assert_equal(25, @c.send(:font_size))
329
371
  end
330
-
372
+
331
373
  def test_to_xml
332
374
  # TODO This could use some much more stringent testing related to the xml content generated!
333
375
  @ws.add_row [Time.now, Date.today, true, 1, 1.0, "text", "=sum(A1:A2)", "2013-01-13T13:31:25.123"]
334
376
  @ws.rows.last.cells[5].u = true
335
-
377
+
336
378
  schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
337
379
  doc = Nokogiri::XML(@ws.to_xml_string)
338
380
  errors = []