@@ -35,12 +35,12 @@ module Concurrent
3535 # dereferenceable
3636
3737 def dereferenceable_subject ( value , opts = { } )
38- opts = opts . merge ( executor : executor )
38+ opts = opts . merge ( executor : Concurrent :: ImmediateExecutor . new )
3939 Agent . new ( value , opts )
4040 end
4141
4242 def dereferenceable_observable ( opts = { } )
43- opts = opts . merge ( executor : executor )
43+ opts = opts . merge ( executor : Concurrent :: ImmediateExecutor . new )
4444 Agent . new ( 0 , opts )
4545 end
4646
@@ -211,201 +211,187 @@ def trigger_observable(observable)
211211 context 'fulfillment' do
212212
213213 it 'process each block in the queue' do
214- @expected = [ ]
215- subject . post { @expected << 1 }
216- subject . post { @expected << 2 }
217- subject . post { @expected << 3 }
218- sleep ( 0.1 )
219- @expected . sort . should eq [ 1 , 2 , 3 ]
214+ latch = Concurrent ::CountDownLatch . new ( 3 )
215+ subject . post { latch . count_down }
216+ subject . post { latch . count_down }
217+ subject . post { latch . count_down }
218+ latch . wait ( 1 ) . should be_true
220219 end
221220
222221 it 'passes the current value to the handler' do
223- @expected = nil
224- Agent . new ( 10 , executor : executor ) . post { |i | @expected = i }
225- sleep ( 0.1 )
226- @expected . should eq 10
222+ latch = Concurrent ::CountDownLatch . new ( 5 )
223+ Agent . new ( latch . count , executor : executor ) . post do |i |
224+ i . times { latch . count_down }
225+ end
226+ latch . wait ( 1 ) . should be_true
227227 end
228228
229229 it 'sets the value to the handler return value on success' do
230- subject . post { 100 }
231- sleep ( 0.1 )
232- subject . value . should eq 100
230+ agent = Agent . new ( 10 , executor : Concurrent ::ImmediateExecutor . new )
231+ agent . value . should eq 10
232+ agent . post { 100 }
233+ agent . value . should eq 100
233234 end
234235
235236 it 'rejects the handler after timeout reached' do
236237 agent = Agent . new ( 0 , timeout : 0.1 , executor : executor )
237238 agent . post { sleep ( 1 ) ; 10 }
239+ sleep ( 0.2 )
238240 agent . value . should eq 0
239241 end
240242 end
241243
242244 context 'validation' do
243245
244246 it 'processes the validator when present' do
245- @expected = nil
246- subject . validate { @expected = 10 ; true }
247+ latch = Concurrent :: CountDownLatch . new ( 1 )
248+ subject . validate { latch . count_down ; true }
247249 subject . post { nil }
248- sleep ( 0.1 )
249- @expected . should eq 10
250+ latch . wait ( 1 ) . should be_true
250251 end
251252
252253 it 'passes the new value to the validator' do
253- @expected = nil
254- subject . validate { |v | @expected = v ; true }
254+ expected = Concurrent ::AtomicFixnum . new ( 0 )
255+ latch = Concurrent ::CountDownLatch . new ( 1 )
256+ subject . validate { |v | expected . value = v ; latch . count_down ; true }
255257 subject . post { 10 }
256- sleep ( 0. 1)
257- @ expected. should eq 10
258+ latch . wait ( 1 )
259+ expected . value . should eq 10
258260 end
259261
260262 it 'sets the new value when the validator returns true' do
261- agent = Agent . new ( 0 , executor : executor ) . validate { true }
263+ agent = Agent . new ( 0 , executor : Concurrent :: ImmediateExecutor . new ) . validate { true }
262264 agent . post { 10 }
263- sleep ( 0.1 )
264265 agent . value . should eq 10
265266 end
266267
267268 it 'does not change the value when the validator returns false' do
268- agent = Agent . new ( 0 , executor : executor ) . validate { false }
269+ agent = Agent . new ( 0 , executor : Concurrent :: ImmediateExecutor . new ) . validate { false }
269270 agent . post { 10 }
270- sleep ( 0.1 )
271271 agent . value . should eq 0
272272 end
273273
274274 it 'does not change the value when the validator raises an exception' do
275- agent = Agent . new ( 0 , executor : executor ) . validate { raise StandardError }
275+ agent = Agent . new ( 0 , executor : Concurrent :: ImmediateExecutor . new ) . validate { raise StandardError }
276276 agent . post { 10 }
277- sleep ( 0.1 )
278277 agent . value . should eq 0
279278 end
280279 end
281280
282281 context 'rejection' do
283282
284283 it 'calls the first exception block with a matching class' do
285- @expected = nil
286- subject .
287- rescue ( StandardError ) { |ex | @expected = 1 } .
288- rescue ( StandardError ) { |ex | @expected = 2 } .
289- rescue ( StandardError ) { |ex | @expected = 3 }
290- subject . post { raise StandardError }
291- sleep ( 0.1 )
292- @expected . should eq 1
284+ expected = nil
285+ agent = Agent . new ( 0 , executor : Concurrent ::ImmediateExecutor . new ) .
286+ rescue ( StandardError ) { |ex | expected = 1 } .
287+ rescue ( StandardError ) { |ex | expected = 2 } .
288+ rescue ( StandardError ) { |ex | expected = 3 }
289+ agent . post { raise StandardError }
290+ expected . should eq 1
293291 end
294292
295293 it 'matches all with a rescue with no class given' do
296- @expected = nil
297- subject .
298- rescue ( LoadError ) { |ex | @expected = 1 } .
299- rescue { |ex | @expected = 2 } .
300- rescue ( StandardError ) { |ex | @expected = 3 }
301- subject . post { raise NoMethodError }
302- sleep ( 0.1 )
303- @expected . should eq 2
294+ expected = nil
295+ agent = Agent . new ( 0 , executor : Concurrent ::ImmediateExecutor . new ) .
296+ rescue ( LoadError ) { |ex | expected = 1 } .
297+ rescue { |ex | expected = 2 } .
298+ rescue ( StandardError ) { |ex | expected = 3 }
299+ agent . post { raise NoMethodError }
300+ expected . should eq 2
304301 end
305302
306303 it 'searches associated rescue handlers in order' do
307- @expected = nil
308- subject .
309- rescue ( ArgumentError ) { |ex | @expected = 1 } .
310- rescue ( LoadError ) { |ex | @expected = 2 } .
311- rescue ( StandardError ) { |ex | @expected = 3 }
312- subject . post { raise ArgumentError }
313- sleep ( 0.1 )
314- @expected . should eq 1
315-
316- @expected = nil
317- subject .
318- rescue ( ArgumentError ) { |ex | @expected = 1 } .
319- rescue ( LoadError ) { |ex | @expected = 2 } .
320- rescue ( StandardError ) { |ex | @expected = 3 }
321- subject . post { raise LoadError }
322- sleep ( 0.1 )
323- @expected . should eq 2
324-
325- @expected = nil
326- subject .
327- rescue ( ArgumentError ) { |ex | @expected = 1 } .
328- rescue ( LoadError ) { |ex | @expected = 2 } .
329- rescue ( StandardError ) { |ex | @expected = 3 }
330- subject . post { raise StandardError }
331- sleep ( 0.1 )
332- @expected . should eq 3
304+ expected = nil
305+ agent = Agent . new ( 0 , executor : Concurrent ::ImmediateExecutor . new ) .
306+ rescue ( ArgumentError ) { |ex | expected = 1 } .
307+ rescue ( LoadError ) { |ex | expected = 2 } .
308+ rescue ( StandardError ) { |ex | expected = 3 }
309+ agent . post { raise ArgumentError }
310+ expected . should eq 1
311+
312+ expected = nil
313+ agent = Agent . new ( 0 , executor : Concurrent ::ImmediateExecutor . new ) .
314+ rescue ( ArgumentError ) { |ex | expected = 1 } .
315+ rescue ( LoadError ) { |ex | expected = 2 } .
316+ rescue ( StandardError ) { |ex | expected = 3 }
317+ agent . post { raise LoadError }
318+ expected . should eq 2
319+
320+ expected = nil
321+ agent = Agent . new ( 0 , executor : Concurrent ::ImmediateExecutor . new ) .
322+ rescue ( ArgumentError ) { |ex | expected = 1 } .
323+ rescue ( LoadError ) { |ex | expected = 2 } .
324+ rescue ( StandardError ) { |ex | expected = 3 }
325+ agent . post { raise StandardError }
326+ expected . should eq 3
333327 end
334328
335329 it 'passes the exception object to the matched block' do
336- @expected = nil
337- subject .
338- rescue ( ArgumentError ) { |ex | @expected = ex } .
339- rescue ( LoadError ) { |ex | @expected = ex } .
340- rescue ( StandardError ) { |ex | @expected = ex }
341- subject . post { raise StandardError }
342- sleep ( 0.1 )
343- @expected . should be_a ( StandardError )
330+ expected = nil
331+ agent = Agent . new ( 0 , executor : Concurrent ::ImmediateExecutor . new ) .
332+ rescue ( ArgumentError ) { |ex | expected = ex } .
333+ rescue ( LoadError ) { |ex | expected = ex } .
334+ rescue ( StandardError ) { |ex | expected = ex }
335+ agent . post { raise StandardError }
336+ expected . should be_a ( StandardError )
344337 end
345338
346339 it 'ignores rescuers without a block' do
347- @ expected = nil
348- subject .
340+ expected = nil
341+ agent = Agent . new ( 0 , executor : Concurrent :: ImmediateExecutor . new ) .
349342 rescue ( StandardError ) .
350- rescue ( StandardError ) { |ex | @expected = ex }
351- subject . post { raise StandardError }
352- sleep ( 0.1 )
353- @expected . should be_a ( StandardError )
343+ rescue ( StandardError ) { |ex | expected = ex }
344+ agent . post { raise StandardError }
345+ expected . should be_a ( StandardError )
354346 end
355347
356348 it 'supresses the exception if no rescue matches' do
357349 lambda {
358- subject .
350+ agent = Agent . new ( 0 , executor : Concurrent :: ImmediateExecutor . new ) .
359351 rescue ( ArgumentError ) { |ex | @expected = ex } .
360352 rescue ( NotImplementedError ) { |ex | @expected = ex } .
361353 rescue ( NoMethodError ) { |ex | @expected = ex }
362- subject . post { raise StandardError }
363- sleep ( 0.1 )
354+ agent . post { raise StandardError }
364355 } . should_not raise_error
365356 end
366357
367358 it 'suppresses exceptions thrown from rescue handlers' do
368359 lambda {
369- subject . rescue ( StandardError ) { raise StandardError }
370- subject . post { raise ArgumentError }
371- sleep ( 0.1 )
360+ agent = Agent . new ( 0 , executor : Concurrent ::ImmediateExecutor . new ) . rescue ( StandardError ) { raise StandardError }
361+ agent . post { raise ArgumentError }
372362 } . should_not raise_error
373363 end
374364 end
375365
376366 context 'observation' do
377367
378368 it 'notifies all observers when the value changes' do
379- agent = Agent . new ( 0 , executor : executor )
369+ agent = Agent . new ( 0 , executor : Concurrent :: ImmediateExecutor . new )
380370 agent . add_observer ( observer )
381371 agent . post { 10 }
382- sleep ( 0.1 )
383372 observer . value . should eq 10
384373 end
385374
386375 it 'does not notify removed observers when the value changes' do
387- agent = Agent . new ( 0 , executor : executor )
376+ agent = Agent . new ( 0 , executor : Concurrent :: ImmediateExecutor . new )
388377 agent . add_observer ( observer )
389378 agent . delete_observer ( observer )
390379 agent . post { 10 }
391- sleep ( 0.1 )
392380 observer . value . should be_nil
393381 end
394382
395383 it 'does not notify observers when validation fails' do
396- agent = Agent . new ( 0 , executor : executor )
384+ agent = Agent . new ( 0 , executor : Concurrent :: ImmediateExecutor . new )
397385 agent . validate { false }
398386 agent . add_observer ( observer )
399387 agent . post { 10 }
400- sleep ( 0.1 )
401388 observer . value . should be_nil
402389 end
403390
404391 it 'does not notify observers when the handler raises an exception' do
405- agent = Agent . new ( 0 , executor : executor )
392+ agent = Agent . new ( 0 , executor : Concurrent :: ImmediateExecutor . new )
406393 agent . add_observer ( observer )
407394 agent . post { raise StandardError }
408- sleep ( 0.1 )
409395 observer . value . should be_nil
410396 end
411397 end
@@ -457,43 +443,40 @@ def trigger_observable(observable)
457443 end
458444
459445 it 'aliases #validates for :validate' do
460- @expected = nil
461- subject . validates { |v | @expected = v }
462- subject . post { 10 }
463- sleep ( 0.1 )
464- @expected . should eq 10
446+ latch = Concurrent ::CountDownLatch . new ( 1 )
447+ subject . validates { latch . count_down ; true }
448+ subject . post { nil }
449+ latch . wait ( 1 ) . should be_true
465450 end
466451
467452 it 'aliases #validate_with for :validate' do
468- @expected = nil
469- subject . validate_with { |v | @expected = v }
470- subject . post { 10 }
471- sleep ( 0.1 )
472- @expected . should eq 10
453+ latch = Concurrent ::CountDownLatch . new ( 1 )
454+ subject . validate_with { latch . count_down ; true }
455+ subject . post { nil }
456+ latch . wait ( 1 ) . should be_true
473457 end
474458
475459 it 'aliases #validates_with for :validate' do
476- @expected = nil
477- subject . validates_with { |v | @expected = v }
478- subject . post { 10 }
479- sleep ( 0.1 )
480- @expected . should eq 10
460+ latch = Concurrent ::CountDownLatch . new ( 1 )
461+ subject . validates_with { latch . count_down ; true }
462+ subject . post { nil }
463+ latch . wait ( 1 ) . should be_true
481464 end
482465
483466 it 'aliases #catch for #rescue' do
484- @expected = nil
485- subject . catch { @ expected = true }
486- subject . post { raise StandardError }
487- sleep ( 0.1 )
488- @expected . should be_true
467+ agent = Agent . new ( 0 , executor : Concurrent :: ImmediateExecutor . new )
468+ expected = nil
469+ agent . catch { expected = true }
470+ agent . post { raise StandardError }
471+ agent . should be_true
489472 end
490473
491474 it 'aliases #on_error for #rescue' do
492- @expected = nil
493- subject . on_error { @ expected = true }
494- subject . post { raise StandardError }
495- sleep ( 0.1 )
496- @expected . should be_true
475+ agent = Agent . new ( 0 , executor : Concurrent :: ImmediateExecutor . new )
476+ expected = nil
477+ agent . on_error { expected = true }
478+ agent . post { raise StandardError }
479+ agent . should be_true
497480 end
498481 end
499482 end
0 commit comments