2 require 'spec/expectations'
3 require 'spec/matchers'
4 require 'spec/example/pending'
9 A World represents the actual instance a scenario will run in.
11 The runner ensures any instance variables and methods defined anywhere
12 in a story block are available to all the scenarios. This includes
13 variables that are created or referenced inside Given, When and Then
17 include ::Spec::Example::Pending
18 include ::Spec::Matchers
19 # store steps and listeners in the singleton metaclass.
20 # This serves both to keep them out of the way of runtime Worlds
21 # and to make them available to all instances.
23 def create(cls = Object, *args)
24 cls.new(*args).extend(World)
31 def add_listener(listener)
32 listeners() << listener
36 @step_mother ||= StepMother.new
40 step_mother.use(steps)
47 def run_given_scenario_with_suspended_listeners(world, type, name, scenario)
48 current_listeners = Array.new(listeners)
50 listeners.each { |l| l.found_scenario(type, name) }
52 scenario.perform(world, name) unless ::Spec::Story::Runner.dry_run
54 @listeners.replace(current_listeners)
58 def store_and_call(world, type, name, *args, &block)
60 step_mother.store(type, Step.new(name, &block))
62 step = step_mother.find(type, name)
65 step_names << step_name
67 # It's important to have access to the parsed args here, so
68 # we can give them to the listeners. The HTML reporter needs
69 # the args so it can style them. See the generated output in
70 # story_server/prototype/rspec_stories.html (generated by rake stories)
71 args = step.parse_args(name) if args.empty?
73 step.perform(world, *args) unless ::Spec::Story::Runner.dry_run
74 listeners.each { |l| l.step_succeeded(type, step_name, *args) }
77 when Spec::Example::ExamplePendingError
78 @listeners.each { |l| l.step_pending(type, step_name, *args) }
80 @listeners.each { |l| l.step_failed(type, step_name, *args) }
89 end # end of class << self
91 def start_collecting_errors
99 def GivenScenario(name)
100 World.run_given_scenario_with_suspended_listeners(self, :'given scenario', name, GivenScenario.new(name))
101 @__previous_step = :given
104 def Given(name, *args, &block)
105 World.store_and_call self, :given, name, *args, &block
106 @__previous_step = :given
109 def When(name, *args, &block)
110 World.store_and_call self, :when, name, *args, &block
111 @__previous_step = :when
114 def Then(name, *args, &block)
115 World.store_and_call self, :then, name, *args, &block
116 @__previous_step = :then
119 def And(name, *args, &block)
120 World.store_and_call self, @__previous_step, name, *args, &block