File: bacon.rb

package info (click to toggle)
ruby-em-spec 0.2.7-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, stretch
  • size: 168 kB
  • ctags: 97
  • sloc: ruby: 500; makefile: 3
file content (99 lines) | stat: -rw-r--r-- 2,114 bytes parent folder | download | duplicates (3)
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