roo 2.0.1 → 2.7.1

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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +17 -0
  3. data/.github/ISSUE_TEMPLATE +10 -0
  4. data/.gitignore +4 -0
  5. data/.travis.yml +10 -6
  6. data/CHANGELOG.md +116 -1
  7. data/Gemfile +3 -4
  8. data/Gemfile_ruby2 +30 -0
  9. data/Guardfile +1 -2
  10. data/README.md +56 -22
  11. data/Rakefile +1 -1
  12. data/lib/roo/base.rb +108 -245
  13. data/lib/roo/constants.rb +5 -0
  14. data/lib/roo/csv.rb +94 -87
  15. data/lib/roo/errors.rb +11 -0
  16. data/lib/roo/excelx/cell/base.rb +94 -0
  17. data/lib/roo/excelx/cell/boolean.rb +27 -0
  18. data/lib/roo/excelx/cell/date.rb +28 -0
  19. data/lib/roo/excelx/cell/datetime.rb +111 -0
  20. data/lib/roo/excelx/cell/empty.rb +19 -0
  21. data/lib/roo/excelx/cell/number.rb +87 -0
  22. data/lib/roo/excelx/cell/string.rb +19 -0
  23. data/lib/roo/excelx/cell/time.rb +43 -0
  24. data/lib/roo/excelx/cell.rb +33 -4
  25. data/lib/roo/excelx/comments.rb +33 -0
  26. data/lib/roo/excelx/coordinate.rb +12 -0
  27. data/lib/roo/excelx/extractor.rb +3 -4
  28. data/lib/roo/excelx/format.rb +64 -0
  29. data/lib/roo/excelx/shared.rb +32 -0
  30. data/lib/roo/excelx/shared_strings.rb +124 -4
  31. data/lib/roo/excelx/sheet.rb +12 -7
  32. data/lib/roo/excelx/sheet_doc.rb +108 -97
  33. data/lib/roo/excelx/styles.rb +1 -1
  34. data/lib/roo/excelx.rb +61 -103
  35. data/lib/roo/formatters/base.rb +15 -0
  36. data/lib/roo/formatters/csv.rb +84 -0
  37. data/lib/roo/formatters/matrix.rb +23 -0
  38. data/lib/roo/formatters/xml.rb +31 -0
  39. data/lib/roo/formatters/yaml.rb +40 -0
  40. data/lib/roo/libre_office.rb +1 -2
  41. data/lib/roo/link.rb +21 -2
  42. data/lib/roo/open_office.rb +468 -523
  43. data/lib/roo/spreadsheet.rb +3 -1
  44. data/lib/roo/tempdir.rb +21 -0
  45. data/lib/roo/utils.rb +7 -7
  46. data/lib/roo/version.rb +1 -1
  47. data/lib/roo.rb +8 -3
  48. data/roo.gemspec +2 -1
  49. data/spec/helpers.rb +5 -0
  50. data/spec/lib/roo/base_spec.rb +229 -0
  51. data/spec/lib/roo/csv_spec.rb +19 -0
  52. data/spec/lib/roo/excelx_spec.rb +97 -11
  53. data/spec/lib/roo/openoffice_spec.rb +18 -1
  54. data/spec/lib/roo/spreadsheet_spec.rb +20 -0
  55. data/spec/lib/roo/utils_spec.rb +1 -1
  56. data/spec/spec_helper.rb +5 -5
  57. data/test/all_ss.rb +12 -11
  58. data/test/excelx/cell/test_base.rb +63 -0
  59. data/test/excelx/cell/test_boolean.rb +36 -0
  60. data/test/excelx/cell/test_date.rb +38 -0
  61. data/test/excelx/cell/test_datetime.rb +45 -0
  62. data/test/excelx/cell/test_empty.rb +7 -0
  63. data/test/excelx/cell/test_number.rb +74 -0
  64. data/test/excelx/cell/test_string.rb +28 -0
  65. data/test/excelx/cell/test_time.rb +30 -0
  66. data/test/formatters/test_csv.rb +119 -0
  67. data/test/formatters/test_matrix.rb +76 -0
  68. data/test/formatters/test_xml.rb +78 -0
  69. data/test/formatters/test_yaml.rb +20 -0
  70. data/test/helpers/test_accessing_files.rb +60 -0
  71. data/test/helpers/test_comments.rb +43 -0
  72. data/test/helpers/test_formulas.rb +9 -0
  73. data/test/helpers/test_labels.rb +103 -0
  74. data/test/helpers/test_sheets.rb +55 -0
  75. data/test/helpers/test_styles.rb +62 -0
  76. data/test/roo/test_base.rb +182 -0
  77. data/test/roo/test_csv.rb +60 -0
  78. data/test/roo/test_excelx.rb +325 -0
  79. data/test/roo/test_libre_office.rb +9 -0
  80. data/test/roo/test_open_office.rb +289 -0
  81. data/test/test_helper.rb +116 -18
  82. data/test/test_roo.rb +362 -2088
  83. metadata +70 -4
  84. data/test/test_generic_spreadsheet.rb +0 -237
@@ -0,0 +1,325 @@
1
+ require "test_helper"
2
+
3
+ class TestRworkbookExcelx < Minitest::Test
4
+ def test_download_uri_with_invalid_host
5
+ assert_raises(RuntimeError) do
6
+ Roo::Excelx.new("http://example.com/file.xlsx")
7
+ end
8
+ end
9
+
10
+ def test_download_uri_with_query_string
11
+ file = filename("simple_spreadsheet")
12
+ port = 12_344
13
+ url = "#{local_server(port)}/#{file}?query-param=value"
14
+
15
+ start_local_server(file, port) do
16
+ spreadsheet = roo_class.new(url)
17
+ assert_equal "Task 1", spreadsheet.cell("f", 4)
18
+ end
19
+ end
20
+
21
+ def test_should_raise_file_not_found_error
22
+ assert_raises(IOError) do
23
+ roo_class.new(File.join("testnichtvorhanden", "Bibelbund.xlsx"))
24
+ end
25
+ end
26
+
27
+ def test_file_warning_default
28
+ assert_raises(TypeError) { roo_class.new(File.join(TESTDIR, "numbers1.ods")) }
29
+ assert_raises(TypeError) { roo_class.new(File.join(TESTDIR, "numbers1.xls")) }
30
+ end
31
+
32
+ def test_file_warning_error
33
+ %w(ods xls).each do |extension|
34
+ assert_raises(TypeError) do
35
+ options = { packed: false, file_warning: :error }
36
+ roo_class.new(File.join(TESTDIR, "numbers1. #{extension}"), options)
37
+ end
38
+ end
39
+ end
40
+
41
+ def test_file_warning_warning
42
+ options = { packed: false, file_warning: :warning }
43
+ assert_raises(ArgumentError) do
44
+ roo_class.new(File.join(TESTDIR, "numbers1.ods"), options)
45
+ end
46
+ end
47
+
48
+ def test_file_warning_ignore
49
+ options = { packed: false, file_warning: :ignore }
50
+ sheet = roo_class.new(File.join(TESTDIR, "type_excelx.ods"), options)
51
+ assert sheet, "Should not throw an error"
52
+ end
53
+
54
+ def test_bug_xlsx_reference_cell
55
+ # NOTE: If cell A contains a string and cell B references cell A. When
56
+ # reading the value of cell B, the result will be "0.0" instead of the
57
+ # value of cell A.
58
+ #
59
+ # Before this test case, the following code:
60
+ #
61
+ # spreadsheet = Roo::Excelx.new("formula_string_error.xlsx")
62
+ # spreadsheet.default_sheet = "sheet1"
63
+ # p "A: #{spreadsheet.cell(1, 1)}" #=> "A: TestString"
64
+ # p "B: #{spreadsheet.cell(2, 1)}" #=> "B: 0.0"
65
+ #
66
+ # where the expected result is
67
+ # "A: TestString"
68
+ # "B: TestString"
69
+ xlsx = roo_class.new(File.join(TESTDIR, "formula_string_error.xlsx"))
70
+ assert_equal "Teststring", xlsx.cell("a", 1)
71
+ assert_equal "Teststring", xlsx.cell("a", 2)
72
+ end
73
+
74
+ def test_parsing_xslx_from_numbers
75
+ xlsx = roo_class.new(File.join(TESTDIR, "numbers-export.xlsx"))
76
+
77
+ xlsx.default_sheet = xlsx.sheets.first
78
+ assert_equal "Sheet 1", xlsx.cell("a", 1)
79
+
80
+ # Another buggy behavior of Numbers 3.1: if a warkbook has more than a
81
+ # single sheet, all sheets except the first one will have an extra row and
82
+ # column added to the beginning. That's why we assert against cell B2 and
83
+ # not A1
84
+ xlsx.default_sheet = xlsx.sheets.last
85
+ assert_equal "Sheet 2", xlsx.cell("b", 2)
86
+ end
87
+
88
+ def assert_cell_range_values(sheet, row_range, column_range, is_merged_range, expected_value)
89
+ row_range.each do |row|
90
+ column_range.each do |col|
91
+ value = sheet.cell(col, row)
92
+ if is_merged_range.call(row, col)
93
+ assert_equal expected_value, value
94
+ else
95
+ assert_nil value
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ def test_expand_merged_range
102
+ options = { expand_merged_ranges: true }
103
+ xlsx = roo_class.new(File.join(TESTDIR, "merged_ranges.xlsx"), options)
104
+
105
+ [
106
+ {
107
+ rows: (3..7),
108
+ columns: ("a".."b"),
109
+ conditional: ->(row, col) { row > 3 && row < 7 && col == "a" },
110
+ expected_value: "vertical1"
111
+ },
112
+ {
113
+ rows: (3..11),
114
+ columns: ("f".."h"),
115
+ conditional: ->(row, col) { row > 3 && row < 11 && col == "g" },
116
+ expected_value: "vertical2"
117
+ },
118
+ {
119
+ rows: (3..5),
120
+ columns: ("b".."f"),
121
+ conditional: ->(row, col) { row == 4 && col > "b" && col < "f" },
122
+ expected_value: "horizontal"
123
+ },
124
+ {
125
+ rows: (8..13),
126
+ columns: ("a".."e"),
127
+ conditional: ->(row, col) { row > 8 && row < 13 && col > "a" && col < "e" },
128
+ expected_value: "block"
129
+ }
130
+ ].each do |data|
131
+ rows, cols, conditional, expected_value = data.values
132
+ assert_cell_range_values(xlsx, rows, cols, conditional, expected_value)
133
+ end
134
+ end
135
+
136
+ def test_noexpand_merged_range
137
+ xlsx = roo_class.new(File.join(TESTDIR, "merged_ranges.xlsx"))
138
+
139
+ [
140
+ {
141
+ rows: (3..7),
142
+ columns: ("a".."b"),
143
+ conditional: ->(row, col) { row == 4 && col == "a" },
144
+ expected_value: "vertical1"
145
+ },
146
+ {
147
+ rows: (3..11),
148
+ columns: ("f".."h"),
149
+ conditional: ->(row, col) { row == 4 && col == "g" },
150
+ expected_value: "vertical2"
151
+ },
152
+ {
153
+ rows: (3..5),
154
+ columns: ("b".."f"),
155
+ conditional: ->(row, col) { row == 4 && col == "c" },
156
+ expected_value: "horizontal"
157
+ },
158
+ {
159
+ rows: (8..13),
160
+ columns: ("a".."e"),
161
+ conditional: ->(row, col) { row == 9 && col == "b" },
162
+ expected_value: "block"
163
+ }
164
+ ].each do |data|
165
+ rows, cols, conditional, expected_value = data.values
166
+ assert_cell_range_values(xlsx, rows, cols, conditional, expected_value)
167
+ end
168
+ end
169
+
170
+ def test_open_stream
171
+ file = filename(:numbers1)
172
+ file_contents = File.read File.join(TESTDIR, file), encoding: "BINARY"
173
+ stream = StringIO.new(file_contents)
174
+ xlsx = roo_class.new(stream)
175
+ expected_sheet_names = ["Tabelle1", "Name of Sheet 2", "Sheet3", "Sheet4", "Sheet5"]
176
+ assert_equal expected_sheet_names, xlsx.sheets
177
+ end
178
+
179
+ def test_header_offset
180
+ xlsx = roo_class.new(File.join(TESTDIR, "header_offset.xlsx"))
181
+ data = xlsx.parse(column_1: "Header A1", column_2: "Header B1")
182
+ assert_equal "Data A2", data[0][:column_1]
183
+ assert_equal "Data B2", data[0][:column_2]
184
+ end
185
+
186
+ def test_formula_excelx
187
+ with_each_spreadsheet(name: "formula", format: :excelx) do |workbook|
188
+ assert_equal 1, workbook.cell("A", 1)
189
+ assert_equal 2, workbook.cell("A", 2)
190
+ assert_equal 3, workbook.cell("A", 3)
191
+ assert_equal 4, workbook.cell("A", 4)
192
+ assert_equal 5, workbook.cell("A", 5)
193
+ assert_equal 6, workbook.cell("A", 6)
194
+ assert_equal 21, workbook.cell("A", 7)
195
+ assert_equal :formula, workbook.celltype("A", 7)
196
+ assert_nil workbook.formula("A", 6)
197
+
198
+ expected_result = [
199
+ [7, 1, "SUM(A1:A6)"],
200
+ [7, 2, "SUM($A$1:B6)"],
201
+ ]
202
+ assert_equal expected_result, workbook.formulas(workbook.sheets.first)
203
+
204
+ # setting a cell
205
+ workbook.set("A", 15, 41)
206
+ assert_equal 41, workbook.cell("A", 15)
207
+ workbook.set("A", 16, "41")
208
+ assert_equal "41", workbook.cell("A", 16)
209
+ workbook.set("A", 17, 42.5)
210
+ assert_equal 42.5, workbook.cell("A", 17)
211
+ end
212
+ end
213
+
214
+ # TODO: temporaerer Test
215
+ def test_seiten_als_date
216
+ skip_long_test
217
+
218
+ with_each_spreadsheet(name: "Bibelbund", format: :excelx) do |workbook|
219
+ assert_equal "Bericht aus dem Sekretariat", workbook.cell(13, 1)
220
+ assert_equal "1981-4", workbook.cell(13, "D")
221
+ assert_equal String, workbook.excelx_type(13, "E")[1].class
222
+ assert_equal [:numeric_or_formula, "General"], workbook.excelx_type(13, "E")
223
+ assert_equal "428", workbook.excelx_value(13, "E")
224
+ assert_equal 428.0, workbook.cell(13, "E")
225
+ end
226
+ end
227
+
228
+ def test_bug_simple_spreadsheet_time_bug
229
+ # really a bug? are cells really of type time?
230
+ # No! :float must be the correct type
231
+ with_each_spreadsheet(name: "simple_spreadsheet", format: :excelx) do |workbook|
232
+ # puts workbook.cell("B", 5).to_s
233
+ # assert_equal :time, workbook.celltype("B", 5)
234
+ assert_equal :float, workbook.celltype("B", 5)
235
+ assert_equal 10.75, workbook.cell("B", 5)
236
+ assert_equal 12.50, workbook.cell("C", 5)
237
+ assert_equal 0, workbook.cell("D", 5)
238
+ assert_equal 1.75, workbook.cell("E", 5)
239
+ assert_equal "Task 1", workbook.cell("F", 5)
240
+ assert_equal Date.new(2007, 5, 7), workbook.cell("A", 5)
241
+ end
242
+ end
243
+
244
+ def test_simple2_excelx
245
+ with_each_spreadsheet(name: "simple_spreadsheet", format: :excelx) do |workbook|
246
+ assert_equal [:numeric_or_formula, "yyyy\\-mm\\-dd"], workbook.excelx_type("A", 4)
247
+ assert_equal [:numeric_or_formula, "#,##0.00"], workbook.excelx_type("B", 4)
248
+ assert_equal [:numeric_or_formula, "#,##0.00"], workbook.excelx_type("c", 4)
249
+ assert_equal [:numeric_or_formula, "General"], workbook.excelx_type("d", 4)
250
+ assert_equal [:numeric_or_formula, "General"], workbook.excelx_type("e", 4)
251
+ assert_equal :string, workbook.excelx_type("f", 4)
252
+
253
+ assert_equal "39209", workbook.excelx_value("a", 4)
254
+ assert_equal "yyyy\\-mm\\-dd", workbook.excelx_format("a", 4)
255
+ assert_equal "9.25", workbook.excelx_value("b", 4)
256
+ assert_equal "10.25", workbook.excelx_value("c", 4)
257
+ assert_equal "0", workbook.excelx_value("d", 4)
258
+ # ... Sum-Spalte
259
+ # assert_equal "Task 1", workbook.excelx_value("f", 4)
260
+ assert_equal "Task 1", workbook.cell("f", 4)
261
+ assert_equal Date.new(2007, 05, 07), workbook.cell("a", 4)
262
+ assert_equal "9.25", workbook.excelx_value("b", 4)
263
+ assert_equal "#,##0.00", workbook.excelx_format("b", 4)
264
+ assert_equal 9.25, workbook.cell("b", 4)
265
+ assert_equal :float, workbook.celltype("b", 4)
266
+ assert_equal :float, workbook.celltype("d", 4)
267
+ assert_equal 0, workbook.cell("d", 4)
268
+ assert_equal :formula, workbook.celltype("e", 4)
269
+ assert_equal 1, workbook.cell("e", 4)
270
+ assert_equal "C4-B4-D4", workbook.formula("e", 4)
271
+ assert_equal :string, workbook.celltype("f", 4)
272
+ assert_equal "Task 1", workbook.cell("f", 4)
273
+ end
274
+ end
275
+
276
+ def test_bug_pfand_from_windows_phone_xlsx
277
+ # skip_jruby_incompatible_test
278
+ # TODO: Does JRUBY need to skip this test
279
+ return if defined? JRUBY_VERSION
280
+
281
+ options = { name: "Pfand_from_windows_phone", format: :excelx }
282
+ with_each_spreadsheet(options) do |workbook|
283
+ workbook.default_sheet = workbook.sheets.first
284
+ assert_equal ["Blatt1", "Blatt2", "Blatt3"], workbook.sheets
285
+ assert_equal "Summe", workbook.cell("b", 1)
286
+
287
+ assert_equal Date.new(2011, 9, 14), workbook.cell("a", 2)
288
+ assert_equal :date, workbook.celltype("a", 2)
289
+ assert_equal Date.new(2011, 9, 15), workbook.cell("a", 3)
290
+ assert_equal :date, workbook.celltype("a", 3)
291
+
292
+ assert_equal 3.81, workbook.cell("b", 2)
293
+ assert_equal "SUM(C2:L2)", workbook.formula("b", 2)
294
+ assert_equal 0.7, workbook.cell("c", 2)
295
+ end # each
296
+ end
297
+
298
+ def test_excelx_links
299
+ with_each_spreadsheet(name: "link", format: :excelx) do |workbook|
300
+ assert_equal "Google", workbook.cell(1, 1)
301
+ assert_equal "http://www.google.com", workbook.cell(1, 1).href
302
+ end
303
+ end
304
+
305
+ # Excel has two base date formats one from 1900 and the other from 1904.
306
+ # see #test_base_dates_in_excel
307
+ def test_base_dates_in_excelx
308
+ with_each_spreadsheet(name: "1900_base", format: :excelx) do |workbook|
309
+ assert_equal Date.new(2009, 06, 15), workbook.cell(1, 1)
310
+ assert_equal :date, workbook.celltype(1, 1)
311
+ end
312
+ with_each_spreadsheet(name: "1904_base", format: :excelx) do |workbook|
313
+ assert_equal Date.new(2009, 06, 15), workbook.cell(1, 1)
314
+ assert_equal :date, workbook.celltype(1, 1)
315
+ end
316
+ end
317
+
318
+ def roo_class
319
+ Roo::Excelx
320
+ end
321
+
322
+ def filename(name)
323
+ "#{name}.xlsx"
324
+ end
325
+ end
@@ -0,0 +1,9 @@
1
+ require "test_helper"
2
+
3
+ class TestRooOpenOffice < Minitest::Test
4
+ def test_libre_office
5
+ oo = Roo::LibreOffice.new(File.join(TESTDIR, "numbers1.ods"))
6
+ oo.default_sheet = oo.sheets.first
7
+ assert_equal 41, oo.cell("a", 12)
8
+ end
9
+ end
@@ -0,0 +1,289 @@
1
+ # encoding: utf-8
2
+ require "test_helper"
3
+
4
+ class TestRooOpenOffice < Minitest::Test
5
+ def test_openoffice_download_uri_and_zipped
6
+ port = 12_345
7
+ file = "rata.ods.zip"
8
+ start_local_server(file, port) do
9
+ url = "#{local_server(port)}/#{file}"
10
+
11
+ workbook = roo_class.new(url, packed: :zip)
12
+ assert_in_delta 0.001, 505.14, workbook.cell("c", 33).to_f
13
+ end
14
+ end
15
+
16
+ def test_download_uri_with_invalid_host
17
+ assert_raises(RuntimeError) do
18
+ roo_class.new("http://example.com/file.ods")
19
+ end
20
+ end
21
+
22
+ def test_download_uri_with_query_string
23
+ file = filename("simple_spreadsheet")
24
+ port = 12_346
25
+ url = "#{local_server(port)}/#{file}?query-param=value"
26
+ start_local_server(file, port) do
27
+ spreadsheet = roo_class.new(url)
28
+ assert_equal "Task 1", spreadsheet.cell("f", 4)
29
+ end
30
+ end
31
+
32
+ def test_openoffice_zipped
33
+ workbook = roo_class.new(File.join(TESTDIR, "bode-v1.ods.zip"), packed: :zip)
34
+ assert workbook
35
+ assert_equal 'ist "e" im Nenner von H(s)', workbook.cell("b", 5)
36
+ end
37
+
38
+ def test_should_raise_file_not_found_error
39
+ assert_raises(IOError) do
40
+ roo_class.new(File.join("testnichtvorhanden", "Bibelbund.ods"))
41
+ end
42
+ end
43
+
44
+ def test_file_warning_default_is_error
45
+ expected_message = "test/files/numbers1.xls is not an openoffice spreadsheet"
46
+ assert_raises(TypeError, expected_message) do
47
+ roo_class.new(File.join(TESTDIR, "numbers1.xls"))
48
+ end
49
+
50
+ assert_raises(TypeError) do
51
+ roo_class.new(File.join(TESTDIR, "numbers1.xlsx"))
52
+ end
53
+ end
54
+
55
+ def test_file_warning_error
56
+ options = { packed: false, file_warning: :error }
57
+
58
+ assert_raises(TypeError) do
59
+ roo_class.new(File.join(TESTDIR, "numbers1.xls"), options)
60
+ end
61
+
62
+ assert_raises(TypeError) do
63
+ roo_class.new(File.join(TESTDIR, "numbers1.xlsx"), options)
64
+ end
65
+ end
66
+
67
+ def test_file_warning_warning
68
+ assert_raises(ArgumentError) do
69
+ options = { packed: false, file_warning: :warning }
70
+ roo_class.new(File.join(TESTDIR, "numbers1.xlsx"), options)
71
+ end
72
+ end
73
+
74
+ def test_file_warning_ignore
75
+ options = { packed: false, file_warning: :ignore }
76
+ assert roo_class.new(File.join(TESTDIR, "type_openoffice.xlsx"), options), "Should not throw an error"
77
+ end
78
+
79
+ def test_encrypted_file
80
+ workbook = roo_class.new(File.join(TESTDIR, "encrypted-letmein.ods"), password: "letmein")
81
+ assert_equal "Hello World", workbook.cell("a", 1)
82
+ end
83
+
84
+ def test_encrypted_file_requires_password
85
+ assert_raises(ArgumentError) do
86
+ roo_class.new(File.join(TESTDIR, "encrypted-letmein.ods"))
87
+ end
88
+ end
89
+
90
+ def test_encrypted_file_with_incorrect_password
91
+ assert_raises(ArgumentError) do
92
+ roo_class.new(File.join(TESTDIR, "encrypted-letmein.ods"), password: "badpassword")
93
+ end
94
+ end
95
+
96
+ # 2011-08-11
97
+ def test_bug_openoffice_formula_missing_letters
98
+ # NOTE: This document was created using LibreOffice. The formulas seem
99
+ # different from a document created using OpenOffice.
100
+ #
101
+ # TODO: translate
102
+ # Bei den OpenOffice-Dateien ist in diesem Feld in der XML-
103
+ # Datei of: als Prefix enthalten, waehrend in dieser Datei
104
+ # irgendetwas mit oooc: als Prefix verwendet wird.
105
+ workbook = roo_class.new(File.join(TESTDIR, "dreimalvier.ods"))
106
+ assert_equal "=SUM([.A1:.D1])", workbook.formula("e", 1)
107
+ assert_equal "=SUM([.A2:.D2])", workbook.formula("e", 2)
108
+ assert_equal "=SUM([.A3:.D3])", workbook.formula("e", 3)
109
+ expected_formulas = [
110
+ [1, 5, "=SUM([.A1:.D1])"],
111
+ [2, 5, "=SUM([.A2:.D2])"],
112
+ [3, 5, "=SUM([.A3:.D3])"],
113
+ ]
114
+ assert_equal expected_formulas, workbook.formulas
115
+ end
116
+
117
+ def test_header_with_brackets_open_office
118
+ options = { name: "advanced_header", format: :openoffice }
119
+ with_each_spreadsheet(options) do |workbook|
120
+ parsed_head = workbook.parse(headers: true)
121
+ assert_equal "Date(yyyy-mm-dd)", workbook.cell("A", 1)
122
+ assert_equal parsed_head[0].keys, ["Date(yyyy-mm-dd)"]
123
+ assert_equal parsed_head[0].values, ["Date(yyyy-mm-dd)"]
124
+ end
125
+ end
126
+
127
+ def test_office_version
128
+ with_each_spreadsheet(name: "numbers1", format: :openoffice) do |workbook|
129
+ assert_equal "1.0", workbook.officeversion
130
+ end
131
+ end
132
+
133
+ def test_bug_contiguous_cells
134
+ with_each_spreadsheet(name: "numbers1", format: :openoffice) do |workbook|
135
+ workbook.default_sheet = "Sheet4"
136
+ assert_equal Date.new(2007, 06, 16), workbook.cell("a", 1)
137
+ assert_equal 10, workbook.cell("b", 1)
138
+ assert_equal 10, workbook.cell("c", 1)
139
+ assert_equal 10, workbook.cell("d", 1)
140
+ assert_equal 10, workbook.cell("e", 1)
141
+ end
142
+ end
143
+
144
+ def test_italo_table
145
+ with_each_spreadsheet(name: "simple_spreadsheet_from_italo", format: :openoffice) do |workbook|
146
+ assert_equal "1", workbook.cell("A", 1)
147
+ assert_equal "1", workbook.cell("B", 1)
148
+ assert_equal "1", workbook.cell("C", 1)
149
+ assert_equal 1, workbook.cell("A", 2).to_i
150
+ assert_equal 2, workbook.cell("B", 2).to_i
151
+ assert_equal 1, workbook.cell("C", 2).to_i
152
+ assert_equal 1, workbook.cell("A", 3)
153
+ assert_equal 3, workbook.cell("B", 3)
154
+ assert_equal 1, workbook.cell("C", 3)
155
+ assert_equal "A", workbook.cell("A", 4)
156
+ assert_equal "A", workbook.cell("B", 4)
157
+ assert_equal "A", workbook.cell("C", 4)
158
+ assert_equal 0.01, workbook.cell("A", 5)
159
+ assert_equal 0.01, workbook.cell("B", 5)
160
+ assert_equal 0.01, workbook.cell("C", 5)
161
+ assert_equal 0.03, workbook.cell("a", 5) + workbook.cell("b", 5) + workbook.cell("c", 5)
162
+
163
+ # Cells values in row 1:
164
+ assert_equal "1:string", [workbook.cell(1, 1), workbook.celltype(1, 1)].join(":")
165
+ assert_equal "1:string", [workbook.cell(1, 2), workbook.celltype(1, 2)].join(":")
166
+ assert_equal "1:string", [workbook.cell(1, 3), workbook.celltype(1, 3)].join(":")
167
+
168
+ # Cells values in row 2:
169
+ assert_equal "1:string", [workbook.cell(2, 1), workbook.celltype(2, 1)].join(":")
170
+ assert_equal "2:string", [workbook.cell(2, 2), workbook.celltype(2, 2)].join(":")
171
+ assert_equal "1:string", [workbook.cell(2, 3), workbook.celltype(2, 3)].join(":")
172
+
173
+ # Cells values in row 3:
174
+ assert_equal "1:float", [workbook.cell(3, 1), workbook.celltype(3, 1)].join(":")
175
+ assert_equal "3:float", [workbook.cell(3, 2), workbook.celltype(3, 2)].join(":")
176
+ assert_equal "1:float", [workbook.cell(3, 3), workbook.celltype(3, 3)].join(":")
177
+
178
+ # Cells values in row 4:
179
+ assert_equal "A:string", [workbook.cell(4, 1), workbook.celltype(4, 1)].join(":")
180
+ assert_equal "A:string", [workbook.cell(4, 2), workbook.celltype(4, 2)].join(":")
181
+ assert_equal "A:string", [workbook.cell(4, 3), workbook.celltype(4, 3)].join(":")
182
+
183
+ # Cells values in row 5:
184
+ assert_equal "0.01:percentage", [workbook.cell(5, 1), workbook.celltype(5, 1)].join(":")
185
+ assert_equal "0.01:percentage", [workbook.cell(5, 2), workbook.celltype(5, 2)].join(":")
186
+ assert_equal "0.01:percentage", [workbook.cell(5, 3), workbook.celltype(5, 3)].join(":")
187
+ end
188
+ end
189
+
190
+ def test_formula_openoffice
191
+ with_each_spreadsheet(name: "formula", format: :openoffice) do |workbook|
192
+ assert_equal 1, workbook.cell("A", 1)
193
+ assert_equal 2, workbook.cell("A", 2)
194
+ assert_equal 3, workbook.cell("A", 3)
195
+ assert_equal 4, workbook.cell("A", 4)
196
+ assert_equal 5, workbook.cell("A", 5)
197
+ assert_equal 6, workbook.cell("A", 6)
198
+ assert_equal 21, workbook.cell("A", 7)
199
+ assert_equal :formula, workbook.celltype("A", 7)
200
+ assert_equal "=[Sheet2.A1]", workbook.formula("C", 7)
201
+ assert_nil workbook.formula("A", 6)
202
+ expected_formulas = [
203
+ [7, 1, "=SUM([.A1:.A6])"],
204
+ [7, 2, "=SUM([.$A$1:.B6])"],
205
+ [7, 3, "=[Sheet2.A1]"],
206
+ [8, 2, "=SUM([.$A$1:.B7])"],
207
+ ]
208
+ assert_equal expected_formulas, workbook.formulas(workbook.sheets.first)
209
+
210
+ # setting a cell
211
+ workbook.set("A", 15, 41)
212
+ assert_equal 41, workbook.cell("A", 15)
213
+ workbook.set("A", 16, "41")
214
+ assert_equal "41", workbook.cell("A", 16)
215
+ workbook.set("A", 17, 42.5)
216
+ assert_equal 42.5, workbook.cell("A", 17)
217
+ end
218
+ end
219
+
220
+ def test_bug_ric
221
+ with_each_spreadsheet(name: "ric", format: :openoffice) do |workbook|
222
+ assert workbook.empty?("A", 1)
223
+ assert workbook.empty?("B", 1)
224
+ assert workbook.empty?("C", 1)
225
+ assert workbook.empty?("D", 1)
226
+ expected = 1
227
+ letter = "e"
228
+ while letter <= "u"
229
+ assert_equal expected, workbook.cell(letter, 1)
230
+ letter.succ!
231
+ expected += 1
232
+ end
233
+ assert_equal "J", workbook.cell("v", 1)
234
+ assert_equal "P", workbook.cell("w", 1)
235
+ assert_equal "B", workbook.cell("x", 1)
236
+ assert_equal "All", workbook.cell("y", 1)
237
+ assert_equal 0, workbook.cell("a", 2)
238
+ assert workbook.empty?("b", 2)
239
+ assert workbook.empty?("c", 2)
240
+ assert workbook.empty?("d", 2)
241
+ assert_equal "B", workbook.cell("e", 2)
242
+ assert_equal "B", workbook.cell("f", 2)
243
+ assert_equal "B", workbook.cell("g", 2)
244
+ assert_equal "B", workbook.cell("h", 2)
245
+ assert_equal "B", workbook.cell("i", 2)
246
+ assert_equal "B", workbook.cell("j", 2)
247
+ assert_equal "B", workbook.cell("k", 2)
248
+ assert_equal "B", workbook.cell("l", 2)
249
+ assert_equal "B", workbook.cell("m", 2)
250
+ assert_equal "B", workbook.cell("n", 2)
251
+ assert_equal "B", workbook.cell("o", 2)
252
+ assert_equal "B", workbook.cell("p", 2)
253
+ assert_equal "B", workbook.cell("q", 2)
254
+ assert_equal "B", workbook.cell("r", 2)
255
+ assert_equal "B", workbook.cell("s", 2)
256
+ assert workbook.empty?("t", 2)
257
+ assert workbook.empty?("u", 2)
258
+ assert_equal 0, workbook.cell("v", 2)
259
+ assert_equal 0, workbook.cell("w", 2)
260
+ assert_equal 15, workbook.cell("x", 2)
261
+ assert_equal 15, workbook.cell("y", 2)
262
+ end
263
+ end
264
+
265
+ def test_mehrteilig
266
+ with_each_spreadsheet(name: "Bibelbund1", format: :openoffice) do |workbook|
267
+ assert_equal "Tagebuch des Sekret\303\244rs. Letzte Tagung 15./16.11.75 Schweiz", workbook.cell(45, "A")
268
+ end
269
+ end
270
+
271
+ def test_cell_openoffice_html_escape
272
+ with_each_spreadsheet(name: "html-escape", format: :openoffice) do |workbook|
273
+ assert_equal "'", workbook.cell(1, 1)
274
+ assert_equal "&", workbook.cell(2, 1)
275
+ assert_equal ">", workbook.cell(3, 1)
276
+ assert_equal "<", workbook.cell(4, 1)
277
+ assert_equal "`", workbook.cell(5, 1)
278
+ # test_openoffice_zipped will catch issues with &quot;
279
+ end
280
+ end
281
+
282
+ def roo_class
283
+ Roo::OpenOffice
284
+ end
285
+
286
+ def filename(name)
287
+ "#{name}.ods"
288
+ end
289
+ end