1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
require File.dirname(__FILE__) + '/../ext/fiber18'
# dependencies are added in debian/control
# require 'rubygems'
require 'eventmachine'
require 'bacon'
module EventMachine
def self.spec_backend=( backend )
@spec_backend = backend
end
def self.spec_backend
@spec_backend
end
def self.spec *args, &blk
raise ArgumentError, 'block required' unless block_given?
raise 'EventMachine reactor already running' if EM.reactor_running?
spec_backend.spec( args, blk )
end
class << self; alias :describe :spec; end
def self.bacon( *args, &block )
require File.dirname(__FILE__) + '/spec/bacon'
self.spec_backend = EventMachine::Spec::Bacon
self.spec( args, &block )
end
end
module EventMachine
module Spec
module Bacon
def self.spec( args, blk )
EM.run do
::Bacon.summary_on_exit
($em_spec_fiber = Fiber.new{
::Bacon::FiberedContext.new(args.join(' '), &blk).run
EM.stop_event_loop
}).resume
end
end
end
end
end
class Bacon::FiberedContext < Bacon::Context
SpecTimeoutExceededError = Class.new(RuntimeError)
def default_timeout(timeout)
$_em_default_time_to_finish = timeout
end
def cancel_timer
EM.cancel_timer($_em_timer) if $_em_timer
end
def timeout(time_to_run)
cancel_timer
$_em_timer = EM.add_timer(time_to_run) { done(false) }
end
def it *args
super{
if block_given?
if $_em_default_time_to_finish
timeout($_em_default_time_to_finish)
end
yield
Fiber.yield
end
}
end
def describe(*args, &block)
context = Bacon::FiberedContext.new(args.join(' '), &block)
@before.each { |b| context.before(&b) }
@after.each { |b| context.after(&b) }
context.run
end
def done(succeed = true)
cancel_timer
EM.next_tick{
if succeed
:done.should == :done
else
should.flunk
end
$em_spec_fiber.resume if $em_spec_fiber
}
end
end
|