# encoding: utf-8 # damit keine falschen Vermutungen aufkommen: Ich habe religioes rein gar nichts # mit diesem Bibelbund zu tun, aber die hatten eine ziemlich grosse # Spreadsheet-Datei mit ca. 3500 Zeilen oeffentlich im Netz, die sich ganz gut # zum Testen eignete. # #-- # these test cases were developed to run under Linux OS, some commands # (like 'diff') must be changed (or commented out ;-)) if you want to run # the tests under another OS # #TODO # Look at formulas in excel - does not work with date/time # Dump warnings that come from the test to open files # with the wrong spreadsheet class #STDERR.reopen "/dev/null","w" require 'test_helper' require 'stringio' class TestRoo < Minitest::Test OPENOFFICE = true # do OpenOffice-Spreadsheet Tests? (.ods files) EXCELX = true # do Excelx Tests? (.xlsx files) LIBREOFFICE = true # do LibreOffice tests? (.ods files) CSV = true # do CSV tests? (.csv files) FORMATS = [ :excelx, :excelxm, :openoffice, :libreoffice ] ONLINE = false LONG_RUN = false def fixture_filename(name, format) case format when :excelx "#{name}.xlsx" when :excelxm "#{name}.xlsm" when :openoffice, :libreoffice "#{name}.ods" else raise ArgumentError, "unexpected format #{format}" end end # call a block of code for each spreadsheet type # and yield a reference to the roo object def with_each_spreadsheet(options) if options[:format] formats = Array(options[:format]) invalid_formats = formats - FORMATS unless invalid_formats.empty? raise "invalid spreadsheet types: #{invalid_formats.join(', ')}" end else formats = FORMATS end formats.each do |format| begin yield Roo::Spreadsheet.open(File.join(TESTDIR, fixture_filename(options[:name], format))) rescue => e raise e, "#{e.message} for #{format}", e.backtrace unless options[:ignore_errors] end end end def test_sheets_csv if CSV oo = Roo::CSV.new(File.join(TESTDIR,'numbers1.csv')) assert_equal ["default"], oo.sheets assert_raises(RangeError) { oo.default_sheet = "no_sheet" } assert_raises(TypeError) { oo.default_sheet = [1,2,3] } oo.sheets.each { |sh| oo.default_sheet = sh assert_equal sh, oo.default_sheet } end end def test_sheets with_each_spreadsheet(:name=>'numbers1') do |oo| assert_equal ["Tabelle1","Name of Sheet 2","Sheet3","Sheet4","Sheet5"], oo.sheets assert_raises(RangeError) { oo.default_sheet = "no_sheet" } assert_raises(TypeError) { oo.default_sheet = [1,2,3] } oo.sheets.each { |sh| oo.default_sheet = sh assert_equal sh, oo.default_sheet } end end def test_cells with_each_spreadsheet(:name=>'numbers1') do |oo| # warum ist Auswaehlen erstes sheet hier nicht # mehr drin? oo.default_sheet = oo.sheets.first assert_equal 1, oo.cell(1,1) assert_equal 2, oo.cell(1,2) assert_equal 3, oo.cell(1,3) assert_equal 4, oo.cell(1,4) assert_equal 5, oo.cell(2,1) assert_equal 6, oo.cell(2,2) assert_equal 7, oo.cell(2,3) assert_equal 8, oo.cell(2,4) assert_equal 9, oo.cell(2,5) assert_equal "test", oo.cell(2,6) assert_equal :string, oo.celltype(2,6) assert_equal 11, oo.cell(2,7) unless oo.kind_of? Roo::CSV assert_equal :float, oo.celltype(2,7) end assert_equal 10, oo.cell(4,1) assert_equal 11, oo.cell(4,2) assert_equal 12, oo.cell(4,3) assert_equal 13, oo.cell(4,4) assert_equal 14, oo.cell(4,5) assert_equal 10, oo.cell(4,'A') assert_equal 11, oo.cell(4,'B') assert_equal 12, oo.cell(4,'C') assert_equal 13, oo.cell(4,'D') assert_equal 14, oo.cell(4,'E') unless oo.kind_of? Roo::CSV assert_equal :date, oo.celltype(5,1) assert_equal Date.new(1961,11,21), oo.cell(5,1) assert_equal "1961-11-21", oo.cell(5,1).to_s end end end def test_celltype with_each_spreadsheet(:name=>'numbers1') do |oo| assert_equal :string, oo.celltype(2,6) end end def test_cell_address with_each_spreadsheet(:name=>'numbers1') do |oo| assert_equal "tata", oo.cell(6,1) assert_equal "tata", oo.cell(6,'A') assert_equal "tata", oo.cell('A',6) assert_equal "tata", oo.cell(6,'a') assert_equal "tata", oo.cell('a',6) assert_raises(ArgumentError) { assert_equal "tata", oo.cell('a','f') } assert_raises(ArgumentError) { assert_equal "tata", oo.cell('f','a') } assert_equal "thisisc8", oo.cell(8,3) assert_equal "thisisc8", oo.cell(8,'C') assert_equal "thisisc8", oo.cell('C',8) assert_equal "thisisc8", oo.cell(8,'c') assert_equal "thisisc8", oo.cell('c',8) assert_equal "thisisd9", oo.cell('d',9) assert_equal "thisisa11", oo.cell('a',11) end end def test_office_version with_each_spreadsheet(:name=>'numbers1', :format=>:openoffice) do |oo| assert_equal "1.0", oo.officeversion end end def test_libre_office if LIBREOFFICE oo = Roo::LibreOffice.new(File.join(TESTDIR, "numbers1.ods")) oo.default_sheet = oo.sheets.first assert_equal 41, oo.cell('a',12) end end def test_sheetname with_each_spreadsheet(:name=>'numbers1') do |oo| oo.default_sheet = "Name of Sheet 2" assert_equal 'I am sheet 2', oo.cell('C',5) assert_raises(RangeError) { oo.default_sheet = "non existing sheet name" } assert_raises(RangeError) { oo.default_sheet = "non existing sheet name" } assert_raises(RangeError) { oo.cell('C',5,"non existing sheet name")} assert_raises(RangeError) { oo.celltype('C',5,"non existing sheet name")} assert_raises(RangeError) { oo.empty?('C',5,"non existing sheet name")} assert_raises(RangeError) { oo.formula?('C',5,"non existing sheet name")} assert_raises(RangeError) { oo.formula('C',5,"non existing sheet name")} assert_raises(RangeError) { oo.set('C',5,42,"non existing sheet name")} assert_raises(RangeError) { oo.formulas("non existing sheet name")} assert_raises(RangeError) { oo.to_yaml({},1,1,1,1,"non existing sheet name")} end end def test_argument_error with_each_spreadsheet(:name=>'numbers1') do |oo| oo.default_sheet = "Tabelle1" end end def test_bug_contiguous_cells with_each_spreadsheet(:name=>'numbers1', :format=>:openoffice) do |oo| oo.default_sheet = "Sheet4" assert_equal Date.new(2007,06,16), oo.cell('a',1) assert_equal 10, oo.cell('b',1) assert_equal 10, oo.cell('c',1) assert_equal 10, oo.cell('d',1) assert_equal 10, oo.cell('e',1) end end def test_bug_italo_ve with_each_spreadsheet(:name=>'numbers1') do |oo| oo.default_sheet = "Sheet5" assert_equal 1, oo.cell('A',1) assert_equal 5, oo.cell('b',1) assert_equal 5, oo.cell('c',1) assert_equal 2, oo.cell('a',2) assert_equal 3, oo.cell('a',3) end end def test_italo_table with_each_spreadsheet(:name=>'simple_spreadsheet_from_italo', :format=>:openoffice) do |oo| assert_equal '1', oo.cell('A',1) assert_equal '1', oo.cell('B',1) assert_equal '1', oo.cell('C',1) assert_equal 1, oo.cell('A',2).to_i assert_equal 2, oo.cell('B',2).to_i assert_equal 1, oo.cell('C',2).to_i assert_equal 1, oo.cell('A',3) assert_equal 3, oo.cell('B',3) assert_equal 1, oo.cell('C',3) assert_equal 'A', oo.cell('A',4) assert_equal 'A', oo.cell('B',4) assert_equal 'A', oo.cell('C',4) assert_equal 0.01, oo.cell('A',5) assert_equal 0.01, oo.cell('B',5) assert_equal 0.01, oo.cell('C',5) assert_equal 0.03, oo.cell('a',5)+oo.cell('b',5)+oo.cell('c',5) # Cells values in row 1: assert_equal "1:string", oo.cell(1, 1)+":"+oo.celltype(1, 1).to_s assert_equal "1:string",oo.cell(1, 2)+":"+oo.celltype(1, 2).to_s assert_equal "1:string",oo.cell(1, 3)+":"+oo.celltype(1, 3).to_s # Cells values in row 2: assert_equal "1:string",oo.cell(2, 1)+":"+oo.celltype(2, 1).to_s assert_equal "2:string",oo.cell(2, 2)+":"+oo.celltype(2, 2).to_s assert_equal "1:string",oo.cell(2, 3)+":"+oo.celltype(2, 3).to_s # Cells values in row 3: assert_equal "1.0:float",oo.cell(3, 1).to_s+":"+oo.celltype(3, 1).to_s assert_equal "3.0:float",oo.cell(3, 2).to_s+":"+oo.celltype(3, 2).to_s assert_equal "1.0:float",oo.cell(3, 3).to_s+":"+oo.celltype(3, 3).to_s # Cells values in row 4: assert_equal "A:string",oo.cell(4, 1)+":"+oo.celltype(4, 1).to_s assert_equal "A:string",oo.cell(4, 2)+":"+oo.celltype(4, 2).to_s assert_equal "A:string",oo.cell(4, 3)+":"+oo.celltype(4, 3).to_s # Cells values in row 5: if oo.class == Roo::OpenOffice assert_equal "0.01:percentage",oo.cell(5, 1).to_s+":"+oo.celltype(5, 1).to_s assert_equal "0.01:percentage",oo.cell(5, 2).to_s+":"+oo.celltype(5, 2).to_s assert_equal "0.01:percentage",oo.cell(5, 3).to_s+":"+oo.celltype(5, 3).to_s else assert_equal "0.01:float",oo.cell(5, 1).to_s+":"+oo.celltype(5, 1).to_s assert_equal "0.01:float",oo.cell(5, 2).to_s+":"+oo.celltype(5, 2).to_s assert_equal "0.01:float",oo.cell(5, 3).to_s+":"+oo.celltype(5, 3).to_s end end end def test_formula_openoffice with_each_spreadsheet(:name=>'formula', :format=>:openoffice) do |oo| assert_equal 1, oo.cell('A',1) assert_equal 2, oo.cell('A',2) assert_equal 3, oo.cell('A',3) assert_equal 4, oo.cell('A',4) assert_equal 5, oo.cell('A',5) assert_equal 6, oo.cell('A',6) assert_equal 21, oo.cell('A',7) assert_equal :formula, oo.celltype('A',7) assert_equal "=[Sheet2.A1]", oo.formula('C',7) assert_nil oo.formula('A',6) assert_equal [[7, 1, "=SUM([.A1:.A6])"], [7, 2, "=SUM([.$A$1:.B6])"], [7, 3, "=[Sheet2.A1]"], [8, 2, "=SUM([.$A$1:.B7])"], ], oo.formulas(oo.sheets.first) # setting a cell oo.set('A',15, 41) assert_equal 41, oo.cell('A',15) oo.set('A',16, "41") assert_equal "41", oo.cell('A',16) oo.set('A',17, 42.5) assert_equal 42.5, oo.cell('A',17) end end def test_header_with_brackets_excelx with_each_spreadsheet(:name => 'advanced_header', :format => :openoffice) do |oo| parsed_head = oo.parse(:headers => true) assert_equal "Date(yyyy-mm-dd)", oo.cell('A',1) assert_equal parsed_head[0].keys, ["Date(yyyy-mm-dd)"] assert_equal parsed_head[0].values, ["Date(yyyy-mm-dd)"] end end def test_formula_excelx with_each_spreadsheet(:name=>'formula', :format=>:excelx) do |oo| assert_equal 1, oo.cell('A',1) assert_equal 2, oo.cell('A',2) assert_equal 3, oo.cell('A',3) assert_equal 4, oo.cell('A',4) assert_equal 5, oo.cell('A',5) assert_equal 6, oo.cell('A',6) assert_equal 21, oo.cell('A',7) assert_equal :formula, oo.celltype('A',7) #steht nicht in Datei, oder? #nein, diesen Bezug habe ich nur in der OpenOffice-Datei #assert_equal "=[Sheet2.A1]", oo.formula('C',7) assert_nil oo.formula('A',6) # assert_equal [[7, 1, "=SUM([.A1:.A6])"], # [7, 2, "=SUM([.$A$1:.B6])"], #[7, 3, "=[Sheet2.A1]"], #[8, 2, "=SUM([.$A$1:.B7])"], #], oo.formulas(oo.sheets.first) assert_equal [[7, 1, 'SUM(A1:A6)'], [7, 2, 'SUM($A$1:B6)'], # [7, 3, "=[Sheet2.A1]"], # [8, 2, "=SUM([.$A$1:.B7])"], ], oo.formulas(oo.sheets.first) # setting a cell oo.set('A',15, 41) assert_equal 41, oo.cell('A',15) oo.set('A',16, "41") assert_equal "41", oo.cell('A',16) oo.set('A',17, 42.5) assert_equal 42.5, oo.cell('A',17) end end def test_borders_sheets with_each_spreadsheet(:name=>'borders') do |oo| oo.default_sheet = oo.sheets[1] assert_equal 6, oo.first_row assert_equal 11, oo.last_row assert_equal 4, oo.first_column assert_equal 8, oo.last_column oo.default_sheet = oo.sheets.first assert_equal 5, oo.first_row assert_equal 10, oo.last_row assert_equal 3, oo.first_column assert_equal 7, oo.last_column oo.default_sheet = oo.sheets[2] assert_equal 7, oo.first_row assert_equal 12, oo.last_row assert_equal 5, oo.first_column assert_equal 9, oo.last_column end end def test_only_one_sheet with_each_spreadsheet(:name=>'only_one_sheet') do |oo| assert_equal 42, oo.cell('B',4) assert_equal 43, oo.cell('C',4) assert_equal 44, oo.cell('D',4) oo.default_sheet = oo.sheets.first assert_equal 42, oo.cell('B',4) assert_equal 43, oo.cell('C',4) assert_equal 44, oo.cell('D',4) end end def test_openoffice_download_uri_and_zipped if OPENOFFICE if ONLINE url = 'http://spazioinwind.libero.it/s2/rata.ods.zip' sheet = Roo::OpenOffice.new(url, packed: :zip) #has been changed: assert_equal 'ist "e" im Nenner von H(s)', sheet.cell('b', 5) assert_in_delta 0.001, 505.14, sheet.cell('c', 33).to_f end end end def test_openoffice_zipped if OPENOFFICE oo = Roo::OpenOffice.new(File.join(TESTDIR,"bode-v1.ods.zip"), packed: :zip) assert oo assert_equal 'ist "e" im Nenner von H(s)', oo.cell('b', 5) end end def test_bug_ric with_each_spreadsheet(:name=>'ric', :format=>:openoffice) do |oo| assert oo.empty?('A',1) assert oo.empty?('B',1) assert oo.empty?('C',1) assert oo.empty?('D',1) expected = 1 letter = 'e' while letter <= 'u' assert_equal expected, oo.cell(letter,1) letter.succ! expected += 1 end assert_equal 'J', oo.cell('v',1) assert_equal 'P', oo.cell('w',1) assert_equal 'B', oo.cell('x',1) assert_equal 'All', oo.cell('y',1) assert_equal 0, oo.cell('a',2) assert oo.empty?('b',2) assert oo.empty?('c',2) assert oo.empty?('d',2) assert_equal 'B', oo.cell('e',2) assert_equal 'B', oo.cell('f',2) assert_equal 'B', oo.cell('g',2) assert_equal 'B', oo.cell('h',2) assert_equal 'B', oo.cell('i',2) assert_equal 'B', oo.cell('j',2) assert_equal 'B', oo.cell('k',2) assert_equal 'B', oo.cell('l',2) assert_equal 'B', oo.cell('m',2) assert_equal 'B', oo.cell('n',2) assert_equal 'B', oo.cell('o',2) assert_equal 'B', oo.cell('p',2) assert_equal 'B', oo.cell('q',2) assert_equal 'B', oo.cell('r',2) assert_equal 'B', oo.cell('s',2) assert oo.empty?('t',2) assert oo.empty?('u',2) assert_equal 0 , oo.cell('v',2) assert_equal 0 , oo.cell('w',2) assert_equal 15 , oo.cell('x',2) assert_equal 15 , oo.cell('y',2) end end def test_mehrteilig with_each_spreadsheet(:name=>'Bibelbund1', :format=>:openoffice) do |oo| assert_equal "Tagebuch des Sekret\303\244rs. Letzte Tagung 15./16.11.75 Schweiz", oo.cell(45,'A') end #if EXCELX # #Datei gibt es noch nicht # oo = Roo::Excelx.new(File.join(TESTDIR,"Bibelbund1.xlsx")) # oo.default_sheet = oo.sheets.first # assert_equal "Tagebuch des Sekret\303\244rs. Letzte Tagung 15./16.11.75 Schweiz", oo.cell(45,'A') #end end # "/tmp/xxxx" darf man unter Windows nicht verwenden, weil das nicht erkannt # wird. # Besser: Methode um temporaeres Dir. portabel zu bestimmen def test_huge_document_to_csv if LONG_RUN with_each_spreadsheet(:name=>'Bibelbund', :format=>[ :openoffice, :excelx # Google hier nicht, weil Google-Spreadsheets nicht so gross werden # duerfen ]) do |oo| Dir.mktmpdir do |tempdir| assert_equal "Tagebuch des Sekret\303\244rs. Letzte Tagung 15./16.11.75 Schweiz", oo.cell(45,'A') assert_equal "Tagebuch des Sekret\303\244rs. Nachrichten aus Chile", oo.cell(46,'A') assert_equal "Tagebuch aus Chile Juli 1977", oo.cell(55,'A') assert oo.to_csv(File.join(tempdir,"Bibelbund.csv")) assert File.exists?(File.join(tempdir,"Bibelbund.csv")) assert_equal "", file_diff(File.join(TESTDIR, "Bibelbund.csv"), File.join(tempdir,"Bibelbund.csv")), "error in class #{oo.class}" #end end end end end def test_bug_quotes_excelx if LONG_RUN with_each_spreadsheet(:name=>'Bibelbund', :format=>[:openoffice, :excelx]) do |oo| oo.default_sheet = oo.sheets.first assert_equal 'Einflüsse der neuen Theologie in "de gereformeerde Kerken van Nederland"', oo.cell('a',76) oo.to_csv("csv#{$$}") assert_equal 'Einflüsse der neuen Theologie in "de gereformeerde Kerken van Nederland"', oo.cell('a',78) File.delete_if_exist("csv#{$$}") end end end def test_bug_mehrere_datum with_each_spreadsheet(:name=>'numbers1') do |oo| oo.default_sheet = 'Sheet5' assert_equal :date, oo.celltype('A',4) assert_equal :date, oo.celltype('B',4) assert_equal :date, oo.celltype('C',4) assert_equal :date, oo.celltype('D',4) assert_equal :date, oo.celltype('E',4) assert_equal Date.new(2007,11,21), oo.cell('A',4) assert_equal Date.new(2007,11,21), oo.cell('B',4) assert_equal Date.new(2007,11,21), oo.cell('C',4) assert_equal Date.new(2007,11,21), oo.cell('D',4) assert_equal Date.new(2007,11,21), oo.cell('E',4) assert_equal :float, oo.celltype('A',5) assert_equal :float, oo.celltype('B',5) assert_equal :float, oo.celltype('C',5) assert_equal :float, oo.celltype('D',5) assert_equal :float, oo.celltype('E',5) assert_equal 42, oo.cell('A',5) assert_equal 42, oo.cell('B',5) assert_equal 42, oo.cell('C',5) assert_equal 42, oo.cell('D',5) assert_equal 42, oo.cell('E',5) assert_equal :string, oo.celltype('A',6) assert_equal :string, oo.celltype('B',6) assert_equal :string, oo.celltype('C',6) assert_equal :string, oo.celltype('D',6) assert_equal :string, oo.celltype('E',6) assert_equal "ABC", oo.cell('A',6) assert_equal "ABC", oo.cell('B',6) assert_equal "ABC", oo.cell('C',6) assert_equal "ABC", oo.cell('D',6) assert_equal "ABC", oo.cell('E',6) end end def test_multiple_sheets with_each_spreadsheet(:name=>'numbers1') do |oo| 2.times do oo.default_sheet = "Tabelle1" assert_equal 1, oo.cell(1,1) assert_equal 1, oo.cell(1,1,"Tabelle1") assert_equal "I am sheet 2", oo.cell('C',5,"Name of Sheet 2") sheetname = 'Sheet5' assert_equal :date, oo.celltype('A',4,sheetname) assert_equal :date, oo.celltype('B',4,sheetname) assert_equal :date, oo.celltype('C',4,sheetname) assert_equal :date, oo.celltype('D',4,sheetname) assert_equal :date, oo.celltype('E',4,sheetname) assert_equal Date.new(2007,11,21), oo.cell('A',4,sheetname) assert_equal Date.new(2007,11,21), oo.cell('B',4,sheetname) assert_equal Date.new(2007,11,21), oo.cell('C',4,sheetname) assert_equal Date.new(2007,11,21), oo.cell('D',4,sheetname) assert_equal Date.new(2007,11,21), oo.cell('E',4,sheetname) assert_equal :float, oo.celltype('A',5,sheetname) assert_equal :float, oo.celltype('B',5,sheetname) assert_equal :float, oo.celltype('C',5,sheetname) assert_equal :float, oo.celltype('D',5,sheetname) assert_equal :float, oo.celltype('E',5,sheetname) assert_equal 42, oo.cell('A',5,sheetname) assert_equal 42, oo.cell('B',5,sheetname) assert_equal 42, oo.cell('C',5,sheetname) assert_equal 42, oo.cell('D',5,sheetname) assert_equal 42, oo.cell('E',5,sheetname) assert_equal :string, oo.celltype('A',6,sheetname) assert_equal :string, oo.celltype('B',6,sheetname) assert_equal :string, oo.celltype('C',6,sheetname) assert_equal :string, oo.celltype('D',6,sheetname) assert_equal :string, oo.celltype('E',6,sheetname) assert_equal "ABC", oo.cell('A',6,sheetname) assert_equal "ABC", oo.cell('B',6,sheetname) assert_equal "ABC", oo.cell('C',6,sheetname) assert_equal "ABC", oo.cell('D',6,sheetname) assert_equal "ABC", oo.cell('E',6,sheetname) oo.reload end end end def test_bug_empty_sheet with_each_spreadsheet(:name=>'formula', :format=>[:openoffice, :excelx]) do |oo| oo.default_sheet = 'Sheet3' # is an empty sheet Dir.mktmpdir do |tempdir| oo.to_csv(File.join(tempdir,"emptysheet.csv")) assert_equal "", `cat #{File.join(tempdir,"emptysheet.csv")}` end end end def test_find_by_row_huge_document if LONG_RUN with_each_spreadsheet(:name=>'Bibelbund', :format=>[:openoffice, :excelx]) do |oo| oo.default_sheet = oo.sheets.first rec = oo.find 20 assert rec # assert_equal "Brief aus dem Sekretariat", rec[0] #p rec assert_equal "Brief aus dem Sekretariat", rec[0]['TITEL'] rec = oo.find 22 assert rec # assert_equal "Brief aus dem Skretariat. Tagung in Amberg/Opf.",rec[0] assert_equal "Brief aus dem Skretariat. Tagung in Amberg/Opf.",rec[0]['TITEL'] end end end def test_find_by_row with_each_spreadsheet(:name=>'numbers1') do |oo| oo.header_line = nil rec = oo.find 16 assert rec assert_nil oo.header_line # keine Headerlines in diesem Beispiel definiert assert_equal "einundvierzig", rec[0] #assert_equal false, rec rec = oo.find 15 assert rec assert_equal 41,rec[0] end end def test_find_by_row_if_header_line_is_not_nil with_each_spreadsheet(:name=>'numbers1') do |oo| oo.header_line = 2 refute_nil oo.header_line rec = oo.find 1 assert rec assert_equal 5, rec[0] assert_equal 6, rec[1] rec = oo.find 15 assert rec assert_equal "einundvierzig", rec[0] end end def test_find_by_conditions if LONG_RUN with_each_spreadsheet(:name=>'Bibelbund', :format=>[:openoffice, :excelx]) do |oo| #----------------------------------------------------------------- zeilen = oo.find(:all, :conditions => { 'TITEL' => 'Brief aus dem Sekretariat' } ) assert_equal 2, zeilen.size assert_equal [{"VERFASSER"=>"Almassy, Annelene von", "INTERNET"=>nil, "SEITE"=>316.0, "KENNUNG"=>"Aus dem Bibelbund", "OBJEKT"=>"Bibel+Gem", "PC"=>"#C:\\Bibelbund\\reprint\\BuG1982-3.pdf#", "NUMMER"=>"1982-3", "TITEL"=>"Brief aus dem Sekretariat"}, {"VERFASSER"=>"Almassy, Annelene von", "INTERNET"=>nil, "SEITE"=>222.0, "KENNUNG"=>"Aus dem Bibelbund", "OBJEKT"=>"Bibel+Gem", "PC"=>"#C:\\Bibelbund\\reprint\\BuG1983-2.pdf#", "NUMMER"=>"1983-2", "TITEL"=>"Brief aus dem Sekretariat"}] , zeilen #---------------------------------------------------------- zeilen = oo.find(:all, :conditions => { 'VERFASSER' => 'Almassy, Annelene von' } ) assert_equal 13, zeilen.size #---------------------------------------------------------- zeilen = oo.find(:all, :conditions => { 'TITEL' => 'Brief aus dem Sekretariat', 'VERFASSER' => 'Almassy, Annelene von', } ) assert_equal 2, zeilen.size assert_equal [{"VERFASSER"=>"Almassy, Annelene von", "INTERNET"=>nil, "SEITE"=>316.0, "KENNUNG"=>"Aus dem Bibelbund", "OBJEKT"=>"Bibel+Gem", "PC"=>"#C:\\Bibelbund\\reprint\\BuG1982-3.pdf#", "NUMMER"=>"1982-3", "TITEL"=>"Brief aus dem Sekretariat"}, {"VERFASSER"=>"Almassy, Annelene von", "INTERNET"=>nil, "SEITE"=>222.0, "KENNUNG"=>"Aus dem Bibelbund", "OBJEKT"=>"Bibel+Gem", "PC"=>"#C:\\Bibelbund\\reprint\\BuG1983-2.pdf#", "NUMMER"=>"1983-2", "TITEL"=>"Brief aus dem Sekretariat"}] , zeilen # Result as an array zeilen = oo.find(:all, :conditions => { 'TITEL' => 'Brief aus dem Sekretariat', 'VERFASSER' => 'Almassy, Annelene von', }, :array => true) assert_equal 2, zeilen.size assert_equal [ [ "Brief aus dem Sekretariat", "Almassy, Annelene von", "Bibel+Gem", "1982-3", 316.0, nil, "#C:\\Bibelbund\\reprint\\BuG1982-3.pdf#", "Aus dem Bibelbund", ], [ "Brief aus dem Sekretariat", "Almassy, Annelene von", "Bibel+Gem", "1983-2", 222.0, nil, "#C:\\Bibelbund\\reprint\\BuG1983-2.pdf#", "Aus dem Bibelbund", ]] , zeilen end end end #TODO: temporaerer Test def test_seiten_als_date if LONG_RUN with_each_spreadsheet(:name=>'Bibelbund', :format=>:excelx) do |oo| assert_equal 'Bericht aus dem Sekretariat', oo.cell(13,1) assert_equal '1981-4', oo.cell(13,'D') assert_equal String, oo.excelx_type(13,'E')[1].class assert_equal [:numeric_or_formula,"General"], oo.excelx_type(13,'E') assert_equal '428', oo.excelx_value(13,'E') assert_equal 428.0, oo.cell(13,'E') end end end def test_column with_each_spreadsheet(:name=>'numbers1') do |oo| expected = [1.0,5.0,nil,10.0,Date.new(1961,11,21),'tata',nil,nil,nil,nil,'thisisa11',41.0,nil,nil,41.0,'einundvierzig',nil,Date.new(2007,5,31)] assert_equal expected, oo.column(1) assert_equal expected, oo.column('a') end end def test_column_huge_document if LONG_RUN with_each_spreadsheet(:name=>'Bibelbund', :format=>[:openoffice, :excelx]) do |oo| oo.default_sheet = oo.sheets.first assert_equal 3735, oo.column('a').size #assert_equal 499, oo.column('a').size end end end def test_simple_spreadsheet_find_by_condition with_each_spreadsheet(:name=>'simple_spreadsheet') do |oo| oo.header_line = 3 # oo.date_format = '%m/%d/%Y' if oo.class == Google erg = oo.find(:all, :conditions => {'Comment' => 'Task 1'}) assert_equal Date.new(2007,05,07), erg[1]['Date'] assert_equal 10.75 , erg[1]['Start time'] assert_equal 12.50 , erg[1]['End time'] assert_equal 0 , erg[1]['Pause'] assert_equal 1.75 , erg[1]['Sum'] assert_equal "Task 1" , erg[1]['Comment'] end end def get_extension(oo) case oo when Roo::OpenOffice ".ods" when Roo::Excelx ".xlsx" end end def test_info expected_templ = "File: numbers1%s\n"+ "Number of sheets: 5\n"+ "Sheets: Tabelle1, Name of Sheet 2, Sheet3, Sheet4, Sheet5\n"+ "Sheet 1:\n"+ " First row: 1\n"+ " Last row: 18\n"+ " First column: A\n"+ " Last column: G\n"+ "Sheet 2:\n"+ " First row: 5\n"+ " Last row: 14\n"+ " First column: B\n"+ " Last column: E\n"+ "Sheet 3:\n"+ " First row: 1\n"+ " Last row: 1\n"+ " First column: A\n"+ " Last column: BA\n"+ "Sheet 4:\n"+ " First row: 1\n"+ " Last row: 1\n"+ " First column: A\n"+ " Last column: E\n"+ "Sheet 5:\n"+ " First row: 1\n"+ " Last row: 6\n"+ " First column: A\n"+ " Last column: E" with_each_spreadsheet(:name=>'numbers1') do |oo| ext = get_extension(oo) expected = sprintf(expected_templ,ext) begin if oo.class == Google assert_equal expected.gsub(/numbers1/,key_of("numbers1")), oo.info else assert_equal expected, oo.info end rescue NameError # end end end def test_info_doesnt_set_default_sheet with_each_spreadsheet(:name=>'numbers1') do |oo| oo.default_sheet = 'Sheet3' oo.info assert_equal 'Sheet3', oo.default_sheet end end def test_should_raise_file_not_found_error if OPENOFFICE assert_raises(IOError) { Roo::OpenOffice.new(File.join('testnichtvorhanden','Bibelbund.ods')) } end if EXCELX assert_raises(IOError) { Roo::Excelx.new(File.join('testnichtvorhanden','Bibelbund.xlsx')) } end end def test_bug_bbu with_each_spreadsheet(:name=>'bbu', :format=>[:openoffice, :excelx]) do |oo| assert_equal "File: bbu#{get_extension(oo)} Number of sheets: 3 Sheets: 2007_12, Tabelle2, Tabelle3 Sheet 1: First row: 1 Last row: 4 First column: A Last column: F Sheet 2: - empty - Sheet 3: - empty -", oo.info oo.default_sheet = oo.sheets[1] # empty sheet assert_nil oo.first_row assert_nil oo.last_row assert_nil oo.first_column assert_nil oo.last_column end end def test_bug_time_nil with_each_spreadsheet(:name=>'time-test') do |oo| assert_equal 12*3600+13*60+14, oo.cell('B',1) # 12:13:14 (secs since midnight) assert_equal :time, oo.celltype('B',1) assert_equal 15*3600+16*60, oo.cell('C',1) # 15:16 (secs since midnight) assert_equal :time, oo.celltype('C',1) assert_equal 23*3600, oo.cell('D',1) # 23:00 (secs since midnight) assert_equal :time, oo.celltype('D',1) end end def test_date_time_to_csv with_each_spreadsheet(:name=>'time-test') do |oo| Dir.mktmpdir do |tempdir| csv_output = File.join(tempdir,'time_test.csv') assert oo.to_csv(csv_output) assert File.exists?(csv_output) assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/time-test.csv #{csv_output}` # --strip-trailing-cr is needed because the test-file use 0A and # the test on an windows box generates 0D 0A as line endings end end end def test_boolean_to_csv with_each_spreadsheet(:name=>'boolean') do |oo| Dir.mktmpdir do |tempdir| csv_output = File.join(tempdir,'boolean.csv') assert oo.to_csv(csv_output) assert File.exists?(csv_output) assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/boolean.csv #{csv_output}` # --strip-trailing-cr is needed because the test-file use 0A and # the test on an windows box generates 0D 0A as line endings end end end def test_link_to_csv with_each_spreadsheet(:name=>'link',:format=>:excelx) do |oo| Dir.mktmpdir do |tempdir| csv_output = File.join(tempdir,'link.csv') assert oo.to_csv(csv_output) assert File.exists?(csv_output) assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/link.csv #{csv_output}` # --strip-trailing-cr is needed because the test-file use 0A and # the test on an windows box generates 0D 0A as line endings end end end def test_date_time_yaml with_each_spreadsheet(:name=>'time-test') do |oo| expected = "--- \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" assert_equal expected, oo.to_yaml end end # Erstellt eine Liste aller Zellen im Spreadsheet. Dies ist nötig, weil ein einfacher # Textvergleich des XML-Outputs nicht funktioniert, da xml-builder die Attribute # nicht immer in der gleichen Reihenfolge erzeugt. def init_all_cells(oo,sheet) all = [] oo.first_row(sheet).upto(oo.last_row(sheet)) do |row| oo.first_column(sheet).upto(oo.last_column(sheet)) do |col| unless oo.empty?(row,col,sheet) all << {:row => row.to_s, :column => col.to_s, :content => oo.cell(row,col,sheet).to_s, :type => oo.celltype(row,col,sheet).to_s, } end end end all end def test_to_xml with_each_spreadsheet(:name=>'numbers1', :encoding => 'utf8') do |oo| skip if defined? JRUBY_VERSION oo.to_xml sheetname = oo.sheets.first doc = Nokogiri::XML(oo.to_xml) sheet_count = 0 doc.xpath('//spreadsheet/sheet').each {|tmpelem| sheet_count += 1 } assert_equal 5, sheet_count doc.xpath('//spreadsheet/sheet').each { |xml_sheet| all_cells = init_all_cells(oo, sheetname) x = 0 assert_equal sheetname, xml_sheet.attributes['name'].value xml_sheet.children.each {|cell| if cell.attributes['name'] expected = [all_cells[x][:row], all_cells[x][:column], all_cells[x][:content], all_cells[x][:type], ] result = [ cell.attributes['row'], cell.attributes['column'], cell.content, cell.attributes['type'], ] assert_equal expected, result x += 1 end # if } # end of sheet sheetname = oo.sheets[oo.sheets.index(sheetname)+1] } end end def test_file_warning_default if OPENOFFICE assert_raises(TypeError, "test/files/numbers1.xls is not an openoffice spreadsheet") { Roo::OpenOffice.new(File.join(TESTDIR,"numbers1.xls")) } assert_raises(TypeError) { Roo::OpenOffice.new(File.join(TESTDIR,"numbers1.xlsx")) } end if EXCELX assert_raises(TypeError) { Roo::Excelx.new(File.join(TESTDIR,"numbers1.ods")) } assert_raises(TypeError) { Roo::Excelx.new(File.join(TESTDIR,"numbers1.xls")) } end end def test_file_warning_error if OPENOFFICE assert_raises(TypeError) { Roo::OpenOffice.new(File.join(TESTDIR,"numbers1.xls"), packed: false, file_warning: :error ) } assert_raises(TypeError) { Roo::OpenOffice.new(File.join(TESTDIR,"numbers1.xlsx"), packed: false, file_warning: :error) } end if EXCELX assert_raises(TypeError) { Roo::Excelx.new(File.join(TESTDIR,"numbers1.ods"), packed: false, file_warning: :error) } assert_raises(TypeError) { Roo::Excelx.new(File.join(TESTDIR,"numbers1.xls"), packed: false, file_warning: :error) } end end def test_file_warning_warning if OPENOFFICE assert_raises(ArgumentError) { Roo::OpenOffice.new(File.join(TESTDIR,"numbers1.xlsx"), packed: false, file_warning: :warning) } end if EXCELX assert_raises(ArgumentError) { Roo::Excelx.new(File.join(TESTDIR,"numbers1.ods"), packed: false, file_warning: :warning) } end end def test_file_warning_ignore if OPENOFFICE # Files, die eigentlich OpenOffice- # Files sind, aber die falsche Endung haben. # Es soll ohne Fehlermeldung oder Warnung # oder Abbruch die Datei geoffnet werden # xlsx Roo::OpenOffice.new(File.join(TESTDIR,"type_openoffice.xlsx"), packed: false, file_warning: :ignore) end if EXCELX Roo::Excelx.new(File.join(TESTDIR,"type_excelx.ods"), packed: false, file_warning: :ignore) end end def test_bug_to_xml_with_empty_sheets with_each_spreadsheet(:name=>'emptysheets', :format=>[:openoffice, :excelx]) do |oo| oo.sheets.each { |sheet| assert_equal nil, oo.first_row, "first_row not nil in sheet #{sheet}" assert_equal nil, oo.last_row, "last_row not nil in sheet #{sheet}" assert_equal nil, oo.first_column, "first_column not nil in sheet #{sheet}" assert_equal nil, oo.last_column, "last_column not nil in sheet #{sheet}" assert_equal nil, oo.first_row(sheet), "first_row not nil in sheet #{sheet}" assert_equal nil, oo.last_row(sheet), "last_row not nil in sheet #{sheet}" assert_equal nil, oo.first_column(sheet), "first_column not nil in sheet #{sheet}" assert_equal nil, oo.last_column(sheet), "last_column not nil in sheet #{sheet}" } oo.to_xml end end def test_bug_simple_spreadsheet_time_bug # really a bug? are cells really of type time? # No! :float must be the correct type with_each_spreadsheet(:name=>'simple_spreadsheet', :format=>:excelx) do |oo| # puts oo.cell('B',5).to_s # assert_equal :time, oo.celltype('B',5) assert_equal :float, oo.celltype('B',5) assert_equal 10.75, oo.cell('B',5) assert_equal 12.50, oo.cell('C',5) assert_equal 0, oo.cell('D',5) assert_equal 1.75, oo.cell('E',5) assert_equal 'Task 1', oo.cell('F',5) assert_equal Date.new(2007,5,7), oo.cell('A',5) end end def test_simple2_excelx with_each_spreadsheet(:name=>'simple_spreadsheet', :format=>:excelx) do |oo| assert_equal [:numeric_or_formula, "yyyy\\-mm\\-dd"], oo.excelx_type('A',4) assert_equal [:numeric_or_formula, "#,##0.00"], oo.excelx_type('B',4) assert_equal [:numeric_or_formula, "#,##0.00"], oo.excelx_type('c',4) assert_equal [:numeric_or_formula, "General"], oo.excelx_type('d',4) assert_equal [:numeric_or_formula, "General"], oo.excelx_type('e',4) assert_equal :string, oo.excelx_type('f',4) assert_equal "39209", oo.excelx_value('a',4) assert_equal "yyyy\\-mm\\-dd", oo.excelx_format('a',4) assert_equal "9.25", oo.excelx_value('b',4) assert_equal "10.25", oo.excelx_value('c',4) assert_equal "0", oo.excelx_value('d',4) #... Sum-Spalte # assert_equal "Task 1", oo.excelx_value('f',4) assert_equal "Task 1", oo.cell('f',4) assert_equal Date.new(2007,05,07), oo.cell('a',4) assert_equal "9.25", oo.excelx_value('b',4) assert_equal "#,##0.00", oo.excelx_format('b',4) assert_equal 9.25, oo.cell('b',4) assert_equal :float, oo.celltype('b',4) assert_equal :float, oo.celltype('d',4) assert_equal 0, oo.cell('d',4) assert_equal :formula, oo.celltype('e',4) assert_equal 1, oo.cell('e',4) assert_equal 'C4-B4-D4', oo.formula('e',4) assert_equal :string, oo.celltype('f',4) assert_equal "Task 1", oo.cell('f',4) end end def test_datetime with_each_spreadsheet(:name=>'datetime') do |oo| val = oo.cell('c',3) assert_equal :datetime, oo.celltype('c',3) assert_equal DateTime.new(1961,11,21,12,17,18), val assert_kind_of DateTime, val val = oo.cell('a',1) assert_equal :date, oo.celltype('a',1) assert_kind_of Date, val assert_equal Date.new(1961,11,21), val assert_equal Date.new(1961,11,21), oo.cell('a',1) assert_equal DateTime.new(1961,11,21,12,17,18), oo.cell('a',3) assert_equal DateTime.new(1961,11,21,12,17,18), oo.cell('b',3) assert_equal DateTime.new(1961,11,21,12,17,18), oo.cell('c',3) assert_equal DateTime.new(1961,11,21,12,17,18), oo.cell('a',4) assert_equal DateTime.new(1961,11,21,12,17,18), oo.cell('b',4) assert_equal DateTime.new(1961,11,21,12,17,18), oo.cell('c',4) assert_equal DateTime.new(1961,11,21,12,17,18), oo.cell('a',5) assert_equal DateTime.new(1961,11,21,12,17,18), oo.cell('b',5) assert_equal DateTime.new(1961,11,21,12,17,18), oo.cell('c',5) assert_equal Date.new(1961,11,21), oo.cell('a',6) assert_equal Date.new(1961,11,21), oo.cell('b',6) assert_equal Date.new(1961,11,21), oo.cell('c',6) assert_equal Date.new(1961,11,21), oo.cell('a',7) assert_equal Date.new(1961,11,21), oo.cell('b',7) assert_equal Date.new(1961,11,21), oo.cell('c',7) assert_equal DateTime.new(2013,11,5,11,45,00), oo.cell('a',8) assert_equal DateTime.new(2013,11,5,11,45,00), oo.cell('b',8) assert_equal DateTime.new(2013,11,5,11,45,00), oo.cell('c',8) end end def test_cell_openoffice_html_escape with_each_spreadsheet(:name=>'html-escape', :format=>:openoffice) do |oo| assert_equal "'", oo.cell(1,1) assert_equal "&", oo.cell(2,1) assert_equal ">", oo.cell(3,1) assert_equal "<", oo.cell(4,1) assert_equal "`", oo.cell(5,1) # test_openoffice_zipped will catch issues with " end end def test_cell_boolean with_each_spreadsheet(:name=>'boolean', :format=>[:openoffice, :excelx]) do |oo| if oo.class == Roo::Excelx assert_equal "TRUE", oo.cell(1,1), "failure in "+oo.class.to_s assert_equal "FALSE", oo.cell(2,1), "failure in "+oo.class.to_s else assert_equal "true", oo.cell(1,1), "failure in "+oo.class.to_s assert_equal "false", oo.cell(2,1), "failure in "+oo.class.to_s end end end def test_cell_multiline with_each_spreadsheet(:name=>'paragraph', :format=>[:openoffice, :excelx]) do |oo| assert_equal "This is a test\nof a multiline\nCell", oo.cell(1,1) assert_equal "This is a test\n¶\nof a multiline\n\nCell", oo.cell(1,2) assert_equal "first p\n\nsecond p\n\nlast p", oo.cell(2,1) end end def test_cell_styles # styles only valid in excel spreadsheets? # TODO: what todo with other spreadsheet types with_each_spreadsheet(:name=>'style', :format=>[# :openoffice, :excelx ]) do |oo| # bold assert_equal true, oo.font(1,1).bold? assert_equal false, oo.font(1,1).italic? assert_equal false, oo.font(1,1).underline? # italic assert_equal false, oo.font(2,1).bold? assert_equal true, oo.font(2,1).italic? assert_equal false, oo.font(2,1).underline? # normal assert_equal false, oo.font(3,1).bold? assert_equal false, oo.font(3,1).italic? assert_equal false, oo.font(3,1).underline? # underline assert_equal false, oo.font(4,1).bold? assert_equal false, oo.font(4,1).italic? assert_equal true, oo.font(4,1).underline? # bold italic assert_equal true, oo.font(5,1).bold? assert_equal true, oo.font(5,1).italic? assert_equal false, oo.font(5,1).underline? # bold underline assert_equal true, oo.font(6,1).bold? assert_equal false, oo.font(6,1).italic? assert_equal true, oo.font(6,1).underline? # italic underline assert_equal false, oo.font(7,1).bold? assert_equal true, oo.font(7,1).italic? assert_equal true, oo.font(7,1).underline? # bolded row assert_equal true, oo.font(8,1).bold? assert_equal false, oo.font(8,1).italic? assert_equal false, oo.font(8,1).underline? # bolded col assert_equal true, oo.font(9,2).bold? assert_equal false, oo.font(9,2).italic? assert_equal false, oo.font(9,2).underline? # bolded row, italic col assert_equal true, oo.font(10,3).bold? assert_equal true, oo.font(10,3).italic? assert_equal false, oo.font(10,3).underline? # normal assert_equal false, oo.font(11,4).bold? assert_equal false, oo.font(11,4).italic? assert_equal false, oo.font(11,4).underline? end end # Need to extend to other formats def test_row_whitespace # auf dieses Dokument habe ich keinen Zugriff TODO: with_each_spreadsheet(:name=>'whitespace') do |oo| oo.default_sheet = "Sheet1" assert_equal [nil, nil, nil, nil, nil, nil], oo.row(1) assert_equal [nil, nil, nil, nil, nil, nil], oo.row(2) assert_equal ["Date", "Start time", "End time", "Pause", "Sum", "Comment"], oo.row(3) assert_equal [Date.new(2007,5,7), 9.25, 10.25, 0.0, 1.0, "Task 1"], oo.row(4) assert_equal [nil, nil, nil, nil, nil, nil], oo.row(5) assert_equal [Date.new(2007,5,7), 10.75, 10.75, 0.0, 0.0, "Task 1"], oo.row(6) oo.default_sheet = "Sheet2" assert_equal ["Date", nil, "Start time"], oo.row(1) assert_equal [Date.new(2007,5,7), nil, 9.25], oo.row(2) assert_equal [Date.new(2007,5,7), nil, 10.75], oo.row(3) end end def test_col_whitespace #TODO: # kein Zugriff auf Dokument whitespace with_each_spreadsheet(:name=>'whitespace') do |oo| oo.default_sheet = "Sheet1" assert_equal ["Date", Date.new(2007,5,7), nil, Date.new(2007,5,7)], oo.column(1) assert_equal ["Start time", 9.25, nil, 10.75], oo.column(2) assert_equal ["End time", 10.25, nil, 10.75], oo.column(3) assert_equal ["Pause", 0.0, nil, 0.0], oo.column(4) assert_equal ["Sum", 1.0, nil, 0.0], oo.column(5) assert_equal ["Comment","Task 1", nil, "Task 1"], oo.column(6) oo.default_sheet = "Sheet2" assert_equal [nil, nil, nil], oo.column(1) assert_equal [nil, nil, nil], oo.column(2) assert_equal ["Date", Date.new(2007,5,7), Date.new(2007,5,7)], oo.column(3) assert_equal [nil, nil, nil], oo.column(4) assert_equal [ "Start time", 9.25, 10.75], oo.column(5) end end def test_excelx_links with_each_spreadsheet(:name=>'link', :format=>:excelx) do |oo| assert_equal 'Google', oo.cell(1,1) assert_equal 'http://www.google.com', oo.cell(1,1).href end end # Excel has two base date formats one from 1900 and the other from 1904. # see #test_base_dates_in_excel def test_base_dates_in_excelx with_each_spreadsheet(:name=>'1900_base', :format=>:excelx) do |oo| assert_equal Date.new(2009,06,15), oo.cell(1,1) assert_equal :date, oo.celltype(1,1) end with_each_spreadsheet(:name=>'1904_base', :format=>:excelx) do |oo| assert_equal Date.new(2009,06,15), oo.cell(1,1) assert_equal :date, oo.celltype(1,1) end end def test_cell_methods with_each_spreadsheet(:name=>'numbers1') do |oo| assert_equal 10, oo.a4 # cell(4,'A') assert_equal 11, oo.b4 # cell(4,'B') assert_equal 12, oo.c4 # cell(4,'C') assert_equal 13, oo.d4 # cell(4,'D') assert_equal 14, oo.e4 # cell(4,'E') assert_equal 'ABC', oo.c6('Sheet5') #assert_raises(ArgumentError) { assert_raises(NoMethodError) { # a42a is not a valid cell name, should raise ArgumentError assert_equal 9999, oo.a42a } end end # compare large spreadsheets def test_compare_large_spreadsheets # problematisch, weil Formeln in Excel nicht unterstützt werden if LONG_RUN qq = Roo::OpenOffice.new(File.join('test',"Bibelbund.ods")) with_each_spreadsheet(:name=>'Bibelbund') do |oo| # p "comparing Bibelbund.ods with #{oo.class}" oo.sheets.each do |sh| oo.first_row.upto(oo.last_row) do |row| oo.first_column.upto(oo.last_column) do |col| c1 = qq.cell(row,col,sh) c1.force_encoding("UTF-8") if c1.class == String c2 = oo.cell(row,col,sh) c2.force_encoding("UTF-8") if c2.class == String assert_equal c1, c2, "diff in #{sh}/#{row}/#{col}}" assert_equal qq.celltype(row,col,sh), oo.celltype(row,col,sh) assert_equal qq.formula?(row,col,sh), oo.formula?(row,col,sh) if oo.class != Roo::Excel end end end end end # LONG_RUN end def test_label with_each_spreadsheet(:name=>'named_cells', :format=>[:openoffice,:excelx,:libreoffice]) do |oo| # oo.default_sheet = oo.sheets.first begin row,col = oo.label('anton') rescue ArgumentError puts "labels error at #{oo.class}" raise end assert_equal 5, row, "error with label in class #{oo.class}" assert_equal 3, col, "error with label in class #{oo.class}" row,col = oo.label('anton') assert_equal 'Anton', oo.cell(row,col), "error with label in class #{oo.class}" row,col = oo.label('berta') assert_equal 'Bertha', oo.cell(row,col), "error with label in class #{oo.class}" row,col = oo.label('caesar') assert_equal 'Cäsar', oo.cell(row,col),"error with label in class #{oo.class}" row,col = oo.label('never') assert_nil row assert_nil col row,col,sheet = oo.label('anton') assert_equal 5, row assert_equal 3, col assert_equal "Sheet1", sheet end end def test_method_missing_anton with_each_spreadsheet(:name=>'named_cells', :format=>[:openoffice,:excelx,:libreoffice]) do |oo| # oo.default_sheet = oo.sheets.first assert_equal "Anton", oo.anton assert_raises(NoMethodError) { oo.never } end end def test_labels with_each_spreadsheet(:name=>'named_cells', :format=>[:openoffice,:excelx,:libreoffice]) do |oo| # oo.default_sheet = oo.sheets.first assert_equal [ ['anton',[5,3,'Sheet1']], ['berta',[4,2,'Sheet1']], ['caesar',[7,2,'Sheet1']], ], oo.labels, "error with labels array in class #{oo.class}" end end def test_labeled_cells with_each_spreadsheet(:name=>'named_cells', :format=>[:openoffice,:excelx,:libreoffice]) do |oo| oo.default_sheet = oo.sheets.first begin row,col = oo.label('anton') rescue ArgumentError puts "labels error at #{oo.class}" raise end assert_equal 5, row assert_equal 3, col row,col = oo.label('anton') assert_equal 'Anton', oo.cell(row,col) row,col = oo.label('berta') assert_equal 'Bertha', oo.cell(row,col) row,col = oo.label('caesar') assert_equal 'Cäsar', oo.cell(row,col) row,col = oo.label('never') assert_nil row assert_nil col row,col,sheet = oo.label('anton') assert_equal 5, row assert_equal 3, col assert_equal "Sheet1", sheet assert_equal "Anton", oo.anton assert_raises(NoMethodError) { row,col = oo.never } # Reihenfolge row,col,sheet analog zu #label assert_equal [ ['anton',[5,3,'Sheet1']], ['berta',[4,2,'Sheet1']], ['caesar',[7,2,'Sheet1']], ], oo.labels, "error with labels array in class #{oo.class}" end end require 'matrix' def test_matrix with_each_spreadsheet(:name => 'matrix', :format => :openoffice) do |oo| oo.default_sheet = oo.sheets.first assert_equal Matrix[ [1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0] ], oo.to_matrix end end def test_matrix_selected_range with_each_spreadsheet(:name => 'matrix', :format=>:openoffice) do |oo| oo.default_sheet = 'Sheet2' assert_equal Matrix[ [1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0] ], oo.to_matrix(3,4,5,6) end end def test_matrix_all_nil with_each_spreadsheet(:name => 'matrix', :format=>:openoffice) do |oo| oo.default_sheet = 'Sheet2' assert_equal Matrix[ [nil, nil, nil], [nil, nil, nil], [nil, nil, nil] ], oo.to_matrix(10,10,12,12) end end def test_matrix_values_and_nil with_each_spreadsheet(:name => 'matrix', :format=>:openoffice) do |oo| oo.default_sheet = 'Sheet3' assert_equal Matrix[ [1.0, nil, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, nil] ], oo.to_matrix(1,1,3,3) end end def test_matrix_specifying_sheet with_each_spreadsheet(:name => 'matrix', :format => :openoffice) do |oo| oo.default_sheet = oo.sheets.first assert_equal Matrix[ [1.0, nil, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, nil] ], oo.to_matrix(nil, nil, nil, nil, 'Sheet3') end end # unter Windows soll es laut Bug-Reports nicht moeglich sein, eine Excel-Datei, die # mit Excel.new geoeffnet wurde nach dem Processing anschliessend zu loeschen. # Anmerkung: Das Spreadsheet-Gem erlaubt kein explizites Close von Spreadsheet-Dateien, # was verhindern koennte, das die Datei geloescht werden kann. # def test_bug_cannot_delete_opened_excel_sheet # with_each_spreadsheet(:name=>'simple_spreadsheet') do |oo| # 'kopiere nach temporaere Datei und versuche diese zu oeffnen und zu loeschen' # end # end def test_bug_xlsx_reference_cell if EXCELX =begin If cell A contains a string and cell B references cell A. When reading the value of cell B, the result will be "0.0" instead of the value of cell A. With the attached test case, I ran the following code: spreadsheet = Roo::Excelx.new('formula_string_error.xlsx') spreadsheet.default_sheet = 'sheet1' p "A: #{spreadsheet.cell(1, 1)}" p "B: #{spreadsheet.cell(2, 1)}" with the following results "A: TestString" "B: 0.0" where the expected result is "A: TestString" "B: TestString" =end xlsx = Roo::Excelx.new(File.join(TESTDIR, "formula_string_error.xlsx")) xlsx.default_sheet = xlsx.sheets.first assert_equal 'Teststring', xlsx.cell('a',1) assert_equal 'Teststring', xlsx.cell('a',2) end end # #formulas of an empty sheet should return an empty array and not result in # an error message # 2011-06-24 def test_bug_formulas_empty_sheet with_each_spreadsheet(:name =>'emptysheets', :format=>[:openoffice,:excelx]) do |oo| oo.default_sheet = oo.sheets.first oo.formulas assert_equal([], oo.formulas) end end # #to_yaml of an empty sheet should return an empty string and not result in # an error message # 2011-06-24 def test_bug_to_yaml_empty_sheet with_each_spreadsheet(:name =>'emptysheets', :format=>[:openoffice,:excelx]) do |oo| oo.default_sheet = oo.sheets.first oo.to_yaml assert_equal('', oo.to_yaml) end end # #to_matrix of an empty sheet should return an empty matrix and not result in # an error message # 2011-06-25 def test_bug_to_matrix_empty_sheet with_each_spreadsheet(:name =>'emptysheets', :format=>[:openoffice,:excelx]) do |oo| oo.default_sheet = oo.sheets.first oo.to_matrix assert_equal(Matrix.empty(0,0), oo.to_matrix) end end # 2011-08-03 def test_bug_datetime_to_csv with_each_spreadsheet(:name=>'datetime') do |oo| Dir.mktmpdir do |tempdir| datetime_csv_file = File.join(tempdir,"datetime.csv") assert oo.to_csv(datetime_csv_file) assert File.exists?(datetime_csv_file) assert_equal "", file_diff('test/files/so_datetime.csv', datetime_csv_file) end end end # 2011-08-11 def test_bug_openoffice_formula_missing_letters if LIBREOFFICE # Dieses Dokument wurde mit LibreOffice angelegt. # Keine Ahnung, ob es damit zusammenhaengt, das diese # Formeln anders sind, als in der Datei formula.ods, welche # mit OpenOffice angelegt wurde. # Bei den OpenOffice-Dateien ist in diesem Feld in der XML- # Datei of: als Prefix enthalten, waehrend in dieser Datei # irgendetwas mit oooc: als Prefix verwendet wird. oo = Roo::OpenOffice.new(File.join(TESTDIR,'dreimalvier.ods')) oo.default_sheet = oo.sheets.first assert_equal '=SUM([.A1:.D1])', oo.formula('e',1) assert_equal '=SUM([.A2:.D2])', oo.formula('e',2) assert_equal '=SUM([.A3:.D3])', oo.formula('e',3) assert_equal [ [1,5,'=SUM([.A1:.D1])'], [2,5,'=SUM([.A2:.D2])'], [3,5,'=SUM([.A3:.D3])'], ], oo.formulas end end =begin def test_postprocessing_and_types_in_csv if CSV oo = CSV.new(File.join(TESTDIR,'csvtypes.csv')) oo.default_sheet = oo.sheets.first assert_equal(1,oo.a1) assert_equal(:float,oo.celltype('A',1)) assert_equal("2",oo.b1) assert_equal(:string,oo.celltype('B',1)) assert_equal("Mayer",oo.c1) assert_equal(:string,oo.celltype('C',1)) end end =end =begin def test_postprocessing_with_callback_function if CSV oo = CSV.new(File.join(TESTDIR,'csvtypes.csv')) oo.default_sheet = oo.sheets.first # assert_equal(1, oo.last_column) end end =end =begin def x_123 class ::CSV def cell_postprocessing(row,col,value) if row < 3 return nil end return value end end end =end def test_nil_rows_and_lines_csv # x_123 if CSV oo = Roo::CSV.new(File.join(TESTDIR,'Bibelbund.csv')) oo.default_sheet = oo.sheets.first assert_equal 1, oo.first_row end end def test_bug_pfand_from_windows_phone_xlsx return if defined? JRUBY_VERSION with_each_spreadsheet(:name=>'Pfand_from_windows_phone', :format=>:excelx) do |oo| oo.default_sheet = oo.sheets.first assert_equal ['Blatt1','Blatt2','Blatt3'], oo.sheets assert_equal 'Summe', oo.cell('b',1) assert_equal Date.new(2011,9,14), oo.cell('a',2) assert_equal :date, oo.celltype('a',2) assert_equal Date.new(2011,9,15), oo.cell('a',3) assert_equal :date, oo.celltype('a',3) assert_equal 3.81, oo.cell('b',2) assert_equal "SUM(C2:L2)", oo.formula('b',2) assert_equal 0.7, oo.cell('c',2) end # each end def test_comment with_each_spreadsheet(:name=>'comments', :format=>[:openoffice,:libreoffice, :excelx]) do |oo| oo.default_sheet = oo.sheets.first assert_equal 'Kommentar fuer B4',oo.comment('b',4) assert_equal 'Kommentar fuer B5',oo.comment('b',5) assert_nil oo.comment('b',99) # no comment at the second page oo.default_sheet = oo.sheets[1] assert_nil oo.comment('b',4) end end def test_comments with_each_spreadsheet(:name=>'comments', :format=>[:openoffice,:libreoffice, :excelx]) do |oo| oo.default_sheet = oo.sheets.first assert_equal [ [4, 2, "Kommentar fuer B4"], [5, 2, "Kommentar fuer B5"], ], oo.comments(oo.sheets.first), "comments error in class #{oo.class}" # no comments at the second page oo.default_sheet = oo.sheets[1] assert_equal [], oo.comments, "comments error in class #{oo.class}" end with_each_spreadsheet(:name=>'comments-google', :format=>[:excelx]) do |oo| oo.default_sheet = oo.sheets.first assert_equal [[1, 1, "this is a comment\n\t-Steven Daniels"]], oo.comments(oo.sheets.first), "comments error in class #{oo.class}" end end ## PREVIOUSLY SKIPPED # don't have these test files so removing. We can easily add in # by modifying with_each_spreadsheet GNUMERIC_ODS = false # do gnumeric with ods files Tests? OPENOFFICEWRITE = false # experimental: write access with OO-Documents def test_writeopenoffice if OPENOFFICEWRITE File.cp(File.join(TESTDIR,"numbers1.ods"), File.join(TESTDIR,"numbers2.ods")) File.cp(File.join(TESTDIR,"numbers2.ods"), File.join(TESTDIR,"bak_numbers2.ods")) oo = OpenOffice.new(File.join(TESTDIR,"numbers2.ods")) oo.default_sheet = oo.sheets.first oo.first_row.upto(oo.last_row) {|y| oo.first_column.upto(oo.last_column) {|x| unless oo.empty?(y,x) # oo.set(y, x, oo.cell(y,x) + 7) if oo.celltype(y,x) == "float" oo.set(y, x, oo.cell(y,x) + 7) if oo.celltype(y,x) == :float end } } oo.save oo1 = Roo::OpenOffice.new(File.join(TESTDIR,"numbers2.ods")) oo2 = Roo::OpenOffice.new(File.join(TESTDIR,"bak_numbers2.ods")) #p oo2.to_s assert_equal 999, oo2.cell('a',1), oo2.cell('a',1) assert_equal oo2.cell('a',1) + 7, oo1.cell('a',1) assert_equal oo2.cell('b',1)+7, oo1.cell('b',1) assert_equal oo2.cell('c',1)+7, oo1.cell('c',1) assert_equal oo2.cell('d',1)+7, oo1.cell('d',1) assert_equal oo2.cell('a',2)+7, oo1.cell('a',2) assert_equal oo2.cell('b',2)+7, oo1.cell('b',2) assert_equal oo2.cell('c',2)+7, oo1.cell('c',2) assert_equal oo2.cell('d',2)+7, oo1.cell('d',2) assert_equal oo2.cell('e',2)+7, oo1.cell('e',2) File.cp(File.join(TESTDIR,"bak_numbers2.ods"), File.join(TESTDIR,"numbers2.ods")) end end def common_possible_bug_snowboard_cells(ss) assert_equal "A.", ss.cell(13,'A'), ss.class assert_equal 147, ss.cell(13,'f'), ss.class assert_equal 152, ss.cell(13,'g'), ss.class assert_equal 156, ss.cell(13,'h'), ss.class assert_equal 158, ss.cell(13,'i'), ss.class assert_equal 160, ss.cell(13,'j'), ss.class assert_equal 164, ss.cell(13,'k'), ss.class assert_equal 168, ss.cell(13,'l'), ss.class assert_equal :string, ss.celltype(13,'m'), ss.class assert_equal "159W", ss.cell(13,'m'), ss.class assert_equal "164W", ss.cell(13,'n'), ss.class assert_equal "168W", ss.cell(13,'o'), ss.class end # def test_false_encoding # ex = Roo::Excel.new(File.join(TESTDIR,'false_encoding.xls')) # ex.default_sheet = ex.sheets.first # assert_equal "Sheet1", ex.sheets.first # ex.first_row.upto(ex.last_row) do |row| # ex.first_column.upto(ex.last_column) do |col| # content = ex.cell(row,col) # puts "#{row}/#{col}" # #puts content if ! ex.empty?(row,col) or ex.formula?(row,col) # if ex.formula?(row,col) # #! ex.empty?(row,col) # puts content # end # end # end # end def test_download_uri if ONLINE if OPENOFFICE assert_raises(RuntimeError) { Roo::OpenOffice.new("http://gibbsnichtdomainxxxxx.com/file.ods") } end if EXCELX assert_raises(RuntimeError) { Roo::Excelx.new("http://gibbsnichtdomainxxxxx.com/file.xlsx") } end end end def test_download_uri_with_query_string dir = File.expand_path("#{File.dirname __FILE__}/files") { xlsx: [EXCELX, Roo::Excelx], ods: [OPENOFFICE, Roo::OpenOffice]}.each do |extension, (flag, type)| if flag file = "#{dir}/simple_spreadsheet.#{extension}" url = "http://test.example.com/simple_spreadsheet.#{extension}?query-param=value" stub_request(:any, url).to_return(body: File.read(file)) spreadsheet = type.new(url) spreadsheet.default_sheet = spreadsheet.sheets.first assert_equal 'Task 1', spreadsheet.cell('f', 4) end end end # def test_soap_server # #threads = [] # #threads << Thread.new("serverthread") do # fork do # p "serverthread started" # puts "in child, pid = #$$" # puts `/usr/bin/ruby rooserver.rb` # p "serverthread finished" # end # #threads << Thread.new("clientthread") do # p "clientthread started" # sleep 10 # proxy = SOAP::RPC::Driver.new("http://localhost:12321","spreadsheetserver") # proxy.add_method('cell','row','col') # proxy.add_method('officeversion') # proxy.add_method('last_row') # proxy.add_method('last_column') # proxy.add_method('first_row') # proxy.add_method('first_column') # proxy.add_method('sheets') # proxy.add_method('set_default_sheet','s') # proxy.add_method('ferien_fuer_region', 'region') # sheets = proxy.sheets # p sheets # proxy.set_default_sheet(sheets.first) # assert_equal 1, proxy.first_row # assert_equal 1, proxy.first_column # assert_equal 187, proxy.last_row # assert_equal 7, proxy.last_column # assert_equal 42, proxy.cell('C',8) # assert_equal 43, proxy.cell('F',12) # assert_equal "1.0", proxy.officeversion # p "clientthread finished" # #end # #threads.each {|t| t.join } # puts "fertig" # Process.kill("INT",pid) # pid = Process.wait # puts "child terminated, pid= #{pid}, status= #{$?.exitstatus}" # end def split_coord(s) letter = "" number = 0 i = 0 while i true) assert_equal headers, parsed[1].keys end def test_bug_numbered_sheet_names with_each_spreadsheet(:name=>'bug-numbered-sheet-names', :format=>:excelx) do |oo| oo.each_with_pagename { } end end def test_parsing_xslx_from_numbers return unless EXCELX xlsx = Roo::Excelx.new(File.join(TESTDIR, "numbers-export.xlsx")) xlsx.default_sheet = xlsx.sheets.first assert_equal 'Sheet 1', xlsx.cell('a',1) # Another buggy behavior of Numbers 3.1: if a warkbook has more than a # single sheet, all sheets except the first one will have an extra row and # column added to the beginning. That's why we assert against cell B2 and # not A1 xlsx.default_sheet = xlsx.sheets.last assert_equal 'Sheet 2', xlsx.cell('b',2) end def test_openoffice_encryption if OPENOFFICE assert_raises(ArgumentError) { Roo::LibreOffice.new(File.join(TESTDIR, "encrypted-letmein.ods")) } assert_raises(ArgumentError) { Roo::LibreOffice.new(File.join(TESTDIR, "encrypted-letmein.ods"), :password => "badpassword") } oo = Roo::LibreOffice.new(File.join(TESTDIR, "encrypted-letmein.ods"), :password => "letmein") oo.default_sheet = oo.sheets.first assert_equal "Hello World", oo.cell('a',1) end end def test_expand_merged_range return unless EXCELX xlsx = Roo::Excelx.new(File.join(TESTDIR, "merged_ranges.xlsx"), {:expand_merged_ranges => true}) for row in 3..7 do for col in 'a'..'b' if row > 3 && row < 7 && col == 'a' assert_equal 'vertical1', xlsx.cell(col,row) else assert_nil xlsx.cell(col,row) end end end for row in 3..11 do for col in 'f'..'h' if row > 3 && row < 11 && col == 'g' assert_equal 'vertical2', xlsx.cell(col,row) else assert_nil xlsx.cell(col,row) end end end for row in 3..5 do for col in 'b'..'f' if row == 4 && col > 'b' && col < 'f' assert_equal 'horizontal', xlsx.cell(col,row) else assert_nil xlsx.cell(col,row) end end end for row in 8..13 do for col in 'a'..'e' if row > 8 && row < 13 && col > 'a' && col < 'e' assert_equal 'block', xlsx.cell(col,row) else assert_nil xlsx.cell(col,row) end end end end def test_noexpand_merged_range return unless EXCELX xlsx = Roo::Excelx.new(File.join(TESTDIR, "merged_ranges.xlsx")) for row in 3..7 do for col in 'a'..'b' if row == 4 && col == 'a' assert_equal 'vertical1', xlsx.cell(col,row) else assert_nil xlsx.cell(col,row) end end end for row in 3..11 do for col in 'f'..'h' if row == 4 && col == 'g' assert_equal 'vertical2', xlsx.cell(col,row) else assert_nil xlsx.cell(col,row) end end end for row in 3..5 do for col in 'b'..'f' if row == 4 && col == 'c' assert_equal 'horizontal', xlsx.cell(col,row) else assert_nil xlsx.cell(col,row) end end end for row in 8..13 do for col in 'a'..'e' if row == 9 && col == 'b' assert_equal 'block', xlsx.cell(col,row) else assert_nil xlsx.cell(col,row) end end end end def test_open_stream return unless EXCELX file_contents = File.read File.join(TESTDIR, fixture_filename(:numbers1, :excelx)), encoding: 'BINARY' stream = StringIO.new(file_contents) xlsx = Roo::Excelx.new(stream) assert_equal ["Tabelle1","Name of Sheet 2","Sheet3","Sheet4","Sheet5"], xlsx.sheets end def test_close with_each_spreadsheet(:name=>'numbers1') do |oo| next unless (tempdir = oo.instance_variable_get('@tmpdir')) oo.close assert !File.exists?(tempdir), "Expected #{tempdir} to be cleaned up, but it still exists" end end def test_cleanup_on_error old_temp_files = Dir.open(Dir.tmpdir).to_a with_each_spreadsheet(:name=>'non_existent_file', :ignore_errors=>true) do |oo|; end assert_equal Dir.open(Dir.tmpdir).to_a, old_temp_files end end # class