]> git.openstreetmap.org Git - rails.git/blob - vendor/gems/rspec-1.1.2/lib/spec/story/runner/story_mediator.rb
1f4744b9f87492dcc4c98bd660b2ee2324635dc3
[rails.git] / vendor / gems / rspec-1.1.2 / lib / spec / story / runner / story_mediator.rb
1  module Spec
2   module Story
3     module Runner
4
5       class StoryMediator
6         def initialize(step_group, runner, options={})
7           @step_group = step_group
8           @stories = []
9           @runner = runner
10           @options = options
11         end
12         
13         def stories
14           @stories.collect { |p| p.to_proc }
15         end
16         
17         def create_story(title, narrative)
18           @stories << Story.new(title, narrative, @step_group, @options)
19         end
20         
21         def create_scenario(title)
22           current_story.add_scenario Scenario.new(title)
23         end
24         
25         def create_given(name)
26           current_scenario.add_step Step.new('Given', name)
27         end
28         
29         def create_given_scenario(name)
30           current_scenario.add_step Step.new('GivenScenario', name)
31         end
32         
33         def create_when(name)
34           current_scenario.add_step Step.new('When', name)
35         end
36         
37         def create_then(name)
38           current_scenario.add_step Step.new('Then', name)
39         end
40         
41         def run_stories
42           stories.each { |story| @runner.instance_eval(&story) }
43         end
44         
45         private
46         def current_story
47           @stories.last
48         end
49         
50         def current_scenario
51           current_story.current_scenario
52         end
53         
54         class Story
55           def initialize(title, narrative, step_group, options)
56             @title = title
57             @narrative = narrative
58             @scenarios = []
59             @step_group = step_group
60             @options = options
61           end
62           
63           def to_proc
64             title = @title
65             narrative = @narrative
66             scenarios = @scenarios.collect { |scenario| scenario.to_proc }
67             options = @options.merge(:steps => @step_group)
68             lambda do
69               Story title, narrative, options do
70                 scenarios.each { |scenario| instance_eval(&scenario) }
71               end
72             end
73           end
74           
75           def add_scenario(scenario)
76             @scenarios << scenario
77           end
78           
79           def current_scenario
80             @scenarios.last
81           end
82         end
83         
84         class Scenario
85           def initialize(name)
86             @name = name
87             @steps = []
88           end
89           
90           def to_proc
91             name = @name
92             steps = @steps.collect { |step| step.to_proc }
93             lambda do
94               Scenario name do
95                 steps.each { |step| instance_eval(&step) }
96               end
97             end
98           end
99           
100           def add_step(step)
101             @steps << step
102           end
103         end
104         
105         class Step
106           def initialize(type, name)
107             @type = type
108             @name = name
109           end
110           
111           def to_proc
112             type = @type
113             name = @name
114             lambda do
115               send(type, name)
116             end
117           end
118         end
119       end
120       
121     end
122   end
123 end