roo 2.3.0 → 2.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +17 -0
  3. data/.github/issue_template.md +16 -0
  4. data/.github/pull_request_template.md +14 -0
  5. data/.github/workflows/pull-request.yml +15 -0
  6. data/.github/workflows/ruby.yml +34 -0
  7. data/.gitignore +4 -0
  8. data/.rubocop.yml +186 -0
  9. data/CHANGELOG.md +148 -0
  10. data/Gemfile +4 -4
  11. data/LICENSE +2 -0
  12. data/README.md +84 -27
  13. data/Rakefile +1 -1
  14. data/lib/roo/base.rb +111 -237
  15. data/lib/roo/constants.rb +5 -3
  16. data/lib/roo/csv.rb +106 -85
  17. data/lib/roo/errors.rb +2 -0
  18. data/lib/roo/excelx/cell/base.rb +26 -12
  19. data/lib/roo/excelx/cell/boolean.rb +9 -6
  20. data/lib/roo/excelx/cell/date.rb +7 -7
  21. data/lib/roo/excelx/cell/datetime.rb +50 -44
  22. data/lib/roo/excelx/cell/empty.rb +3 -2
  23. data/lib/roo/excelx/cell/number.rb +60 -47
  24. data/lib/roo/excelx/cell/string.rb +3 -3
  25. data/lib/roo/excelx/cell/time.rb +17 -16
  26. data/lib/roo/excelx/cell.rb +11 -7
  27. data/lib/roo/excelx/comments.rb +3 -3
  28. data/lib/roo/excelx/coordinate.rb +11 -4
  29. data/lib/roo/excelx/extractor.rb +20 -3
  30. data/lib/roo/excelx/format.rb +38 -31
  31. data/lib/roo/excelx/images.rb +26 -0
  32. data/lib/roo/excelx/relationships.rb +12 -4
  33. data/lib/roo/excelx/shared.rb +10 -3
  34. data/lib/roo/excelx/shared_strings.rb +113 -9
  35. data/lib/roo/excelx/sheet.rb +49 -10
  36. data/lib/roo/excelx/sheet_doc.rb +101 -48
  37. data/lib/roo/excelx/styles.rb +4 -4
  38. data/lib/roo/excelx/workbook.rb +8 -3
  39. data/lib/roo/excelx.rb +85 -42
  40. data/lib/roo/formatters/base.rb +15 -0
  41. data/lib/roo/formatters/csv.rb +84 -0
  42. data/lib/roo/formatters/matrix.rb +23 -0
  43. data/lib/roo/formatters/xml.rb +31 -0
  44. data/lib/roo/formatters/yaml.rb +40 -0
  45. data/lib/roo/helpers/default_attr_reader.rb +20 -0
  46. data/lib/roo/helpers/weak_instance_cache.rb +41 -0
  47. data/lib/roo/open_office.rb +41 -27
  48. data/lib/roo/spreadsheet.rb +8 -2
  49. data/lib/roo/tempdir.rb +24 -0
  50. data/lib/roo/utils.rb +76 -26
  51. data/lib/roo/version.rb +1 -1
  52. data/lib/roo.rb +5 -0
  53. data/roo.gemspec +22 -12
  54. data/spec/lib/roo/base_spec.rb +65 -3
  55. data/spec/lib/roo/csv_spec.rb +19 -0
  56. data/spec/lib/roo/excelx/cell/time_spec.rb +15 -0
  57. data/spec/lib/roo/excelx/relationships_spec.rb +43 -0
  58. data/spec/lib/roo/excelx/sheet_doc_spec.rb +11 -0
  59. data/spec/lib/roo/excelx_spec.rb +237 -5
  60. data/spec/lib/roo/openoffice_spec.rb +2 -2
  61. data/spec/lib/roo/spreadsheet_spec.rb +1 -1
  62. data/spec/lib/roo/strict_spec.rb +43 -0
  63. data/spec/lib/roo/utils_spec.rb +22 -9
  64. data/spec/lib/roo/weak_instance_cache_spec.rb +92 -0
  65. data/spec/lib/roo_spec.rb +0 -0
  66. data/spec/spec_helper.rb +2 -7
  67. data/test/excelx/cell/test_attr_reader_default.rb +72 -0
  68. data/test/excelx/cell/test_base.rb +6 -2
  69. data/test/excelx/cell/test_boolean.rb +1 -3
  70. data/test/excelx/cell/test_date.rb +1 -6
  71. data/test/excelx/cell/test_datetime.rb +7 -10
  72. data/test/excelx/cell/test_empty.rb +12 -2
  73. data/test/excelx/cell/test_number.rb +28 -4
  74. data/test/excelx/cell/test_string.rb +21 -3
  75. data/test/excelx/cell/test_time.rb +7 -10
  76. data/test/excelx/test_coordinate.rb +51 -0
  77. data/test/formatters/test_csv.rb +136 -0
  78. data/test/formatters/test_matrix.rb +76 -0
  79. data/test/formatters/test_xml.rb +78 -0
  80. data/test/formatters/test_yaml.rb +20 -0
  81. data/test/helpers/test_accessing_files.rb +81 -0
  82. data/test/helpers/test_comments.rb +43 -0
  83. data/test/helpers/test_formulas.rb +9 -0
  84. data/test/helpers/test_labels.rb +103 -0
  85. data/test/helpers/test_sheets.rb +55 -0
  86. data/test/helpers/test_styles.rb +62 -0
  87. data/test/roo/test_base.rb +182 -0
  88. data/test/roo/test_csv.rb +88 -0
  89. data/test/roo/test_excelx.rb +360 -0
  90. data/test/roo/test_libre_office.rb +9 -0
  91. data/test/roo/test_open_office.rb +289 -0
  92. data/test/test_helper.rb +129 -14
  93. data/test/test_roo.rb +60 -1765
  94. metadata +91 -21
  95. data/.travis.yml +0 -14
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ if RUBY_PLATFORM == "java"
4
+ require 'java'
5
+ java_import 'java.lang.System'
6
+ end
7
+
8
+ describe Roo::Helpers::WeakInstanceCache do
9
+ let(:klass) do
10
+ Class.new do
11
+ include Roo::Helpers::WeakInstanceCache
12
+
13
+ def memoized_data
14
+ instance_cache(:@memoized_data) do
15
+ "Some Costly Operation #{rand(1000)}" * 1_000
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ subject do
22
+ klass.new
23
+ end
24
+
25
+ it 'should be lazy' do
26
+ expect(subject.instance_variables).to_not include(:@memoized_data)
27
+ data = subject.memoized_data
28
+ expect(subject.instance_variables).to include(:@memoized_data)
29
+ end
30
+
31
+
32
+ it 'should be memoized' do
33
+ data = subject.memoized_data
34
+ expect(subject.memoized_data).to equal(data)
35
+ end
36
+
37
+ it 'should recalculate after GC' do
38
+ expect(subject.instance_variables).to_not include(:@memoized_data)
39
+ GC.disable
40
+ subject.memoized_data && nil
41
+ expect(subject.instance_variables).to include(:@memoized_data)
42
+
43
+ force_gc
44
+ expect(subject.instance_variables).to_not include(:@memoized_data)
45
+ GC.disable
46
+ subject.memoized_data && nil
47
+ expect(subject.instance_variables).to include(:@memoized_data)
48
+ end
49
+
50
+ it 'must remove instance variable' do
51
+ expect(subject.instance_variables).to_not include(:@memoized_data)
52
+ GC.disable
53
+ subject.memoized_data && nil
54
+ expect(subject.instance_variables).to include(:@memoized_data)
55
+
56
+ force_gc
57
+ expect(subject.instance_variables).to_not include(:@memoized_data)
58
+ end
59
+
60
+ context '#inspect must not raise' do
61
+ it 'before calculation' do
62
+ expect{subject.inspect}.to_not raise_error
63
+ end
64
+ it 'after calculation' do
65
+ GC.disable
66
+ subject.memoized_data && nil
67
+ expect{subject.inspect}.to_not raise_error
68
+ expect(subject.inspect).to include("Some Costly Operation")
69
+ force_gc
70
+ end
71
+ it 'after GC' do
72
+ subject.memoized_data && nil
73
+ force_gc
74
+ expect(subject.instance_variables).to_not include(:@memoized_data)
75
+ expect{subject.inspect}.to_not raise_error
76
+ expect(subject.inspect).to_not include("Some Costly Operation")
77
+ end
78
+ end
79
+
80
+ if RUBY_PLATFORM == "java"
81
+ def force_gc
82
+ System.gc
83
+ sleep(0.1)
84
+ end
85
+ else
86
+ def force_gc
87
+ GC.start(full_mark: true, immediate_sweep: true)
88
+ sleep(0.1)
89
+ GC.start(full_mark: true, immediate_sweep: true)
90
+ end
91
+ end
92
+ end
File without changes
data/spec/spec_helper.rb CHANGED
@@ -1,14 +1,9 @@
1
1
  require 'simplecov'
2
2
  require 'roo'
3
- require 'vcr'
4
-
5
3
  require 'helpers'
6
4
 
7
5
  RSpec.configure do |c|
8
6
  c.include Helpers
9
- end
10
-
11
- VCR.configure do |c|
12
- c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
13
- c.hook_into :webmock # or :fakeweb
7
+ c.color = true
8
+ c.formatter = :documentation if ENV["USE_REPORTERS"]
14
9
  end
@@ -0,0 +1,72 @@
1
+ require "test_helper"
2
+
3
+ class TestAttrReaderDefault < Minitest::Test
4
+ def base
5
+ Roo::Excelx::Cell::Base
6
+ end
7
+
8
+ def boolean
9
+ Roo::Excelx::Cell::Boolean
10
+ end
11
+
12
+ def class_date
13
+ Roo::Excelx::Cell::Date
14
+ end
15
+
16
+ def datetime
17
+ Roo::Excelx::Cell::DateTime
18
+ end
19
+
20
+ def empty
21
+ Roo::Excelx::Cell::Empty
22
+ end
23
+
24
+ def number
25
+ Roo::Excelx::Cell::Number
26
+ end
27
+
28
+ def string
29
+ Roo::Excelx::Cell::String
30
+ end
31
+
32
+ def base_date
33
+ ::Date.new(1899, 12, 30)
34
+ end
35
+
36
+ def base_timestamp
37
+ ::Date.new(1899, 12, 30).to_datetime.to_time.to_i
38
+ end
39
+
40
+ def class_time
41
+ Roo::Excelx::Cell::Time
42
+ end
43
+
44
+ def test_cell_default_values
45
+ assert_values base.new(nil, nil, [], 1, nil, nil), default_type: :base, :@default_type => nil, style: 1, :@style => nil
46
+ assert_values boolean.new("1", nil, nil, nil, nil), default_type: :boolean, :@default_type => nil, cell_type: :boolean, :@cell_type => nil
47
+ assert_values class_date.new("41791", nil, [:numeric_or_formula, "mm-dd-yy"], 6, nil, base_date, nil), default_type: :date, :@default_type => nil
48
+ assert_values class_time.new("0.521", nil, [:numeric_or_formula, "hh:mm"], 6, nil, base_timestamp, nil), default_type: :time, :@default_type => nil
49
+ assert_values datetime.new("41791.521", nil, [:numeric_or_formula, "mm-dd-yy hh:mm"], 6, nil, base_timestamp, nil), default_type: :datetime, :@default_type => nil
50
+ assert_values empty.new(nil), default_type: nil, :@default_type => nil, style: nil, :@style => nil
51
+ assert_values number.new("42", nil, ["0"], nil, nil, nil), default_type: :float, :@default_type => nil
52
+ assert_values string.new("1", nil, nil, nil, nil), default_type: :string, :@default_type => nil, cell_type: :string, :@cell_type => nil
53
+
54
+ assert_values base.new(nil, nil, [], 2, nil, nil), style: 2, :@style => 2
55
+ end
56
+
57
+ def assert_values(object, value_hash)
58
+ value_hash.each do |attr_name, expected_value|
59
+ value = if attr_name.to_s.include?("@")
60
+ object.instance_variable_defined?(attr_name) ? object.instance_variable_get(attr_name) : nil
61
+ else
62
+ object.public_send(attr_name)
63
+ end
64
+
65
+ if expected_value
66
+ assert_equal expected_value, value
67
+ else
68
+ assert_nil value
69
+ end
70
+ end
71
+ end
72
+ end
@@ -1,5 +1,4 @@
1
- require 'roo/excelx/cell/base'
2
- require 'roo/link'
1
+ require 'test_helper'
3
2
 
4
3
  class TestRooExcelxCellBase < Minitest::Test
5
4
  def base
@@ -26,6 +25,11 @@ class TestRooExcelxCellBase < Minitest::Test
26
25
  refute cell.empty?
27
26
  end
28
27
 
28
+ def test_presence
29
+ cell = base.new(value, nil, [], nil, nil, nil)
30
+ assert_equal cell, cell.presence
31
+ end
32
+
29
33
  def test_cell_type_is_formula
30
34
  formula = true
31
35
  cell = base.new(value, formula, [], nil, nil, nil)
@@ -1,6 +1,4 @@
1
- require 'roo/excelx/cell/base'
2
- require 'roo/excelx/cell/boolean'
3
- require 'roo/link'
1
+ require 'test_helper'
4
2
 
5
3
  class TestRooExcelxCellNumber < Minitest::Test
6
4
  def boolean
@@ -1,9 +1,4 @@
1
- require 'date'
2
- require 'roo/excelx/cell/base'
3
- require 'roo/excelx/cell/datetime'
4
- require 'roo/excelx/cell/date'
5
- require 'roo/link'
6
- require 'pry'
1
+ require 'test_helper'
7
2
 
8
3
  class TestRooExcelxCellDate < Minitest::Test
9
4
  def date_cell
@@ -1,16 +1,13 @@
1
- require 'date'
2
- require 'roo/excelx/cell/base'
3
- require 'roo/excelx/cell/datetime'
4
- require 'roo/link'
1
+ require 'test_helper'
5
2
 
6
3
  class TestRooExcelxCellDateTime < Minitest::Test
7
4
  def test_cell_value_is_datetime
8
- cell = datetime.new('30000.323212', nil, ['mm-dd-yy'], nil, nil, base_date, nil)
5
+ cell = datetime.new('30000.323212', nil, ['mm-dd-yy'], nil, nil, base_timestamp, nil)
9
6
  assert_kind_of ::DateTime, cell.value
10
7
  end
11
8
 
12
9
  def test_cell_type_is_datetime
13
- cell = datetime.new('30000.323212', nil, [], nil, nil, base_date, nil)
10
+ cell = datetime.new('30000.323212', nil, [], nil, nil, base_timestamp, nil)
14
11
  assert_equal :datetime, cell.type
15
12
  end
16
13
 
@@ -22,7 +19,7 @@ class TestRooExcelxCellDateTime < Minitest::Test
22
19
  ['mmm-yy', 'JAN-15'],
23
20
  ['m/d/yy h:mm', '1/25/15 8:15']
24
21
  ].each do |format, formatted_value|
25
- cell = datetime.new '42029.34375', nil, [format], nil, nil, base_date, nil
22
+ cell = datetime.new '42029.34375', nil, [format], nil, nil, base_timestamp, nil
26
23
  assert_equal formatted_value, cell.formatted_value
27
24
  end
28
25
  end
@@ -33,7 +30,7 @@ class TestRooExcelxCellDateTime < Minitest::Test
33
30
  ['h:mm:ss000 mm/yy', '8:15:00000 01/15'],
34
31
  ['mmm yyy', '2015-01-25 08:15:00']
35
32
  ].each do |format, formatted_value|
36
- cell = datetime.new '42029.34375', nil, [format], nil, nil, base_date, nil
33
+ cell = datetime.new '42029.34375', nil, [format], nil, nil, base_timestamp, nil
37
34
  assert_equal formatted_value, cell.formatted_value
38
35
  end
39
36
  end
@@ -42,7 +39,7 @@ class TestRooExcelxCellDateTime < Minitest::Test
42
39
  Roo::Excelx::Cell::DateTime
43
40
  end
44
41
 
45
- def base_date
46
- Date.new(1899, 12, 30)
42
+ def base_timestamp
43
+ DateTime.new(1899, 12, 30).to_time.to_i
47
44
  end
48
45
  end
@@ -1,8 +1,18 @@
1
- require 'roo/excelx/cell/base'
2
- require 'roo/excelx/cell/empty'
1
+ require 'test_helper'
3
2
 
4
3
  class TestRooExcelxCellEmpty < Minitest::Test
5
4
  def empty
6
5
  Roo::Excelx::Cell::Empty
7
6
  end
7
+
8
+ def test_empty?
9
+ cell = empty.new(nil)
10
+ assert_same true, cell.empty?
11
+ end
12
+
13
+ def test_nil_presence
14
+ cell = empty.new(nil)
15
+ assert_nil cell.presence
16
+ end
17
+
8
18
  end
@@ -1,6 +1,4 @@
1
- require 'roo/excelx/cell/base'
2
- require 'roo/excelx/cell/number'
3
- require 'roo/link'
1
+ require 'test_helper'
4
2
 
5
3
  class TestRooExcelxCellNumber < Minitest::Test
6
4
  def number
@@ -17,11 +15,31 @@ class TestRooExcelxCellNumber < Minitest::Test
17
15
  assert_kind_of(Integer, cell.value)
18
16
  end
19
17
 
18
+ def test_scientific_notation
19
+ cell = Roo::Excelx::Cell::Number.new '1.2E-3', nil, ['0'], nil, nil, nil
20
+ assert_kind_of(Float, cell.value)
21
+ end
22
+
23
+ def test_simple_scientific_notation
24
+ cell = Roo::Excelx::Cell::Number.new '1E-3', nil, ['0'], nil, nil, nil
25
+ assert_kind_of(Float, cell.value)
26
+ end
27
+
28
+ def test_very_simple_scientific_notation
29
+ cell = Roo::Excelx::Cell::Number.new '1e6', nil, ['0'], nil, nil, nil
30
+ assert_kind_of(Float, cell.value)
31
+ end
32
+
20
33
  def test_percent
21
34
  cell = Roo::Excelx::Cell::Number.new '42.1', nil, ['0.00%'], nil, nil, nil
22
35
  assert_kind_of(Float, cell.value)
23
36
  end
24
37
 
38
+ def test_rounded_percent_formatted_value
39
+ cell = Roo::Excelx::Cell::Number.new '0.569999999995', nil, ['0%'], nil, nil, nil
40
+ assert_equal('57%', cell.formatted_value)
41
+ end
42
+
25
43
  def test_formats_with_negative_numbers
26
44
  [
27
45
  ['#,##0 ;(#,##0)', '(1,042)'],
@@ -35,7 +53,7 @@ class TestRooExcelxCellNumber < Minitest::Test
35
53
  end
36
54
 
37
55
  def test_numbers_with_cell_errors
38
- %w(#N/A #REF! #NAME? #DIV/0! #NULL! #VALUE! #NUM!).each do |error|
56
+ Roo::Excelx::ERROR_VALUES.each do |error|
39
57
  cell = Roo::Excelx::Cell::Number.new error, nil, ['General'], nil, nil, nil
40
58
  assert_equal error, cell.value
41
59
  assert_equal error, cell.formatted_value
@@ -45,10 +63,15 @@ class TestRooExcelxCellNumber < Minitest::Test
45
63
  def test_formats
46
64
  [
47
65
  ['General', '1042'],
66
+ ['GENERAL', '1042'],
48
67
  ['0', '1042'],
68
+ ['000000', '001042'],
49
69
  ['0.00', '1042.00'],
70
+ ['0.0000', '1042.0000'],
71
+ ['0.000000000', '1042.000000000'],
50
72
  ['#,##0', '1,042'],
51
73
  ['#,##0.00', '1,042.00'],
74
+ ['#,##0.000', '1,042.000'],
52
75
  ['0%', '104200%'],
53
76
  ['0.00%', '104200.00%'],
54
77
  ['0.00E+00', '1.04E+03'],
@@ -57,6 +80,7 @@ class TestRooExcelxCellNumber < Minitest::Test
57
80
  ['#,##0.00;(#,##0.00)', '1,042.00'],
58
81
  ['#,##0.00;[Red](#,##0.00)', '1,042.00'],
59
82
  ['##0.0E+0', '1.0E+03'],
83
+ ["_-* #,##0.00\\ _€_-;\\-* #,##0.00\\ _€_-;_-* \"-\"??\\ _€_-;_-@_-", '1,042.00'],
60
84
  ['@', '1042']
61
85
  ].each do |style_format, result|
62
86
  cell = Roo::Excelx::Cell::Number.new '1042', nil, [style_format], nil, nil, nil
@@ -1,6 +1,4 @@
1
- require 'roo/excelx/cell/base'
2
- require 'roo/excelx/cell/string'
3
- require 'roo/link'
1
+ require 'test_helper'
4
2
 
5
3
  class TestRooExcelxCellString < Minitest::Test
6
4
  def string
@@ -27,4 +25,24 @@ class TestRooExcelxCellString < Minitest::Test
27
25
  cell = string.new '0', nil, nil, nil, nil
28
26
  assert_equal '0', cell.value
29
27
  end
28
+
29
+ def test_not_empty?
30
+ cell = string.new '1', nil, nil, nil, nil
31
+ assert_equal false, cell.empty?
32
+ end
33
+
34
+ def test_empty?
35
+ cell = string.new '', nil, nil, nil, nil
36
+ assert_equal true, cell.empty?
37
+ end
38
+
39
+ def test_presence
40
+ cell = string.new '1', nil, nil, nil, nil
41
+ assert_equal cell, cell.presence
42
+ end
43
+
44
+ def test_nil_presence
45
+ cell = string.new '', nil, nil, nil, nil
46
+ assert_nil cell.presence
47
+ end
30
48
  end
@@ -1,15 +1,12 @@
1
- require 'roo/excelx/cell/base'
2
- require 'roo/excelx/cell/datetime'
3
- require 'roo/excelx/cell/time'
4
- require 'roo/link'
1
+ require 'test_helper'
5
2
 
6
3
  class TestRooExcelxCellTime < Minitest::Test
7
- def time
4
+ def roo_time
8
5
  Roo::Excelx::Cell::Time
9
6
  end
10
7
 
11
- def base_date
12
- Date.new(1899, 12, 30)
8
+ def base_timestamp
9
+ DateTime.new(1899, 12, 30).to_time.to_i
13
10
  end
14
11
 
15
12
  def test_formatted_value
@@ -21,13 +18,13 @@ class TestRooExcelxCellTime < Minitest::Test
21
18
  ['[h]:mm:ss', '[1]:48:09'],
22
19
  ['mmss.0', '4809.0'] # Cell::Time always get rounded to the nearest second.
23
20
  ].each do |style_format, result|
24
- cell = time.new(value, nil, [:numeric_or_formula, style_format], 6, nil, base_date, nil)
21
+ cell = roo_time.new(value, nil, [:numeric_or_formula, style_format], 6, nil, base_timestamp, nil)
25
22
  assert_equal result, cell.formatted_value, "Style=#{style_format} is not properly formatted"
26
23
  end
27
24
  end
28
25
 
29
26
  def test_value
30
- cell = time.new('0.0751', nil, [:numeric_or_formula, 'h:mm'], 6, nil, base_date, nil)
31
- assert_kind_of Fixnum, cell.value
27
+ cell = roo_time.new('0.0751', nil, [:numeric_or_formula, 'h:mm'], 6, nil, base_timestamp, nil)
28
+ assert_kind_of Integer, cell.value
32
29
  end
33
30
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class TestRooExcelxCoordinate < Minitest::Test
6
+ def row
7
+ 10
8
+ end
9
+
10
+ def column
11
+ 20
12
+ end
13
+
14
+ def coordinate
15
+ Roo::Excelx::Coordinate.new(row, column)
16
+ end
17
+
18
+ def array
19
+ [row, column]
20
+ end
21
+
22
+ def test_row
23
+ assert_same row, coordinate.row
24
+ end
25
+
26
+ def test_column
27
+ assert_same column, coordinate.column
28
+ end
29
+
30
+ def test_frozen?
31
+ assert coordinate.frozen?
32
+ end
33
+
34
+ def test_equality
35
+ hash = {}
36
+ hash[coordinate] = true
37
+ assert hash.key?(coordinate)
38
+ assert hash.key?(array)
39
+ end
40
+
41
+ def test_expand
42
+ r, c = coordinate
43
+ assert_same row, r
44
+ assert_same column, c
45
+ end
46
+
47
+ def test_aref
48
+ assert_same row, coordinate[0]
49
+ assert_same column, coordinate[1]
50
+ end
51
+ end
@@ -0,0 +1,136 @@
1
+ require "test_helper"
2
+
3
+ class TestRooFormatterCSV < Minitest::Test
4
+ def test_date_time_to_csv
5
+ with_each_spreadsheet(name: "time-test") do |workbook|
6
+ Dir.mktmpdir do |tempdir|
7
+ csv_output = File.join(tempdir, "time_test.csv")
8
+ assert workbook.to_csv(csv_output)
9
+ assert File.exist?(csv_output)
10
+ assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/time-test.csv #{csv_output}`
11
+ # --strip-trailing-cr is needed because the test-file use 0A and
12
+ # the test on an windows box generates 0D 0A as line endings
13
+ end
14
+ end
15
+ end
16
+
17
+ def test_boolean_to_csv
18
+ with_each_spreadsheet(name: "boolean") do |workbook|
19
+ Dir.mktmpdir do |tempdir|
20
+ csv_output = File.join(tempdir,"boolean.csv")
21
+ assert workbook.to_csv(csv_output)
22
+ assert File.exist?(csv_output)
23
+ assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/boolean.csv #{csv_output}`
24
+ # --strip-trailing-cr is needed because the test-file use 0A and
25
+ # the test on an windows box generates 0D 0A as line endings
26
+ end
27
+ end
28
+ end
29
+
30
+ def test_link_to_csv
31
+ with_each_spreadsheet(name: "link", format: :excelx) do |workbook|
32
+ Dir.mktmpdir do |tempdir|
33
+ csv_output = File.join(tempdir, "link.csv")
34
+ assert workbook.to_csv(csv_output)
35
+ assert File.exist?(csv_output)
36
+ assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/link.csv #{csv_output}`
37
+ # --strip-trailing-cr is needed because the test-file use 0A and
38
+ # the test on an windows box generates 0D 0A as line endings
39
+ end
40
+ end
41
+ end
42
+
43
+ # "/tmp/xxxx" darf man unter Windows nicht verwenden, weil das nicht erkannt
44
+ # wird.
45
+ # Besser: Methode um temporaeres Dir. portabel zu bestimmen
46
+ def test_huge_document_to_csv
47
+ skip_long_test
48
+
49
+ original_csv_path = File.join(TESTDIR, "Bibelbund.csv")
50
+ with_each_spreadsheet(name: "Bibelbund", format: [:openoffice, :excelx]) do |workbook|
51
+ Dir.mktmpdir do |tempdir|
52
+ new_csv_path = File.join(tempdir, "Bibelbund.csv")
53
+ assert_equal "Tagebuch des Sekret\303\244rs. Letzte Tagung 15./16.11.75 Schweiz", workbook.cell(45, "A")
54
+ assert_equal "Tagebuch des Sekret\303\244rs. Nachrichten aus Chile", workbook.cell(46, "A")
55
+ assert_equal "Tagebuch aus Chile Juli 1977", workbook.cell(55, "A")
56
+ assert workbook.to_csv(new_csv_path)
57
+ assert File.exist?(new_csv_path)
58
+ assert FileUtils.identical?(original_csv_path, new_csv_path), "error in class #{workbook.class}"
59
+ end
60
+ end
61
+ end
62
+
63
+ def test_bug_empty_sheet
64
+ with_each_spreadsheet(name: "formula", format: [:openoffice, :excelx]) do |workbook|
65
+ workbook.default_sheet = "Sheet3" # is an empty sheet
66
+ Dir.mktmpdir do |tempdir|
67
+ workbook.to_csv(File.join(tempdir, "emptysheet.csv"))
68
+ assert_equal "", `cat #{File.join(tempdir, "emptysheet.csv")}`
69
+ end
70
+ end
71
+ end
72
+
73
+ def test_bug_quotes_excelx
74
+ skip_long_test
75
+ # TODO: run this test with a much smaller document
76
+ with_each_spreadsheet(name: "Bibelbund", format: [:openoffice, :excelx]) do |workbook|
77
+ workbook.default_sheet = workbook.sheets.first
78
+ assert_equal(
79
+ 'Einflüsse der neuen Theologie in "de gereformeerde Kerken van Nederland"',
80
+ workbook.cell("A", 76)
81
+ )
82
+ workbook.to_csv("csv#{$$}")
83
+ assert_equal(
84
+ 'Einflüsse der neuen Theologie in "de gereformeerde Kerken van Nederland"',
85
+ workbook.cell("A", 78)
86
+ )
87
+ File.delete_if_exist("csv#{$$}")
88
+ end
89
+ end
90
+
91
+ def test_bug_datetime_to_csv
92
+ with_each_spreadsheet(name: "datetime") do |workbook|
93
+ Dir.mktmpdir do |tempdir|
94
+ datetime_csv_file = File.join(tempdir, "datetime.csv")
95
+
96
+ assert workbook.to_csv(datetime_csv_file)
97
+ assert File.exist?(datetime_csv_file)
98
+ assert_equal "", file_diff("#{TESTDIR}/so_datetime.csv", datetime_csv_file)
99
+ end
100
+ end
101
+ end
102
+
103
+ def test_bug_datetime_offset_change
104
+ # DO NOT REMOVE Asia/Calcutta
105
+ [nil, "US/Eastern", "US/Pacific", "Asia/Calcutta"].each do |zone|
106
+ with_timezone(zone) do
107
+ with_each_spreadsheet(name: "datetime_timezone_ist_offset_change", format: %i[excelx openoffice libreoffice]) do |workbook|
108
+ Dir.mktmpdir do |tempdir|
109
+ datetime_csv_file = File.join(tempdir, "datetime_timezone_ist_offset_change.csv")
110
+
111
+ assert workbook.to_csv(datetime_csv_file)
112
+ assert File.exist?(datetime_csv_file)
113
+ assert_equal "", file_diff("#{TESTDIR}/so_datetime_timezone_ist_offset_change.csv", datetime_csv_file)
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ def test_true_class
121
+ assert_equal "true", cell_to_csv(1, 1)
122
+ end
123
+
124
+ def test_false_class
125
+ assert_equal "false", cell_to_csv(2, 1)
126
+ end
127
+
128
+ def test_date_class
129
+ assert_equal "2017-01-01", cell_to_csv(3, 1)
130
+ end
131
+
132
+ def cell_to_csv(row, col)
133
+ filename = File.join(TESTDIR, "formula_cell_types.xlsx")
134
+ Roo::Spreadsheet.open(filename).send("cell_to_csv", row, col, "Sheet1")
135
+ end
136
+ end