style_train 0.1.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.
@@ -0,0 +1,160 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ HexColor = StyleTrain::HexColor unless defined?( HexColor )
4
+
5
+ describe HexColor do
6
+ describe 'class methods' do
7
+ it 'should expand a 3-digit hex' do
8
+ HexColor.expand('333').should == 0x333333
9
+ end
10
+ end
11
+
12
+ describe 'initialization' do
13
+ describe 'from another color' do
14
+ it 'should convert correctly from a RGB color' do
15
+ color = StyleTrain::RGBcolor.new(:color => [20, 40, 60])
16
+ hex = HexColor.new(color)
17
+ hex.r.should == color.r
18
+ hex.g.should == color.g
19
+ hex.b.should == color.b
20
+ hex.hex.upcase.should == '14283C'
21
+ hex.hex_6.should == 0x14283C
22
+ end
23
+ end
24
+
25
+ describe 'from a hex without a hash and possibly a number' do
26
+ before do
27
+ @gray = HexColor.new(:color => 666)
28
+ @red = HexColor.new(:color => '993300')
29
+ @gold = HexColor.new(:color => 'FC0')
30
+ end
31
+
32
+ it 'should set the #hex attribute' do
33
+ @gray.hex.should == '666'
34
+ @red.hex.should == '993300'
35
+ @gold.hex.should == 'FC0'
36
+ end
37
+
38
+ it 'should set the #hex_6 attribute' do
39
+ @gray.hex_6.should == 0x666666
40
+ @red.hex_6.should == 0x993300
41
+ @gold.hex_6.should == 0xFFCC00
42
+ end
43
+
44
+ it 'should set the #r attribute' do
45
+ @gray.r.should == 102
46
+ @red.r.should == 153
47
+ @gold.r.should == 255
48
+ end
49
+
50
+ it 'should set the #g attribute' do
51
+ @gray.g.should == 102
52
+ @red.g.should == 51
53
+ @gold.g.should == 204
54
+ end
55
+
56
+ it 'should set the #b attribute' do
57
+ @gray.b.should == 102
58
+ @red.b.should == 0
59
+ @gold.b.should == 0
60
+ end
61
+ end
62
+
63
+ describe 'from a three digit hex' do
64
+ before do
65
+ @gray = HexColor.new(:color =>'#666')
66
+ @red = HexColor.new(:color => '#930')
67
+ @gold = HexColor.new(:color => '#FC0')
68
+ end
69
+
70
+ it 'should set the #hex attribute' do
71
+ @gray.hex.should == '666'
72
+ @red.hex.should == '930'
73
+ @gold.hex.should == 'FC0'
74
+ end
75
+
76
+ it 'should set the #hex_6 attribute' do
77
+ @gray.hex_6.should == 0x666666
78
+ @red.hex_6.should == 0x993300
79
+ @gold.hex_6.should == 0xFFCC00
80
+ end
81
+
82
+ it 'should set the #r attribute' do
83
+ @gray.r.should == 102
84
+ @red.r.should == 153
85
+ @gold.r.should == 255
86
+ end
87
+
88
+ it 'should set the #g attribute' do
89
+ @gray.g.should == 102
90
+ @red.g.should == 51
91
+ @gold.g.should == 204
92
+ end
93
+
94
+ it 'should set the #b attribute' do
95
+ @gray.b.should == 102
96
+ @red.b.should == 0
97
+ @gold.b.should == 0
98
+ end
99
+ end
100
+
101
+ describe 'from a 6 digit hex' do
102
+ before do
103
+ @gray = HexColor.new(:color => '#666666')
104
+ @red = HexColor.new(:color =>'#993300')
105
+ @gold = HexColor.new(:color => '#FFCC00')
106
+ @mix = HexColor.new(:color => '#6b602f')
107
+ end
108
+
109
+ it 'should set the #hex attribute' do
110
+ @gray.hex.should == '666666'
111
+ @red.hex.should == '993300'
112
+ @gold.hex.should == 'FFCC00'
113
+ @mix.hex.should == '6b602f'
114
+ end
115
+
116
+ it 'should set the #hex_6 attribute' do
117
+ @gray.hex_6.should == 0x666666
118
+ @red.hex_6.should == 0x993300
119
+ @gold.hex_6.should == 0xFFCC00
120
+ @mix.hex_6.should == 0x6b602f
121
+ end
122
+
123
+ it 'should set the #r attribute' do
124
+ @gray.r.should == 102
125
+ @red.r.should == 153
126
+ @gold.r.should == 255
127
+ @mix.r.should == 107
128
+ end
129
+
130
+ it 'should set the #g attribute' do
131
+ @gray.g.should == 102
132
+ @red.g.should == 51
133
+ @gold.g.should == 204
134
+ @mix.g.should == 96
135
+ end
136
+
137
+ it 'should set the #b attribute' do
138
+ @gray.b.should == 102
139
+ @red.b.should == 0
140
+ @gold.b.should == 0
141
+ @mix.b.should == 47
142
+ end
143
+ end
144
+ end
145
+
146
+ describe '#to_s' do
147
+ before do
148
+ @color = HexColor.new(:color => '666')
149
+ end
150
+
151
+ it 'should render with the original passed in value if no alpha is present' do
152
+ @color.to_s.should == "#666"
153
+ end
154
+
155
+ it 'should render as rgba if alpha is present' do
156
+ @color.alpha = 0.5
157
+ @color.to_s.should == "rgba( 102, 102, 102, 0.5 )"
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,56 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ KeywordColor = StyleTrain::KeywordColor unless defined?( KeywordColor )
4
+
5
+ describe KeywordColor do
6
+ describe 'accessors' do
7
+ it 'should have methods for #keyword= and #keyword' do
8
+ KeywordColor.instance_methods.should include( 'keyword=', 'keyword' )
9
+ end
10
+
11
+ it 'should raise an error if the keyword is not found' do
12
+ lambda{ KeywordColor.new(:color => :puke) }.should raise_error( KeywordColor::KeywordError)
13
+ color = KeywordColor.new(:color => :lightyellow)
14
+ lambda{ color.keyword = :puke }.should raise_error(KeywordColor::KeywordError)
15
+ end
16
+
17
+ it 'should set the keyword attribute' do
18
+ color = KeywordColor.new(:color => :lightyellow)
19
+ color.keyword.should == :lightyellow
20
+ end
21
+ end
22
+
23
+ describe 'initialization' do
24
+ describe 'from a color' do
25
+ it 'should find a keyword if it maps' do
26
+ rgb = StyleTrain::RGBcolor.new(:color => [255,255,224])
27
+ light_yellow = KeywordColor.new( rgb )
28
+ light_yellow.r.should == 255
29
+ light_yellow.g.should == 255
30
+ light_yellow.b.should == 224
31
+ end
32
+
33
+ it 'should raise an error if it does not map' do
34
+ rgb = StyleTrain::RGBcolor.new(:color => [255,255,220])
35
+ lambda{ KeywordColor.new( rgb ) }.should raise_error( KeywordColor::KeywordError )
36
+ end
37
+ end
38
+
39
+ describe 'from a keyword' do
40
+ it 'should have the right rgb values' do
41
+ light_yellow = KeywordColor.new(:color => :lightyellow)
42
+ light_yellow.r.should == 255
43
+ light_yellow.g.should == 255
44
+ light_yellow.b.should == 224
45
+ end
46
+ end
47
+ end
48
+
49
+ describe 'rendering' do
50
+ it 'should render as given by default' do
51
+ light_yellow = KeywordColor.new(:color => :lightyellow)
52
+ light_yellow.render.should == 'lightyellow'
53
+ end
54
+ end
55
+
56
+ end
@@ -0,0 +1,75 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ RGBcolor = StyleTrain::RGBcolor unless defined?( RGBcolor )
4
+
5
+ describe RGBcolor do
6
+
7
+ it 'should have methods for #red=, #green= and #blue=' do
8
+ RGBcolor.instance_methods.should include( 'red=', 'green=', 'blue=' )
9
+ end
10
+
11
+ describe 'array initialization' do
12
+ it '#red #green and #blue should be set to passed values' do
13
+ color = RGBcolor.new(:color => [20, 40, 60])
14
+ color.red.should == 20
15
+ color.green.should == 40
16
+ color.blue.should == 60
17
+
18
+ color = RGBcolor.new(:color => ['20', '40', '60'])
19
+ color.red.should == '20'
20
+ color.green.should == '40'
21
+ color.blue.should == '60'
22
+
23
+ color = RGBcolor.new(:color => ['0%', '50%', '100%'])
24
+ color.red.should == '0%'
25
+ color.green.should == '50%'
26
+ color.blue.should == '100%'
27
+ end
28
+
29
+ it '#r #g and #b (the internal storage ) should be set' do
30
+ color = RGBcolor.new(:color => [20, 40, 60])
31
+ color.r.should == 20
32
+ color.g.should == 40
33
+ color.b.should == 60
34
+
35
+ color = RGBcolor.new(:color => ['20', '40', '60'])
36
+ color.r.should == 20
37
+ color.g.should == 40
38
+ color.b.should == 60
39
+
40
+ color = RGBcolor.new(:color => ['0%', '50%', '100%'])
41
+ color.r.should == 0
42
+ color.g.should == 127
43
+ color.b.should == 255
44
+ end
45
+ end
46
+
47
+ # This should be a shared example
48
+ describe 'alpha' do
49
+ it 'should be 1.0 by default' do
50
+ color = RGBcolor.new(:color => ['0%', '50%', '100%'])
51
+ color.alpha.should == 1.0
52
+ end
53
+
54
+ it 'should be set by the alpha parameter' do
55
+ color = RGBcolor.new(:color => ['0%', '50%', '100%'], :alpha => 0.5 )
56
+ color.alpha.should == 0.5
57
+
58
+ color = RGBcolor.new(:color => ['0%', '50%', '100%'], :alpha => '0.5' )
59
+ color.alpha.should == 0.5
60
+ end
61
+ end
62
+
63
+ it 'render should output rgb css tag' do
64
+ RGBcolor.new(:color => ['0%', '50%', '100%'] ).render.should ==
65
+ "rgb( 0%, 50%, 100% )"
66
+
67
+ RGBcolor.new(:color => [255, 255, 255] ).render.should ==
68
+ "rgb( 255, 255, 255 )"
69
+
70
+ RGBcolor.new(:color => ['255', '255', '255'] ).render.should ==
71
+ "rgb( 255, 255, 255 )"
72
+ end
73
+
74
+
75
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Fixnum do
4
+ it '#em converts to a string with em at the end' do
5
+ 42.em.should == '42em'
6
+ end
7
+
8
+ it '#px converts to a string with px at the end' do
9
+ 42.px.should == '42px'
10
+ end
11
+
12
+ it '#percent converts to a string with % at the end' do
13
+ 42.percent.should == '42%'
14
+ end
15
+
16
+ it '#pt converts to a string with % at the end' do
17
+ 42.pt.should == '42pt'
18
+ end
19
+ end
20
+
21
+ describe Float do
22
+ it '#em converts to a string with em at the end' do
23
+ 1.5.em.should == '1.5em'
24
+ end
25
+ end
@@ -0,0 +1,549 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ Sheet = StyleTrain::Sheet unless defined?( Sheet )
4
+
5
+ describe Sheet do
6
+ describe 'attributes' do
7
+ before :all do
8
+ @sheet = Sheet.new
9
+ end
10
+
11
+ it 'should have an output' do
12
+ @sheet.output = 'foo'
13
+ @sheet.output.should == 'foo'
14
+ end
15
+
16
+ it 'output gets set to an empty string on initialize' do
17
+ Sheet.new.output.should == ''
18
+ end
19
+
20
+ it 'should have an indent_level that is initialized to 0' do
21
+ Sheet.new.indent_level.should == 0
22
+ end
23
+ end
24
+
25
+ describe '#render' do
26
+ before :all do
27
+ @sheet = Sheet.new
28
+ end
29
+
30
+ it 'resets the output' do
31
+ @sheet.should_receive(:output=).with('')
32
+ @sheet.render
33
+ end
34
+
35
+ it 'calls #content by default' do
36
+ @sheet.should_receive(:content)
37
+ @sheet.render
38
+ end
39
+
40
+ it 'calls an alterate content method' do
41
+ @sheet.should_not_receive(:content)
42
+ @sheet.should_receive(:foo)
43
+ @sheet.render :foo
44
+ end
45
+
46
+ it 'returns the output' do
47
+ @sheet.output = "bar"
48
+ @sheet.stub(:output=)
49
+ @sheet.stub(:content).and_return('foo')
50
+ @sheet.render.should == "bar"
51
+ end
52
+ end
53
+
54
+ describe '#style' do
55
+ before do
56
+ @sheet = Sheet.new
57
+ end
58
+
59
+ it 'adds an entry to the output' do
60
+ @sheet.output.should == ""
61
+ @sheet.style(:foo)
62
+ @sheet.output.should_not == ""
63
+ end
64
+
65
+ it 'renders the right style when passed a string' do
66
+ @sheet.style('.foo')
67
+ @sheet.output.should include '.foo'
68
+ end
69
+
70
+ it 'renders the right selecter when passed a non-tag symbol' do
71
+ @sheet.style(:bar)
72
+ @sheet.output.should include '.bar'
73
+ end
74
+
75
+ it 'renders the right style when passed a tag symbol' do
76
+ @sheet.style(:body)
77
+ @sheet.output.should include 'body'
78
+ @sheet.output.should_not include '.body'
79
+ end
80
+
81
+ it 'renders {} when not passed a block' do
82
+ @sheet.style(:body)
83
+ @sheet.output.should include "body {\n}"
84
+ end
85
+
86
+ describe 'receiving a block' do
87
+ end
88
+
89
+ describe 'nesting' do
90
+ end
91
+ end
92
+
93
+ describe 'tags' do
94
+ before do
95
+ @sheet = Sheet.new
96
+ end
97
+
98
+ Sheet::TAGS.each do |tag|
99
+ it "should have a method for '#{tag}'" do
100
+ @sheet.should respond_to(tag)
101
+ end
102
+
103
+ it "should add a style for '#{tag}'" do
104
+ @sheet.send(tag)
105
+ @sheet.output.should include "#{tag} {\n}"
106
+ end
107
+ end
108
+
109
+ it 'should pass the block on to the style method' do
110
+ str = @sheet.instance_eval <<-RUBY
111
+ body do
112
+ margin [2.em, :auto]
113
+ end
114
+ RUBY
115
+ str.should include 'margin: 2em auto'
116
+ end
117
+ end
118
+
119
+ describe 'properties' do
120
+ before :all do
121
+ @sheet = Sheet.new
122
+ end
123
+
124
+ describe '#property' do
125
+ before :all do
126
+ @sheet.indent_level = 4
127
+ @property = @sheet.property('border', '1px solid #ccc' )
128
+ end
129
+
130
+ it 'returns a string' do
131
+ @property.is_a?(String).should be_true
132
+ end
133
+
134
+ it 'adds a line break and an indent to the front of the string' do
135
+ @property.match(/^\W{5}/).should_not be_nil
136
+ end
137
+
138
+ it 'includes the property name' do
139
+ @property.should include 'border'
140
+ end
141
+
142
+ it 'includes punctuation' do
143
+ @property.should include ':', ';'
144
+ end
145
+
146
+ it 'includes the value' do
147
+ @property.should include '1px solid #ccc'
148
+ end
149
+
150
+ it 'puts it all together correctly' do
151
+ @property.should == "\n border: 1px solid #ccc;"
152
+ end
153
+
154
+ it 'adds the string to the output' do
155
+ @sheet.output.should include @property
156
+ end
157
+
158
+ it 'converts an array to a space separated string' do
159
+ @sheet.property('margin', [0,0,0,0]).should include '0 0 0 0'
160
+ end
161
+ end
162
+
163
+ describe 'background' do
164
+ it ':color will create a background-color property' do
165
+ @sheet.background(:color => :white).should include 'background-color: white;'
166
+ end
167
+
168
+ it ':image will create a background-image property' do
169
+ @sheet.background(:image => "url('ok.png')").should include "background-image: url('ok.png');"
170
+ end
171
+
172
+ it ':position will create a background-position property' do
173
+ @sheet.background(:position => "center").should include 'background-position: center;'
174
+ end
175
+
176
+ it ':attachment will create a background-attachment property' do
177
+ @sheet.background(:attachment => 'fixed').should include 'background-attachment: fixed;'
178
+ end
179
+
180
+ it ':repeat will create a background-repeat property with the correct value' do
181
+ @sheet.background(:repeat => :x).should include "background-repeat: repeat-x;"
182
+ end
183
+
184
+ it 'will create a background-color property if it receives a string that converts to a color'
185
+ it 'will create a background-color property if it receives a color'
186
+ end
187
+
188
+ describe 'border' do
189
+ it 'it defaults to 1px solid black' do
190
+ @sheet.border.should include 'border: 1px solid black;'
191
+ end
192
+
193
+ it 'takes the width it is passed in' do
194
+ @sheet.border(:width => 3.px).should include 'border: 3px solid black;'
195
+ end
196
+
197
+ it 'takes in the color when it is passed in' do
198
+ @sheet.border(:color => StyleTrain::Color.new('#333')).should include 'border: 1px solid #333'
199
+ end
200
+
201
+ it 'takes in the style when it is passed in' do
202
+ @sheet.border(:style => 'dashed').should include 'border: 1px dashed black'
203
+ end
204
+
205
+ it 'makes a declaration for only a certain type of border when requested' do
206
+ @sheet.border(:only => :bottom).should include 'border-bottom: 1px solid black'
207
+ end
208
+
209
+ it ':only option works as an array too' do
210
+ @sheet.border(:only => [:bottom, :left]).should include(
211
+ 'border-bottom: 1px solid black', 'border-left: 1px solid black'
212
+ )
213
+ end
214
+ end
215
+
216
+ describe 'outline' do
217
+ it 'it defaults to 1px solid black' do
218
+ @sheet.outline.should include 'outline: 1px solid black;'
219
+ end
220
+
221
+ it 'takes the width it is passed in' do
222
+ @sheet.outline(:width => 3.px).should include 'outline: 3px solid black;'
223
+ end
224
+
225
+ it 'takes in the color when it is passed in' do
226
+ @sheet.outline(:color => StyleTrain::Color.new('#333')).should include 'outline: 1px solid #333'
227
+ end
228
+
229
+ it 'takes in the style when it is passed in' do
230
+ @sheet.outline(:style => 'dashed').should include 'outline: 1px dashed black'
231
+ end
232
+ end
233
+
234
+ describe 'dimensions' do
235
+ describe '#height' do
236
+ it 'makes a height declaration' do
237
+ @sheet.height(320.px).should include 'height: 320px;'
238
+ end
239
+
240
+ it 'will make a max declaration too' do
241
+ @sheet.max_height(400.px).should include 'max-height: 400px'
242
+ end
243
+
244
+ it 'will make a min width declaration' do
245
+ @sheet.min_height(200.px).should include 'min-height: 200px'
246
+ end
247
+ end
248
+
249
+ describe '#height' do
250
+ it 'makes a height declaration' do
251
+ @sheet.width(320.px).should include 'width: 320px;'
252
+ end
253
+
254
+ it 'will make a max declaration too' do
255
+ @sheet.max_width(400.px).should include 'max-width: 400px'
256
+ end
257
+
258
+ it 'will make a min width declaration' do
259
+ @sheet.min_width(200.px).should include 'min-width: 200px'
260
+ end
261
+ end
262
+ end
263
+
264
+ describe 'position' do
265
+ it 'takes a string argument and makes a position declaration' do
266
+ @sheet.position( 'absolute' ).should include 'position: absolute'
267
+ end
268
+
269
+ it 'take a symbol and makes a position declaration' do
270
+ @sheet.position( :relative ).should include 'position: relative'
271
+ end
272
+
273
+ it 'takes a option for type and makes a position declaration' do
274
+ @sheet.position(:type => :fixed).should include 'position: fixed'
275
+ end
276
+
277
+ it 'makes a bottom declaration' do
278
+ @sheet.position(:bottom => 5.px).should include 'bottom: 5px'
279
+ end
280
+
281
+ it 'makes a right declaration' do
282
+ @sheet.position(:right => 15.px).should include 'right: 15px'
283
+ end
284
+
285
+ it 'makes a top declaration' do
286
+ @sheet.position(:top => 25.px).should include 'top: 25px'
287
+ end
288
+
289
+ it 'makes a left declaration' do
290
+ @sheet.position(:left => 35.px).should include 'left: 35px'
291
+ end
292
+
293
+ it 'floats' do
294
+ @sheet.position(:float => :left).should include 'float: left'
295
+ end
296
+
297
+ it 'clears' do
298
+ @sheet.position(:clear => :both).should include 'clear: both'
299
+ end
300
+
301
+ it 'has a display declaration' do
302
+ @sheet.position(:display => :inline).should include 'display: inline'
303
+ end
304
+
305
+ it 'constructs visibility' do
306
+ @sheet.position(:visibility => :hidden).should include 'visibility: hidden'
307
+ end
308
+
309
+ it 'has a z-index' do
310
+ @sheet.position(:z_index => 5).should include 'z-index: 5'
311
+ end
312
+
313
+ it 'has overflow declarations' do
314
+ @sheet.position(:overflow => :scroll).should include 'overflow: scroll'
315
+ @sheet.position(:overflow_x => :hidden).should include 'overflow-x: hidden'
316
+ @sheet.position(:overflow_y => :visible).should include 'overflow-y: visible'
317
+ end
318
+
319
+ it 'has a clip declaration' do
320
+ @sheet.position(:clip => [10.px, 20.px, 30.px, 40.px]).should include 'clip: rect(10px 20px 30px 40px)'
321
+ end
322
+ end
323
+
324
+ describe 'text' do
325
+ it 'adds a font-family declaration when passed a font option' do
326
+ @sheet.text(:font => 'arial').should include 'font-family: arial;'
327
+ end
328
+
329
+ it 'adds a font-size declaration whet passed' do
330
+ @sheet.text(:size => 23.pt).should include 'font-size: 23pt;'
331
+ end
332
+
333
+ it 'adds a style declaration' do
334
+ @sheet.text(:style => :italic).should include 'font-style: italic;'
335
+ end
336
+
337
+ it 'adds a variant declaration' do
338
+ @sheet.text(:variant => 'small-caps').should include 'font-variant: small-caps;'
339
+ end
340
+
341
+ it 'adds a weight declaration' do
342
+ @sheet.text(:weight => 'bold').should include 'font-weight: bold;'
343
+ end
344
+
345
+ it 'adds color' do
346
+ @sheet.text(:color => '#444').should include 'color: #444;'
347
+ end
348
+
349
+ it 'adds direction' do
350
+ @sheet.text(:direction => :rtl).should include 'text-direction: rtl'
351
+ end
352
+
353
+ it 'adds letter spacing' do
354
+ @sheet.text(:spacing => -2.px).should include 'letter-spacing: -2px'
355
+ end
356
+
357
+ it 'adds line height' do
358
+ @sheet.text(:line_height => 2).should include 'line-height: 2'
359
+ end
360
+
361
+ it 'aligns' do
362
+ @sheet.text(:align => :center).should include 'text-align: center'
363
+ end
364
+
365
+ it 'adds decoration' do
366
+ @sheet.text(:decoration => :underline).should include 'text-decoration: underline'
367
+ end
368
+
369
+ it 'indents' do
370
+ @sheet.text(:indent => 20.px).should include 'text-indent: 20px'
371
+ end
372
+
373
+ it 'adds a transform' do
374
+ @sheet.text(:transform => :uppercase).should include 'text-transform: uppercase'
375
+ end
376
+
377
+ it 'adds a vertical align' do
378
+ @sheet.text(:vertical_align => :top).should include 'vertical-align: top'
379
+ end
380
+
381
+ it 'adds white space declaration' do
382
+ @sheet.text(:white_space => :nowrap).should include 'white-space: nowrap'
383
+ end
384
+
385
+ it 'specifies word spacing' do
386
+ @sheet.text(:word_spacing => 25.px).should include 'word-spacing: 25px'
387
+ end
388
+ end
389
+
390
+ describe 'list' do
391
+ it 'sets the image' do
392
+ @sheet.list(:image => 'url("foo.gif")').should include 'list-style-image: url("foo.gif")'
393
+ end
394
+
395
+ it 'sets the position' do
396
+ @sheet.list(:position => :inside).should include 'list-style-position: inside'
397
+ end
398
+
399
+ it 'sets the type' do
400
+ @sheet.list(:type => :square).should include 'list-style-type: square'
401
+ end
402
+ end
403
+
404
+ describe 'margin' do
405
+ it 'takes an array' do
406
+ @sheet.margin( [10.px, 20.px, 13.px] ).should include 'margin: 10px 20px 13px'
407
+ end
408
+
409
+ it 'takes :left and just makes that declaration' do
410
+ @sheet.margin( :left => 30.px ).should include 'margin-left: 30px'
411
+ end
412
+
413
+ it 'takes :left and just makes that declaration' do
414
+ @sheet.margin( :right => 20.px ).should include 'margin-right: 20px'
415
+ end
416
+
417
+ it 'takes :left and just makes that declaration' do
418
+ @sheet.margin( :top => 10.px ).should include 'margin-top: 10px'
419
+ end
420
+
421
+ it 'takes :left and just makes that declaration' do
422
+ @sheet.margin( :bottom => 15.px ).should include 'margin-bottom: 15px'
423
+ end
424
+ end
425
+
426
+ describe 'padding' do
427
+ it 'takes an array' do
428
+ @sheet.padding( [10.px, 20.px, 13.px] ).should include 'padding: 10px 20px 13px'
429
+ end
430
+
431
+ it 'takes :left and just makes that declaration' do
432
+ @sheet.padding( :left => 30.px ).should include 'padding-left: 30px'
433
+ end
434
+
435
+ it 'takes :left and just makes that declaration' do
436
+ @sheet.padding( :right => 20.px ).should include 'padding-right: 20px'
437
+ end
438
+
439
+ it 'takes :left and just makes that declaration' do
440
+ @sheet.padding( :top => 10.px ).should include 'padding-top: 10px'
441
+ end
442
+
443
+ it 'takes :left and just makes that declaration' do
444
+ @sheet.padding( :bottom => 15.px ).should include 'padding-bottom: 15px'
445
+ end
446
+ end
447
+
448
+ describe 'table_options' do
449
+ it 'has border option' do
450
+ @sheet.table_options(:border => :collapse).should include 'border-collapse: collapse'
451
+ end
452
+
453
+ it 'border spacing option' do
454
+ @sheet.table_options(:border_spacing => [20.px, 30.px]).should include 'border-spacing: 20px 30px'
455
+ end
456
+
457
+ it 'has a caption option' do
458
+ @sheet.table_options(:caption => :bottom).should include 'caption-side: bottom'
459
+ end
460
+
461
+ it 'has empty option' do
462
+ @sheet.table_options(:empty => :hide).should include 'empty-cells: hide'
463
+ end
464
+
465
+ it 'has a layout' do
466
+ @sheet.table_options(:layout => :fixed).should include 'table-layout: fixed'
467
+ end
468
+ end
469
+
470
+ describe 'print' do
471
+ # orphans Sets the minimum number of lines that must be left at the bottom of a page when a page break occurs inside an element 2
472
+ # page-break-after Sets the page-breaking behavior after an element 2
473
+ # page-break-before Sets the page-breaking behavior before an element 2
474
+ # page-break-inside Sets the page-breaking behavior inside an element 2
475
+ # widows Sets the minimum number of lines that must be left at the top of a page when a page break occurs inside an element 2
476
+ end
477
+
478
+ describe 'misc' do
479
+ # content Used with the :before and :after pseudo-elements, to insert generated content 2
480
+ # counter-increment Increments one or more counters 2
481
+ # counter-reset Creates or resets one or more counters 2
482
+ # quotes Sets the type of quotation marks for embedded quotations 2
483
+ # cursor Specifies the type of cursor to be displayed 2
484
+ it 'has a cursor declaration' do
485
+ @sheet.cursor(:crosshair).should include 'cursor: crosshair'
486
+ end
487
+ end
488
+
489
+ describe 'duplicate declarations' do
490
+ it 'color' do
491
+ @sheet.color(StyleTrain::Color.new('#456')).should include 'color: #456'
492
+ end
493
+
494
+ it 'overflows' do
495
+ @sheet.overflow(:hidden).should include 'overflow: hidden'
496
+ @sheet.overflow(:x => :scroll).should include 'overflow-x: scroll'
497
+ @sheet.overflow(:y => :auto).should include 'overflow-y: auto'
498
+ end
499
+
500
+ it 'display' do
501
+ @sheet.display(:block).should include 'display: block'
502
+ end
503
+
504
+ it 'float' do
505
+ @sheet.float(:left).should include 'float: left'
506
+ end
507
+
508
+ it 'clear' do
509
+ @sheet.clear(:both).should include 'clear: both'
510
+ end
511
+
512
+ it 'visibility' do
513
+ @sheet.visibility(:hidden).should include 'visibility: hidden'
514
+ end
515
+ end
516
+ end
517
+
518
+ describe 'subclassing' do
519
+ class StyleSheet < StyleTrain::Sheet
520
+ def content
521
+ body {
522
+ background :color => '#666'
523
+ text :font => 'verdana'
524
+ }
525
+
526
+ style('#wrapper'){
527
+ background :color => :white
528
+ margin [1.em, :auto]
529
+ }
530
+ end
531
+ end
532
+
533
+ it 'works' do
534
+ StyleSheet.render.should include(
535
+ <<-CSS
536
+ body {
537
+ background-color: #666;
538
+ font-family: verdana;
539
+ }
540
+
541
+ #wrapper {
542
+ background-color: white;
543
+ margin: 1em auto;
544
+ }
545
+ CSS
546
+ )
547
+ end
548
+ end
549
+ end