osheet 0.1.0 → 0.2.0

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 (71) hide show
  1. data/.bundle/config +2 -0
  2. data/.gitignore +6 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +33 -0
  5. data/README.rdoc +103 -61
  6. data/Rakefile +5 -56
  7. data/examples/basic.rb +73 -0
  8. data/examples/formats.rb +366 -0
  9. data/examples/trivial.rb +21 -0
  10. data/lib/osheet/associations.rb +62 -0
  11. data/lib/osheet/cell.rb +44 -10
  12. data/lib/osheet/column.rb +34 -7
  13. data/lib/osheet/format/accounting.rb +21 -0
  14. data/lib/osheet/format/currency.rb +23 -0
  15. data/lib/osheet/format/custom.rb +13 -0
  16. data/lib/osheet/format/datetime.rb +13 -0
  17. data/lib/osheet/format/fraction.rb +33 -0
  18. data/lib/osheet/format/general.rb +9 -0
  19. data/lib/osheet/format/number.rb +13 -0
  20. data/lib/osheet/format/numeric.rb +113 -0
  21. data/lib/osheet/format/percentage.rb +25 -0
  22. data/lib/osheet/format/scientific.rb +25 -0
  23. data/lib/osheet/format/special.rb +28 -0
  24. data/lib/osheet/format/text.rb +11 -0
  25. data/lib/osheet/format.rb +30 -0
  26. data/lib/osheet/row.rb +32 -7
  27. data/lib/osheet/style.rb +65 -0
  28. data/lib/osheet/style_set.rb +39 -0
  29. data/lib/osheet/styled_element.rb +18 -0
  30. data/lib/osheet/template.rb +32 -0
  31. data/lib/osheet/template_set.rb +57 -0
  32. data/lib/osheet/version.rb +1 -11
  33. data/lib/osheet/workbook.rb +32 -16
  34. data/lib/osheet/workbook_element.rb +21 -0
  35. data/lib/osheet/worksheet.rb +18 -20
  36. data/lib/osheet/worksheet_element.rb +15 -0
  37. data/lib/osheet/xmlss_writer/base.rb +42 -0
  38. data/lib/osheet/xmlss_writer/elements.rb +68 -0
  39. data/lib/osheet/xmlss_writer/styles.rb +176 -0
  40. data/lib/osheet/xmlss_writer.rb +1 -0
  41. data/lib/osheet.rb +7 -27
  42. data/osheet.gemspec +26 -0
  43. data/test/cell_test.rb +83 -0
  44. data/test/column_test.rb +81 -0
  45. data/test/env.rb +9 -0
  46. data/test/format/accounting_test.rb +158 -0
  47. data/test/format/currency_test.rb +158 -0
  48. data/test/format/custom_test.rb +22 -0
  49. data/test/format/datetime_test.rb +22 -0
  50. data/test/format/fraction_test.rb +84 -0
  51. data/test/format/general_test.rb +21 -0
  52. data/test/format/number_test.rb +93 -0
  53. data/test/format/percentage_test.rb +116 -0
  54. data/test/format/scientific_test.rb +116 -0
  55. data/test/format/special_test.rb +51 -0
  56. data/test/format/text_test.rb +18 -0
  57. data/test/format_test.rb +35 -0
  58. data/test/helper.rb +101 -0
  59. data/test/osheet_test.rb +14 -0
  60. data/test/row_test.rb +78 -0
  61. data/test/style_set_test.rb +50 -0
  62. data/test/style_test.rb +92 -0
  63. data/test/template_set_test.rb +76 -0
  64. data/test/template_test.rb +63 -0
  65. data/test/workbook_test.rb +142 -0
  66. data/test/worksheet_test.rb +77 -0
  67. data/test/xmlss_writer/base_test.rb +92 -0
  68. data/test/xmlss_writer/elements_test.rb +168 -0
  69. data/test/xmlss_writer/styles_test.rb +253 -0
  70. metadata +141 -30
  71. data/lib/osheet/base.rb +0 -95
@@ -0,0 +1,42 @@
1
+ require 'fileutils'
2
+ module Osheet::XmlssWriter; end
3
+ require 'xmlss'
4
+ require 'osheet/xmlss_writer/elements'
5
+ require 'osheet/xmlss_writer/styles'
6
+
7
+ module Osheet::XmlssWriter
8
+ class Base
9
+ include Elements
10
+ include Styles
11
+
12
+ attr_reader :workbook, :styles
13
+
14
+ def initialize(opts={})
15
+ @styles = []
16
+ @ostyles = ::Osheet::StyleSet.new
17
+ self.workbook = opts[:workbook] if opts.has_key?(:workbook)
18
+ end
19
+
20
+ def workbook=(oworkbook)
21
+ unless oworkbook.kind_of?(::Osheet::Workbook)
22
+ raise ArgumentError, "'#{oworkbook.inspect}' is not an Osheet::Workbook"
23
+ end
24
+ @ostyles = oworkbook.styles
25
+ @workbook = ::Xmlss::Workbook.new({
26
+ :worksheets => worksheets(oworkbook.worksheets)
27
+ })
28
+ end
29
+
30
+ def to_data
31
+ @workbook.styles = @styles
32
+ @workbook.to_xml
33
+ end
34
+
35
+ def to_file(path)
36
+ FileUtils.mkdir_p(File.dirname(path))
37
+ File.open(path, 'w') {|f| f.write self.to_data}
38
+ File.exists?(path) ? path : false
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,68 @@
1
+ module Osheet::XmlssWriter::Elements
2
+
3
+ protected
4
+
5
+ def worksheets(oworksheets)
6
+ oworksheets.collect do |oworksheet|
7
+ worksheet(oworksheet)
8
+ end
9
+ end
10
+ def worksheet(oworksheet)
11
+ ::Xmlss::Worksheet.new(oworksheet.attributes[:name], {
12
+ :table => table(oworksheet)
13
+ })
14
+ end
15
+ def table(oworksheet)
16
+ ::Xmlss::Table.new({
17
+ :columns => columns(oworksheet.columns),
18
+ :rows => rows(oworksheet.rows)
19
+ })
20
+ end
21
+
22
+ def columns(ocolumns)
23
+ ocolumns.collect do |ocolumn|
24
+ column(ocolumn)
25
+ end
26
+ end
27
+ def column(ocolumn)
28
+ ::Xmlss::Column.new({
29
+ :style_id => style_id(ocolumn.attributes[:style_class]),
30
+ :width => ocolumn.attributes[:width],
31
+ :auto_fit_width => ocolumn.attributes[:autofit],
32
+ :hidden => ocolumn.attributes[:hidden]
33
+ })
34
+ end
35
+
36
+ def rows(orows)
37
+ orows.collect{|orow| row(orow)}
38
+ end
39
+ def row(orow)
40
+ ::Xmlss::Row.new({
41
+ :style_id => style_id(orow.attributes[:style_class]),
42
+ :height => orow.attributes[:height],
43
+ :auto_fit_height => orow.attributes[:autofit],
44
+ :hidden => orow.attributes[:hidden],
45
+ :cells => cells(orow.cells)
46
+ })
47
+ end
48
+
49
+ def cells(ocells)
50
+ ocells.collect{|ocell| cell(ocell)}
51
+ end
52
+ def cell(ocell)
53
+ ::Xmlss::Cell.new({
54
+ :style_id => style_id(ocell.attributes[:style_class], ocell.attributes[:format]),
55
+ :href => ocell.attributes[:href],
56
+ :merge_across => cell_merge(ocell.attributes[:colspan]),
57
+ :merge_down => cell_merge(ocell.attributes[:rowspan]),
58
+ :data => data(ocell.attributes[:data])
59
+ })
60
+ end
61
+ def cell_merge(span)
62
+ span.kind_of?(::Fixnum) && span > 1 ? span-1 : 0
63
+ end
64
+ def data(ocell_data)
65
+ ::Xmlss::Data.new(ocell_data)
66
+ end
67
+
68
+ end
@@ -0,0 +1,176 @@
1
+ require 'osheet/format'
2
+ module Osheet::XmlssWriter::Styles
3
+
4
+ protected
5
+
6
+ def style_id(style_class, oformat=nil)
7
+ oformat ||= Osheet::Format.new(:general)
8
+ (xmlss_style = style(style_class, oformat)).nil? ? '' : xmlss_style.id
9
+ end
10
+
11
+ def style(style_class, oformat=nil)
12
+ oformat ||= Osheet::Format.new(:general)
13
+ key = style_key(style_class, oformat.key)
14
+ xmlss_style = @styles.find{|style| style.id == key}
15
+ if !key.empty? && xmlss_style.nil?
16
+ settings = style_settings(key)
17
+ @styles << (xmlss_style = ::Xmlss::Style::Base.new(key) {
18
+ if settings.has_key?(:align) && !settings[:align].empty?
19
+ alignment(settings[:align])
20
+ end
21
+ if settings.has_key?(:font) && !settings[:font].empty?
22
+ font(settings[:font])
23
+ end
24
+ if settings.has_key?(:bg) && !settings[:bg].empty?
25
+ interior(settings[:bg])
26
+ end
27
+ ::Osheet::Style::BORDERS.each do |bp|
28
+ if settings.has_key?(bp) && !settings[bp].empty?
29
+ border(settings[bp])
30
+ end
31
+ end
32
+ if oformat
33
+ number_format(:format => oformat.style)
34
+ end
35
+ })
36
+ end
37
+ xmlss_style
38
+ end
39
+
40
+ def style_key(style_class, format_key)
41
+ (style_class || '').strip.split(/\s+/).collect do |c|
42
+ ".#{c}"
43
+ end.join('') + (format_key.nil? || format_key.empty? ? '' : "..#{format_key}")
44
+ end
45
+
46
+ def style_settings(key)
47
+ @ostyles.for(key).inject({}) do |style_settings, ostyle|
48
+ merged_settings(style_settings, ostyle_settings(ostyle))
49
+ end
50
+ end
51
+
52
+ def merged_settings(current, add)
53
+ # concat values for keys in both sets
54
+ current.keys.each do |k|
55
+ current[k].merge!(add.delete(k))
56
+ end
57
+ # merge keys for anything not in the current
58
+ current.merge(add)
59
+ end
60
+
61
+ def ostyle_settings(ostyle)
62
+ ostyle_settings = {}
63
+ ostyle.attributes.each do |k,v|
64
+ unless v.empty?
65
+ ostyle_settings[k] = send("#{k}_settings", v)
66
+ end
67
+ end
68
+ ostyle_settings
69
+ end
70
+
71
+ def align_settings(align_cmds)
72
+ align_cmds.inject({}) do |align_settings, align_cmd|
73
+ if (setting = case align_cmd
74
+ when :left, :center, :right
75
+ [:horizontal, align_cmd]
76
+ when :top, :bottom
77
+ [:vertical, align_cmd]
78
+ when :middle
79
+ [:vertical, :center]
80
+ when :wrap
81
+ [:wrap_text, true]
82
+ when ::Fixnum
83
+ [:rotate, align_cmd]
84
+ end
85
+ )
86
+ align_settings[setting.first] = setting.last
87
+ end
88
+ align_settings
89
+ end
90
+ end
91
+
92
+ def font_settings(font_cmds)
93
+ font_cmds.inject({}) do |font_settings, font_cmd|
94
+ if (setting = case font_cmd
95
+ when :underline
96
+ [:underline, :single]
97
+ when :double_underline
98
+ [:underline, :double]
99
+ when :subscript, :superscript
100
+ [:alignment, font_cmd]
101
+ when :bold, :italic
102
+ [font_cmd, true]
103
+ when :strikethrough
104
+ [:strike_through, true]
105
+ when ::Fixnum
106
+ [:size, font_cmd]
107
+ when ::String
108
+ if font_cmd =~ /^#/
109
+ [:color, font_cmd]
110
+ end
111
+ end
112
+ )
113
+ font_settings[setting.first] = setting.last
114
+ end
115
+ font_settings
116
+ end
117
+ end
118
+
119
+ def bg_settings(bg_cmds)
120
+ bg_cmds.inject({}) do |bg_settings, bg_cmd|
121
+ if (settings = case bg_cmd
122
+ when ::String
123
+ if bg_cmd =~ /^#/
124
+ [[:color, bg_cmd]]
125
+ end
126
+ when ::Symbol
127
+ if ::Xmlss::Style::Interior.pattern_set.include?(bg_cmd)
128
+ [[:pattern, bg_cmd]]
129
+ end
130
+ when ::Hash
131
+ bg_cmd.inject([]) do |set, kv|
132
+ if ::Xmlss::Style::Interior.pattern_set.include?(kv.first) && kv.last =~ /^#/
133
+ set << [:pattern, kv.first]
134
+ set << [:pattern_color, kv.last]
135
+ end
136
+ set
137
+ end
138
+ end
139
+ )
140
+ settings.each do |setting|
141
+ bg_settings[setting.first] = setting.last
142
+ end
143
+ end
144
+ bg_settings
145
+ end
146
+ end
147
+
148
+ def border_settings(border_cmds)
149
+ border_cmds.inject({}) do |border_settings, border_cmd|
150
+ if (setting = case border_cmd
151
+ when ::String
152
+ if border_cmd =~ /^#/
153
+ [:color, border_cmd]
154
+ end
155
+ when ::Symbol
156
+ if ::Xmlss::Style::Border.position_set.include?(border_cmd)
157
+ [:position, border_cmd]
158
+ elsif ::Xmlss::Style::Border.weight_set.include?(border_cmd)
159
+ [:weight, border_cmd]
160
+ elsif ::Xmlss::Style::Border.line_style_set.include?(border_cmd)
161
+ [:line_style, border_cmd]
162
+ end
163
+ end
164
+ )
165
+ border_settings[setting.first] = setting.last
166
+ end
167
+ border_settings
168
+ end
169
+ end
170
+ ::Osheet::Style::BORDER_POSITIONS.each do |p|
171
+ define_method("border_#{p}_settings") do |cmds|
172
+ border_settings(cmds+[p])
173
+ end
174
+ end
175
+
176
+ end
@@ -0,0 +1 @@
1
+ require 'osheet/xmlss_writer/base'
data/lib/osheet.rb CHANGED
@@ -1,32 +1,12 @@
1
- require 'osheet/base'
2
- require 'osheet/workbook'
3
- require 'osheet/worksheet'
4
-
5
1
  module Osheet
6
2
  SPREADSHEET_TYPE = "Excel"
7
3
  MIME_TYPE = "application/vnd.ms-excel"
8
- =begin
9
- @@config = Config.new
10
-
11
- class << self
12
-
13
- # Configuration accessors for Rack::Less
14
- # (see config.rb for details)
15
- def configure
16
- yield @@config if block_given?
17
- end
18
- def config
19
- @@config
20
- end
21
- def config=(value)
22
- @@config = value
23
- end
24
-
25
- # Combinations config convenience method
26
- def combinations(key=nil)
27
- @@config.combinations(key)
28
- end
29
4
 
30
- end
31
- =end
32
5
  end
6
+
7
+ require 'osheet/associations'
8
+ require 'osheet/workbook_element'
9
+ require 'osheet/worksheet_element'
10
+ require 'osheet/styled_element'
11
+
12
+ require 'osheet/workbook'
data/osheet.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "osheet/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "osheet"
7
+ s.version = Osheet::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Kelly Redding"]
10
+ s.email = ["kelly@kelredd.com"]
11
+ s.homepage = "http://github.com/kelredd/osheet"
12
+ s.summary = %q{A DSL for generating spreadsheets that doesn't totally suck - pronounced 'Oh sheeeeeet!'}
13
+ s.description = %q{A DSL for specifying and generating rich spreasheetML. Specify your spreadsheet using the richness of Ruby and easily produce the corresponding spreadsheetML to render in MS Excel.}
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_development_dependency("bundler", ["~> 1.0"])
21
+ s.add_development_dependency("test-belt", ["= 0.2.1"]) # locked to a specific version for test stability
22
+
23
+ s.add_dependency("enumeration", ["~>1.1.0"])
24
+ s.add_dependency("xmlss", "~>0.0.2")
25
+
26
+ end
data/test/cell_test.rb ADDED
@@ -0,0 +1,83 @@
1
+ require "test/helper"
2
+ require 'osheet/cell'
3
+
4
+ module Osheet
5
+ class CellTest < Test::Unit::TestCase
6
+
7
+ context "Osheet::Cell" do
8
+ subject { Cell.new }
9
+
10
+ should_be_a_styled_element(Cell)
11
+ should_be_a_worksheet_element(Cell)
12
+ should_be_a_workbook_element(Cell)
13
+
14
+ should_have_instance_methods :data, :format, :colspan, :rowspan, :href
15
+
16
+ should "set it's defaults" do
17
+ assert_equal nil, subject.send(:instance_variable_get, "@data")
18
+ assert_kind_of Format::General, subject.send(:instance_variable_get, "@format")
19
+ assert_equal 1, subject.send(:instance_variable_get, "@colspan")
20
+ assert_equal 1, subject.send(:instance_variable_get, "@rowspan")
21
+ assert_equal nil, subject.send(:instance_variable_get, "@href")
22
+ end
23
+
24
+ context "that has attributes" do
25
+ subject do
26
+ Cell.new do
27
+ style_class 'more poo'
28
+ data "Poo"
29
+ format :number
30
+ colspan 4
31
+ rowspan 2
32
+ href "http://www.google.com"
33
+ end
34
+ end
35
+
36
+ should "should set them correctly" do
37
+ assert_equal "Poo", subject.send(:instance_variable_get, "@data")
38
+ assert_kind_of Format::Number, subject.send(:instance_variable_get, "@format")
39
+ assert_equal 4, subject.send(:instance_variable_get, "@colspan")
40
+ assert_equal 2, subject.send(:instance_variable_get, "@rowspan")
41
+ assert_equal "http://www.google.com", subject.send(:instance_variable_get, "@href")
42
+ end
43
+
44
+ should "know it's attribute(s)" do
45
+ [:style_class, :data, :format, :rowspan, :colspan, :href].each do |a|
46
+ assert subject.attributes.has_key?(a)
47
+ end
48
+ assert_equal "more poo", subject.attributes[:style_class]
49
+ assert_equal "Poo", subject.attributes[:data]
50
+ assert_kind_of Format::Number, subject.attributes[:format]
51
+ assert_equal 4, subject.attributes[:colspan]
52
+ assert_equal 2, subject.attributes[:rowspan]
53
+ assert_equal "http://www.google.com", subject.attributes[:href]
54
+ end
55
+ end
56
+
57
+ should "type cast data strings/symbols" do
58
+ ['a string', :symbol].each do |thing|
59
+ cell = Cell.new{data thing}
60
+ assert_kind_of ::String, cell.send(:instance_variable_get, "@data")
61
+ end
62
+ end
63
+ should "type cast data dates" do
64
+ cell = Cell.new{data Date.today}
65
+ assert_kind_of ::Date, cell.send(:instance_variable_get, "@data")
66
+ end
67
+ should "type cast data numerics" do
68
+ [1, 1.0].each do |thing|
69
+ cell = Cell.new{data thing}
70
+ assert_kind_of ::Numeric, cell.send(:instance_variable_get, "@data")
71
+ end
72
+ end
73
+ should "type cast all other data to string" do
74
+ [Osheet, [:a, 'Aye'], {:a => 'Aye'}].each do |thing|
75
+ cell = Cell.new{data thing}
76
+ assert_kind_of ::String, cell.send(:instance_variable_get, "@data")
77
+ end
78
+ end
79
+
80
+ end
81
+
82
+ end
83
+ end
@@ -0,0 +1,81 @@
1
+ require "test/helper"
2
+ require "osheet/column"
3
+
4
+ module Osheet
5
+ class ColumnTest < Test::Unit::TestCase
6
+
7
+ context "Osheet::Column" do
8
+ subject { Column.new }
9
+
10
+ should_be_a_styled_element(Column)
11
+ should_be_a_worksheet_element(Column)
12
+ should_be_a_workbook_element(Column)
13
+
14
+ should_have_instance_method :width
15
+ should_have_instance_methods :autofit, :autofit?
16
+ should_have_instance_methods :hidden, :hidden?
17
+ should_have_instance_method :meta
18
+
19
+ should "set it's defaults" do
20
+ assert_equal nil, subject.send(:instance_variable_get, "@width")
21
+ assert_equal false, subject.send(:instance_variable_get, "@autofit")
22
+ assert !subject.autofit?
23
+ assert_equal false, subject.send(:instance_variable_get, "@hidden")
24
+ assert !subject.hidden?
25
+
26
+ assert_equal nil, subject.meta
27
+ end
28
+
29
+ context "that has attributes" do
30
+ subject do
31
+ Column.new do
32
+ style_class "more poo"
33
+ width 100
34
+ autofit true
35
+ hidden true
36
+ meta(
37
+ {}
38
+ )
39
+ end
40
+ end
41
+
42
+ should "should set them correctly" do
43
+ assert_equal 100, subject.send(:instance_variable_get, "@width")
44
+ assert_equal true, subject.send(:instance_variable_get, "@autofit")
45
+ assert subject.autofit?
46
+ assert_equal true, subject.send(:instance_variable_get, "@hidden")
47
+ assert subject.hidden?
48
+ assert_equal({}, subject.meta)
49
+ end
50
+
51
+ should "know it's width" do
52
+ subject.width(false)
53
+ assert_equal false, subject.width
54
+ subject.width(180)
55
+ assert_equal 180, subject.width
56
+ subject.width(nil)
57
+ assert_equal 180, subject.width
58
+ end
59
+
60
+ should "know it's attribute(s)" do
61
+ [:style_class, :width, :autofit, :hidden].each do |a|
62
+ assert subject.attributes.has_key?(a)
63
+ end
64
+ assert_equal 'more poo', subject.attributes[:style_class]
65
+ assert_equal 100, subject.attributes[:width]
66
+ assert_equal true, subject.attributes[:autofit]
67
+ assert_equal true, subject.attributes[:hidden]
68
+ end
69
+
70
+ end
71
+
72
+ should "cast autofit and hidden to bool" do
73
+ col = Column.new { autofit :true; hidden 'false'}
74
+ assert_kind_of ::TrueClass, col.send(:instance_variable_get, "@autofit")
75
+ assert_kind_of ::TrueClass, col.send(:instance_variable_get, "@hidden")
76
+ end
77
+
78
+ end
79
+
80
+ end
81
+ end
data/test/env.rb ADDED
@@ -0,0 +1,9 @@
1
+ # Add test and lib paths to the $LOAD_PATH
2
+ [ File.dirname(__FILE__),
3
+ File.join(File.dirname(__FILE__), '..', 'lib')
4
+ ].each do |path|
5
+ full_path = File.expand_path(path)
6
+ $LOAD_PATH.unshift(full_path) unless $LOAD_PATH.include?(full_path)
7
+ end
8
+
9
+ require 'osheet'
@@ -0,0 +1,158 @@
1
+ require "test/helper"
2
+ require 'osheet/format/accounting'
3
+
4
+ module Osheet::Format
5
+
6
+ class AccountingTest < Test::Unit::TestCase
7
+ context "Accounting format" do
8
+ subject { Accounting.new }
9
+
10
+ should_have_accessors :decimal_places, :symbol, :comma_separator, :negative_numbers
11
+
12
+ should "provide symbol options" do
13
+ assert_equal 3, Accounting.symbol_set.size
14
+ [:none, :dollar, :euro].each do |a|
15
+ assert Accounting.symbol_set.include?(a)
16
+ end
17
+ end
18
+
19
+ should "provide negative numbers options" do
20
+ assert_equal 4, Accounting.negative_numbers_set.size
21
+ [:black, :black_parenth, :red, :red_parenth].each do |a|
22
+ assert Accounting.negative_numbers_set.include?(a)
23
+ end
24
+ end
25
+
26
+ should "set default values" do
27
+ assert_equal 2, subject.decimal_places
28
+ assert_equal :dollar, subject.symbol
29
+ assert_equal true, subject.comma_separator
30
+ assert_equal :black, subject.negative_numbers
31
+ end
32
+
33
+ should "only allow Fixnum decimal places between 0 and 30" do
34
+ assert_raises ArgumentError do
35
+ Accounting.new({:decimal_places => -1})
36
+ end
37
+ assert_raises ArgumentError do
38
+ Accounting.new({:decimal_places => 31})
39
+ end
40
+ assert_raises ArgumentError do
41
+ Accounting.new({:decimal_places => 'poo'})
42
+ end
43
+ assert_nothing_raised do
44
+ Accounting.new({:decimal_places => 1})
45
+ end
46
+ end
47
+
48
+ should "generate decimal place style strings" do
49
+ assert_equal "0", Accounting.new({
50
+ :decimal_places => 0,
51
+ :comma_separator => false,
52
+ :symbol => :none
53
+ }).style
54
+ (1..5).each do |n|
55
+ assert_equal "0.#{'0'*n}", Accounting.new({
56
+ :decimal_places => n,
57
+ :comma_separator => false,
58
+ :symbol => :none
59
+ }).style
60
+ end
61
+ end
62
+
63
+ should "generate comma separator style strings" do
64
+ assert_equal "0", Accounting.new({
65
+ :comma_separator => false,
66
+ :decimal_places => 0,
67
+ :symbol => :none
68
+ }).style
69
+ assert_equal "#,##0", Accounting.new({
70
+ :comma_separator => true,
71
+ :decimal_places => 0,
72
+ :symbol => :none
73
+ }).style
74
+ end
75
+
76
+ should "generate parenth negative numbers style strings" do
77
+ assert_equal "0", Accounting.new({
78
+ :negative_numbers => :black,
79
+ :decimal_places => 0,
80
+ :comma_separator => false,
81
+ :symbol => :none
82
+ }).style
83
+ assert_equal "0_);\(0\)", Accounting.new({
84
+ :negative_numbers => :black_parenth,
85
+ :decimal_places => 0,
86
+ :comma_separator => false,
87
+ :symbol => :none
88
+ }).style
89
+ end
90
+
91
+ should "generate red negative numbers style strings" do
92
+ assert_equal "0;[Red]0", Accounting.new({
93
+ :negative_numbers => :red,
94
+ :decimal_places => 0,
95
+ :comma_separator => false,
96
+ :symbol => :none
97
+ }).style
98
+ assert_equal "0_);[Red]\(0\)", Accounting.new({
99
+ :negative_numbers => :red_parenth,
100
+ :decimal_places => 0,
101
+ :comma_separator => false,
102
+ :symbol => :none
103
+ }).style
104
+ end
105
+
106
+ should "generate symbol style strings" do
107
+ assert_equal "0", Accounting.new({
108
+ :decimal_places => 0,
109
+ :comma_separator => false,
110
+ :symbol => :none
111
+ }).style
112
+ assert_equal "\"$\"* 0", Accounting.new({
113
+ :decimal_places => 0,
114
+ :comma_separator => false,
115
+ :symbol => :dollar
116
+ }).style
117
+ assert_equal "[$€-2]\ * 0", Accounting.new({
118
+ :decimal_places => 0,
119
+ :comma_separator => false,
120
+ :symbol => :euro
121
+ }).style
122
+ end
123
+
124
+ should "generate complex style string" do
125
+ assert_equal("\"$\"* 0.00_);\(\"$\"* 0.00\)", Accounting.new({
126
+ :symbol => :dollar,
127
+ :decimal_places => 2,
128
+ :negative_numbers => :black_parenth,
129
+ :comma_separator => false
130
+ }).style)
131
+ assert_equal("[$€-2]\ * #,##0.0000_);[Red]\([$€-2]\ * #,##0.0000\)", Accounting.new({
132
+ :symbol => :euro,
133
+ :decimal_places => 4,
134
+ :negative_numbers => :red_parenth,
135
+ :comma_separator => true
136
+ }).style)
137
+ end
138
+
139
+ should "provide unique format keys" do
140
+ assert_equal("accounting_dollar_2_nocomma_blackparenth", Accounting.new({
141
+ :decimal_places => 2,
142
+ :negative_numbers => :black_parenth,
143
+ :comma_separator => false
144
+ }).key)
145
+ assert_equal("accounting_none_4_comma_redparenth", Accounting.new({
146
+ :symbol => :none,
147
+ :decimal_places => 4,
148
+ :negative_numbers => :red_parenth,
149
+ :comma_separator => true
150
+ }).key)
151
+ end
152
+
153
+
154
+
155
+ end
156
+ end
157
+
158
+ end