cheeky-dreams 0.0.4 → 0.0.5

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.
@@ -4,6 +4,25 @@ describe CheekyDreams do
4
4
 
5
5
  include CheekyDreams
6
6
 
7
+ describe 'sleep_until' do
8
+ describe 'when until is in the past' do
9
+ it "should not sleep" do
10
+ finish = Time.at(0)
11
+ Time.should_receive(:now).and_return(Time.at(1))
12
+ sleep_until finish
13
+ end
14
+ end
15
+
16
+ describe 'when until is in the future' do
17
+ it "should sleep for expected time" do
18
+ finish = Time.at(13.1)
19
+ Time.should_receive(:now).and_return(Time.at(3.2))
20
+ should_receive(:sleep).with(9.9)
21
+ sleep_until finish
22
+ end
23
+ end
24
+ end
25
+
7
26
  describe "find_dream_cheeky_usb_device" do
8
27
  it "should locate the rgb files and return the driver" do
9
28
  Dir.should_receive(:glob).with('/sys/devices/**/red').and_return(["/sys/devices/some-crazy-pci-bus-stuff/red"])
@@ -40,306 +59,412 @@ describe CheekyDreams do
40
59
  end
41
60
  end
42
61
 
43
- describe "rgb_for" do
44
- it "should return rgb array for simple colours" do
45
- rgb_for(:off).should == [0, 0, 0]
46
- rgb_for(:red).should == [255, 0, 0]
47
- rgb_for(:green).should == [0, 255, 0]
48
- rgb_for(:blue).should == [0, 0, 255]
62
+ describe "rgb" do
63
+ it "should return rgb array for simple colour symbols" do
64
+ rgb(:off).should == [0, 0, 0]
65
+ rgb(:red).should == [255, 0, 0]
66
+ rgb(:green).should == [0, 255, 0]
67
+ rgb(:blue).should == [0, 0, 255]
49
68
  end
50
69
 
51
70
  it "should return an rgb array when given one" do
52
- rgb_for([11, 34, 111]).should == [11, 34, 111]
71
+ rgb([11, 34, 111]).should == [11, 34, 111]
72
+ end
73
+
74
+ it "should take var args and return an rgb array" do
75
+ rgb(11, 34, 111).should == [11, 34, 111]
53
76
  end
54
77
 
55
78
  it "should blow up when given meaningless symbol" do
56
- lambda { rgb_for(:purple_patch) }.should raise_error "Unknown colour 'purple_patch'"
79
+ proc { rgb(:purple_patch) }.should raise_error "Unknown colour 'purple_patch'"
57
80
  end
58
81
 
59
82
  it "should blow up when given array that isnt rgb" do
60
- lambda { rgb_for([1]) }.should raise_error "Invalid rgb [1]"
61
- lambda { rgb_for([1, 2, 3, 4]) }.should raise_error "Invalid rgb [1, 2, 3, 4]"
62
- lambda { rgb_for(["a", "b", "c"]) }.should raise_error 'Invalid rgb ["a", "b", "c"]'
83
+ proc { rgb(1, 2) }.should raise_error "Invalid rgb [1, 2]"
84
+ proc { rgb([1, 2, 3, 4]) }.should raise_error "Invalid rgb [1, 2, 3, 4]"
85
+ proc { rgb(["a", "b", "c"]) }.should raise_error 'Invalid rgb ["a", "b", "c"]'
63
86
  end
64
87
 
65
88
  it "should blow up when given invalid rgb values" do
66
- lambda { rgb_for([0, 256, 0]) }.should raise_error "Invalid rgb value 0, 256, 0"
67
- lambda { rgb_for([-1, 0, 0]) }.should raise_error "Invalid rgb value -1, 0, 0"
68
- lambda { rgb_for([0, 0, 256]) }.should raise_error "Invalid rgb value 0, 0, 256"
89
+ proc { rgb([0, 256, 0]) }.should raise_error "Invalid rgb value 0, 256, 0"
90
+ proc { rgb([-1, 0, 0]) }.should raise_error "Invalid rgb value -1, 0, 0"
91
+ proc { rgb([0, 0, 256]) }.should raise_error "Invalid rgb value 0, 0, 256"
92
+ end
93
+
94
+ it "should floor values" do
95
+ rgb(2.4, 0.1, 255.3).should == [2, 0, 255]
69
96
  end
97
+
98
+ describe "creating with values out of range" do
99
+ it "should blow up" do
100
+ proc { rgb(-1, 0, 0) }.should raise_error "Invalid rgb value -1, 0, 0"
101
+ proc { rgb(256, 0, 0) }.should raise_error "Invalid rgb value 256, 0, 0"
102
+ proc { rgb(0, -1, 0) }.should raise_error "Invalid rgb value 0, -1, 0"
103
+ proc { rgb(0, 256, 0) }.should raise_error "Invalid rgb value 0, 256, 0"
104
+ proc { rgb(0, 0, -1) }.should raise_error "Invalid rgb value 0, 0, -1"
105
+ proc { rgb(0, 0, 256) }.should raise_error "Invalid rgb value 0, 0, 256"
106
+ end
107
+ end
70
108
  end
71
- end
72
-
73
- module CheekyDreams::Device
74
109
 
75
- include CheekyDreams
76
-
77
- describe DreamCheeky do
78
- before :each do
79
- @device_path = "/device"
80
- end
110
+ describe 'effects' do
111
+
112
+ include CheekyDreams
81
113
 
82
- describe "when cannot write to the files" do
114
+ describe 'off' do
83
115
  before :each do
84
- @device = DreamCheeky.new @device_path, 255
116
+ @off = off
85
117
  end
86
118
 
87
- describe "making it go 123,34,255" do
119
+ it "should return [0,0,0] every time called" do
120
+ @off.next.should == COLOURS[:off]
121
+ @off.next.should == COLOURS[:off]
122
+ @off.next.should == COLOURS[:off]
123
+ end
124
+ end
125
+
126
+ describe CheekyDreams::Effects::Solid, 'solid' do
127
+ describe "when is symbols" do
88
128
  before :each do
89
- @device.should_receive(:system).with("echo 123 > /device/red").and_return false
129
+ @solid = solid :purple
90
130
  end
91
131
 
92
- it "should turn the light the correct colours" do
93
- lambda { @device.go [123, 34, 255] }.should raise_error "Failed to update /device/red, do you have permissions to write to that file??"
132
+ it "should return rgb every time called" do
133
+ @solid.next.should == COLOURS[:purple]
134
+ @solid.next.should == COLOURS[:purple]
135
+ @solid.next.should == COLOURS[:purple]
136
+ end
137
+ end
138
+
139
+ describe "when is random rgb value" do
140
+ before :each do
141
+ @solid = solid [123, 123, 123]
142
+ end
143
+
144
+ it "should return rgb every time called" do
145
+ @solid.next.should == [123, 123, 123]
146
+ @solid.next.should == [123, 123, 123]
147
+ @solid.next.should == [123, 123, 123]
94
148
  end
95
149
  end
96
150
  end
97
-
98
- describe "when the max threshold is 100" do
151
+
152
+ describe CheekyDreams::Effects::Cycle do
99
153
  before :each do
100
- @device = DreamCheeky.new @device_path, 100
154
+ @cycle = cycle [:red, :blue, [211, 192, 101]], 22
101
155
  end
102
156
 
103
- describe "making it go 123,34,255" do
157
+ it "should have a frequency" do
158
+ @cycle.freq.should == 22
159
+ end
160
+
161
+ it "should cycle through the colours as rgb" do
162
+ @cycle.next.should == [255, 0, 0]
163
+ @cycle.next.should == [ 0, 0, 255]
164
+ @cycle.next.should == [211, 192, 101]
165
+
166
+ @cycle.next.should == [255, 0, 0]
167
+ @cycle.next.should == [ 0, 0, 255]
168
+ @cycle.next.should == [211, 192, 101]
169
+
170
+ @cycle.next.should == [255, 0, 0]
171
+ @cycle.next.should == [ 0, 0, 255]
172
+ @cycle.next.should == [211, 192, 101]
173
+ end
174
+ end
175
+
176
+ describe CheekyDreams::Effects::Fade do
177
+ describe "fading between two symbols" do
104
178
  before :each do
105
- @device.should_receive(:system).with("echo 48 > /device/red").and_return(true)
106
- @device.should_receive(:system).with("echo 13 > /device/green").and_return(true)
107
- @device.should_receive(:system).with("echo 100 > /device/blue").and_return(true)
179
+ @fade = fade :blue, :green, 1, 5
108
180
  end
109
181
 
110
- it "should turn the light the correct colours" do
111
- @device.go [123, 34, 255]
182
+ it "should have a freq of 2" do
183
+ @fade.freq.should == 5
184
+ end
185
+
186
+ it "should be able to provide the steps when asked" do
187
+ @fade.next.should == [ 0, 0, 255]
188
+ @fade.next.should == [ 0, 255, 0]
189
+ @fade.next.should == [ 0, 255, 0]
190
+ @fade.next.should == [ 0, 255, 0]
112
191
  end
113
192
  end
114
-
115
- describe "making it go 0,1,100" do
193
+
194
+ describe "fading between two arbitary rgb values" do
116
195
  before :each do
117
- @device.should_receive(:system).with("echo 0 > /device/red").and_return(true)
118
- @device.should_receive(:system).with("echo 0 > /device/green").and_return(true)
119
- @device.should_receive(:system).with("echo 39 > /device/blue").and_return(true)
196
+ @fade = fade [100, 100, 100], [110, 90, 0], 10, 2
120
197
  end
121
198
 
122
- it "should turn the light the correct colours" do
123
- @device.go [0, 1, 100]
199
+ it "should have a freq of 2" do
200
+ @fade.freq.should == 2
124
201
  end
202
+
203
+ it "should be able to provide the steps when asked" do
204
+ @fade.next.should == [100, 100, 100]
205
+ @fade.next.should == [101, 99, 90]
206
+ @fade.next.should == [102, 98, 80]
207
+ @fade.next.should == [103, 97, 70]
208
+ @fade.next.should == [104, 96, 60]
209
+ @fade.next.should == [105, 95, 50]
210
+ @fade.next.should == [106, 94, 40]
211
+ @fade.next.should == [107, 93, 30]
212
+ @fade.next.should == [108, 92, 20]
213
+ @fade.next.should == [109, 91, 10]
214
+ @fade.next.should == [110, 90, 0]
215
+ # and then continue to provide the same colour
216
+ @fade.next.should == [110, 90, 0]
217
+ @fade.next.should == [110, 90, 0]
218
+ end
125
219
  end
126
220
  end
127
-
128
- describe "when the max threshold is 255" do
129
- before :each do
130
- @device = DreamCheeky.new @device_path, 255
221
+
222
+ describe CheekyDreams::Effects::FadeTo do
223
+ describe "fading to a symbol" do
224
+ before :each do
225
+ @fade_to = fade_to :green, 11, 2
226
+ end
227
+
228
+ it "should have a freq of 2" do
229
+ @fade_to.freq.should == 2
230
+ end
231
+
232
+ it "should be able to gradually go to colour when asked" do
233
+ @fade_to.next([0, 145, 0]).should == [0, 145, 0]
234
+ @fade_to.next([0, 155, 0]).should == [0, 155, 0]
235
+ @fade_to.next([0, 165, 0]).should == [0, 165, 0]
236
+ @fade_to.next([0, 165, 0]).should == [0, 175, 0]
237
+ @fade_to.next([0, 175, 0]).should == [0, 185, 0]
238
+ @fade_to.next([0, 185, 0]).should == [0, 195, 0]
239
+ @fade_to.next([0, 195, 0]).should == [0, 205, 0]
240
+ @fade_to.next([0, 205, 0]).should == [0, 215, 0]
241
+ @fade_to.next([0, 215, 0]).should == [0, 225, 0]
242
+ @fade_to.next([0, 225, 0]).should == [0, 235, 0]
243
+ @fade_to.next([0, 235, 0]).should == [0, 245, 0]
244
+ @fade_to.next([0, 245, 0]).should == [0, 255, 0]
245
+ end
131
246
  end
132
247
 
133
- describe "making it go 123,34,255" do
248
+ describe "fading to a random rgb" do
134
249
  before :each do
135
- @device.should_receive(:system).with("echo 123 > /device/red").and_return(true)
136
- @device.should_receive(:system).with("echo 34 > /device/green").and_return(true)
137
- @device.should_receive(:system).with("echo 255 > /device/blue").and_return(true)
250
+ @fade_to = fade_to [130, 80, 170], 3, 20
138
251
  end
139
252
 
140
- it "should turn the light the correct colours" do
141
- @device.go [123, 34, 255]
253
+ it "should have a freq of 20" do
254
+ @fade_to.freq.should == 20
255
+ end
256
+
257
+ it "should be able to gradually go to colour when asked" do
258
+ @fade_to.next([190, 77, 140]).should == [190, 77, 140]
259
+ @fade_to.next([190, 77, 140]).should == [170, 78, 150]
260
+ @fade_to.next([170, 78, 150]).should == [150, 79, 160]
261
+ @fade_to.next([150, 79, 160]).should == [130, 80, 170]
142
262
  end
143
263
  end
144
264
  end
145
- end
146
- end
147
265
 
148
- module CheekyDreams::Effect
149
-
150
- include CheekyDreams
151
-
152
- describe Solid do
153
- describe "when is symbols" do
154
- before :each do
155
- @solid = Solid.new :purple
266
+ describe CheekyDreams::Effects::Func do
267
+ describe "when the block return rgb values" do
268
+ before :each do
269
+ @func = func(22) { |current_colour| [current_colour[0] + 1, current_colour[1] + 1, current_colour[2] + 1] }
270
+ end
271
+
272
+ it "should have a freq of 22" do
273
+ @func.freq.should == 22
274
+ end
275
+
276
+ it "should return the given rgb plus 1 to each of r, g, and b" do
277
+ @func.next([2, 5, 6]).should == [3, 6, 7]
278
+ end
156
279
  end
157
280
 
158
- it "should return rgb every time called" do
159
- @solid.next.should == COLOURS[:purple]
160
- @solid.next.should == COLOURS[:purple]
161
- @solid.next.should == COLOURS[:purple]
281
+ describe "when the block return symbol" do
282
+ before :each do
283
+ @func = func(22) { |current_colour| :purple }
284
+ end
285
+
286
+ it "should return the rgb for the symbol" do
287
+ @func.next([2, 5, 6]).should == COLOURS[:purple]
288
+ end
162
289
  end
163
290
  end
164
-
165
- describe "when is random rgb value" do
291
+
292
+ describe CheekyDreams::Effects::Throb do
166
293
  before :each do
167
- @solid = Solid.new [123, 123, 123]
294
+ @throb = throb 10, [100, 100, 100], [250, 50, 0]
168
295
  end
169
296
 
170
- it "should return rgb every time called" do
171
- @solid.next.should == [123, 123, 123]
172
- @solid.next.should == [123, 123, 123]
173
- @solid.next.should == [123, 123, 123]
297
+ it "should have r_amp" do
298
+ @throb.r_amp.should == 75
299
+ end
300
+
301
+ it "should have r_centre" do
302
+ @throb.r_centre.should == 175
303
+ end
304
+
305
+ it "should have g_amp" do
306
+ @throb.g_amp.should == 25
307
+ end
308
+
309
+ it "should have g_centre" do
310
+ @throb.g_centre.should == 75
311
+ end
312
+
313
+ it "should have b_amp" do
314
+ @throb.b_amp.should == 50
315
+ end
316
+
317
+ it "should have b_centre" do
318
+ @throb.b_centre.should == 50
174
319
  end
175
320
  end
176
321
  end
177
-
178
- describe Cycle do
322
+ end
323
+
324
+ module CheekyDreams
325
+ describe FilteringAuditor do
179
326
  before :each do
180
- @cycle = Cycle.new [:red, :blue, [211, 192, 101]], 22
327
+ @delegate = mock('delegate auditor')
328
+ @auditor = FilteringAuditor.new @delegate, [:error]
181
329
  end
182
330
 
183
- it "should have a frequency" do
184
- @cycle.freq.should == 22
331
+ it 'should allow through audits of type :error' do
332
+ @delegate.should_receive(:audit).with(:error, 'here')
333
+ @auditor.audit :error, 'here'
185
334
  end
186
335
 
187
- it "should cycle through the colours as rgb" do
188
- @cycle.next.should == [255, 0, 0]
189
- @cycle.next.should == [ 0, 0,255]
190
- @cycle.next.should == [211, 192, 101]
191
-
192
- @cycle.next.should == [255, 0, 0]
193
- @cycle.next.should == [ 0, 0,255]
194
- @cycle.next.should == [211, 192, 101]
195
-
196
- @cycle.next.should == [255, 0, 0]
197
- @cycle.next.should == [ 0, 0,255]
198
- @cycle.next.should == [211, 192, 101]
336
+ it 'should not allow through other random audits' do
337
+ @auditor.audit :error1, 'here'
338
+ @auditor.audit :error2, 'here'
199
339
  end
200
340
  end
201
341
 
202
- describe Fade do
203
- describe "fading between two symbols" do
204
- before :each do
205
- @fade = Fade.new :blue, :green, 1, 5
206
- end
207
-
208
- it "should have a freq of 2" do
209
- @fade.freq.should == 5
210
- end
211
-
212
- it "should be able to provide the steps when asked" do
213
- @fade.next.should == [ 0, 0, 255]
214
- @fade.next.should == [ 0, 255, 0]
215
- @fade.next.should == [ 0, 255, 0]
216
- @fade.next.should == [ 0, 255, 0]
217
- end
342
+ describe CompositeAuditor do
343
+ before :each do
344
+ @auditor1, @auditor2 = mock('auditor1'), mock('auditor2')
345
+ @auditor = CompositeAuditor.new @auditor1, @auditor2
218
346
  end
219
347
 
220
- describe "fading between two arbitary rgb values" do
221
- before :each do
222
- @fade = Fade.new [100, 100, 100], [110, 90, 0], 10, 2
223
- end
224
-
225
- it "should have a freq of 2" do
226
- @fade.freq.should == 2
227
- end
228
-
229
- it "should be able to provide the steps when asked" do
230
- @fade.next.should == [100, 100, 100]
231
- @fade.next.should == [101, 99, 90]
232
- @fade.next.should == [102, 98, 80]
233
- @fade.next.should == [103, 97, 70]
234
- @fade.next.should == [104, 96, 60]
235
- @fade.next.should == [105, 95, 50]
236
- @fade.next.should == [106, 94, 40]
237
- @fade.next.should == [107, 93, 30]
238
- @fade.next.should == [108, 92, 20]
239
- @fade.next.should == [109, 91, 10]
240
- @fade.next.should == [110, 90, 0]
241
- # and then continue to provide the same colour
242
- @fade.next.should == [110, 90, 0]
243
- @fade.next.should == [110, 90, 0]
244
- end
348
+ it 'should notify both auditors' do
349
+ @auditor1.should_receive(:audit).with(:bob, 'marley')
350
+ @auditor2.should_receive(:audit).with(:bob, 'marley')
351
+ @auditor.audit :bob, 'marley'
245
352
  end
246
353
  end
247
354
 
248
- describe FadeTo do
249
- describe "fading to a symbol" do
250
- before :each do
251
- @fade_to = FadeTo.new :green, 11, 2
252
- end
253
-
254
- it "should have a freq of 2" do
255
- @fade_to.freq.should == 2
256
- end
257
-
258
- it "should be able to gradually go to colour when asked" do
259
- @fade_to.next([0, 145, 0]).should == [0, 155, 0]
260
- @fade_to.next([0, 155, 0]).should == [0, 165, 0]
261
- @fade_to.next([0, 165, 0]).should == [0, 175, 0]
262
- @fade_to.next([0, 175, 0]).should == [0, 185, 0]
263
- @fade_to.next([0, 185, 0]).should == [0, 195, 0]
264
- @fade_to.next([0, 195, 0]).should == [0, 205, 0]
265
- @fade_to.next([0, 205, 0]).should == [0, 215, 0]
266
- @fade_to.next([0, 215, 0]).should == [0, 225, 0]
267
- @fade_to.next([0, 225, 0]).should == [0, 235, 0]
268
- @fade_to.next([0, 235, 0]).should == [0, 245, 0]
269
- @fade_to.next([0, 245, 0]).should == [0, 255, 0]
270
- end
271
- end
272
-
273
- describe "fading to a random rgb" do
274
- before :each do
275
- @fade_to = FadeTo.new [130, 80, 170], 3, 20
276
- end
277
-
278
- it "should have a freq of 20" do
279
- @fade_to.freq.should == 20
280
- end
281
-
282
- it "should be able to gradually go to colour when asked" do
283
- @fade_to.next([190, 77, 140]).should == [170, 78, 150]
284
- @fade_to.next([170, 78, 150]).should == [150, 79, 160]
285
- @fade_to.next([150, 79, 160]).should == [130, 80, 170]
286
- end
355
+ describe StdIOAuditor do
356
+ before :each do
357
+ @out, @err = StringIO.new, StringIO.new
358
+ @auditor = StdIOAuditor.new(@out, @err)
359
+ end
360
+
361
+ it 'should report :error to stderr, with newlines between each one' do
362
+ @auditor.audit :error, "damn"
363
+ @auditor.audit :error, "this"
364
+ @out.string.should == ""
365
+ @err.string.should == "error - damn\nerror - this\n"
366
+ end
367
+
368
+ it 'should report other symbols to stdout, with newlines between each one' do
369
+ @auditor.audit :mmmm, "beer"
370
+ @auditor.audit :tastes, "good"
371
+ @out.string.should == "mmmm - beer\ntastes - good\n"
372
+ @err.string.should == ""
287
373
  end
288
374
  end
375
+ end
376
+
377
+ module CheekyDreams::Dev
378
+
379
+ include CheekyDreams
289
380
 
290
- describe Func do
291
- describe "when the block return rgb values" do
381
+ describe IO do
382
+ before :each do
383
+ @io = StringIO.new
384
+ @device = IO.new @io
385
+ end
386
+
387
+ it 'should write colour' do
388
+ @device.go [1, 5, 6]
389
+ @io.string.should == "[1,5,6]\n"
390
+ end
391
+
392
+ it 'should write colour only once when doesnt change' do
393
+ @device.go [1, 5, 6]
394
+ @device.go [4, 4, 4]
395
+ @device.go [4, 4, 4]
396
+ @device.go [2, 3, 4]
397
+ @io.string.should == "[1,5,6]\n[4,4,4]\n[2,3,4]\n"
398
+ end
399
+ end
400
+
401
+ describe DreamCheeky do
402
+ before :each do
403
+ @device_path = "/device"
404
+ end
405
+
406
+ describe "when cannot write to the files" do
292
407
  before :each do
293
- @func = Func.new(22) { |current_colour| [current_colour[0] + 1, current_colour[1] + 1, current_colour[2] + 1] }
294
- end
295
-
296
- it "should have a freq of 22" do
297
- @func.freq.should == 22
408
+ @device = DreamCheeky.new @device_path, 255
298
409
  end
299
-
300
- it "should return the given rgb plus 1 to each of r, g, and b" do
301
- @func.next([2, 5, 6]).should == [3, 6, 7]
410
+
411
+ describe "making it go 123,34,255" do
412
+ before :each do
413
+ @device.should_receive(:system).with("echo 123 > /device/red").and_return false
414
+ end
415
+
416
+ it "should turn the light the correct colours" do
417
+ lambda { @device.go [123, 34, 255] }.should raise_error "Failed to update /device/red, do you have permissions to write to that file??"
418
+ end
302
419
  end
303
420
  end
304
421
 
305
- describe "when the block return symbol" do
422
+ describe "when the max threshold is 100" do
306
423
  before :each do
307
- @func = Func.new(22) { |current_colour| :purple }
424
+ @device = DreamCheeky.new @device_path, 100
425
+ end
426
+
427
+ describe "making it go 123,34,255" do
428
+ before :each do
429
+ @device.should_receive(:system).with("echo 48 > /device/red").and_return(true)
430
+ @device.should_receive(:system).with("echo 13 > /device/green").and_return(true)
431
+ @device.should_receive(:system).with("echo 100 > /device/blue").and_return(true)
432
+ end
433
+
434
+ it "should turn the light the correct colours" do
435
+ @device.go [123, 34, 255]
436
+ end
308
437
  end
309
438
 
310
- it "should return the rgb for the symbol" do
311
- @func.next([2, 5, 6]).should == COLOURS[:purple]
439
+ describe "making it go 0,1,100" do
440
+ before :each do
441
+ @device.should_receive(:system).with("echo 0 > /device/red").and_return(true)
442
+ @device.should_receive(:system).with("echo 0 > /device/green").and_return(true)
443
+ @device.should_receive(:system).with("echo 39 > /device/blue").and_return(true)
444
+ end
445
+
446
+ it "should turn the light the correct colours" do
447
+ @device.go [0, 1, 100]
448
+ end
312
449
  end
313
450
  end
314
- end
315
-
316
- describe Throb do
317
- before :each do
318
- @throb = Throb.new 10, [100, 100, 100], [250, 50, 0]
319
- end
320
-
321
- it "should have r_amp" do
322
- @throb.r_amp.should == 75
323
- end
324
-
325
- it "should have r_centre" do
326
- @throb.r_centre.should == 175
327
- end
328
-
329
- it "should have g_amp" do
330
- @throb.g_amp.should == 25
331
- end
332
-
333
- it "should have g_centre" do
334
- @throb.g_centre.should == 75
335
- end
336
-
337
- it "should have b_amp" do
338
- @throb.b_amp.should == 50
339
- end
340
451
 
341
- it "should have b_centre" do
342
- @throb.b_centre.should == 50
452
+ describe "when the max threshold is 255" do
453
+ before :each do
454
+ @device = DreamCheeky.new @device_path, 255
455
+ end
456
+
457
+ describe "making it go 123,34,255" do
458
+ before :each do
459
+ @device.should_receive(:system).with("echo 123 > /device/red").and_return(true)
460
+ @device.should_receive(:system).with("echo 34 > /device/green").and_return(true)
461
+ @device.should_receive(:system).with("echo 255 > /device/blue").and_return(true)
462
+ end
463
+
464
+ it "should turn the light the correct colours" do
465
+ @device.go [123, 34, 255]
466
+ end
467
+ end
343
468
  end
344
469
  end
345
470
  end
@@ -352,19 +477,26 @@ describe Light do
352
477
  before :each do
353
478
  @driver = StubDriver.new
354
479
  @light = Light.new @driver
480
+ @collecting_auditor = CollectingAuditor.new
481
+ @audit_errors = filtering([:error], stdio_audit)
482
+ @light.auditor = audit_to @audit_errors, @collecting_auditor
483
+ end
484
+
485
+ after :each do
486
+ @light.off
355
487
  end
356
488
 
357
489
  describe "unhandled errors" do
358
490
  before :each do
359
- @error = RuntimeError.new "On purpose error"
491
+ @error_message = "On purpose error"
492
+ @error = RuntimeError.new @error_message
360
493
  @effect = StubEffect.new(20) { raise @error }
361
- @auditor = CollectingAuditor.new
362
- @light.auditor = @auditor
494
+ @light.auditor = @collecting_auditor
363
495
  end
364
496
 
365
497
  it 'should notify the auditor' do
366
498
  @light.go @effect
367
- within(1, "auditor should have received '#{@error}'") { [@auditor.has_received?(@error), @auditor.errors] }
499
+ within(2, "auditor should have received ':error - #{@error_message}'") { [@collecting_auditor.has_received?(:error, @error_message), @collecting_auditor.events] }
368
500
  end
369
501
  end
370
502
 
@@ -412,6 +544,14 @@ describe Light do
412
544
  end
413
545
 
414
546
  describe "changing colour" do
547
+
548
+ include CheekyDreams
549
+
550
+ it "should tell the auditor" do
551
+ @light.go [22, 11, 33]
552
+ within(1, "auditor should have received ':colour_change - [22, 11, 33]'") { [@collecting_auditor.has_received?(:colour_change, "[22, 11, 33]"), @collecting_auditor.events] }
553
+ end
554
+
415
555
  it "should go red" do
416
556
  @light.go :red
417
557
  @driver.should_become [255,0,0]
@@ -428,7 +568,7 @@ describe Light do
428
568
  end
429
569
 
430
570
  it "should blow up if you give it a symbol it doesnt understand" do
431
- lambda { @light.go :pink_with_polka_dots }.should raise_error "Unknown colour 'pink_with_polka_dots'"
571
+ proc { @light.go :pink_with_polka_dots }.should raise_error "Unknown colour 'pink_with_polka_dots'"
432
572
  end
433
573
 
434
574
  it "should be able to go any rgb" do
@@ -442,7 +582,7 @@ describe Light do
442
582
  end
443
583
 
444
584
  it "should be able to cycle between colours when specified as rgb" do
445
- @light.cycle([[255, 255, 255], [200, 200, 200], [100, 100, 100]], 10)
585
+ @light.go cycle([[255, 255, 255], [200, 200, 200], [100, 100, 100]], 10)
446
586
  @driver.should_become [255, 255, 255]
447
587
  @driver.should_become [200, 200, 200]
448
588
  @driver.should_become [100, 100, 100]
@@ -451,7 +591,7 @@ describe Light do
451
591
  end
452
592
 
453
593
  it "should be able to cycle between colours when specified as symbols" do
454
- @light.cycle([:red, :green, :blue], 10)
594
+ @light.go cycle([:red, :green, :blue], 10)
455
595
  @driver.should_become :red
456
596
  @driver.should_become :green
457
597
  @driver.should_become :blue
@@ -460,7 +600,7 @@ describe Light do
460
600
  end
461
601
 
462
602
  it "should be able to fade from one colour to another" do
463
- @light.fade([100, 100, 0], [105, 95, 0], 5, 2)
603
+ @light.go fade([100, 100, 0], [105, 95, 0], 5, 2)
464
604
  @driver.should_become [101, 99, 0]
465
605
  @driver.should_become [102, 98, 0]
466
606
  @driver.should_become [103, 97, 0]
@@ -472,7 +612,7 @@ describe Light do
472
612
  @light.go [100, 100, 0]
473
613
  @driver.should_become [100, 100, 0]
474
614
 
475
- @light.fade_to([105, 95, 0], 5, 2)
615
+ @light.go fade_to([105, 95, 0], 5, 2)
476
616
  @driver.should_become [101, 99, 0]
477
617
  @driver.should_become [102, 98, 0]
478
618
  @driver.should_become [103, 97, 0]
@@ -482,7 +622,7 @@ describe Light do
482
622
 
483
623
  it "should be able to go different colours based on a function" do
484
624
  cycle = [:blue, :red, :green, :purple, :grey, :aqua].cycle
485
- @light.func(10) { cycle.next }
625
+ @light.go func(10) { cycle.next }
486
626
  @driver.should_become :blue
487
627
  @driver.should_become :red
488
628
  @driver.should_become :green
@@ -490,20 +630,12 @@ describe Light do
490
630
  @driver.should_become :grey
491
631
  @driver.should_become :aqua
492
632
  end
493
- end
494
- end
495
-
496
- describe "RGB" do
497
- include CheekyDreams
498
-
499
- describe "creating with values out of range" do
500
- it "should blow up" do
501
- lambda { rgb(-1, 0, 0) }.should raise_error "Invalid rgb value -1, 0, 0"
502
- lambda { rgb(256, 0, 0) }.should raise_error "Invalid rgb value 256, 0, 0"
503
- lambda { rgb(0, -1, 0) }.should raise_error "Invalid rgb value 0, -1, 0"
504
- lambda { rgb(0, 256, 0) }.should raise_error "Invalid rgb value 0, 256, 0"
505
- lambda { rgb(0, 0, -1) }.should raise_error "Invalid rgb value 0, 0, -1"
506
- lambda { rgb(0, 0, 256) }.should raise_error "Invalid rgb value 0, 0, 256"
633
+
634
+ it "should not wait for an effect to finish if a new one is provided" do
635
+ @light.go fade([100, 0, 0], [110, 0, 0], 10, 2)
636
+ @driver.should_become [101, 0, 0]
637
+ @light.go :red
638
+ @driver.should_become [255, 0, 0]
507
639
  end
508
640
  end
509
641
  end