roo 2.6.0 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,126 @@
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
+ oo = roo_class.new(url, packed: :zip)
12
+ assert_in_delta 0.001, 505.14, oo.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
+ oo = roo_class.new(File.join(TESTDIR, "bode-v1.ods.zip"), packed: :zip)
34
+ assert oo
35
+ assert_equal 'ist "e" im Nenner von H(s)', oo.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
+
45
+ def test_file_warning_default_is_error
46
+ expected_message = "test/files/numbers1.xls is not an openoffice spreadsheet"
47
+ assert_raises(TypeError, expected_message) do
48
+ roo_class.new(File.join(TESTDIR, "numbers1.xls"))
49
+ end
50
+
51
+ assert_raises(TypeError) do
52
+ roo_class.new(File.join(TESTDIR, "numbers1.xlsx"))
53
+ end
54
+ end
55
+
56
+ def test_file_warning_error
57
+ assert_raises(TypeError) do
58
+ roo_class.new(File.join(TESTDIR, "numbers1.xls"),
59
+ packed: false,
60
+ file_warning: :error
61
+ )
62
+ end
63
+
64
+ assert_raises(TypeError) do
65
+ roo_class.new(File.join(TESTDIR, "numbers1.xlsx"),
66
+ packed: false,
67
+ file_warning: :error)
68
+ end
69
+ end
70
+
71
+ def test_file_warning_warning
72
+ assert_raises(ArgumentError) do
73
+ roo_class.new(File.join(TESTDIR, "numbers1.xlsx"),
74
+ packed: false,
75
+ file_warning: :warning)
76
+ end
77
+ end
78
+
79
+ def test_file_warning_ignore
80
+ assert roo_class.new(File.join(TESTDIR, "type_openoffice.xlsx"),
81
+ packed: false,
82
+ file_warning: :ignore), "Should not throw an error"
83
+ end
84
+
85
+ def test_encrypted_file
86
+ oo = roo_class.new(File.join(TESTDIR, "encrypted-letmein.ods"), password: "letmein")
87
+ assert_equal "Hello World", oo.cell("a", 1)
88
+ end
89
+
90
+ def test_encrypted_file_requires_password
91
+ assert_raises(ArgumentError) { roo_class.new(File.join(TESTDIR, "encrypted-letmein.ods")) }
92
+ end
93
+
94
+ def test_encrypted_file_with_incorrect_password
95
+ assert_raises(ArgumentError) { roo_class.new(File.join(TESTDIR, "encrypted-letmein.ods"), password: "badpassword") }
96
+ end
97
+
98
+ # 2011-08-11
99
+ def test_bug_openoffice_formula_missing_letters
100
+ # NOTE: This document was created using LibreOffice. The formulas seem
101
+ # different from a document created using OpenOffice.
102
+ #
103
+ # TODO: translate
104
+ # Bei den OpenOffice-Dateien ist in diesem Feld in der XML-
105
+ # Datei of: als Prefix enthalten, waehrend in dieser Datei
106
+ # irgendetwas mit oooc: als Prefix verwendet wird.
107
+ oo = Roo::OpenOffice.new(File.join(TESTDIR,'dreimalvier.ods'))
108
+ assert_equal '=SUM([.A1:.D1])', oo.formula('e',1)
109
+ assert_equal '=SUM([.A2:.D2])', oo.formula('e',2)
110
+ assert_equal '=SUM([.A3:.D3])', oo.formula('e',3)
111
+ assert_equal [
112
+ [1,5,'=SUM([.A1:.D1])'],
113
+ [2,5,'=SUM([.A2:.D2])'],
114
+ [3,5,'=SUM([.A3:.D3])'],
115
+ ], oo.formulas
116
+
117
+ end
118
+
119
+ def roo_class
120
+ Roo::OpenOffice
121
+ end
122
+
123
+ def filename(name)
124
+ "#{name}.ods"
125
+ end
126
+ end
@@ -1,19 +1,21 @@
1
+ # encoding: utf-8
1
2
  require 'simplecov'
2
3
  # require deps
3
4
  require 'tmpdir'
4
5
  require 'fileutils'
5
6
  require 'minitest/autorun'
6
7
  require 'shoulda'
7
- require 'fileutils'
8
8
  require 'timeout'
9
9
  require 'logger'
10
10
  require 'date'
11
- require 'webmock/minitest'
12
11
 
13
12
  # require gem files
14
13
  require 'roo'
14
+ require "minitest/reporters"
15
+ Minitest::Reporters.use!([Minitest::Reporters::DefaultReporter.new,
16
+ Minitest::Reporters::SpecReporter.new]) unless defined? JRUBY_VERSION
15
17
 
16
- TESTDIR = File.join(File.dirname(__FILE__), 'files')
18
+ TESTDIR = File.join(File.dirname(__FILE__), 'files')
17
19
 
18
20
  # very simple diff implementation
19
21
  # output is an empty string if the files are equal
@@ -52,3 +54,72 @@ class File
52
54
  end
53
55
  end
54
56
  end
57
+
58
+ def local_server(port)
59
+ raise ArgumentError unless port.to_i > 0
60
+ "http://0.0.0.0:#{port}"
61
+ end
62
+
63
+ def start_local_server(filename, port = nil)
64
+ require "rack"
65
+ content_type = filename.split(".").last
66
+ port ||= TEST_RACK_PORT
67
+
68
+ web_server = Proc.new do |env|
69
+ [
70
+ "200",
71
+ { "Content-Type" => content_type },
72
+ [File.read("#{TESTDIR}/#{filename}")]
73
+ ]
74
+ end
75
+
76
+ t = Thread.new { Rack::Handler::WEBrick.run web_server, Host: '0.0.0.0', Port: port , Logger: WEBrick::BasicLog.new(nil,1) }
77
+ # give the app a chance to startup
78
+ sleep(0.2)
79
+
80
+ yield
81
+ ensure
82
+ t.kill
83
+ end
84
+
85
+ ROO_FORMATS = [
86
+ :excelx,
87
+ :excelxm,
88
+ :openoffice,
89
+ :libreoffice
90
+ ]
91
+
92
+ # call a block of code for each spreadsheet type
93
+ # and yield a reference to the roo object
94
+ def with_each_spreadsheet(options)
95
+ if options[:format]
96
+ formats = Array(options[:format])
97
+ invalid_formats = formats - ROO_FORMATS
98
+ unless invalid_formats.empty?
99
+ raise "invalid spreadsheet types: #{invalid_formats.join(', ')}"
100
+ end
101
+ else
102
+ formats = ROO_FORMATS
103
+ end
104
+ formats.each do |format|
105
+ begin
106
+ yield Roo::Spreadsheet.open(File.join(TESTDIR,
107
+ fixture_filename(options[:name], format)))
108
+ rescue => e
109
+ raise e, "#{e.message} for #{format}", e.backtrace unless options[:ignore_errors]
110
+ end
111
+ end
112
+ end
113
+
114
+ def fixture_filename(name, format)
115
+ case format
116
+ when :excelx
117
+ "#{name}.xlsx"
118
+ when :excelxm
119
+ "#{name}.xlsm"
120
+ when :openoffice, :libreoffice
121
+ "#{name}.ods"
122
+ else
123
+ raise ArgumentError, "unexpected format #{format}"
124
+ end
125
+ end
@@ -1,17 +1,4 @@
1
1
  # encoding: utf-8
2
- # damit keine falschen Vermutungen aufkommen: Ich habe religioes rein gar nichts
3
- # mit diesem Bibelbund zu tun, aber die hatten eine ziemlich grosse
4
- # Spreadsheet-Datei mit ca. 3500 Zeilen oeffentlich im Netz, die sich ganz gut
5
- # zum Testen eignete.
6
- #
7
- #--
8
- # these test cases were developed to run under Linux OS, some commands
9
- # (like 'diff') must be changed (or commented out ;-)) if you want to run
10
- # the tests under another OS
11
- #
12
-
13
- #TODO
14
- # Look at formulas in excel - does not work with date/time
15
2
 
16
3
  # Dump warnings that come from the test to open files
17
4
  # with the wrong spreadsheet class
@@ -23,69 +10,7 @@ require 'test_helper'
23
10
  require 'stringio'
24
11
 
25
12
  class TestRoo < Minitest::Test
26
-
27
- OPENOFFICE = true # do OpenOffice-Spreadsheet Tests? (.ods files)
28
- EXCELX = true # do Excelx Tests? (.xlsx files)
29
- LIBREOFFICE = true # do LibreOffice tests? (.ods files)
30
- CSV = true # do CSV tests? (.csv files)
31
-
32
- FORMATS = [
33
- :excelx,
34
- :excelxm,
35
- :openoffice,
36
- :libreoffice
37
- ]
38
-
39
- ONLINE = false
40
- LONG_RUN = false
41
-
42
- def fixture_filename(name, format)
43
- case format
44
- when :excelx
45
- "#{name}.xlsx"
46
- when :excelxm
47
- "#{name}.xlsm"
48
- when :openoffice, :libreoffice
49
- "#{name}.ods"
50
- else
51
- raise ArgumentError, "unexpected format #{format}"
52
- end
53
- end
54
-
55
- # call a block of code for each spreadsheet type
56
- # and yield a reference to the roo object
57
- def with_each_spreadsheet(options)
58
- if options[:format]
59
- formats = Array(options[:format])
60
- invalid_formats = formats - FORMATS
61
- unless invalid_formats.empty?
62
- raise "invalid spreadsheet types: #{invalid_formats.join(', ')}"
63
- end
64
- else
65
- formats = FORMATS
66
- end
67
- formats.each do |format|
68
- begin
69
- yield Roo::Spreadsheet.open(File.join(TESTDIR,
70
- fixture_filename(options[:name], format)))
71
- rescue => e
72
- raise e, "#{e.message} for #{format}", e.backtrace unless options[:ignore_errors]
73
- end
74
- end
75
- end
76
-
77
- def test_sheets_csv
78
- if CSV
79
- oo = Roo::CSV.new(File.join(TESTDIR,'numbers1.csv'))
80
- assert_equal ["default"], oo.sheets
81
- assert_raises(RangeError) { oo.default_sheet = "no_sheet" }
82
- assert_raises(TypeError) { oo.default_sheet = [1,2,3] }
83
- oo.sheets.each { |sh|
84
- oo.default_sheet = sh
85
- assert_equal sh, oo.default_sheet
86
- }
87
- end
88
- end
13
+ LONG_RUN = ENV["LONG_RUN"] ? true : false
89
14
 
90
15
  def test_sheets
91
16
  with_each_spreadsheet(:name=>'numbers1') do |oo|
@@ -168,14 +93,6 @@ class TestRoo < Minitest::Test
168
93
  end
169
94
  end
170
95
 
171
- def test_libre_office
172
- if LIBREOFFICE
173
- oo = Roo::LibreOffice.new(File.join(TESTDIR, "numbers1.ods"))
174
- oo.default_sheet = oo.sheets.first
175
- assert_equal 41, oo.cell('a',12)
176
- end
177
- end
178
-
179
96
  def test_sheetname
180
97
  with_each_spreadsheet(:name=>'numbers1') do |oo|
181
98
  oo.default_sheet = "Name of Sheet 2"
@@ -379,25 +296,6 @@ class TestRoo < Minitest::Test
379
296
  end
380
297
  end
381
298
 
382
- def test_openoffice_download_uri_and_zipped
383
- if OPENOFFICE
384
- if ONLINE
385
- url = 'http://spazioinwind.libero.it/s2/rata.ods.zip'
386
- sheet = Roo::OpenOffice.new(url, packed: :zip)
387
- #has been changed: assert_equal 'ist "e" im Nenner von H(s)', sheet.cell('b', 5)
388
- assert_in_delta 0.001, 505.14, sheet.cell('c', 33).to_f
389
- end
390
- end
391
- end
392
-
393
- def test_openoffice_zipped
394
- if OPENOFFICE
395
- oo = Roo::OpenOffice.new(File.join(TESTDIR,"bode-v1.ods.zip"), packed: :zip)
396
- assert oo
397
- assert_equal 'ist "e" im Nenner von H(s)', oo.cell('b', 5)
398
- end
399
- end
400
-
401
299
  def test_bug_ric
402
300
  with_each_spreadsheet(:name=>'ric', :format=>:openoffice) do |oo|
403
301
  assert oo.empty?('A',1)
@@ -447,51 +345,6 @@ class TestRoo < Minitest::Test
447
345
  with_each_spreadsheet(:name=>'Bibelbund1', :format=>:openoffice) do |oo|
448
346
  assert_equal "Tagebuch des Sekret\303\244rs. Letzte Tagung 15./16.11.75 Schweiz", oo.cell(45,'A')
449
347
  end
450
- #if EXCELX
451
- # #Datei gibt es noch nicht
452
- # oo = Roo::Excelx.new(File.join(TESTDIR,"Bibelbund1.xlsx"))
453
- # oo.default_sheet = oo.sheets.first
454
- # assert_equal "Tagebuch des Sekret\303\244rs. Letzte Tagung 15./16.11.75 Schweiz", oo.cell(45,'A')
455
- #end
456
- end
457
-
458
- # "/tmp/xxxx" darf man unter Windows nicht verwenden, weil das nicht erkannt
459
- # wird.
460
- # Besser: Methode um temporaeres Dir. portabel zu bestimmen
461
- def test_huge_document_to_csv
462
- if LONG_RUN
463
- with_each_spreadsheet(:name=>'Bibelbund', :format=>[
464
- :openoffice,
465
- :excelx
466
- # Google hier nicht, weil Google-Spreadsheets nicht so gross werden
467
- # duerfen
468
- ]) do |oo|
469
- Dir.mktmpdir do |tempdir|
470
- assert_equal "Tagebuch des Sekret\303\244rs. Letzte Tagung 15./16.11.75 Schweiz", oo.cell(45,'A')
471
- assert_equal "Tagebuch des Sekret\303\244rs. Nachrichten aus Chile", oo.cell(46,'A')
472
- assert_equal "Tagebuch aus Chile Juli 1977", oo.cell(55,'A')
473
- assert oo.to_csv(File.join(tempdir,"Bibelbund.csv"))
474
- assert File.exists?(File.join(tempdir,"Bibelbund.csv"))
475
- assert_equal "", file_diff(File.join(TESTDIR, "Bibelbund.csv"), File.join(tempdir,"Bibelbund.csv")),
476
- "error in class #{oo.class}"
477
- #end
478
- end
479
- end
480
- end
481
- end
482
-
483
- def test_bug_quotes_excelx
484
- if LONG_RUN
485
- with_each_spreadsheet(:name=>'Bibelbund', :format=>[:openoffice, :excelx]) do |oo|
486
- oo.default_sheet = oo.sheets.first
487
- assert_equal 'Einflüsse der neuen Theologie in "de gereformeerde Kerken van Nederland"',
488
- oo.cell('a',76)
489
- oo.to_csv("csv#{$$}")
490
- assert_equal 'Einflüsse der neuen Theologie in "de gereformeerde Kerken van Nederland"',
491
- oo.cell('a',78)
492
- File.delete_if_exist("csv#{$$}")
493
- end
494
- end
495
348
  end
496
349
 
497
350
  def test_bug_mehrere_datum
@@ -573,17 +426,6 @@ class TestRoo < Minitest::Test
573
426
  end
574
427
  end
575
428
 
576
-
577
- def test_bug_empty_sheet
578
- with_each_spreadsheet(:name=>'formula', :format=>[:openoffice, :excelx]) do |oo|
579
- oo.default_sheet = 'Sheet3' # is an empty sheet
580
- Dir.mktmpdir do |tempdir|
581
- oo.to_csv(File.join(tempdir,"emptysheet.csv"))
582
- assert_equal "", `cat #{File.join(tempdir,"emptysheet.csv")}`
583
- end
584
- end
585
- end
586
-
587
429
  def test_find_by_row_huge_document
588
430
  if LONG_RUN
589
431
  with_each_spreadsheet(:name=>'Bibelbund', :format=>[:openoffice, :excelx]) do |oo|
@@ -718,7 +560,6 @@ class TestRoo < Minitest::Test
718
560
  end
719
561
  end
720
562
 
721
-
722
563
  #TODO: temporaerer Test
723
564
  def test_seiten_als_date
724
565
  if LONG_RUN
@@ -827,19 +668,6 @@ class TestRoo < Minitest::Test
827
668
  end
828
669
  end
829
670
 
830
- def test_should_raise_file_not_found_error
831
- if OPENOFFICE
832
- assert_raises(IOError) {
833
- Roo::OpenOffice.new(File.join('testnichtvorhanden','Bibelbund.ods'))
834
- }
835
- end
836
- if EXCELX
837
- assert_raises(IOError) {
838
- Roo::Excelx.new(File.join('testnichtvorhanden','Bibelbund.xlsx'))
839
- }
840
- end
841
- end
842
-
843
671
  def test_bug_bbu
844
672
  with_each_spreadsheet(:name=>'bbu', :format=>[:openoffice, :excelx]) do |oo|
845
673
  assert_equal "File: bbu#{get_extension(oo)}
@@ -875,200 +703,6 @@ Sheet 3:
875
703
  end
876
704
  end
877
705
 
878
- def test_date_time_to_csv
879
- with_each_spreadsheet(:name=>'time-test') do |oo|
880
- Dir.mktmpdir do |tempdir|
881
- csv_output = File.join(tempdir,'time_test.csv')
882
- assert oo.to_csv(csv_output)
883
- assert File.exists?(csv_output)
884
- assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/time-test.csv #{csv_output}`
885
- # --strip-trailing-cr is needed because the test-file use 0A and
886
- # the test on an windows box generates 0D 0A as line endings
887
- end
888
- end
889
- end
890
-
891
- def test_boolean_to_csv
892
- with_each_spreadsheet(:name=>'boolean') do |oo|
893
- Dir.mktmpdir do |tempdir|
894
- csv_output = File.join(tempdir,'boolean.csv')
895
- assert oo.to_csv(csv_output)
896
- assert File.exists?(csv_output)
897
- assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/boolean.csv #{csv_output}`
898
- # --strip-trailing-cr is needed because the test-file use 0A and
899
- # the test on an windows box generates 0D 0A as line endings
900
- end
901
- end
902
- end
903
- def test_link_to_csv
904
- with_each_spreadsheet(:name=>'link',:format=>:excelx) do |oo|
905
- Dir.mktmpdir do |tempdir|
906
- csv_output = File.join(tempdir,'link.csv')
907
- assert oo.to_csv(csv_output)
908
- assert File.exists?(csv_output)
909
- assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/link.csv #{csv_output}`
910
- # --strip-trailing-cr is needed because the test-file use 0A and
911
- # the test on an windows box generates 0D 0A as line endings
912
- end
913
- end
914
- end
915
- def test_date_time_yaml
916
- with_each_spreadsheet(:name=>'time-test') do |oo|
917
- expected =
918
- "--- \ncell_1_1: \n row: 1 \n col: 1 \n celltype: string \n value: Mittags: \ncell_1_2: \n row: 1 \n col: 2 \n celltype: time \n value: 12:13:14 \ncell_1_3: \n row: 1 \n col: 3 \n celltype: time \n value: 15:16:00 \ncell_1_4: \n row: 1 \n col: 4 \n celltype: time \n value: 23:00:00 \ncell_2_1: \n row: 2 \n col: 1 \n celltype: date \n value: 2007-11-21 \n"
919
- assert_equal expected, oo.to_yaml
920
- end
921
- end
922
-
923
- # Erstellt eine Liste aller Zellen im Spreadsheet. Dies ist nötig, weil ein einfacher
924
- # Textvergleich des XML-Outputs nicht funktioniert, da xml-builder die Attribute
925
- # nicht immer in der gleichen Reihenfolge erzeugt.
926
- def init_all_cells(oo,sheet)
927
- all = []
928
- oo.first_row(sheet).upto(oo.last_row(sheet)) do |row|
929
- oo.first_column(sheet).upto(oo.last_column(sheet)) do |col|
930
- unless oo.empty?(row,col,sheet)
931
- all << {:row => row.to_s,
932
- :column => col.to_s,
933
- :content => oo.cell(row,col,sheet).to_s,
934
- :type => oo.celltype(row,col,sheet).to_s,
935
- }
936
- end
937
- end
938
- end
939
- all
940
- end
941
-
942
- def test_to_xml
943
- with_each_spreadsheet(:name=>'numbers1', :encoding => 'utf8') do |oo|
944
- skip if defined? JRUBY_VERSION
945
- oo.to_xml
946
- sheetname = oo.sheets.first
947
- doc = Nokogiri::XML(oo.to_xml)
948
- sheet_count = 0
949
- doc.xpath('//spreadsheet/sheet').each {|tmpelem|
950
- sheet_count += 1
951
- }
952
- assert_equal 5, sheet_count
953
- doc.xpath('//spreadsheet/sheet').each { |xml_sheet|
954
- all_cells = init_all_cells(oo, sheetname)
955
- x = 0
956
- assert_equal sheetname, xml_sheet.attributes['name'].value
957
- xml_sheet.children.each {|cell|
958
- if cell.attributes['name']
959
- expected = [all_cells[x][:row],
960
- all_cells[x][:column],
961
- all_cells[x][:content],
962
- all_cells[x][:type],
963
- ]
964
- result = [
965
- cell.attributes['row'],
966
- cell.attributes['column'],
967
- cell.content,
968
- cell.attributes['type'],
969
- ]
970
- assert_equal expected, result
971
- x += 1
972
- end # if
973
- } # end of sheet
974
- sheetname = oo.sheets[oo.sheets.index(sheetname)+1]
975
- }
976
- end
977
- end
978
-
979
- def test_file_warning_default
980
- if OPENOFFICE
981
- assert_raises(TypeError, "test/files/numbers1.xls is not an openoffice spreadsheet") {
982
- Roo::OpenOffice.new(File.join(TESTDIR,"numbers1.xls"))
983
- }
984
- assert_raises(TypeError) { Roo::OpenOffice.new(File.join(TESTDIR,"numbers1.xlsx")) }
985
- end
986
- if EXCELX
987
- assert_raises(TypeError) { Roo::Excelx.new(File.join(TESTDIR,"numbers1.ods")) }
988
- assert_raises(TypeError) { Roo::Excelx.new(File.join(TESTDIR,"numbers1.xls")) }
989
- end
990
- end
991
-
992
- def test_file_warning_error
993
- if OPENOFFICE
994
- assert_raises(TypeError) {
995
- Roo::OpenOffice.new(File.join(TESTDIR,"numbers1.xls"),
996
- packed: false,
997
- file_warning: :error
998
- )
999
- }
1000
- assert_raises(TypeError) {
1001
- Roo::OpenOffice.new(File.join(TESTDIR,"numbers1.xlsx"),
1002
- packed: false,
1003
- file_warning: :error)
1004
- }
1005
- end
1006
- if EXCELX
1007
- assert_raises(TypeError) {
1008
- Roo::Excelx.new(File.join(TESTDIR,"numbers1.ods"),
1009
- packed: false,
1010
- file_warning: :error)
1011
- }
1012
- assert_raises(TypeError) {
1013
- Roo::Excelx.new(File.join(TESTDIR,"numbers1.xls"),
1014
- packed: false,
1015
- file_warning: :error)
1016
- }
1017
- end
1018
- end
1019
-
1020
- def test_file_warning_warning
1021
- if OPENOFFICE
1022
- assert_raises(ArgumentError) {
1023
- Roo::OpenOffice.new(File.join(TESTDIR,"numbers1.xlsx"),
1024
- packed: false,
1025
- file_warning: :warning)
1026
- }
1027
- end
1028
- if EXCELX
1029
- assert_raises(ArgumentError) {
1030
- Roo::Excelx.new(File.join(TESTDIR,"numbers1.ods"),
1031
- packed: false,
1032
- file_warning: :warning)
1033
- }
1034
- end
1035
- end
1036
-
1037
- def test_file_warning_ignore
1038
- if OPENOFFICE
1039
- # Files, die eigentlich OpenOffice-
1040
- # Files sind, aber die falsche Endung haben.
1041
- # Es soll ohne Fehlermeldung oder Warnung
1042
- # oder Abbruch die Datei geoffnet werden
1043
-
1044
- # xlsx
1045
- Roo::OpenOffice.new(File.join(TESTDIR,"type_openoffice.xlsx"),
1046
- packed: false,
1047
- file_warning: :ignore)
1048
- end
1049
- if EXCELX
1050
- Roo::Excelx.new(File.join(TESTDIR,"type_excelx.ods"),
1051
- packed: false,
1052
- file_warning: :ignore)
1053
- end
1054
- end
1055
-
1056
- def test_bug_to_xml_with_empty_sheets
1057
- with_each_spreadsheet(:name=>'emptysheets', :format=>[:openoffice, :excelx]) do |oo|
1058
- oo.sheets.each { |sheet|
1059
- assert_nil oo.first_row, "first_row not nil in sheet #{sheet}"
1060
- assert_nil oo.last_row, "last_row not nil in sheet #{sheet}"
1061
- assert_nil oo.first_column, "first_column not nil in sheet #{sheet}"
1062
- assert_nil oo.last_column, "last_column not nil in sheet #{sheet}"
1063
- assert_nil oo.first_row(sheet), "first_row not nil in sheet #{sheet}"
1064
- assert_nil oo.last_row(sheet), "last_row not nil in sheet #{sheet}"
1065
- assert_nil oo.first_column(sheet), "first_column not nil in sheet #{sheet}"
1066
- assert_nil oo.last_column(sheet), "last_column not nil in sheet #{sheet}"
1067
- }
1068
- oo.to_xml
1069
- end
1070
- end
1071
-
1072
706
  def test_bug_simple_spreadsheet_time_bug
1073
707
  # really a bug? are cells really of type time?
1074
708
  # No! :float must be the correct type
@@ -1324,7 +958,6 @@ Sheet 3:
1324
958
  end
1325
959
  end
1326
960
 
1327
-
1328
961
  # compare large spreadsheets
1329
962
  def test_compare_large_spreadsheets
1330
963
  # problematisch, weil Formeln in Excel nicht unterstützt werden
@@ -1446,95 +1079,6 @@ Sheet 3:
1446
1079
  end
1447
1080
  end
1448
1081
 
1449
- require 'matrix'
1450
- def test_matrix
1451
- with_each_spreadsheet(:name => 'matrix', :format => :openoffice) do |oo|
1452
- oo.default_sheet = oo.sheets.first
1453
- assert_equal Matrix[
1454
- [1.0, 2.0, 3.0],
1455
- [4.0, 5.0, 6.0],
1456
- [7.0, 8.0, 9.0] ], oo.to_matrix
1457
- end
1458
- end
1459
-
1460
- def test_matrix_selected_range
1461
- with_each_spreadsheet(:name => 'matrix', :format=>:openoffice) do |oo|
1462
- oo.default_sheet = 'Sheet2'
1463
- assert_equal Matrix[
1464
- [1.0, 2.0, 3.0],
1465
- [4.0, 5.0, 6.0],
1466
- [7.0, 8.0, 9.0] ], oo.to_matrix(3,4,5,6)
1467
- end
1468
- end
1469
-
1470
- def test_matrix_all_nil
1471
- with_each_spreadsheet(:name => 'matrix', :format=>:openoffice) do |oo|
1472
- oo.default_sheet = 'Sheet2'
1473
- assert_equal Matrix[
1474
- [nil, nil, nil],
1475
- [nil, nil, nil],
1476
- [nil, nil, nil] ], oo.to_matrix(10,10,12,12)
1477
- end
1478
- end
1479
-
1480
- def test_matrix_values_and_nil
1481
- with_each_spreadsheet(:name => 'matrix', :format=>:openoffice) do |oo|
1482
- oo.default_sheet = 'Sheet3'
1483
- assert_equal Matrix[
1484
- [1.0, nil, 3.0],
1485
- [4.0, 5.0, 6.0],
1486
- [7.0, 8.0, nil] ], oo.to_matrix(1,1,3,3)
1487
- end
1488
- end
1489
-
1490
- def test_matrix_specifying_sheet
1491
- with_each_spreadsheet(:name => 'matrix', :format => :openoffice) do |oo|
1492
- oo.default_sheet = oo.sheets.first
1493
- assert_equal Matrix[
1494
- [1.0, nil, 3.0],
1495
- [4.0, 5.0, 6.0],
1496
- [7.0, 8.0, nil] ], oo.to_matrix(nil, nil, nil, nil, 'Sheet3')
1497
- end
1498
- end
1499
-
1500
- # unter Windows soll es laut Bug-Reports nicht moeglich sein, eine Excel-Datei, die
1501
- # mit Excel.new geoeffnet wurde nach dem Processing anschliessend zu loeschen.
1502
- # Anmerkung: Das Spreadsheet-Gem erlaubt kein explizites Close von Spreadsheet-Dateien,
1503
- # was verhindern koennte, das die Datei geloescht werden kann.
1504
- # def test_bug_cannot_delete_opened_excel_sheet
1505
- # with_each_spreadsheet(:name=>'simple_spreadsheet') do |oo|
1506
- # 'kopiere nach temporaere Datei und versuche diese zu oeffnen und zu loeschen'
1507
- # end
1508
- # end
1509
-
1510
- def test_bug_xlsx_reference_cell
1511
-
1512
- if EXCELX
1513
- =begin
1514
- If cell A contains a string and cell B references cell A. When reading the value of cell B, the result will be
1515
- "0.0" instead of the value of cell A.
1516
-
1517
- With the attached test case, I ran the following code:
1518
- spreadsheet = Roo::Excelx.new('formula_string_error.xlsx')
1519
- spreadsheet.default_sheet = 'sheet1'
1520
- p "A: #{spreadsheet.cell(1, 1)}"
1521
- p "B: #{spreadsheet.cell(2, 1)}"
1522
-
1523
- with the following results
1524
- "A: TestString"
1525
- "B: 0.0"
1526
-
1527
- where the expected result is
1528
- "A: TestString"
1529
- "B: TestString"
1530
- =end
1531
- xlsx = Roo::Excelx.new(File.join(TESTDIR, "formula_string_error.xlsx"))
1532
- xlsx.default_sheet = xlsx.sheets.first
1533
- assert_equal 'Teststring', xlsx.cell('a',1)
1534
- assert_equal 'Teststring', xlsx.cell('a',2)
1535
- end
1536
- end
1537
-
1538
1082
  # #formulas of an empty sheet should return an empty array and not result in
1539
1083
  # an error message
1540
1084
  # 2011-06-24
@@ -1547,116 +1091,6 @@ where the expected result is
1547
1091
  end
1548
1092
  end
1549
1093
 
1550
- # #to_yaml of an empty sheet should return an empty string and not result in
1551
- # an error message
1552
- # 2011-06-24
1553
- def test_bug_to_yaml_empty_sheet
1554
- with_each_spreadsheet(:name =>'emptysheets',
1555
- :format=>[:openoffice,:excelx]) do |oo|
1556
- oo.default_sheet = oo.sheets.first
1557
- oo.to_yaml
1558
- assert_equal('', oo.to_yaml)
1559
- end
1560
- end
1561
-
1562
- # #to_matrix of an empty sheet should return an empty matrix and not result in
1563
- # an error message
1564
- # 2011-06-25
1565
- def test_bug_to_matrix_empty_sheet
1566
- with_each_spreadsheet(:name =>'emptysheets',
1567
- :format=>[:openoffice,:excelx]) do |oo|
1568
- oo.default_sheet = oo.sheets.first
1569
- oo.to_matrix
1570
- assert_equal(Matrix.empty(0,0), oo.to_matrix)
1571
- end
1572
- end
1573
-
1574
- # 2011-08-03
1575
- def test_bug_datetime_to_csv
1576
- with_each_spreadsheet(:name=>'datetime') do |oo|
1577
- Dir.mktmpdir do |tempdir|
1578
- datetime_csv_file = File.join(tempdir,"datetime.csv")
1579
-
1580
- assert oo.to_csv(datetime_csv_file)
1581
- assert File.exists?(datetime_csv_file)
1582
- assert_equal "", file_diff('test/files/so_datetime.csv', datetime_csv_file)
1583
- end
1584
- end
1585
- end
1586
-
1587
- # 2011-08-11
1588
- def test_bug_openoffice_formula_missing_letters
1589
- if LIBREOFFICE
1590
- # Dieses Dokument wurde mit LibreOffice angelegt.
1591
- # Keine Ahnung, ob es damit zusammenhaengt, das diese
1592
- # Formeln anders sind, als in der Datei formula.ods, welche
1593
- # mit OpenOffice angelegt wurde.
1594
- # Bei den OpenOffice-Dateien ist in diesem Feld in der XML-
1595
- # Datei of: als Prefix enthalten, waehrend in dieser Datei
1596
- # irgendetwas mit oooc: als Prefix verwendet wird.
1597
- oo = Roo::OpenOffice.new(File.join(TESTDIR,'dreimalvier.ods'))
1598
- oo.default_sheet = oo.sheets.first
1599
- assert_equal '=SUM([.A1:.D1])', oo.formula('e',1)
1600
- assert_equal '=SUM([.A2:.D2])', oo.formula('e',2)
1601
- assert_equal '=SUM([.A3:.D3])', oo.formula('e',3)
1602
- assert_equal [
1603
- [1,5,'=SUM([.A1:.D1])'],
1604
- [2,5,'=SUM([.A2:.D2])'],
1605
- [3,5,'=SUM([.A3:.D3])'],
1606
- ], oo.formulas
1607
-
1608
- end
1609
- end
1610
-
1611
- =begin
1612
- def test_postprocessing_and_types_in_csv
1613
- if CSV
1614
- oo = CSV.new(File.join(TESTDIR,'csvtypes.csv'))
1615
- oo.default_sheet = oo.sheets.first
1616
- assert_equal(1,oo.a1)
1617
- assert_equal(:float,oo.celltype('A',1))
1618
- assert_equal("2",oo.b1)
1619
- assert_equal(:string,oo.celltype('B',1))
1620
- assert_equal("Mayer",oo.c1)
1621
- assert_equal(:string,oo.celltype('C',1))
1622
- end
1623
- end
1624
- =end
1625
-
1626
- =begin
1627
- def test_postprocessing_with_callback_function
1628
- if CSV
1629
- oo = CSV.new(File.join(TESTDIR,'csvtypes.csv'))
1630
- oo.default_sheet = oo.sheets.first
1631
-
1632
- #
1633
- assert_equal(1, oo.last_column)
1634
- end
1635
- end
1636
- =end
1637
-
1638
- =begin
1639
- def x_123
1640
- class ::CSV
1641
- def cell_postprocessing(row,col,value)
1642
- if row < 3
1643
- return nil
1644
- end
1645
- return value
1646
- end
1647
- end
1648
- end
1649
- =end
1650
-
1651
- def test_nil_rows_and_lines_csv
1652
- # x_123
1653
- if CSV
1654
- oo = Roo::CSV.new(File.join(TESTDIR,'Bibelbund.csv'))
1655
- oo.default_sheet = oo.sheets.first
1656
- assert_equal 1, oo.first_row
1657
- end
1658
- end
1659
-
1660
1094
  def test_bug_pfand_from_windows_phone_xlsx
1661
1095
  return if defined? JRUBY_VERSION
1662
1096
  with_each_spreadsheet(:name=>'Pfand_from_windows_phone', :format=>:excelx) do |oo|
@@ -1707,50 +1141,6 @@ where the expected result is
1707
1141
  end
1708
1142
  end
1709
1143
 
1710
- ## PREVIOUSLY SKIPPED
1711
-
1712
- # don't have these test files so removing. We can easily add in
1713
- # by modifying with_each_spreadsheet
1714
- GNUMERIC_ODS = false # do gnumeric with ods files Tests?
1715
- OPENOFFICEWRITE = false # experimental: write access with OO-Documents
1716
-
1717
- def test_writeopenoffice
1718
- if OPENOFFICEWRITE
1719
- File.cp(File.join(TESTDIR,"numbers1.ods"),
1720
- File.join(TESTDIR,"numbers2.ods"))
1721
- File.cp(File.join(TESTDIR,"numbers2.ods"),
1722
- File.join(TESTDIR,"bak_numbers2.ods"))
1723
- oo = OpenOffice.new(File.join(TESTDIR,"numbers2.ods"))
1724
- oo.default_sheet = oo.sheets.first
1725
- oo.first_row.upto(oo.last_row) {|y|
1726
- oo.first_column.upto(oo.last_column) {|x|
1727
- unless oo.empty?(y,x)
1728
- # oo.set(y, x, oo.cell(y,x) + 7) if oo.celltype(y,x) == "float"
1729
- oo.set(y, x, oo.cell(y,x) + 7) if oo.celltype(y,x) == :float
1730
- end
1731
- }
1732
- }
1733
- oo.save
1734
-
1735
- oo1 = Roo::OpenOffice.new(File.join(TESTDIR,"numbers2.ods"))
1736
- oo2 = Roo::OpenOffice.new(File.join(TESTDIR,"bak_numbers2.ods"))
1737
- #p oo2.to_s
1738
- assert_equal 999, oo2.cell('a',1), oo2.cell('a',1)
1739
- assert_equal oo2.cell('a',1) + 7, oo1.cell('a',1)
1740
- assert_equal oo2.cell('b',1)+7, oo1.cell('b',1)
1741
- assert_equal oo2.cell('c',1)+7, oo1.cell('c',1)
1742
- assert_equal oo2.cell('d',1)+7, oo1.cell('d',1)
1743
- assert_equal oo2.cell('a',2)+7, oo1.cell('a',2)
1744
- assert_equal oo2.cell('b',2)+7, oo1.cell('b',2)
1745
- assert_equal oo2.cell('c',2)+7, oo1.cell('c',2)
1746
- assert_equal oo2.cell('d',2)+7, oo1.cell('d',2)
1747
- assert_equal oo2.cell('e',2)+7, oo1.cell('e',2)
1748
-
1749
- File.cp(File.join(TESTDIR,"bak_numbers2.ods"),
1750
- File.join(TESTDIR,"numbers2.ods"))
1751
- end
1752
- end
1753
-
1754
1144
  def common_possible_bug_snowboard_cells(ss)
1755
1145
  assert_equal "A.", ss.cell(13,'A'), ss.class
1756
1146
  assert_equal 147, ss.cell(13,'f'), ss.class
@@ -1766,323 +1156,12 @@ where the expected result is
1766
1156
  assert_equal "168W", ss.cell(13,'o'), ss.class
1767
1157
  end
1768
1158
 
1769
- # def test_false_encoding
1770
- # ex = Roo::Excel.new(File.join(TESTDIR,'false_encoding.xls'))
1771
- # ex.default_sheet = ex.sheets.first
1772
- # assert_equal "Sheet1", ex.sheets.first
1773
- # ex.first_row.upto(ex.last_row) do |row|
1774
- # ex.first_column.upto(ex.last_column) do |col|
1775
- # content = ex.cell(row,col)
1776
- # puts "#{row}/#{col}"
1777
- # #puts content if ! ex.empty?(row,col) or ex.formula?(row,col)
1778
- # if ex.formula?(row,col)
1779
- # #! ex.empty?(row,col)
1780
- # puts content
1781
- # end
1782
- # end
1783
- # end
1784
- # end
1785
-
1786
- def test_download_uri
1787
- if ONLINE
1788
- if OPENOFFICE
1789
- assert_raises(RuntimeError) {
1790
- Roo::OpenOffice.new("http://gibbsnichtdomainxxxxx.com/file.ods")
1791
- }
1792
- end
1793
- if EXCELX
1794
- assert_raises(RuntimeError) {
1795
- Roo::Excelx.new("http://gibbsnichtdomainxxxxx.com/file.xlsx")
1796
- }
1797
- end
1798
- end
1799
- end
1800
-
1801
- def test_download_uri_with_query_string
1802
- dir = File.expand_path("#{File.dirname __FILE__}/files")
1803
- { xlsx: [EXCELX, Roo::Excelx],
1804
- ods: [OPENOFFICE, Roo::OpenOffice]}.each do |extension, (flag, type)|
1805
- if flag
1806
- file = "#{dir}/simple_spreadsheet.#{extension}"
1807
- url = "http://test.example.com/simple_spreadsheet.#{extension}?query-param=value"
1808
- stub_request(:any, url).to_return(body: File.read(file))
1809
- spreadsheet = type.new(url)
1810
- spreadsheet.default_sheet = spreadsheet.sheets.first
1811
- assert_equal 'Task 1', spreadsheet.cell('f', 4)
1812
- end
1813
- end
1814
- end
1815
-
1816
- # def test_soap_server
1817
- # #threads = []
1818
- # #threads << Thread.new("serverthread") do
1819
- # fork do
1820
- # p "serverthread started"
1821
- # puts "in child, pid = #$$"
1822
- # puts `/usr/bin/ruby rooserver.rb`
1823
- # p "serverthread finished"
1824
- # end
1825
- # #threads << Thread.new("clientthread") do
1826
- # p "clientthread started"
1827
- # sleep 10
1828
- # proxy = SOAP::RPC::Driver.new("http://localhost:12321","spreadsheetserver")
1829
- # proxy.add_method('cell','row','col')
1830
- # proxy.add_method('officeversion')
1831
- # proxy.add_method('last_row')
1832
- # proxy.add_method('last_column')
1833
- # proxy.add_method('first_row')
1834
- # proxy.add_method('first_column')
1835
- # proxy.add_method('sheets')
1836
- # proxy.add_method('set_default_sheet','s')
1837
- # proxy.add_method('ferien_fuer_region', 'region')
1838
-
1839
- # sheets = proxy.sheets
1840
- # p sheets
1841
- # proxy.set_default_sheet(sheets.first)
1842
-
1843
- # assert_equal 1, proxy.first_row
1844
- # assert_equal 1, proxy.first_column
1845
- # assert_equal 187, proxy.last_row
1846
- # assert_equal 7, proxy.last_column
1847
- # assert_equal 42, proxy.cell('C',8)
1848
- # assert_equal 43, proxy.cell('F',12)
1849
- # assert_equal "1.0", proxy.officeversion
1850
- # p "clientthread finished"
1851
- # #end
1852
- # #threads.each {|t| t.join }
1853
- # puts "fertig"
1854
- # Process.kill("INT",pid)
1855
- # pid = Process.wait
1856
- # puts "child terminated, pid= #{pid}, status= #{$?.exitstatus}"
1857
- # end
1858
-
1859
- def split_coord(s)
1860
- letter = ""
1861
- number = 0
1862
- i = 0
1863
- while i<s.length and "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".include?(s[i,1])
1864
- letter += s[i,1]
1865
- i+=1
1866
- end
1867
- while i<s.length and "01234567890".include?(s[i,1])
1868
- number = number*10 + s[i,1].to_i
1869
- i+=1
1870
- end
1871
- if letter=="" or number==0
1872
- raise ArgumentError
1873
- end
1874
- return letter,number
1875
- end
1876
-
1877
- #def sum(s,expression)
1878
- # arg = expression.split(':')
1879
- # b,z = split_coord(arg[0])
1880
- # first_row = z
1881
- # first_col = OpenOffice.letter_to_number(b)
1882
- # b,z = split_coord(arg[1])
1883
- # last_row = z
1884
- # last_col = OpenOffice.letter_to_number(b)
1885
- # result = 0
1886
- # first_row.upto(last_row) {|row|
1887
- # first_col.upto(last_col) {|col|
1888
- # result = result + s.cell(row,col)
1889
- # }
1890
- # }
1891
- # result
1892
- #end
1893
-
1894
- #def test_dsl
1895
- # s = OpenOffice.new(File.join(TESTDIR,"numbers1.ods"))
1896
- # s.default_sheet = s.sheets.first
1897
- #
1898
- # s.set 'a',1, 5
1899
- # s.set 'b',1, 3
1900
- # s.set 'c',1, 7
1901
- # s.set('a',2, s.cell('a',1)+s.cell('b',1))
1902
- # assert_equal 8, s.cell('a',2)
1903
- #
1904
- # assert_equal 15, sum(s,'A1:C1')
1905
- # end
1906
-
1907
- #def test_create_spreadsheet1
1908
- # name = File.join(TESTDIR,'createdspreadsheet.ods')
1909
- # rm(name) if File.exists?(File.join(TESTDIR,'createdspreadsheet.ods'))
1910
- # # anlegen, falls noch nicht existierend
1911
- # s = OpenOffice.new(name,true)
1912
- # assert File.exists?(name)
1913
- #end
1914
-
1915
- #def test_create_spreadsheet2
1916
- # # anlegen, falls noch nicht existierend
1917
- # s = OpenOffice.new(File.join(TESTDIR,"createdspreadsheet.ods"),true)
1918
- # s.set 'a',1,42
1919
- # s.set 'b',1,43
1920
- # s.set 'c',1,44
1921
- # s.save
1922
- #
1923
- # t = OpenOffice.new(File.join(TESTDIR,"createdspreadsheet.ods"))
1924
- # assert_equal 42, t.cell(1,'a')
1925
- # assert_equal 43, t.cell('b',1)
1926
- # assert_equal 44, t.cell('c',3)
1927
- #end
1928
-
1929
- # We don't have the bode-v1.xlsx test file
1930
- # #TODO: xlsx-Datei anpassen!
1931
- # def test_excelx_download_uri_and_zipped
1932
- # #TODO: gezippte xlsx Datei online zum Testen suchen
1933
- # if EXCELX
1934
- # if ONLINE
1935
- # url = 'http://stiny-leonhard.de/bode-v1.xlsx.zip'
1936
- # excel = Roo::Excelx.new(url, :zip)
1937
- # assert_equal 'ist "e" im Nenner von H(s)', excel.cell('b', 5)
1938
- # end
1939
- # end
1940
- # end
1941
-
1942
- # def test_excelx_zipped
1943
- # # TODO: bode...xls bei Gelegenheit nach .xlsx konverieren lassen und zippen!
1944
- # if EXCELX
1945
- # # diese Datei gibt es noch nicht gezippt
1946
- # excel = Roo::Excelx.new(File.join(TESTDIR,"bode-v1.xlsx.zip"), :zip)
1947
- # assert excel
1948
- # assert_raises(ArgumentError) {
1949
- # assert_equal 'ist "e" im Nenner von H(s)', excel.cell('b', 5)
1950
- # }
1951
- # excel.default_sheet = excel.sheets.first
1952
- # assert_equal 'ist "e" im Nenner von H(s)', excel.cell('b', 5)
1953
- # end
1954
- # end
1955
-
1956
- def test_csv_parsing_with_headers
1957
- return unless CSV
1958
- headers = ["TITEL", "VERFASSER", "OBJEKT", "NUMMER", "SEITE", "INTERNET", "PC", "KENNUNG"]
1959
-
1960
- oo = Roo::Spreadsheet.open(File.join(TESTDIR, 'Bibelbund.csv'))
1961
- parsed = oo.parse(:headers => true)
1962
- assert_equal headers, parsed[1].keys
1963
- end
1964
-
1965
1159
  def test_bug_numbered_sheet_names
1966
1160
  with_each_spreadsheet(:name=>'bug-numbered-sheet-names', :format=>:excelx) do |oo|
1967
1161
  oo.each_with_pagename { }
1968
1162
  end
1969
1163
  end
1970
1164
 
1971
- def test_parsing_xslx_from_numbers
1972
- return unless EXCELX
1973
- xlsx = Roo::Excelx.new(File.join(TESTDIR, "numbers-export.xlsx"))
1974
-
1975
- xlsx.default_sheet = xlsx.sheets.first
1976
- assert_equal 'Sheet 1', xlsx.cell('a',1)
1977
-
1978
- # Another buggy behavior of Numbers 3.1: if a warkbook has more than a
1979
- # single sheet, all sheets except the first one will have an extra row and
1980
- # column added to the beginning. That's why we assert against cell B2 and
1981
- # not A1
1982
- xlsx.default_sheet = xlsx.sheets.last
1983
- assert_equal 'Sheet 2', xlsx.cell('b',2)
1984
- end
1985
-
1986
- def test_openoffice_encryption
1987
- if OPENOFFICE
1988
- assert_raises(ArgumentError) { Roo::LibreOffice.new(File.join(TESTDIR, "encrypted-letmein.ods")) }
1989
- assert_raises(ArgumentError) { Roo::LibreOffice.new(File.join(TESTDIR, "encrypted-letmein.ods"), :password => "badpassword") }
1990
- oo = Roo::LibreOffice.new(File.join(TESTDIR, "encrypted-letmein.ods"), :password => "letmein")
1991
- oo.default_sheet = oo.sheets.first
1992
- assert_equal "Hello World", oo.cell('a',1)
1993
- end
1994
- end
1995
-
1996
- def test_expand_merged_range
1997
- return unless EXCELX
1998
- xlsx = Roo::Excelx.new(File.join(TESTDIR, "merged_ranges.xlsx"), {:expand_merged_ranges => true})
1999
- for row in 3..7 do
2000
- for col in 'a'..'b'
2001
- if row > 3 && row < 7 && col == 'a'
2002
- assert_equal 'vertical1', xlsx.cell(col,row)
2003
- else
2004
- assert_nil xlsx.cell(col,row)
2005
- end
2006
- end
2007
- end
2008
- for row in 3..11 do
2009
- for col in 'f'..'h'
2010
- if row > 3 && row < 11 && col == 'g'
2011
- assert_equal 'vertical2', xlsx.cell(col,row)
2012
- else
2013
- assert_nil xlsx.cell(col,row)
2014
- end
2015
- end
2016
- end
2017
- for row in 3..5 do
2018
- for col in 'b'..'f'
2019
- if row == 4 && col > 'b' && col < 'f'
2020
- assert_equal 'horizontal', xlsx.cell(col,row)
2021
- else
2022
- assert_nil xlsx.cell(col,row)
2023
- end
2024
- end
2025
- end
2026
- for row in 8..13 do
2027
- for col in 'a'..'e'
2028
- if row > 8 && row < 13 && col > 'a' && col < 'e'
2029
- assert_equal 'block', xlsx.cell(col,row)
2030
- else
2031
- assert_nil xlsx.cell(col,row)
2032
- end
2033
- end
2034
- end
2035
- end
2036
-
2037
- def test_noexpand_merged_range
2038
- return unless EXCELX
2039
- xlsx = Roo::Excelx.new(File.join(TESTDIR, "merged_ranges.xlsx"))
2040
- for row in 3..7 do
2041
- for col in 'a'..'b'
2042
- if row == 4 && col == 'a'
2043
- assert_equal 'vertical1', xlsx.cell(col,row)
2044
- else
2045
- assert_nil xlsx.cell(col,row)
2046
- end
2047
- end
2048
- end
2049
- for row in 3..11 do
2050
- for col in 'f'..'h'
2051
- if row == 4 && col == 'g'
2052
- assert_equal 'vertical2', xlsx.cell(col,row)
2053
- else
2054
- assert_nil xlsx.cell(col,row)
2055
- end
2056
- end
2057
- end
2058
- for row in 3..5 do
2059
- for col in 'b'..'f'
2060
- if row == 4 && col == 'c'
2061
- assert_equal 'horizontal', xlsx.cell(col,row)
2062
- else
2063
- assert_nil xlsx.cell(col,row)
2064
- end
2065
- end
2066
- end
2067
- for row in 8..13 do
2068
- for col in 'a'..'e'
2069
- if row == 9 && col == 'b'
2070
- assert_equal 'block', xlsx.cell(col,row)
2071
- else
2072
- assert_nil xlsx.cell(col,row)
2073
- end
2074
- end
2075
- end
2076
- end
2077
-
2078
- def test_open_stream
2079
- return unless EXCELX
2080
- file_contents = File.read File.join(TESTDIR, fixture_filename(:numbers1, :excelx)), encoding: 'BINARY'
2081
- stream = StringIO.new(file_contents)
2082
- xlsx = Roo::Excelx.new(stream)
2083
- assert_equal ["Tabelle1","Name of Sheet 2","Sheet3","Sheet4","Sheet5"], xlsx.sheets
2084
- end
2085
-
2086
1165
  def test_close
2087
1166
  with_each_spreadsheet(:name=>'numbers1') do |oo|
2088
1167
  next unless (tempdir = oo.instance_variable_get('@tmpdir'))
@@ -2091,16 +1170,31 @@ where the expected result is
2091
1170
  end
2092
1171
  end
2093
1172
 
1173
+ # NOTE: Ruby 2.4.0 changed the way GC works. The last Roo object created by
1174
+ # with_each_spreadsheet wasn't getting GC'd until after the process
1175
+ # ended.
1176
+ #
1177
+ # That behavior change broke this test. In order to fix it, I forked the
1178
+ # process and passed the temp directories from the forked process in
1179
+ # order to check if they were removed properly.
2094
1180
  def test_finalize
2095
- tempdirs = []
2096
- begin
2097
- with_each_spreadsheet(:name=>'numbers1') do |oo|
2098
- tempdirs << oo.instance_variable_get('@tmpdir')
1181
+ skip if defined? JRUBY_VERSION
1182
+
1183
+ read, write = IO.pipe
1184
+ pid = Process.fork do
1185
+ with_each_spreadsheet(name: "numbers1") do |oo|
1186
+ write.puts oo.instance_variable_get("@tmpdir")
2099
1187
  end
2100
- GC.start
2101
1188
  end
1189
+
1190
+ Process.wait(pid)
1191
+ write.close
1192
+ tempdirs = read.read.split("\n")
1193
+ read.close
1194
+
1195
+ refute tempdirs.empty?
2102
1196
  tempdirs.each do |tempdir|
2103
- assert !File.exists?(tempdir), "Expected #{tempdir} to be cleaned up, but it still exists"
1197
+ refute File.exist?(tempdir), "Expected #{tempdir} to be cleaned up, but it still exists"
2104
1198
  end
2105
1199
  end
2106
1200