summaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/lib/roo/base_spec.rb48
-rwxr-xr-xspec/lib/roo/excelx_spec.rb156
-rw-r--r--spec/lib/roo/strict_spec.rb43
-rw-r--r--spec/lib/roo/utils_spec.rb15
-rw-r--r--spec/lib/roo/weak_instance_cache_spec.rb92
-rw-r--r--spec/lib/roo_spec.rb0
6 files changed, 317 insertions, 37 deletions
diff --git a/spec/lib/roo/base_spec.rb b/spec/lib/roo/base_spec.rb
index d00025d..76cefcc 100644
--- a/spec/lib/roo/base_spec.rb
+++ b/spec/lib/roo/base_spec.rb
@@ -127,10 +127,22 @@ describe Roo::Base do
end
end
- describe '#row' do
- it 'should return the specified row' do
+ describe "#row" do
+ it "should return the specified row" do
expect(spreadsheet.row(12)).to eq([41.0, 42.0, 43.0, 44.0, 45.0, nil, nil])
- expect(spreadsheet.row(16)).to eq([nil, '"Hello world!"', 'forty-three', 'forty-four', 'forty-five', nil, nil])
+ expect(spreadsheet.row(16)).to eq([nil, '"Hello world!"', "forty-three", "forty-four", "forty-five", nil, nil])
+ end
+
+ it "should return the specified row if default_sheet is set by a string" do
+ spreadsheet.default_sheet = "my_sheet"
+ expect(spreadsheet.row(12)).to eq([41.0, 42.0, 43.0, 44.0, 45.0, nil, nil])
+ expect(spreadsheet.row(16)).to eq([nil, '"Hello world!"', "forty-three", "forty-four", "forty-five", nil, nil])
+ end
+
+ it "should return the specified row if default_sheet is set by an integer" do
+ spreadsheet.default_sheet = 0
+ expect(spreadsheet.row(12)).to eq([41.0, 42.0, 43.0, 44.0, 45.0, nil, nil])
+ expect(spreadsheet.row(16)).to eq([nil, '"Hello world!"', "forty-three", "forty-four", "forty-five", nil, nil])
end
end
@@ -146,6 +158,11 @@ describe Roo::Base do
expect { spreadsheet.row_with([/Missing Header/]) }.to \
raise_error(Roo::HeaderRowNotFoundError)
end
+
+ it 'returns missing headers' do
+ expect { spreadsheet.row_with([/Header/, /Missing Header 1/, /Missing Header 2/]) }.to \
+ raise_error(Roo::HeaderRowNotFoundError, '[/Missing Header 1/, /Missing Header 2/]')
+ end
end
end
@@ -173,6 +190,31 @@ describe Roo::Base do
end
end
+ describe "#default_sheet=" do
+ it "should correctly set the default sheet if passed a string" do
+ spreadsheet.default_sheet = "my_sheet"
+ expect(spreadsheet.default_sheet).to eq("my_sheet")
+ end
+
+ it "should correctly set the default sheet if passed an integer" do
+ spreadsheet.default_sheet = 0
+ expect(spreadsheet.default_sheet).to eq("my_sheet")
+ end
+
+ it "should correctly set the default sheet if passed an integer for the second sheet" do
+ spreadsheet.default_sheet = 1
+ expect(spreadsheet.default_sheet).to eq("blank sheet")
+ end
+
+ it "should raise an error if passed a sheet that does not exist as an integer" do
+ expect { spreadsheet.default_sheet = 10 }.to raise_error RangeError
+ end
+
+ it "should raise an error if passed a sheet that does not exist as a string" do
+ expect { spreadsheet.default_sheet = "does_not_exist" }.to raise_error RangeError
+ end
+ end
+
describe '#to_yaml' do
it 'should convert the spreadsheet to yaml' do
expect(spreadsheet.to_yaml({}, 5, 1, 5, 1)).to eq("--- \n" + yaml_entry(5, 1, 'date', '1961-11-21'))
diff --git a/spec/lib/roo/excelx_spec.rb b/spec/lib/roo/excelx_spec.rb
index 0ef0f19..6c2289f 100755
--- a/spec/lib/roo/excelx_spec.rb
+++ b/spec/lib/roo/excelx_spec.rb
@@ -151,6 +151,22 @@ describe Roo::Excelx do
it 'returns the expected result' do
expect(subject.sheet_for("Tabelle1").instance_variable_get("@name")).to eq "Tabelle1"
end
+
+ it 'returns the expected result when passed a number' do
+ expect(subject.sheet_for(0).instance_variable_get("@name")).to eq "Tabelle1"
+ end
+
+ it 'returns the expected result when passed a number that is not the first sheet' do
+ expect(subject.sheet_for(1).instance_variable_get("@name")).to eq "Name of Sheet 2"
+ end
+
+ it "should raise an error if passed a sheet that does not exist as an integer" do
+ expect { subject.sheet_for(10) }.to raise_error RangeError
+ end
+
+ it "should raise an error if passed a sheet that does not exist as a string" do
+ expect { subject.sheet_for("does_not_exist") }.to raise_error RangeError
+ end
end
describe '#row' do
@@ -304,6 +320,18 @@ describe Roo::Excelx do
end
end
+ describe '#row' do
+ context 'integers with leading zero'
+ let(:path) { 'test/files/number_with_zero_prefix.xlsx' }
+
+ it 'returns base 10 integer' do
+ (1..50).each do |row_index|
+ range_start = (row_index - 1) * 20 + 1
+ expect(subject.row(row_index)).to eq (range_start..(range_start+19)).to_a
+ end
+ end
+ end
+
describe '#excelx_format' do
let(:path) { 'test/files/style.xlsx' }
@@ -354,11 +382,22 @@ describe Roo::Excelx do
end
describe '#hyperlink' do
- let(:path) { 'test/files/link.xlsx' }
+ context 'without location' do
+ let(:path) { 'test/files/link.xlsx' }
- it 'returns the expected result' do
- expect(subject.hyperlink(1, 1)).to eq "http://www.google.com"
- expect(subject.hyperlink(1, 2)).to eq nil
+ it 'returns the expected result' do
+ expect(subject.hyperlink(1, 1)).to eq "http://www.google.com"
+ expect(subject.hyperlink(1, 2)).to eq nil
+ end
+ end
+
+ context 'with location' do
+ let(:path) { 'test/files/link_with_location.xlsx' }
+
+ it 'returns the expected result' do
+ expect(subject.hyperlink(1, 1)).to eq "http://www.google.com/#hey"
+ expect(subject.hyperlink(1, 2)).to eq nil
+ end
end
end
@@ -480,34 +519,36 @@ describe Roo::Excelx do
end
describe '#html_strings' do
- let(:path) { 'test/files/html_strings_formatting.xlsx' }
+ describe "HTML Parsing Enabling" do
+ let(:path) { 'test/files/html_strings_formatting.xlsx' }
- it 'returns the expected result' do
- expect(subject.excelx_value(1, 1, "Sheet1")).to eq "This has no formatting."
- expect(subject.excelx_value(2, 1, "Sheet1")).to eq "<html>This has<b> bold </b>formatting.</html>"
- expect(subject.excelx_value(2, 2, "Sheet1")).to eq "<html>This has <i>italics</i> formatting.</html>"
- expect(subject.excelx_value(2, 3, "Sheet1")).to eq "<html>This has <u>underline</u> format.</html>"
- expect(subject.excelx_value(2, 4, "Sheet1")).to eq "<html>Superscript. x<sup>123</sup></html>"
- expect(subject.excelx_value(2, 5, "Sheet1")).to eq "<html>SubScript. T<sub>j</sub></html>"
-
- expect(subject.excelx_value(3, 1, "Sheet1")).to eq "<html>Bold, italics <b><i>together</i></b>.</html>"
- expect(subject.excelx_value(3, 2, "Sheet1")).to eq "<html>Bold, Underline <b><u>together</u></b>.</html>"
- expect(subject.excelx_value(3, 3, "Sheet1")).to eq "<html>Bold, Superscript. <b>x</b><sup><b>N</b></sup></html>"
- expect(subject.excelx_value(3, 4, "Sheet1")).to eq "<html>Bold, Subscript. <b>T</b><sub><b>abc</b></sub></html>"
- expect(subject.excelx_value(3, 5, "Sheet1")).to eq "<html>Italics, Underline <i><u>together</u></i>.</html>"
- expect(subject.excelx_value(3, 6, "Sheet1")).to eq "<html>Italics, Superscript. <i>X</i><sup><i>abc</i></sup></html>"
- expect(subject.excelx_value(3, 7, "Sheet1")).to eq "<html>Italics, Subscript. <i>B</i><sub><i>efg</i></sub></html>"
- expect(subject.excelx_value(4, 1, "Sheet1")).to eq "<html>Bold, italics underline,<b><i><u> together</u></i></b>.</html>"
- expect(subject.excelx_value(4, 2, "Sheet1")).to eq "<html>Bold, italics, superscript. <b>X</b><sup><b><i>abc</i></b></sup><b><i>123</i></b></html>"
- expect(subject.excelx_value(4, 3, "Sheet1")).to eq "<html>Bold, Italics, subscript. <b><i>Mg</i></b><sub><b><i>ha</i></b></sub><b><i>2</i></b></html>"
- expect(subject.excelx_value(4, 4, "Sheet1")).to eq "<html>Bold, Underline, superscript. <b><u>AB</u></b><sup><b><u>C12</u></b></sup><b><u>3</u></b></html>"
- expect(subject.excelx_value(4, 5, "Sheet1")).to eq "<html>Bold, Underline, subscript. <b><u>Good</u></b><sub><b><u>XYZ</u></b></sub></html>"
- expect(subject.excelx_value(4, 6, "Sheet1")).to eq "<html>Italics, Underline, superscript. <i><u>Up</u></i><sup><i><u>swing</u></i></sup></html>"
- expect(subject.excelx_value(4, 7, "Sheet1")).to eq "<html>Italics, Underline, subscript. <i><u>T</u></i><sub><i><u>swing</u></i></sub></html>"
- expect(subject.excelx_value(5, 1, "Sheet1")).to eq "<html>Bold, italics, underline, superscript. <b><i><u>GHJK</u></i></b><sup><b><i><u>190</u></i></b></sup><b><i><u>4</u></i></b></html>"
- expect(subject.excelx_value(5, 2, "Sheet1")).to eq "<html>Bold, italics, underline, subscript. <b><i><u>Mike</u></i></b><sub><b><i><u>drop</u></i></b></sub></html>"
- expect(subject.excelx_value(6, 1, "Sheet1")).to eq "See that regular html tags do not create html tags.\n<ol>\n <li> Denver Broncos </li>\n <li> Carolina Panthers </li>\n <li> New England Patriots</li>\n <li>Arizona Panthers</li>\n</ol>"
- expect(subject.excelx_value(7, 1, "Sheet1")).to eq "<html>Does create html tags when formatting is used..\n<ol>\n <li> <b>Denver Broncos</b> </li>\n <li> <i>Carolina Panthers </i></li>\n <li> <u>New England Patriots</u></li>\n <li>Arizona Panthers</li>\n</ol></html>"
+ it 'returns the expected result' do
+ expect(subject.excelx_value(1, 1, "Sheet1")).to eq("This has no formatting.")
+ expect(subject.excelx_value(2, 1, "Sheet1")).to eq("<html>This has<b> bold </b>formatting.</html>")
+ expect(subject.excelx_value(2, 2, "Sheet1")).to eq("<html>This has <i>italics</i> formatting.</html>")
+ expect(subject.excelx_value(2, 3, "Sheet1")).to eq("<html>This has <u>underline</u> format.</html>")
+ expect(subject.excelx_value(2, 4, "Sheet1")).to eq("<html>Superscript. x<sup>123</sup></html>")
+ expect(subject.excelx_value(2, 5, "Sheet1")).to eq("<html>SubScript. T<sub>j</sub></html>")
+
+ expect(subject.excelx_value(3, 1, "Sheet1")).to eq("<html>Bold, italics <b><i>together</i></b>.</html>")
+ expect(subject.excelx_value(3, 2, "Sheet1")).to eq("<html>Bold, Underline <b><u>together</u></b>.</html>")
+ expect(subject.excelx_value(3, 3, "Sheet1")).to eq("<html>Bold, Superscript. <b>x</b><sup><b>N</b></sup></html>")
+ expect(subject.excelx_value(3, 4, "Sheet1")).to eq("<html>Bold, Subscript. <b>T</b><sub><b>abc</b></sub></html>")
+ expect(subject.excelx_value(3, 5, "Sheet1")).to eq("<html>Italics, Underline <i><u>together</u></i>.</html>")
+ expect(subject.excelx_value(3, 6, "Sheet1")).to eq("<html>Italics, Superscript. <i>X</i><sup><i>abc</i></sup></html>")
+ expect(subject.excelx_value(3, 7, "Sheet1")).to eq("<html>Italics, Subscript. <i>B</i><sub><i>efg</i></sub></html>")
+ expect(subject.excelx_value(4, 1, "Sheet1")).to eq("<html>Bold, italics underline,<b><i><u> together</u></i></b>.</html>")
+ expect(subject.excelx_value(4, 2, "Sheet1")).to eq("<html>Bold, italics, superscript. <b>X</b><sup><b><i>abc</i></b></sup><b><i>123</i></b></html>")
+ expect(subject.excelx_value(4, 3, "Sheet1")).to eq("<html>Bold, Italics, subscript. <b><i>Mg</i></b><sub><b><i>ha</i></b></sub><b><i>2</i></b></html>")
+ expect(subject.excelx_value(4, 4, "Sheet1")).to eq("<html>Bold, Underline, superscript. <b><u>AB</u></b><sup><b><u>C12</u></b></sup><b><u>3</u></b></html>")
+ expect(subject.excelx_value(4, 5, "Sheet1")).to eq("<html>Bold, Underline, subscript. <b><u>Good</u></b><sub><b><u>XYZ</u></b></sub></html>")
+ expect(subject.excelx_value(4, 6, "Sheet1")).to eq("<html>Italics, Underline, superscript. <i><u>Up</u></i><sup><i><u>swing</u></i></sup></html>")
+ expect(subject.excelx_value(4, 7, "Sheet1")).to eq("<html>Italics, Underline, subscript. <i><u>T</u></i><sub><i><u>swing</u></i></sub></html>")
+ expect(subject.excelx_value(5, 1, "Sheet1")).to eq("<html>Bold, italics, underline, superscript. <b><i><u>GHJK</u></i></b><sup><b><i><u>190</u></i></b></sup><b><i><u>4</u></i></b></html>")
+ expect(subject.excelx_value(5, 2, "Sheet1")).to eq("<html>Bold, italics, underline, subscript. <b><i><u>Mike</u></i></b><sub><b><i><u>drop</u></i></b></sub></html>")
+ expect(subject.excelx_value(6, 1, "Sheet1")).to eq("See that regular html tags do not create html tags.\n<ol>\n <li> Denver Broncos </li>\n <li> Carolina Panthers </li>\n <li> New England Patriots</li>\n <li>Arizona Panthers</li>\n</ol>")
+ expect(subject.excelx_value(7, 1, "Sheet1")).to eq("<html>Does create html tags when formatting is used..\n<ol>\n <li> <b>Denver Broncos</b> </li>\n <li> <i>Carolina Panthers </i></li>\n <li> <u>New England Patriots</u></li>\n <li>Arizona Panthers</li>\n</ol></html>")
+ end
end
end
@@ -534,4 +575,57 @@ describe Roo::Excelx do
expect(subject.sheet(0).excelx_format(2,1)).to eq 'm/d/yyyy" "h:mm:ss" "AM/PM'
end
end
+
+ describe 'images' do
+ let(:path) { 'test/files/images.xlsx' }
+
+ it 'returns array of images from default sheet' do
+ expect(subject.images).to be_kind_of(Array)
+ expect(subject.images.size).to eql(19)
+ end
+
+ it 'returns empty array if there is no images on the sheet' do
+ expect(subject.images("Sheet2")).to eql([])
+ end
+ end
end
+
+describe 'Roo::Excelx with options set' do
+ subject(:xlsx) do
+ Roo::Excelx.new(path, disable_html_wrapper: true)
+ end
+
+ describe '#html_strings' do
+ describe "HTML Parsing Disabled" do
+ let(:path) { 'test/files/html_strings_formatting.xlsx' }
+
+ it 'returns the expected result' do
+ expect(subject.excelx_value(1, 1, "Sheet1")).to eq("This has no formatting.")
+ expect(subject.excelx_value(2, 1, "Sheet1")).to eq("This has bold formatting.")
+ expect(subject.excelx_value(2, 2, "Sheet1")).to eq("This has italics formatting.")
+ expect(subject.excelx_value(2, 3, "Sheet1")).to eq("This has underline format.")
+ expect(subject.excelx_value(2, 4, "Sheet1")).to eq("Superscript. x123")
+ expect(subject.excelx_value(2, 5, "Sheet1")).to eq("SubScript. Tj")
+
+ expect(subject.excelx_value(3, 1, "Sheet1")).to eq("Bold, italics together.")
+ expect(subject.excelx_value(3, 2, "Sheet1")).to eq("Bold, Underline together.")
+ expect(subject.excelx_value(3, 3, "Sheet1")).to eq("Bold, Superscript. xN")
+ expect(subject.excelx_value(3, 4, "Sheet1")).to eq("Bold, Subscript. Tabc")
+ expect(subject.excelx_value(3, 5, "Sheet1")).to eq("Italics, Underline together.")
+ expect(subject.excelx_value(3, 6, "Sheet1")).to eq("Italics, Superscript. Xabc")
+ expect(subject.excelx_value(3, 7, "Sheet1")).to eq("Italics, Subscript. Befg")
+ expect(subject.excelx_value(4, 1, "Sheet1")).to eq("Bold, italics underline, together.")
+ expect(subject.excelx_value(4, 2, "Sheet1")).to eq("Bold, italics, superscript. Xabc123")
+ expect(subject.excelx_value(4, 3, "Sheet1")).to eq("Bold, Italics, subscript. Mgha2")
+ expect(subject.excelx_value(4, 4, "Sheet1")).to eq("Bold, Underline, superscript. ABC123")
+ expect(subject.excelx_value(4, 5, "Sheet1")).to eq("Bold, Underline, subscript. GoodXYZ")
+ expect(subject.excelx_value(4, 6, "Sheet1")).to eq("Italics, Underline, superscript. Upswing")
+ expect(subject.excelx_value(4, 7, "Sheet1")).to eq("Italics, Underline, subscript. Tswing")
+ expect(subject.excelx_value(5, 1, "Sheet1")).to eq("Bold, italics, underline, superscript. GHJK1904")
+ expect(subject.excelx_value(5, 2, "Sheet1")).to eq("Bold, italics, underline, subscript. Mikedrop")
+ expect(subject.excelx_value(6, 1, "Sheet1")).to eq("See that regular html tags do not create html tags.\n<ol>\n <li> Denver Broncos </li>\n <li> Carolina Panthers </li>\n <li> New England Patriots</li>\n <li>Arizona Panthers</li>\n</ol>")
+ expect(subject.excelx_value(7, 1, "Sheet1")).to eq("Does create html tags when formatting is used..\n<ol>\n <li> Denver Broncos </li>\n <li> Carolina Panthers </li>\n <li> New England Patriots</li>\n <li>Arizona Panthers</li>\n</ol>")
+ end
+ end
+ end
+end \ No newline at end of file
diff --git a/spec/lib/roo/strict_spec.rb b/spec/lib/roo/strict_spec.rb
new file mode 100644
index 0000000..811ee51
--- /dev/null
+++ b/spec/lib/roo/strict_spec.rb
@@ -0,0 +1,43 @@
+require 'spec_helper'
+
+describe Roo::Excelx do
+ subject { Roo::Excelx.new('test/files/strict.xlsx') }
+
+ example '#sheets' do
+ expect(subject.sheets).to eq %w(Sheet1 Sheet2)
+ end
+
+ example '#sheet' do
+ expect(subject.sheet('Sheet1')).to be_a(Roo::Excelx)
+ end
+
+ example '#cell' do
+ expect(subject.cell(1, 1)).to eq 'Sheet 1'
+ expect(subject.cell(1, 1, 'Sheet2')).to eq 'Sheet 2'
+ end
+
+ example '#row' do
+ expect(subject.row(1)).to eq ['Sheet 1']
+ expect(subject.row(1, 'Sheet2')).to eq ['Sheet 2']
+ end
+
+ example '#first_row' do
+ expect(subject.first_row).to eq 1
+ expect(subject.first_row('Sheet2')).to eq 1
+ end
+
+ example '#last_row' do
+ expect(subject.last_row).to eq 1
+ expect(subject.last_row('Sheet2')).to eq 1
+ end
+
+ example '#first_column' do
+ expect(subject.first_column).to eq 1
+ expect(subject.first_column('Sheet2')).to eq 1
+ end
+
+ example '#last_column' do
+ expect(subject.last_column).to eq 1
+ expect(subject.last_column('Sheet2')).to eq 1
+ end
+end
diff --git a/spec/lib/roo/utils_spec.rb b/spec/lib/roo/utils_spec.rb
index ffe93d4..8f322d4 100644
--- a/spec/lib/roo/utils_spec.rb
+++ b/spec/lib/roo/utils_spec.rb
@@ -52,6 +52,15 @@ RSpec.describe ::Roo::Utils do
end
end
+ context '.extract_coordinate' do
+ it "returns the expected result" do
+ expect(described_class.extract_coordinate('A1')).to eq [1, 1]
+ expect(described_class.extract_coordinate('B2')).to eq [2, 2]
+ expect(described_class.extract_coordinate('R2')).to eq [2, 18]
+ expect(described_class.extract_coordinate('AR31')).to eq [31, 18 + 26]
+ end
+ end
+
context '.split_coord' do
it "returns the expected result" do
expect(described_class.split_coord('A1')).to eq ["A", 1]
@@ -86,21 +95,21 @@ RSpec.describe ::Roo::Utils do
expect(described_class.load_xml('test/files/sheet1.xml')).to be_a(Nokogiri::XML::Document)
expect(described_class.load_xml('test/files/sheet1.xml').
remove_namespaces!.xpath("/worksheet/dimension").map do |dim|
- dim.attributes["ref"].value end.first).to eq "A1:B11"
+ dim["ref"] end.first).to eq "A1:B11"
end
end
context '.each_element' do
it 'returns the expected result' do
described_class.each_element('test/files/sheet1.xml', 'dimension') do |dim|
- expect(dim.attributes["ref"].value).to eq "A1:B11"
+ expect(dim["ref"]).to eq "A1:B11"
end
rows = []
described_class.each_element('test/files/sheet1.xml', 'row') do |row|
rows << row
end
expect(rows.size).to eq 11
- expect(rows[2].attributes["r"].value).to eq "3"
+ expect(rows[2]["r"]).to eq "3"
end
end
end
diff --git a/spec/lib/roo/weak_instance_cache_spec.rb b/spec/lib/roo/weak_instance_cache_spec.rb
new file mode 100644
index 0000000..c2ad9b4
--- /dev/null
+++ b/spec/lib/roo/weak_instance_cache_spec.rb
@@ -0,0 +1,92 @@
+require 'spec_helper'
+
+if RUBY_PLATFORM == "java"
+ require 'java'
+ java_import 'java.lang.System'
+end
+
+describe Roo::Helpers::WeakInstanceCache do
+ let(:klass) do
+ Class.new do
+ include Roo::Helpers::WeakInstanceCache
+
+ def memoized_data
+ instance_cache(:@memoized_data) do
+ "Some Costly Operation #{rand(1000)}" * 1_000
+ end
+ end
+ end
+ end
+
+ subject do
+ klass.new
+ end
+
+ it 'should be lazy' do
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ data = subject.memoized_data
+ expect(subject.instance_variables).to include(:@memoized_data)
+ end
+
+
+ it 'should be memoized' do
+ data = subject.memoized_data
+ expect(subject.memoized_data).to equal(data)
+ end
+
+ it 'should recalculate after GC' do
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ GC.disable
+ subject.memoized_data && nil
+ expect(subject.instance_variables).to include(:@memoized_data)
+
+ force_gc
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ GC.disable
+ subject.memoized_data && nil
+ expect(subject.instance_variables).to include(:@memoized_data)
+ end
+
+ it 'must remove instance variable' do
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ GC.disable
+ subject.memoized_data && nil
+ expect(subject.instance_variables).to include(:@memoized_data)
+
+ force_gc
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ end
+
+ context '#inspect must not raise' do
+ it 'before calculation' do
+ expect{subject.inspect}.to_not raise_error
+ end
+ it 'after calculation' do
+ GC.disable
+ subject.memoized_data && nil
+ expect{subject.inspect}.to_not raise_error
+ expect(subject.inspect).to include("Some Costly Operation")
+ force_gc
+ end
+ it 'after GC' do
+ subject.memoized_data && nil
+ force_gc
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ expect{subject.inspect}.to_not raise_error
+ expect(subject.inspect).to_not include("Some Costly Operation")
+ end
+ end
+
+ if RUBY_PLATFORM == "java"
+ def force_gc
+ System.gc
+ sleep(0.1)
+ end
+ else
+ def force_gc
+ GC.start(full_mark: true, immediate_sweep: true)
+ sleep(0.1)
+ GC.start(full_mark: true, immediate_sweep: true)
+ end
+ end
+end \ No newline at end of file
diff --git a/spec/lib/roo_spec.rb b/spec/lib/roo_spec.rb
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/spec/lib/roo_spec.rb