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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +17 -0
- data/.github/ISSUE_TEMPLATE +10 -0
- data/.gitignore +4 -0
- data/.travis.yml +10 -6
- data/CHANGELOG.md +116 -1
- data/Gemfile +3 -4
- data/Gemfile_ruby2 +30 -0
- data/Guardfile +1 -2
- data/README.md +56 -22
- data/Rakefile +1 -1
- data/lib/roo/base.rb +108 -245
- data/lib/roo/constants.rb +5 -0
- data/lib/roo/csv.rb +94 -87
- data/lib/roo/errors.rb +11 -0
- data/lib/roo/excelx/cell/base.rb +94 -0
- data/lib/roo/excelx/cell/boolean.rb +27 -0
- data/lib/roo/excelx/cell/date.rb +28 -0
- data/lib/roo/excelx/cell/datetime.rb +111 -0
- data/lib/roo/excelx/cell/empty.rb +19 -0
- data/lib/roo/excelx/cell/number.rb +87 -0
- data/lib/roo/excelx/cell/string.rb +19 -0
- data/lib/roo/excelx/cell/time.rb +43 -0
- data/lib/roo/excelx/cell.rb +33 -4
- data/lib/roo/excelx/comments.rb +33 -0
- data/lib/roo/excelx/coordinate.rb +12 -0
- data/lib/roo/excelx/extractor.rb +3 -4
- data/lib/roo/excelx/format.rb +64 -0
- data/lib/roo/excelx/shared.rb +32 -0
- data/lib/roo/excelx/shared_strings.rb +124 -4
- data/lib/roo/excelx/sheet.rb +12 -7
- data/lib/roo/excelx/sheet_doc.rb +108 -97
- data/lib/roo/excelx/styles.rb +1 -1
- data/lib/roo/excelx.rb +61 -103
- data/lib/roo/formatters/base.rb +15 -0
- data/lib/roo/formatters/csv.rb +84 -0
- data/lib/roo/formatters/matrix.rb +23 -0
- data/lib/roo/formatters/xml.rb +31 -0
- data/lib/roo/formatters/yaml.rb +40 -0
- data/lib/roo/libre_office.rb +1 -2
- data/lib/roo/link.rb +21 -2
- data/lib/roo/open_office.rb +468 -523
- data/lib/roo/spreadsheet.rb +3 -1
- data/lib/roo/tempdir.rb +21 -0
- data/lib/roo/utils.rb +7 -7
- data/lib/roo/version.rb +1 -1
- data/lib/roo.rb +8 -3
- data/roo.gemspec +2 -1
- data/spec/helpers.rb +5 -0
- data/spec/lib/roo/base_spec.rb +229 -0
- data/spec/lib/roo/csv_spec.rb +19 -0
- data/spec/lib/roo/excelx_spec.rb +97 -11
- data/spec/lib/roo/openoffice_spec.rb +18 -1
- data/spec/lib/roo/spreadsheet_spec.rb +20 -0
- data/spec/lib/roo/utils_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -5
- data/test/all_ss.rb +12 -11
- data/test/excelx/cell/test_base.rb +63 -0
- data/test/excelx/cell/test_boolean.rb +36 -0
- data/test/excelx/cell/test_date.rb +38 -0
- data/test/excelx/cell/test_datetime.rb +45 -0
- data/test/excelx/cell/test_empty.rb +7 -0
- data/test/excelx/cell/test_number.rb +74 -0
- data/test/excelx/cell/test_string.rb +28 -0
- data/test/excelx/cell/test_time.rb +30 -0
- data/test/formatters/test_csv.rb +119 -0
- data/test/formatters/test_matrix.rb +76 -0
- data/test/formatters/test_xml.rb +78 -0
- data/test/formatters/test_yaml.rb +20 -0
- data/test/helpers/test_accessing_files.rb +60 -0
- data/test/helpers/test_comments.rb +43 -0
- data/test/helpers/test_formulas.rb +9 -0
- data/test/helpers/test_labels.rb +103 -0
- data/test/helpers/test_sheets.rb +55 -0
- data/test/helpers/test_styles.rb +62 -0
- data/test/roo/test_base.rb +182 -0
- data/test/roo/test_csv.rb +60 -0
- data/test/roo/test_excelx.rb +325 -0
- data/test/roo/test_libre_office.rb +9 -0
- data/test/roo/test_open_office.rb +289 -0
- data/test/test_helper.rb +116 -18
- data/test/test_roo.rb +362 -2088
- metadata +70 -4
- 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,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 "
|
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
|