spec/workbook_spec.rb in jruby-poi-0.8.2 vs spec/workbook_spec.rb in jruby-poi-0.9.0
- old
+ new
@@ -1,370 +1,385 @@
-require 'spec_helper'
-
-require 'date'
-require 'stringio'
-
-describe POI::Workbook do
- it "should open a workbook and allow access to its worksheets" do
- name = TestDataFile.expand_path("various_samples.xlsx")
- book = POI::Workbook.open(name)
- book.worksheets.size.should == 5
- book.filename.should == name
- end
-
- it "should be able to create a Workbook from an IO object" do
- content = StringIO.new(open(TestDataFile.expand_path("various_samples.xlsx"), 'rb'){|f| f.read})
- book = POI::Workbook.open(content)
- book.worksheets.size.should == 5
- book.filename.should =~ /spreadsheet.xlsx$/
- end
-
- it "should be able to create a Workbook from a Java input stream" do
- content = java.io.FileInputStream.new(TestDataFile.expand_path("various_samples.xlsx"))
- book = POI::Workbook.open(content)
- book.worksheets.size.should == 5
- book.filename.should =~ /spreadsheet.xlsx$/
- end
-
- it "should return a column of cells by reference" do
- name = TestDataFile.expand_path("various_samples.xlsx")
- book = POI::Workbook.open(name)
- book["numbers!$A"].should == book['numbers'].rows.collect{|e| e[0].value}
- book["numbers!A"].should == book['numbers'].rows.collect{|e| e[0].value}
- book["numbers!C"].should == book['numbers'].rows.collect{|e| e[2].value}
- book["numbers!$D:$D"].should == book['numbers'].rows.collect{|e| e[3].value}
- book["numbers!$c:$D"].should == {"C" => book['numbers'].rows.collect{|e| e[2].value}, "D" => book['numbers'].rows.collect{|e| e[3].value}}
- end
-
- it "should return cells by reference" do
- name = TestDataFile.expand_path("various_samples.xlsx")
- book = POI::Workbook.open(name)
- book.cell("numbers!A1").value.should == 'NUM'
- book.cell("numbers!A2").to_s.should == '1.0'
- book.cell("numbers!A3").to_s.should == '2.0'
- book.cell("numbers!A4").to_s.should == '3.0'
-
- book.cell("numbers!A10").to_s.should == '9.0'
- book.cell("numbers!B10").to_s.should == '81.0'
- book.cell("numbers!C10").to_s.should == '729.0'
- book.cell("numbers!D10").to_s.should == '3.0'
-
- book.cell("text & pic!A10").value.should == 'This is an Excel XLSX workbook.'
- book.cell("bools & errors!B3").value.should == true
- book.cell("high refs!AM619").value.should == 'This is some text'
- book.cell("high refs!AO624").value.should == 24.0
- book.cell("high refs!AP631").value.should == 13.0
-
- book.cell(%Q{'text & pic'!A10}).value.should == 'This is an Excel XLSX workbook.'
- book.cell(%Q{'bools & errors'!B3}).value.should == true
- book.cell(%Q{'high refs'!AM619}).value.should == 'This is some text'
- book.cell(%Q{'high refs'!AO624}).value.should == 24.0
- book.cell(%Q{'high refs'!AP631}).value.should == 13.0
- end
-
- it "should handle named cell ranges" do
- name = TestDataFile.expand_path("various_samples.xlsx")
- book = POI::Workbook.open(name)
-
- book.named_ranges.length.should == 3
- book.named_ranges.collect{|e| e.name}.should == %w{four_times_six NAMES nums}
- book.named_ranges.collect{|e| e.sheet.name}.should == ['high refs', 'bools & errors', 'high refs']
- book.named_ranges.collect{|e| e.formula}.should == ["'high refs'!$AO$624", "'bools & errors'!$D$2:$D$11", "'high refs'!$AP$619:$AP$631"]
- book['four_times_six'].should == 24.0
- book['nums'].should == (1..13).collect{|e| e * 1.0}
-
- # NAMES is a range of empty cells
- book['NAMES'].should == [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
- book.cell('NAMES').each do | cell |
- cell.value.should be_nil
- cell.poi_cell.should_not be_nil
- cell.to_s.should be_empty
- end
- end
-
- it "should return an array of cell values by reference" do
- name = TestDataFile.expand_path("various_samples.xlsx")
- book = POI::Workbook.open(name)
- book['dates!A2:A16'].should == (Date.parse('2010-02-28')..Date.parse('2010-03-14')).to_a
- end
-
- it "should return cell values by reference" do
- name = TestDataFile.expand_path("various_samples.xlsx")
- book = POI::Workbook.open(name)
-
- book['text & pic!A10'].should == 'This is an Excel XLSX workbook.'
- book['bools & errors!B3'].should == true
- book['high refs!AM619'].should == 'This is some text'
- book['high refs!AO624'].should == 24.0
- book['high refs!AP631'].should == 13.0
- end
-end
-
-describe POI::Worksheets do
- it "should allow indexing worksheets by ordinal" do
- name = TestDataFile.expand_path("various_samples.xlsx")
- book = POI::Workbook.open(name)
-
- book.worksheets[0].name.should == "text & pic"
- book.worksheets[1].name.should == "numbers"
- book.worksheets[2].name.should == "dates"
- book.worksheets[3].name.should == "bools & errors"
- end
-
- it "should allow indexing worksheets by name" do
- name = TestDataFile.expand_path("various_samples.xlsx")
- book = POI::Workbook.open(name)
-
- book.worksheets["text & pic"].name.should == "text & pic"
- book.worksheets["numbers"].name.should == "numbers"
- book.worksheets["dates"].name.should == "dates"
- end
-
- it "should be enumerable" do
- name = TestDataFile.expand_path("various_samples.xlsx")
- book = POI::Workbook.open(name)
- book.worksheets.should be_kind_of Enumerable
-
- book.worksheets.each do |sheet|
- sheet.should be_kind_of POI::Worksheet
- end
-
- book.worksheets.size.should == 5
- book.worksheets.collect.size.should == 5
- end
-
- it "returns cells when passing a cell reference" do
- name = TestDataFile.expand_path("various_samples.xlsx")
- book = POI::Workbook.open(name)
- book['dates']['A2'].to_s.should == '2010-02-28'
- book['dates']['a2'].to_s.should == '2010-02-28'
- book['dates']['B2'].to_s.should == '2010-03-14'
- book['dates']['b2'].to_s.should == '2010-03-14'
- book['dates']['C2'].to_s.should == '2010-03-28'
- book['dates']['c2'].to_s.should == '2010-03-28'
- end
-end
-
-describe POI::Rows do
- it "should be enumerable" do
- name = TestDataFile.expand_path("various_samples.xlsx")
- book = POI::Workbook.open(name)
- sheet = book.worksheets["text & pic"]
- sheet.rows.should be_kind_of Enumerable
-
- sheet.rows.each do |row|
- row.should be_kind_of POI::Row
- end
-
- sheet.rows.size.should == 7
- sheet.rows.collect.size.should == 7
- end
-end
-
-describe POI::Cells do
- before :each do
- @name = TestDataFile.expand_path("various_samples.xlsx")
- @book = POI::Workbook.open(@name)
- end
-
- def book
- @book
- end
-
- def name
- @name
- end
-
- it "should be enumerable" do
- sheet = book.worksheets["text & pic"]
- rows = sheet.rows
- cells = rows[0].cells
-
- cells.should be_kind_of Enumerable
- cells.size.should == 1
- cells.collect.size.should == 1
- end
-end
-
-describe POI::Cell do
- before :each do
- @name = TestDataFile.expand_path("various_samples.xlsx")
- @book = POI::Workbook.open(@name)
- end
-
- def book
- @book
- end
-
- def name
- @name
- end
-
- it "should provide dates for date cells" do
- sheet = book.worksheets["dates"]
- rows = sheet.rows
-
- dates_by_column = [
- (Date.parse('2010-02-28')..Date.parse('2010-03-14')),
- (Date.parse('2010-03-14')..Date.parse('2010-03-28')),
- (Date.parse('2010-03-28')..Date.parse('2010-04-11'))]
- (0..2).each do |col|
- dates_by_column[col].each_with_index do |date, index|
- row = index + 1
- rows[row][col].value.should equal_at_cell(date, row, col)
- end
- end
- end
-
- it "should provide numbers for numeric cells" do
- sheet = book.worksheets["numbers"]
- rows = sheet.rows
-
- (1..15).each do |number|
- row = number
- rows[row][0].value.should equal_at_cell(number, row, 0)
- rows[row][1].value.should equal_at_cell(number ** 2, row, 1)
- rows[row][2].value.should equal_at_cell(number ** 3, row, 2)
- rows[row][3].value.should equal_at_cell(Math.sqrt(number), row, 3)
- end
-
- rows[9][0].to_s.should == '9.0'
- rows[9][1].to_s.should == '81.0'
- rows[9][2].to_s.should == '729.0'
- rows[9][3].to_s.should == '3.0'
- end
-
- it "should handle array access from the workbook down to cells" do
- book[1][9][0].to_s.should == '9.0'
- book[1][9][1].to_s.should == '81.0'
- book[1][9][2].to_s.should == '729.0'
- book[1][9][3].to_s.should == '3.0'
-
- book["numbers"][9][0].to_s.should == '9.0'
- book["numbers"][9][1].to_s.should == '81.0'
- book["numbers"][9][2].to_s.should == '729.0'
- book["numbers"][9][3].to_s.should == '3.0'
- end
-
- it "should provide error text for error cells" do
- sheet = book.worksheets["bools & errors"]
- rows = sheet.rows
-
- rows[6][0].value.should == 0.0 #'~CIRCULAR~REF~'
- rows[6][0].error_value.should be_nil
-
- rows[7][0].value.should be_nil
- rows[7][0].error_value.should == '#DIV/0!'
-
- rows[8][0].value.should be_nil
- rows[8][0].error_value.should == '#N/A'
-
- rows[9][0].value.should be_nil
- rows[9][0].error_value.should == '#NAME?'
-
- rows[10][0].value.should be_nil
- rows[10][0].error_value.should == '#NULL!'
-
- rows[11][0].value.should be_nil
- rows[11][0].error_value.should == '#NUM!'
-
- rows[12][0].value.should be_nil
- rows[12][0].error_value.should == '#REF!'
-
- rows[13][0].value.should be_nil
- rows[13][0].error_value.should == '#VALUE!'
-
- lambda{ rows[14][0].value }.should_not raise_error(Java::java.lang.RuntimeException)
-
- rows[6][0].to_s.should == '0.0' #'~CIRCULAR~REF~'
- rows[7][0].to_s.should == '' #'#DIV/0!'
- rows[8][0].to_s.should == '' #'#N/A'
- rows[9][0].to_s.should == '' #'#NAME?'
- rows[10][0].to_s.should == '' #'#NULL!'
- rows[11][0].to_s.should == '' #'#NUM!'
- rows[12][0].to_s.should == '' #'#REF!'
- rows[13][0].to_s.should == '' #'#VALUE!'
- rows[14][0].to_s.should == ''
- end
-
- it "should provide booleans for boolean cells" do
- sheet = book.worksheets["bools & errors"]
- rows = sheet.rows
- rows[1][0].value.should == false
- rows[1][0].to_s.should == 'false'
-
- rows[1][1].value.should == false
- rows[1][1].to_s.should == 'false'
-
- rows[2][0].value.should == true
- rows[2][0].to_s.should == 'true'
-
- rows[2][1].value.should == true
- rows[2][1].to_s.should == 'true'
- end
-
- it "should provide the cell value as a string" do
- sheet = book.worksheets["text & pic"]
- rows = sheet.rows
-
- rows[0][0].value.should == "This"
- rows[1][0].value.should == "is"
- rows[2][0].value.should == "an"
- rows[3][0].value.should == "Excel"
- rows[4][0].value.should == "XLSX"
- rows[5][0].value.should == "workbook"
- rows[9][0].value.should == 'This is an Excel XLSX workbook.'
-
-
- rows[0][0].to_s.should == "This"
- rows[1][0].to_s.should == "is"
- rows[2][0].to_s.should == "an"
- rows[3][0].to_s.should == "Excel"
- rows[4][0].to_s.should == "XLSX"
- rows[5][0].to_s.should == "workbook"
- rows[9][0].to_s.should == 'This is an Excel XLSX workbook.'
- end
-
- it "should provide formulas instead of string-ified values" do
- sheet = book.worksheets["numbers"]
- rows = sheet.rows
-
- (1..15).each do |number|
- row = number
- rows[row][0].to_s(false).should == "#{number}.0"
- rows[row][1].to_s(false).should == "A#{row + 1}*A#{row + 1}"
- rows[row][2].to_s(false).should == "B#{row + 1}*A#{row + 1}"
- rows[row][3].to_s(false).should == "SQRT(A#{row + 1})"
- end
-
- sheet = book.worksheets["bools & errors"]
- rows = sheet.rows
- rows[1][0].to_s(false).should == '1=2'
- rows[1][1].to_s(false).should == 'FALSE'
- rows[2][0].to_s(false).should == '1=1'
- rows[2][1].to_s(false).should == 'TRUE'
- rows[14][0].to_s(false).should == 'foobar(1)'
-
- sheet = book.worksheets["text & pic"]
- sheet.rows[9][0].to_s(false).should == 'CONCATENATE(A1," ", A2," ", A3," ", A4," ", A5," ", A6,".")'
- end
-
- it "should handle getting values out of 'non-existent' cells" do
- sheet = book.worksheets["bools & errors"]
- sheet.rows[14][2].value.should be_nil
- end
-
- it "should notify the workbook that I have been updated" do
- book['dates!A10'].to_s.should == '2010-03-08'
- book['dates!A16'].to_s.should == '2010-03-14'
- book['dates!B2'].to_s.should == '2010-03-14'
-
- cell = book.cell('dates!B2')
- cell.formula.should == 'A16'
-
- cell.formula = 'A10 + 1'
- book.cell('dates!B2').poi_cell.should === cell.poi_cell
- book.cell('dates!B2').formula.should == 'A10 + 1'
-
- book['dates!B2'].to_s.should == '2010-03-09'
- end
-end
+require 'spec_helper'
+
+require 'date'
+require 'stringio'
+
+describe POI::Workbook do
+ it "should open a workbook and allow access to its worksheets" do
+ name = TestDataFile.expand_path("various_samples.xlsx")
+ book = POI::Workbook.open(name)
+ book.worksheets.size.should == 5
+ book.filename.should == name
+ end
+
+ it "should be able to create a Workbook from an IO object" do
+ content = StringIO.new(open(TestDataFile.expand_path("various_samples.xlsx"), 'rb'){|f| f.read})
+ book = POI::Workbook.open(content)
+ book.worksheets.size.should == 5
+ book.filename.should =~ /spreadsheet.xlsx$/
+ end
+
+ it "should be able to create a Workbook from a Java input stream" do
+ content = java.io.FileInputStream.new(TestDataFile.expand_path("various_samples.xlsx"))
+ book = POI::Workbook.open(content)
+ book.worksheets.size.should == 5
+ book.filename.should =~ /spreadsheet.xlsx$/
+ end
+
+ it "should create an HSSFWorkbook when passed a :format => :hssf option" do
+ book = POI::Workbook.create('test.xls', :format => :hssf)
+ book.poi_workbook.should be_kind_of(org.apache.poi.hssf.usermodel.HSSFWorkbook)
+ end
+
+ it "should create an XSSFWorkbook when passed a :format => :xssf option" do
+ book = POI::Workbook.create('test.xlsx', :format => :xssf)
+ book.poi_workbook.should be_kind_of(org.apache.poi.xssf.usermodel.XSSFWorkbook)
+ end
+
+ it "should create an XSSFWorkbook by default" do
+ book = POI::Workbook.create('test.xlsx')
+ book.poi_workbook.should be_kind_of(org.apache.poi.xssf.usermodel.XSSFWorkbook)
+ end
+
+ it "should return a column of cells by reference" do
+ name = TestDataFile.expand_path("various_samples.xlsx")
+ book = POI::Workbook.open(name)
+ book["numbers!$A"].should == book['numbers'].rows.collect{|e| e[0].value}
+ book["numbers!A"].should == book['numbers'].rows.collect{|e| e[0].value}
+ book["numbers!C"].should == book['numbers'].rows.collect{|e| e[2].value}
+ book["numbers!$D:$D"].should == book['numbers'].rows.collect{|e| e[3].value}
+ book["numbers!$c:$D"].should == {"C" => book['numbers'].rows.collect{|e| e[2].value}, "D" => book['numbers'].rows.collect{|e| e[3].value}}
+ end
+
+ it "should return cells by reference" do
+ name = TestDataFile.expand_path("various_samples.xlsx")
+ book = POI::Workbook.open(name)
+ book.cell("numbers!A1").value.should == 'NUM'
+ book.cell("numbers!A2").to_s.should == '1.0'
+ book.cell("numbers!A3").to_s.should == '2.0'
+ book.cell("numbers!A4").to_s.should == '3.0'
+
+ book.cell("numbers!A10").to_s.should == '9.0'
+ book.cell("numbers!B10").to_s.should == '81.0'
+ book.cell("numbers!C10").to_s.should == '729.0'
+ book.cell("numbers!D10").to_s.should == '3.0'
+
+ book.cell("text & pic!A10").value.should == 'This is an Excel XLSX workbook.'
+ book.cell("bools & errors!B3").value.should == true
+ book.cell("high refs!AM619").value.should == 'This is some text'
+ book.cell("high refs!AO624").value.should == 24.0
+ book.cell("high refs!AP631").value.should == 13.0
+
+ book.cell(%Q{'text & pic'!A10}).value.should == 'This is an Excel XLSX workbook.'
+ book.cell(%Q{'bools & errors'!B3}).value.should == true
+ book.cell(%Q{'high refs'!AM619}).value.should == 'This is some text'
+ book.cell(%Q{'high refs'!AO624}).value.should == 24.0
+ book.cell(%Q{'high refs'!AP631}).value.should == 13.0
+ end
+
+ it "should handle named cell ranges" do
+ name = TestDataFile.expand_path("various_samples.xlsx")
+ book = POI::Workbook.open(name)
+
+ book.named_ranges.length.should == 3
+ book.named_ranges.collect{|e| e.name}.should == %w{four_times_six NAMES nums}
+ book.named_ranges.collect{|e| e.sheet.name}.should == ['high refs', 'bools & errors', 'high refs']
+ book.named_ranges.collect{|e| e.formula}.should == ["'high refs'!$AO$624", "'bools & errors'!$D$2:$D$11", "'high refs'!$AP$619:$AP$631"]
+ book['four_times_six'].should == 24.0
+ book['nums'].should == (1..13).collect{|e| e * 1.0}
+
+ # NAMES is a range of empty cells
+ book['NAMES'].should == [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
+ book.cell('NAMES').each do | cell |
+ cell.value.should be_nil
+ cell.poi_cell.should_not be_nil
+ cell.to_s.should be_empty
+ end
+ end
+
+ it "should return an array of cell values by reference" do
+ name = TestDataFile.expand_path("various_samples.xlsx")
+ book = POI::Workbook.open(name)
+ book['dates!A2:A16'].should == (Date.parse('2010-02-28')..Date.parse('2010-03-14')).to_a
+ end
+
+ it "should return cell values by reference" do
+ name = TestDataFile.expand_path("various_samples.xlsx")
+ book = POI::Workbook.open(name)
+
+ book['text & pic!A10'].should == 'This is an Excel XLSX workbook.'
+ book['bools & errors!B3'].should == true
+ book['high refs!AM619'].should == 'This is some text'
+ book['high refs!AO624'].should == 24.0
+ book['high refs!AP631'].should == 13.0
+ end
+end
+
+describe POI::Worksheets do
+ it "should allow indexing worksheets by ordinal" do
+ name = TestDataFile.expand_path("various_samples.xlsx")
+ book = POI::Workbook.open(name)
+
+ book.worksheets[0].name.should == "text & pic"
+ book.worksheets[1].name.should == "numbers"
+ book.worksheets[2].name.should == "dates"
+ book.worksheets[3].name.should == "bools & errors"
+ end
+
+ it "should allow indexing worksheets by name" do
+ name = TestDataFile.expand_path("various_samples.xlsx")
+ book = POI::Workbook.open(name)
+
+ book.worksheets["text & pic"].name.should == "text & pic"
+ book.worksheets["numbers"].name.should == "numbers"
+ book.worksheets["dates"].name.should == "dates"
+ end
+
+ it "should be enumerable" do
+ name = TestDataFile.expand_path("various_samples.xlsx")
+ book = POI::Workbook.open(name)
+ book.worksheets.should be_kind_of Enumerable
+
+ book.worksheets.each do |sheet|
+ sheet.should be_kind_of POI::Worksheet
+ end
+
+ book.worksheets.count.should == 5
+ book.worksheets.collect.count.should == 5
+ end
+
+ it "returns cells when passing a cell reference" do
+ name = TestDataFile.expand_path("various_samples.xlsx")
+ book = POI::Workbook.open(name)
+ book['dates']['A2'].to_s.should == '2010-02-28'
+ book['dates']['a2'].to_s.should == '2010-02-28'
+ book['dates']['B2'].to_s.should == '2010-03-14'
+ book['dates']['b2'].to_s.should == '2010-03-14'
+ book['dates']['C2'].to_s.should == '2010-03-28'
+ book['dates']['c2'].to_s.should == '2010-03-28'
+ end
+end
+
+describe POI::Rows do
+ it "should be enumerable" do
+ name = TestDataFile.expand_path("various_samples.xlsx")
+ book = POI::Workbook.open(name)
+ sheet = book.worksheets["text & pic"]
+ sheet.rows.should be_kind_of Enumerable
+
+ sheet.rows.each do |row|
+ row.should be_kind_of POI::Row
+ end
+
+ sheet.rows.count.should == 7
+ sheet.rows.collect.count.should == 7
+ end
+end
+
+describe POI::Cells do
+ before :each do
+ @name = TestDataFile.expand_path("various_samples.xlsx")
+ @book = POI::Workbook.open(@name)
+ end
+
+ def book
+ @book
+ end
+
+ def name
+ @name
+ end
+
+ it "should be enumerable" do
+ sheet = book.worksheets["text & pic"]
+ rows = sheet.rows
+ cells = rows[0].cells
+
+ cells.should be_kind_of Enumerable
+ cells.count.should == 1
+ cells.collect.count.should == 1
+ end
+end
+
+describe POI::Cell do
+ before :each do
+ @name = TestDataFile.expand_path("various_samples.xlsx")
+ @book = POI::Workbook.open(@name)
+ end
+
+ def book
+ @book
+ end
+
+ def name
+ @name
+ end
+
+ it "should provide dates for date cells" do
+ sheet = book.worksheets["dates"]
+ rows = sheet.rows
+
+ dates_by_column = [
+ (Date.parse('2010-02-28')..Date.parse('2010-03-14')),
+ (Date.parse('2010-03-14')..Date.parse('2010-03-28')),
+ (Date.parse('2010-03-28')..Date.parse('2010-04-11'))]
+ (0..2).each do |col|
+ dates_by_column[col].each_with_index do |date, index|
+ row = index + 1
+ rows[row][col].value.should equal_at_cell(date, row, col)
+ end
+ end
+ end
+
+ it "should provide numbers for numeric cells" do
+ sheet = book.worksheets["numbers"]
+ rows = sheet.rows
+
+ (1..15).each do |number|
+ row = number
+ rows[row][0].value.should equal_at_cell(number, row, 0)
+ rows[row][1].value.should equal_at_cell(number ** 2, row, 1)
+ rows[row][2].value.should equal_at_cell(number ** 3, row, 2)
+ rows[row][3].value.should equal_at_cell(Math.sqrt(number), row, 3)
+ end
+
+ rows[9][0].to_s.should == '9.0'
+ rows[9][1].to_s.should == '81.0'
+ rows[9][2].to_s.should == '729.0'
+ rows[9][3].to_s.should == '3.0'
+ end
+
+ it "should handle array access from the workbook down to cells" do
+ book[1][9][0].to_s.should == '9.0'
+ book[1][9][1].to_s.should == '81.0'
+ book[1][9][2].to_s.should == '729.0'
+ book[1][9][3].to_s.should == '3.0'
+
+ book["numbers"][9][0].to_s.should == '9.0'
+ book["numbers"][9][1].to_s.should == '81.0'
+ book["numbers"][9][2].to_s.should == '729.0'
+ book["numbers"][9][3].to_s.should == '3.0'
+ end
+
+ it "should provide error text for error cells" do
+ sheet = book.worksheets["bools & errors"]
+ rows = sheet.rows
+
+ rows[6][0].value.should == 0.0 #'~CIRCULAR~REF~'
+ rows[6][0].error_value.should be_nil
+
+ rows[7][0].value.should be_nil
+ rows[7][0].error_value.should == '#DIV/0!'
+
+ rows[8][0].value.should be_nil
+ rows[8][0].error_value.should == '#N/A'
+
+ rows[9][0].value.should be_nil
+ rows[9][0].error_value.should == '#NAME?'
+
+ rows[10][0].value.should be_nil
+ rows[10][0].error_value.should == '#NULL!'
+
+ rows[11][0].value.should be_nil
+ rows[11][0].error_value.should == '#NUM!'
+
+ rows[12][0].value.should be_nil
+ rows[12][0].error_value.should == '#REF!'
+
+ rows[13][0].value.should be_nil
+ rows[13][0].error_value.should == '#VALUE!'
+
+ lambda{ rows[14][0].value }.should_not raise_error(Java::java.lang.RuntimeException)
+
+ rows[6][0].to_s.should == '0.0' #'~CIRCULAR~REF~'
+ rows[7][0].to_s.should == '' #'#DIV/0!'
+ rows[8][0].to_s.should == '' #'#N/A'
+ rows[9][0].to_s.should == '' #'#NAME?'
+ rows[10][0].to_s.should == '' #'#NULL!'
+ rows[11][0].to_s.should == '' #'#NUM!'
+ rows[12][0].to_s.should == '' #'#REF!'
+ rows[13][0].to_s.should == '' #'#VALUE!'
+ rows[14][0].to_s.should == ''
+ end
+
+ it "should provide booleans for boolean cells" do
+ sheet = book.worksheets["bools & errors"]
+ rows = sheet.rows
+ rows[1][0].value.should == false
+ rows[1][0].to_s.should == 'false'
+
+ rows[1][1].value.should == false
+ rows[1][1].to_s.should == 'false'
+
+ rows[2][0].value.should == true
+ rows[2][0].to_s.should == 'true'
+
+ rows[2][1].value.should == true
+ rows[2][1].to_s.should == 'true'
+ end
+
+ it "should provide the cell value as a string" do
+ sheet = book.worksheets["text & pic"]
+ rows = sheet.rows
+
+ rows[0][0].value.should == "This"
+ rows[1][0].value.should == "is"
+ rows[2][0].value.should == "an"
+ rows[3][0].value.should == "Excel"
+ rows[4][0].value.should == "XLSX"
+ rows[5][0].value.should == "workbook"
+ rows[9][0].value.should == 'This is an Excel XLSX workbook.'
+
+
+ rows[0][0].to_s.should == "This"
+ rows[1][0].to_s.should == "is"
+ rows[2][0].to_s.should == "an"
+ rows[3][0].to_s.should == "Excel"
+ rows[4][0].to_s.should == "XLSX"
+ rows[5][0].to_s.should == "workbook"
+ rows[9][0].to_s.should == 'This is an Excel XLSX workbook.'
+ end
+
+ it "should provide formulas instead of string-ified values" do
+ sheet = book.worksheets["numbers"]
+ rows = sheet.rows
+
+ (1..15).each do |number|
+ row = number
+ rows[row][0].to_s(false).should == "#{number}.0"
+ rows[row][1].to_s(false).should == "A#{row + 1}*A#{row + 1}"
+ rows[row][2].to_s(false).should == "B#{row + 1}*A#{row + 1}"
+ rows[row][3].to_s(false).should == "SQRT(A#{row + 1})"
+ end
+
+ sheet = book.worksheets["bools & errors"]
+ rows = sheet.rows
+ rows[1][0].to_s(false).should == '1=2'
+ rows[1][1].to_s(false).should == 'FALSE'
+ rows[2][0].to_s(false).should == '1=1'
+ rows[2][1].to_s(false).should == 'TRUE'
+ rows[14][0].to_s(false).should == 'foobar(1)'
+
+ sheet = book.worksheets["text & pic"]
+ sheet.rows[9][0].to_s(false).should == 'CONCATENATE(A1," ", A2," ", A3," ", A4," ", A5," ", A6,".")'
+ end
+
+ it "should handle getting values out of 'non-existent' cells" do
+ sheet = book.worksheets["bools & errors"]
+ sheet.rows[14][2].value.should be_nil
+ end
+
+ it "should notify the workbook that I have been updated" do
+ book['dates!A10'].to_s.should == '2010-03-08'
+ book['dates!A16'].to_s.should == '2010-03-14'
+ book['dates!B2'].to_s.should == '2010-03-14'
+
+ cell = book.cell('dates!B2')
+ cell.formula.should == 'A16'
+
+ cell.formula = 'A10 + 1'
+ book.cell('dates!B2').poi_cell.should === cell.poi_cell
+ book.cell('dates!B2').formula.should == 'A10 + 1'
+
+ book['dates!B2'].to_s.should == '2010-03-09'
+ end
+end