osheet-xmlss 1.0.0.rc.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.
- data/.gitignore +20 -0
- data/Gemfile +9 -0
- data/LICENSE +22 -0
- data/README.md +131 -0
- data/Rakefile +49 -0
- data/bench/bench_runner.rb +91 -0
- data/bench/profiler.rb +6 -0
- data/bench/profiler_1000.xls +17015 -0
- data/bench/profiler_runner.rb +40 -0
- data/examples/basic.rb +77 -0
- data/examples/basic.xls +2 -0
- data/examples/basic_with_templates.rb +87 -0
- data/examples/basic_with_templates.xls +93 -0
- data/examples/formats.rb +370 -0
- data/examples/formats.xls +768 -0
- data/examples/formula.rb +42 -0
- data/examples/formula.xls +36 -0
- data/examples/styles.rb +255 -0
- data/examples/styles.xls +343 -0
- data/examples/trivial.rb +25 -0
- data/examples/trivial.xls +18 -0
- data/lib/osheet/xmlss/style_cache.rb +63 -0
- data/lib/osheet/xmlss/style_settings.rb +148 -0
- data/lib/osheet/xmlss/version.rb +4 -0
- data/lib/osheet/xmlss.rb +7 -0
- data/lib/osheet/xmlss_writer.rb +143 -0
- data/osheet-xmlss.gemspec +24 -0
- data/test/helper.rb +17 -0
- data/test/irb.rb +9 -0
- data/test/xmlss/api_test.rb +139 -0
- data/test/xmlss/style_cache_test.rb +65 -0
- data/test/xmlss/style_settings_test.rb +263 -0
- data/test/xmlss/styles_test.rb +340 -0
- data/test/xmlss_writer_test.rb +92 -0
- metadata +157 -0
@@ -0,0 +1,263 @@
|
|
1
|
+
require "assert"
|
2
|
+
|
3
|
+
require 'osheet/xmlss/style_settings'
|
4
|
+
|
5
|
+
module Osheet::Xmlss
|
6
|
+
|
7
|
+
class StyleSettingsTests < Assert::Context
|
8
|
+
desc "the style writer when building"
|
9
|
+
before do
|
10
|
+
@settings = StyleSettings.new([])
|
11
|
+
@workbook = Osheet::Workbook.new
|
12
|
+
@workbook.style('.align.center') { @workbook.align :center }
|
13
|
+
@workbook.style('.font.size') { @workbook.font 14 }
|
14
|
+
@workbook.style('.font.weight') { @workbook.font :bold }
|
15
|
+
@workbook.style('.font.style') { @workbook.font :italic }
|
16
|
+
@workbook.style('.bg.color') { @workbook.bg '#FF0000' }
|
17
|
+
@workbook.style('.border.color') { @workbook.border '#FF0000', :thin }
|
18
|
+
end
|
19
|
+
subject { @settings }
|
20
|
+
|
21
|
+
should have_reader :styles, :value
|
22
|
+
should have_instance_method :setting, :[]
|
23
|
+
|
24
|
+
should "be empty if no styles given" do
|
25
|
+
assert_equal({}, subject.value)
|
26
|
+
end
|
27
|
+
|
28
|
+
should "conditionally run a block if the setting exists and is not empty" do
|
29
|
+
settings = StyleSettings.new([@workbook.styles.first])
|
30
|
+
@something = ''
|
31
|
+
|
32
|
+
settings.setting(:font) { @something = 'i should be empty' }
|
33
|
+
assert_empty @something
|
34
|
+
|
35
|
+
settings.setting(:align) { @something = 'i should not be empty' }
|
36
|
+
assert_not_empty @something
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
class AlignmentSettingsTests < StyleSettingsTests
|
44
|
+
desc "align settings"
|
45
|
+
|
46
|
+
should "translate horizontal directives" do
|
47
|
+
assert_equal({:horizontal => :left}, subject.send(:align_settings, [:left]))
|
48
|
+
assert_equal({:horizontal => :center}, subject.send(:align_settings, [:center]))
|
49
|
+
assert_equal({:horizontal => :right}, subject.send(:align_settings, [:right]))
|
50
|
+
end
|
51
|
+
|
52
|
+
should "translate vertical directives" do
|
53
|
+
assert_equal({:vertical => :top}, subject.send(:align_settings, [:top]))
|
54
|
+
assert_equal({:vertical => :center}, subject.send(:align_settings, [:middle]))
|
55
|
+
assert_equal({:vertical => :bottom}, subject.send(:align_settings, [:bottom]))
|
56
|
+
end
|
57
|
+
|
58
|
+
should "translate wrap text and rotate directives" do
|
59
|
+
assert_equal({:wrap_text => true}, subject.send(:align_settings, [:wrap]))
|
60
|
+
assert_equal({:rotate => 90}, subject.send(:align_settings, [90]))
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
class FontSettingsTests < StyleSettingsTests
|
68
|
+
desc "font settings"
|
69
|
+
|
70
|
+
should "translate size, color and name directives" do
|
71
|
+
assert_equal({:size => 12}, subject.send(:font_settings, [12]))
|
72
|
+
assert_equal({:color => '#FFFFFF'}, subject.send(:font_settings, ['#FFFFFF']))
|
73
|
+
assert_equal({:name => 'Arial'}, subject.send(:font_settings, ['Arial']))
|
74
|
+
end
|
75
|
+
|
76
|
+
should "translate style directives" do
|
77
|
+
assert_equal({:bold => true}, subject.send(:font_settings, [:bold]))
|
78
|
+
assert_equal({:italic => true}, subject.send(:font_settings, [:italic]))
|
79
|
+
assert_equal({:shadow => true}, subject.send(:font_settings, [:shadow]))
|
80
|
+
assert_equal({:alignment => :subscript}, subject.send(:font_settings, [:subscript]))
|
81
|
+
assert_equal({:alignment => :superscript}, subject.send(:font_settings, [:superscript]))
|
82
|
+
assert_equal({:strike_through => true}, subject.send(:font_settings, [:strikethrough]))
|
83
|
+
end
|
84
|
+
|
85
|
+
should "translate underline directives" do
|
86
|
+
assert_equal({:underline => :single}, subject.send(:font_settings, [:underline]))
|
87
|
+
assert_equal({:underline => :double}, subject.send(:font_settings, [:double_underline]))
|
88
|
+
assert_equal({:underline => :single_accounting}, subject.send(:font_settings, [:accounting_underline]))
|
89
|
+
assert_equal({:underline => :double_accounting}, subject.send(:font_settings, [:double_accounting_underline]))
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
class BgSettingsTests < StyleSettingsTests
|
98
|
+
desc "bg settings"
|
99
|
+
|
100
|
+
should "translate color directives" do
|
101
|
+
assert_equal({:color => '#FFFFFF', :pattern => :solid}, subject.send(:bg_settings, ['#FFFFFF']))
|
102
|
+
end
|
103
|
+
|
104
|
+
should "translate pattern directives" do
|
105
|
+
assert_equal({:pattern => :solid}, subject.send(:bg_settings, [:solid]))
|
106
|
+
assert_equal({
|
107
|
+
:pattern => :horz_stripe,
|
108
|
+
:pattern_color => '#0000FF'
|
109
|
+
}, subject.send(:bg_settings, [{:horz_stripe => '#0000FF'}]))
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
class BorderSettingsTests < StyleSettingsTests
|
119
|
+
desc "border settings"
|
120
|
+
|
121
|
+
should "translate color directives" do
|
122
|
+
assert_equal({:color => '#FFFFFF'}, subject.send(:border_settings, ['#FFFFFF']))
|
123
|
+
end
|
124
|
+
|
125
|
+
should "translate position directives" do
|
126
|
+
assert_equal({:position => :top}, subject.send(:border_settings, [:top]))
|
127
|
+
end
|
128
|
+
|
129
|
+
should "translate weight directives" do
|
130
|
+
assert_equal({:weight => :thick}, subject.send(:border_settings, [:thick]))
|
131
|
+
end
|
132
|
+
|
133
|
+
should "translate line_style directives" do
|
134
|
+
assert_equal({:line_style => :dot}, subject.send(:border_settings, [:dot]))
|
135
|
+
end
|
136
|
+
|
137
|
+
should "translate position specific directives" do
|
138
|
+
assert_equal({
|
139
|
+
:position => :left,
|
140
|
+
:color => '#FFFFFF',
|
141
|
+
:weight => :thin
|
142
|
+
}, subject.send(:border_left_settings, ['#FFFFFF', :thin]))
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
class ParseSettingsTests < StyleSettingsTests
|
150
|
+
desc "settings"
|
151
|
+
|
152
|
+
should "parse Osheet style objs for their settings" do
|
153
|
+
assert_equal({
|
154
|
+
:align => {
|
155
|
+
:horizontal => :center
|
156
|
+
}
|
157
|
+
}, subject.send(:style_settings, @workbook.styles.first))
|
158
|
+
|
159
|
+
assert_equal({
|
160
|
+
:border_top => {
|
161
|
+
:position=>:top,
|
162
|
+
:color=>"#FF0000",
|
163
|
+
:weight=>:thin
|
164
|
+
},
|
165
|
+
:border_right => {
|
166
|
+
:position=>:right,
|
167
|
+
:color=>"#FF0000",
|
168
|
+
:weight=>:thin
|
169
|
+
},
|
170
|
+
:border_bottom => {
|
171
|
+
:position=>:bottom,
|
172
|
+
:color=>"#FF0000",
|
173
|
+
:weight=>:thin
|
174
|
+
},
|
175
|
+
:border_left => {
|
176
|
+
:position=>:left,
|
177
|
+
:color=>"#FF0000",
|
178
|
+
:weight=>:thin
|
179
|
+
}
|
180
|
+
}, subject.send(:style_settings, @workbook.styles.last))
|
181
|
+
end
|
182
|
+
|
183
|
+
should "merge style settings from multiple Osheet style objs" do
|
184
|
+
set1 = {
|
185
|
+
:font => {
|
186
|
+
:color => '#FF0000',
|
187
|
+
:name => "Arial"
|
188
|
+
}
|
189
|
+
}
|
190
|
+
set2 = {
|
191
|
+
:font => {
|
192
|
+
:color => '#0000FF',
|
193
|
+
:size => 12
|
194
|
+
}
|
195
|
+
}
|
196
|
+
set3 = {
|
197
|
+
:align => {
|
198
|
+
:horizontal => :center
|
199
|
+
}
|
200
|
+
}
|
201
|
+
|
202
|
+
# should concat keys in both sets
|
203
|
+
assert_equal({
|
204
|
+
:font => {
|
205
|
+
:color => '#0000FF',
|
206
|
+
:name => "Arial",
|
207
|
+
:size => 12
|
208
|
+
}
|
209
|
+
}, subject.send(:merged_settings, set1.dup, set2.dup))
|
210
|
+
|
211
|
+
# should add keys not in first set
|
212
|
+
assert_equal({
|
213
|
+
:font => {
|
214
|
+
:color => '#0000FF',
|
215
|
+
:size => 12
|
216
|
+
},
|
217
|
+
:align => {
|
218
|
+
:horizontal => :center
|
219
|
+
}
|
220
|
+
}, subject.send(:merged_settings, set2.dup, set3.dup))
|
221
|
+
|
222
|
+
end
|
223
|
+
|
224
|
+
should "set its value given its set of styles" do
|
225
|
+
assert_equal({
|
226
|
+
:align => {
|
227
|
+
:horizontal => :center
|
228
|
+
},
|
229
|
+
:font => {
|
230
|
+
:bold => true,
|
231
|
+
:italic => true,
|
232
|
+
:size => 14
|
233
|
+
},
|
234
|
+
:bg => {
|
235
|
+
:pattern => :solid,
|
236
|
+
:color => "#FF0000"
|
237
|
+
},
|
238
|
+
:border_top => {
|
239
|
+
:position => :top,
|
240
|
+
:color => "#FF0000",
|
241
|
+
:weight => :thin
|
242
|
+
},
|
243
|
+
:border_right => {
|
244
|
+
:position => :right,
|
245
|
+
:color => "#FF0000",
|
246
|
+
:weight => :thin
|
247
|
+
},
|
248
|
+
:border_bottom => {
|
249
|
+
:position => :bottom,
|
250
|
+
:color => "#FF0000",
|
251
|
+
:weight => :thin
|
252
|
+
},
|
253
|
+
:border_left => {
|
254
|
+
:position => :left,
|
255
|
+
:color => "#FF0000",
|
256
|
+
:weight => :thin
|
257
|
+
}
|
258
|
+
}, StyleSettings.new(@workbook.styles).value)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
end
|
263
|
+
|
@@ -0,0 +1,340 @@
|
|
1
|
+
require "assert"
|
2
|
+
|
3
|
+
require 'osheet/xmlss_writer'
|
4
|
+
|
5
|
+
module Osheet::Xmlss
|
6
|
+
|
7
|
+
class StylesTests < Assert::Context
|
8
|
+
before do
|
9
|
+
@writer = Osheet::XmlssWriter.new
|
10
|
+
@workbook = Osheet::Workbook.new(@writer)
|
11
|
+
end
|
12
|
+
subject { @writer }
|
13
|
+
|
14
|
+
should "not have a style cache until its bound to an osheet workbook" do
|
15
|
+
writer = Osheet::XmlssWriter.new
|
16
|
+
assert_nil writer.style_cache
|
17
|
+
writer.bind(@workbook)
|
18
|
+
assert_not_nil writer.style_cache
|
19
|
+
end
|
20
|
+
|
21
|
+
should "return no style if no class or format given" do
|
22
|
+
assert_nil subject.style(nil)
|
23
|
+
assert_nil subject.style('')
|
24
|
+
assert_not_nil subject.style('awesome')
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
class StyleMethTests < StylesTests
|
30
|
+
desc "Xmlss style writer"
|
31
|
+
before do
|
32
|
+
@workbook.style('.font.size') { @workbook.font 14 }
|
33
|
+
@workbook.style('.font.weight') { @workbook.font :bold }
|
34
|
+
@workbook.style('.font.style') { @workbook.font :italic }
|
35
|
+
@workbook.style('.align.center') { @workbook.align :center }
|
36
|
+
end
|
37
|
+
|
38
|
+
should "build a style obj and add it to the writers styles" do
|
39
|
+
xmlss_style = subject.style('awesome')
|
40
|
+
assert_kind_of ::Xmlss::Style::Base, xmlss_style
|
41
|
+
assert_equal '.awesome', xmlss_style.id
|
42
|
+
assert_equal 1, subject.style_cache.size
|
43
|
+
assert_equal xmlss_style, subject.style_cache[xmlss_style.id]
|
44
|
+
end
|
45
|
+
|
46
|
+
should "write style markup from many matching osheet styles" do
|
47
|
+
xmlss_style = subject.style('font size weight style align center')
|
48
|
+
assert_equal '.font.size.weight.style.align.center', xmlss_style.id
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
class AlignmentTests < StylesTests
|
54
|
+
desc "Alignment style writer"
|
55
|
+
before do
|
56
|
+
[ :left, :center, :right,
|
57
|
+
:top, :middle, :bottom,
|
58
|
+
:wrap
|
59
|
+
].each do |s|
|
60
|
+
@workbook.style(".align.#{s}") { @workbook.align s }
|
61
|
+
end
|
62
|
+
@workbook.style('.align.rotate') { @workbook.align 90 }
|
63
|
+
end
|
64
|
+
|
65
|
+
should "write style markup with no alignment settings if no alignment style match" do
|
66
|
+
subject.style('align')
|
67
|
+
assert_equal(
|
68
|
+
"<Style ss:ID=\".align\"><NumberFormat /></Style>",
|
69
|
+
xmlss_style_markup(subject)
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
should "write style markup for horizontal alignment settings" do
|
74
|
+
subject.style('align left')
|
75
|
+
subject.style('align center')
|
76
|
+
subject.style('align right')
|
77
|
+
assert_equal(
|
78
|
+
"<Style ss:ID=\".align.left\"><Alignment ss:Horizontal=\"Left\" /><NumberFormat /></Style><Style ss:ID=\".align.center\"><Alignment ss:Horizontal=\"Center\" /><NumberFormat /></Style><Style ss:ID=\".align.right\"><Alignment ss:Horizontal=\"Right\" /><NumberFormat /></Style>",
|
79
|
+
xmlss_style_markup(subject)
|
80
|
+
)
|
81
|
+
end
|
82
|
+
|
83
|
+
should "write style markup for vertical alignment settings" do
|
84
|
+
subject.style('align top')
|
85
|
+
subject.style('align middle')
|
86
|
+
subject.style('align bottom')
|
87
|
+
assert_equal(
|
88
|
+
"<Style ss:ID=\".align.top\"><Alignment ss:Vertical=\"Top\" /><NumberFormat /></Style><Style ss:ID=\".align.middle\"><Alignment ss:Vertical=\"Center\" /><NumberFormat /></Style><Style ss:ID=\".align.bottom\"><Alignment ss:Vertical=\"Bottom\" /><NumberFormat /></Style>",
|
89
|
+
xmlss_style_markup(subject)
|
90
|
+
)
|
91
|
+
end
|
92
|
+
|
93
|
+
should "write style markup for text wrap settings" do
|
94
|
+
subject.style('align wrap')
|
95
|
+
assert_equal(
|
96
|
+
"<Style ss:ID=\".align.wrap\"><Alignment ss:WrapText=\"1\" /><NumberFormat /></Style>",
|
97
|
+
xmlss_style_markup(subject)
|
98
|
+
)
|
99
|
+
end
|
100
|
+
|
101
|
+
should "write style markup for text rotation settings" do
|
102
|
+
subject.style('align rotate')
|
103
|
+
assert_equal(
|
104
|
+
"<Style ss:ID=\".align.rotate\"><Alignment ss:Rotate=\"90\" /><NumberFormat /></Style>",
|
105
|
+
xmlss_style_markup(subject)
|
106
|
+
)
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
class FontTests < StylesTests
|
112
|
+
desc "Font style writer"
|
113
|
+
before do
|
114
|
+
[ :underline, :double_underline, :accounting_underline, :double_accounting_underline,
|
115
|
+
:subscript, :superscript, :shadow, :strikethrough, :wrap,
|
116
|
+
:bold, :italic
|
117
|
+
].each do |s|
|
118
|
+
@workbook.style(".font.#{s}") { @workbook.font s }
|
119
|
+
end
|
120
|
+
@workbook.style('.font.size') { @workbook.font 14 }
|
121
|
+
@workbook.style('.font.color') { @workbook.font '#FF0000' }
|
122
|
+
@workbook.style('.font.name') { @workbook.font 'Verdana' }
|
123
|
+
end
|
124
|
+
|
125
|
+
should "write style markup with empty font settings if no match" do
|
126
|
+
subject.style('font')
|
127
|
+
assert_equal(
|
128
|
+
"<Style ss:ID=\".font\"><NumberFormat /></Style>",
|
129
|
+
xmlss_style_markup(subject)
|
130
|
+
)
|
131
|
+
end
|
132
|
+
|
133
|
+
should "write style markup for font underline settings" do
|
134
|
+
subject.style('font underline')
|
135
|
+
subject.style('font double_underline')
|
136
|
+
subject.style('font accounting_underline')
|
137
|
+
subject.style('font double_accounting_underline')
|
138
|
+
assert_equal(
|
139
|
+
"<Style ss:ID=\".font.underline\"><Font ss:Underline=\"Single\" /><NumberFormat /></Style><Style ss:ID=\".font.double_underline\"><Font ss:Underline=\"Double\" /><NumberFormat /></Style><Style ss:ID=\".font.accounting_underline\"><Font ss:Underline=\"SingleAccounting\" /><NumberFormat /></Style><Style ss:ID=\".font.double_accounting_underline\"><Font ss:Underline=\"DoubleAccounting\" /><NumberFormat /></Style>",
|
140
|
+
xmlss_style_markup(subject)
|
141
|
+
)
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
should "write style markup for font alignment settings" do
|
146
|
+
subject.style('font subscript')
|
147
|
+
subject.style('font superscript')
|
148
|
+
assert_equal(
|
149
|
+
"<Style ss:ID=\".font.subscript\"><Font ss:VerticalAlign=\"Subscript\" /><NumberFormat /></Style><Style ss:ID=\".font.superscript\"><Font ss:VerticalAlign=\"Superscript\" /><NumberFormat /></Style>",
|
150
|
+
xmlss_style_markup(subject)
|
151
|
+
)
|
152
|
+
end
|
153
|
+
|
154
|
+
should "write style markup for font style settings" do
|
155
|
+
subject.style('font bold')
|
156
|
+
subject.style('font italic')
|
157
|
+
subject.style('font strikethrough')
|
158
|
+
subject.style('font shadow')
|
159
|
+
assert_equal(
|
160
|
+
"<Style ss:ID=\".font.bold\"><Font ss:Bold=\"1\" /><NumberFormat /></Style><Style ss:ID=\".font.italic\"><Font ss:Italic=\"1\" /><NumberFormat /></Style><Style ss:ID=\".font.strikethrough\"><Font ss:StrikeThrough=\"1\" /><NumberFormat /></Style><Style ss:ID=\".font.shadow\"><Font ss:Shadow=\"1\" /><NumberFormat /></Style>",
|
161
|
+
xmlss_style_markup(subject)
|
162
|
+
)
|
163
|
+
end
|
164
|
+
|
165
|
+
should "write style markup for font size" do
|
166
|
+
subject.style('font size')
|
167
|
+
assert_equal(
|
168
|
+
"<Style ss:ID=\".font.size\"><Font ss:Size=\"14\" /><NumberFormat /></Style>",
|
169
|
+
xmlss_style_markup(subject)
|
170
|
+
)
|
171
|
+
end
|
172
|
+
|
173
|
+
should "write style markup for font color" do
|
174
|
+
subject.style('font color')
|
175
|
+
assert_equal(
|
176
|
+
"<Style ss:ID=\".font.color\"><Font ss:Color=\"#FF0000\" /><NumberFormat /></Style>",
|
177
|
+
xmlss_style_markup(subject)
|
178
|
+
)
|
179
|
+
end
|
180
|
+
|
181
|
+
should "write style markup for font name" do
|
182
|
+
subject.style('font name')
|
183
|
+
assert_equal(
|
184
|
+
"<Style ss:ID=\".font.name\"><Font ss:FontName=\"Verdana\" /><NumberFormat /></Style>",
|
185
|
+
xmlss_style_markup(subject)
|
186
|
+
)
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
190
|
+
|
191
|
+
class BgTests < StylesTests
|
192
|
+
desc "Bg writer"
|
193
|
+
before do
|
194
|
+
@workbook.style('.bg.color') { @workbook.bg '#FF0000' }
|
195
|
+
@workbook.style('.bg.pattern-only') { @workbook.bg :solid }
|
196
|
+
@workbook.style('.bg.pattern-color') { @workbook.bg :horz_stripe => '#0000FF' }
|
197
|
+
@workbook.style('.bg.color-first') { @workbook.bg '#00FF00', {:horz_stripe => '#0000FF'} }
|
198
|
+
@workbook.style('.bg.pattern-first') { @workbook.bg({:horz_stripe => '#0000FF'}, '#00FF00') }
|
199
|
+
end
|
200
|
+
|
201
|
+
should "write style markup with empty bg settings when no match" do
|
202
|
+
subject.style('bg')
|
203
|
+
assert_equal(
|
204
|
+
"<Style ss:ID=\".bg\"><NumberFormat /></Style>",
|
205
|
+
xmlss_style_markup(subject)
|
206
|
+
)
|
207
|
+
end
|
208
|
+
|
209
|
+
should "write style markup for bg color and auto set the pattern to solid" do
|
210
|
+
subject.style('bg color')
|
211
|
+
assert_equal(
|
212
|
+
"<Style ss:ID=\".bg.color\"><Interior ss:Color=\"#FF0000\" ss:Pattern=\"Solid\" /><NumberFormat /></Style>",
|
213
|
+
xmlss_style_markup(subject)
|
214
|
+
)
|
215
|
+
end
|
216
|
+
|
217
|
+
should "write style markup for bg pattern settings" do
|
218
|
+
subject.style('bg pattern-only')
|
219
|
+
subject.style('bg pattern-only')
|
220
|
+
subject.style('bg pattern-color')
|
221
|
+
subject.style('bg pattern-color')
|
222
|
+
assert_equal(
|
223
|
+
"<Style ss:ID=\".bg.pattern-only\"><Interior ss:Pattern=\"Solid\" /><NumberFormat /></Style><Style ss:ID=\".bg.pattern-color\"><Interior ss:Color=\"#FF0000\" ss:Pattern=\"HorzStripe\" ss:PatternColor=\"#0000FF\" /><NumberFormat /></Style>",
|
224
|
+
xmlss_style_markup(subject)
|
225
|
+
)
|
226
|
+
end
|
227
|
+
|
228
|
+
should "write style markup setting pattern to solid when setting bg color" do
|
229
|
+
subject.style('bg color')
|
230
|
+
assert_equal(
|
231
|
+
"<Style ss:ID=\".bg.color\"><Interior ss:Color=\"#FF0000\" ss:Pattern=\"Solid\" /><NumberFormat /></Style>",
|
232
|
+
xmlss_style_markup(subject)
|
233
|
+
)
|
234
|
+
end
|
235
|
+
|
236
|
+
should "write style markup setting pattern to pattern setting when first setting bg color then pattern" do
|
237
|
+
subject.style('bg color-first')
|
238
|
+
assert_equal(
|
239
|
+
"<Style ss:ID=\".bg.color-first\"><Interior ss:Color=\"#00FF00\" ss:Pattern=\"HorzStripe\" ss:PatternColor=\"#0000FF\" /><NumberFormat /></Style>",
|
240
|
+
xmlss_style_markup(subject)
|
241
|
+
)
|
242
|
+
end
|
243
|
+
|
244
|
+
should "write style markup setting pattern to pattern setting when first setting bg pattern then color" do
|
245
|
+
subject.style('bg pattern-first')
|
246
|
+
assert_equal(
|
247
|
+
"<Style ss:ID=\".bg.pattern-first\"><Interior ss:Color=\"#00FF00\" ss:Pattern=\"HorzStripe\" ss:PatternColor=\"#0000FF\" /><NumberFormat /></Style>",
|
248
|
+
xmlss_style_markup(subject)
|
249
|
+
)
|
250
|
+
end
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
class BorderTests < StylesTests
|
255
|
+
desc "Font border writer"
|
256
|
+
before do
|
257
|
+
::Osheet::Style::BORDER_POSITIONS.each do |p|
|
258
|
+
@workbook.style(".border.#{p}") { @workbook.send("border_#{p}", :thin) }
|
259
|
+
end
|
260
|
+
[:hairline, :thin, :medium, :thick].each do |w|
|
261
|
+
@workbook.style(".border.#{w}") { @workbook.border_top w }
|
262
|
+
end
|
263
|
+
[:none, :continuous, :dash, :dot, :dash_dot, :dash_dot_dot].each do |s|
|
264
|
+
@workbook.style(".border.#{s}") { @workbook.border_top s }
|
265
|
+
end
|
266
|
+
@workbook.style('.border.color') { @workbook.border_top '#FF0000' }
|
267
|
+
@workbook.style('.border.all') { @workbook.border :thick, :dash, '#FF0000' }
|
268
|
+
end
|
269
|
+
|
270
|
+
should "write style markup with empty border settings when no match" do
|
271
|
+
subject.style('border')
|
272
|
+
assert_equal(
|
273
|
+
"<Style ss:ID=\".border\"><NumberFormat /></Style>",
|
274
|
+
xmlss_style_markup(subject)
|
275
|
+
)
|
276
|
+
end
|
277
|
+
|
278
|
+
should "write style markup with identical settings for all positions when using 'border'" do
|
279
|
+
subject.style('border all')
|
280
|
+
assert_equal(
|
281
|
+
"<Style ss:ID=\".border.all\"><Borders><Border ss:Color=\"#FF0000\" ss:LineStyle=\"Dash\" ss:Position=\"Top\" ss:Weight=\"3\" /><Border ss:Color=\"#FF0000\" ss:LineStyle=\"Dash\" ss:Position=\"Right\" ss:Weight=\"3\" /><Border ss:Color=\"#FF0000\" ss:LineStyle=\"Dash\" ss:Position=\"Bottom\" ss:Weight=\"3\" /><Border ss:Color=\"#FF0000\" ss:LineStyle=\"Dash\" ss:Position=\"Left\" ss:Weight=\"3\" /></Borders><NumberFormat /></Style>",
|
282
|
+
xmlss_style_markup(subject)
|
283
|
+
)
|
284
|
+
end
|
285
|
+
|
286
|
+
should "write style markup for border specific positions" do
|
287
|
+
::Osheet::Style::BORDER_POSITIONS.each do |p|
|
288
|
+
subject.style("border #{p}")
|
289
|
+
end
|
290
|
+
assert_equal(
|
291
|
+
"<Style ss:ID=\".border.top\"><Borders><Border ss:LineStyle=\"Continuous\" ss:Position=\"Top\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style><Style ss:ID=\".border.right\"><Borders><Border ss:LineStyle=\"Continuous\" ss:Position=\"Right\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style><Style ss:ID=\".border.bottom\"><Borders><Border ss:LineStyle=\"Continuous\" ss:Position=\"Bottom\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style><Style ss:ID=\".border.left\"><Borders><Border ss:LineStyle=\"Continuous\" ss:Position=\"Left\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style>",
|
292
|
+
xmlss_style_markup(subject)
|
293
|
+
)
|
294
|
+
end
|
295
|
+
|
296
|
+
should "write style markup for border weight settings" do
|
297
|
+
[:hairline, :thin, :medium, :thick].each do |w|
|
298
|
+
subject.style("border #{w}")
|
299
|
+
end
|
300
|
+
assert_equal(
|
301
|
+
"<Style ss:ID=\".border.hairline\"><Borders><Border ss:LineStyle=\"Continuous\" ss:Position=\"Top\" ss:Weight=\"0\" /></Borders><NumberFormat /></Style><Style ss:ID=\".border.thin\"><Borders><Border ss:LineStyle=\"Continuous\" ss:Position=\"Top\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style><Style ss:ID=\".border.medium\"><Borders><Border ss:LineStyle=\"Continuous\" ss:Position=\"Top\" ss:Weight=\"2\" /></Borders><NumberFormat /></Style><Style ss:ID=\".border.thick\"><Borders><Border ss:LineStyle=\"Continuous\" ss:Position=\"Top\" ss:Weight=\"3\" /></Borders><NumberFormat /></Style>",
|
302
|
+
xmlss_style_markup(subject)
|
303
|
+
)
|
304
|
+
end
|
305
|
+
|
306
|
+
should "write style markup for border style settings" do
|
307
|
+
[:none, :continuous, :dash, :dot, :dash_dot, :dash_dot_dot].each do |s|
|
308
|
+
subject.style("border #{s}")
|
309
|
+
end
|
310
|
+
assert_equal(
|
311
|
+
"<Style ss:ID=\".border.none\"><Borders><Border ss:LineStyle=\"None\" ss:Position=\"Top\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style><Style ss:ID=\".border.continuous\"><Borders><Border ss:LineStyle=\"Continuous\" ss:Position=\"Top\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style><Style ss:ID=\".border.dash\"><Borders><Border ss:LineStyle=\"Dash\" ss:Position=\"Top\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style><Style ss:ID=\".border.dot\"><Borders><Border ss:LineStyle=\"Dot\" ss:Position=\"Top\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style><Style ss:ID=\".border.dash_dot\"><Borders><Border ss:LineStyle=\"DashDot\" ss:Position=\"Top\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style><Style ss:ID=\".border.dash_dot_dot\"><Borders><Border ss:LineStyle=\"DashDotDot\" ss:Position=\"Top\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style>",
|
312
|
+
xmlss_style_markup(subject)
|
313
|
+
)
|
314
|
+
end
|
315
|
+
|
316
|
+
should "write style markup for border color" do
|
317
|
+
subject.style('border color')
|
318
|
+
assert_equal(
|
319
|
+
"<Style ss:ID=\".border.color\"><Borders><Border ss:Color=\"#FF0000\" ss:LineStyle=\"Continuous\" ss:Position=\"Top\" ss:Weight=\"1\" /></Borders><NumberFormat /></Style>",
|
320
|
+
xmlss_style_markup(subject)
|
321
|
+
)
|
322
|
+
end
|
323
|
+
|
324
|
+
end
|
325
|
+
|
326
|
+
class NumberFormatTests < StylesTests
|
327
|
+
desc "Xmlss style number format writer"
|
328
|
+
|
329
|
+
should "write style markup with formatting" do
|
330
|
+
subject.style('', Osheet::Format.new(:text))
|
331
|
+
subject.style('', Osheet::Format.new(:datetime, 'mm/dd/yy'))
|
332
|
+
assert_equal(
|
333
|
+
"<Style ss:ID=\"..text\"><NumberFormat ss:Format=\"@\" /></Style><Style ss:ID=\"..datetime_mm/dd/yy\"><NumberFormat ss:Format=\"mm/dd/yy\" /></Style>",
|
334
|
+
xmlss_style_markup(subject)
|
335
|
+
)
|
336
|
+
end
|
337
|
+
|
338
|
+
end
|
339
|
+
|
340
|
+
end
|