1 require File.dirname(__FILE__) + '/../../../../spec_helper.rb'
2 require 'spec/runner/formatter/story/plain_text_formatter'
8 describe PlainTextFormatter do
12 @tweaker = mock('tweaker')
13 @tweaker.stub!(:tweak_backtrace)
14 @options = mock('options')
15 @options.stub!(:colour).and_return(false)
16 @options.stub!(:backtrace_tweaker).and_return(@tweaker)
17 @formatter = PlainTextFormatter.new(@options, @out)
20 it 'should summarize the number of scenarios when the run ends' do
22 @formatter.run_started(3)
23 @formatter.scenario_started(nil, nil)
24 @formatter.scenario_succeeded('story', 'scenario1')
25 @formatter.scenario_started(nil, nil)
26 @formatter.scenario_succeeded('story', 'scenario2')
27 @formatter.scenario_started(nil, nil)
28 @formatter.scenario_succeeded('story', 'scenario3')
32 @out.string.should include('3 scenarios')
35 it 'should summarize the number of successful scenarios when the run ends' do
37 @formatter.run_started(3)
38 @formatter.scenario_started(nil, nil)
39 @formatter.scenario_succeeded('story', 'scenario1')
40 @formatter.scenario_started(nil, nil)
41 @formatter.scenario_succeeded('story', 'scenario2')
42 @formatter.scenario_started(nil, nil)
43 @formatter.scenario_succeeded('story', 'scenario3')
47 @out.string.should include('3 scenarios: 3 succeeded')
50 it 'should summarize the number of failed scenarios when the run ends' do
52 @formatter.run_started(3)
53 @formatter.scenario_started(nil, nil)
54 @formatter.scenario_succeeded('story', 'scenario1')
55 @formatter.scenario_started(nil, nil)
56 @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops' })
57 @formatter.scenario_started(nil, nil)
58 @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' })
62 @out.string.should include("3 scenarios: 1 succeeded, 2 failed")
65 it 'should end cleanly (no characters on the last line) with successes' do
67 @formatter.run_started(1)
68 @formatter.scenario_started(nil, nil)
69 @formatter.scenario_succeeded('story', 'scenario')
73 @out.string.should =~ /\n\z/
76 it 'should end cleanly (no characters on the last line) with failures' do
78 @formatter.run_started(1)
79 @formatter.scenario_started(nil, nil)
80 @formatter.scenario_failed('story', 'scenario', exception_from { raise RuntimeError, 'oops' })
84 @out.string.should =~ /\n\z/
87 it 'should end cleanly (no characters on the last line) with pending steps' do
89 @formatter.run_started(1)
90 @formatter.scenario_started(nil, nil)
91 @formatter.step_pending(:then, 'do pend')
92 @formatter.scenario_pending('story', 'scenario', exception_from { raise RuntimeError, 'oops' })
96 @out.string.should =~ /\n\z/
99 it 'should summarize the number of pending scenarios when the run ends' do
101 @formatter.run_started(3)
102 @formatter.scenario_started(nil, nil)
103 @formatter.scenario_succeeded('story', 'scenario1')
104 @formatter.scenario_started(nil, nil)
105 @formatter.scenario_pending('story', 'scenario2', 'message')
106 @formatter.scenario_started(nil, nil)
107 @formatter.scenario_pending('story', 'scenario3', 'message')
111 @out.string.should include("3 scenarios: 1 succeeded, 0 failed, 2 pending")
114 it "should only count the first failure in one scenario" do
116 @formatter.run_started(3)
117 @formatter.scenario_started(nil, nil)
118 @formatter.scenario_succeeded('story', 'scenario1')
119 @formatter.scenario_started(nil, nil)
120 @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops' })
121 @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops again' })
122 @formatter.scenario_started(nil, nil)
123 @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' })
127 @out.string.should include("3 scenarios: 1 succeeded, 2 failed")
130 it "should only count the first pending in one scenario" do
132 @formatter.run_started(3)
133 @formatter.scenario_started(nil, nil)
134 @formatter.scenario_succeeded('story', 'scenario1')
135 @formatter.scenario_started(nil, nil)
136 @formatter.scenario_pending('story', 'scenario2', 'because ...')
137 @formatter.scenario_pending('story', 'scenario2', 'because ...')
138 @formatter.scenario_started(nil, nil)
139 @formatter.scenario_pending('story', 'scenario3', 'because ...')
143 @out.string.should include("3 scenarios: 1 succeeded, 0 failed, 2 pending")
146 it "should only count a failure before the first pending in one scenario" do
148 @formatter.run_started(3)
149 @formatter.scenario_started(nil, nil)
150 @formatter.scenario_succeeded('story', 'scenario1')
151 @formatter.scenario_started(nil, nil)
152 @formatter.scenario_pending('story', 'scenario2', exception_from { raise RuntimeError, 'oops' })
153 @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops again' })
154 @formatter.scenario_started(nil, nil)
155 @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' })
159 @out.string.should include("3 scenarios: 1 succeeded, 1 failed, 1 pending")
162 it 'should produce details of the first failure each failed scenario when the run ends' do
164 @formatter.run_started(3)
165 @formatter.scenario_started(nil, nil)
166 @formatter.scenario_succeeded('story', 'scenario1')
167 @formatter.scenario_started(nil, nil)
168 @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops2' })
169 @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops2 - this one should not appear' })
170 @formatter.scenario_started(nil, nil)
171 @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops3' })
175 @out.string.should include("FAILURES:\n")
176 @out.string.should include("1) story (scenario2) FAILED")
177 @out.string.should include("RuntimeError: oops2")
178 @out.string.should_not include("RuntimeError: oops2 - this one should not appear")
179 @out.string.should include("2) story (scenario3) FAILED")
180 @out.string.should include("RuntimeError: oops3")
183 it 'should produce details of each pending step when the run ends' do
185 @formatter.run_started(2)
186 @formatter.story_started('story 1', 'narrative')
187 @formatter.scenario_started('story 1', 'scenario 1')
188 @formatter.step_pending(:given, 'todo 1', [])
189 @formatter.story_started('story 2', 'narrative')
190 @formatter.scenario_started('story 2', 'scenario 2')
191 @formatter.step_pending(:given, 'todo 2', [])
195 @out.string.should include("Pending Steps:\n")
196 @out.string.should include("1) story 1 (scenario 1): todo 1")
197 @out.string.should include("2) story 2 (scenario 2): todo 2")
200 it 'should document a story title and narrative' do
202 @formatter.story_started 'story', 'narrative'
205 @out.string.should include("Story: story\n\n narrative")
208 it 'should document a scenario name' do
210 @formatter.scenario_started 'story', 'scenario'
213 @out.string.should include("\n\n Scenario: scenario")
216 it 'should document a step by sentence-casing its name' do
218 @formatter.step_succeeded :given, 'a context'
219 @formatter.step_succeeded :when, 'an event'
220 @formatter.step_succeeded :then, 'an outcome'
223 @out.string.should include("\n\n Given a context\n\n When an event\n\n Then an outcome")
226 it 'should document additional givens using And' do
228 @formatter.step_succeeded :given, 'step 1'
229 @formatter.step_succeeded :given, 'step 2'
230 @formatter.step_succeeded :given, 'step 3'
233 @out.string.should include(" Given step 1\n And step 2\n And step 3")
236 it 'should document additional events using And' do
238 @formatter.step_succeeded :when, 'step 1'
239 @formatter.step_succeeded :when, 'step 2'
240 @formatter.step_succeeded :when, 'step 3'
243 @out.string.should include(" When step 1\n And step 2\n And step 3")
246 it 'should document additional outcomes using And' do
248 @formatter.step_succeeded :then, 'step 1'
249 @formatter.step_succeeded :then, 'step 2'
250 @formatter.step_succeeded :then, 'step 3'
253 @out.string.should include(" Then step 1\n And step 2\n And step 3")
256 it 'should document a GivenScenario followed by a Given using And' do
258 @formatter.step_succeeded :'given scenario', 'a scenario'
259 @formatter.step_succeeded :given, 'a context'
262 @out.string.should include(" Given scenario a scenario\n And a context")
265 it 'should document steps with replaced params' do
266 @formatter.step_succeeded :given, 'a $coloured dog with $n legs', 'pink', 21
267 @out.string.should include(" Given a pink dog with 21 legs")
270 it 'should document regexp steps with replaced params' do
271 @formatter.step_succeeded :given, /a (pink|blue) dog with (.*) legs/, 'pink', 21
272 @out.string.should include(" Given a pink dog with 21 legs")
275 it "should append PENDING for the first pending step" do
276 @formatter.scenario_started('','')
277 @formatter.step_pending(:given, 'a context')
279 @out.string.should include('Given a context (PENDING)')
282 it "should append PENDING for pending after already pending" do
283 @formatter.scenario_started('','')
284 @formatter.step_pending(:given, 'a context')
285 @formatter.step_pending(:when, 'I say hey')
287 @out.string.should include('When I say hey (PENDING)')
290 it "should append FAILED for the first failiure" do
291 @formatter.scenario_started('','')
292 @formatter.step_failed(:given, 'a context')
294 @out.string.should include('Given a context (FAILED)')
297 it "should append SKIPPED for the second failiure" do
298 @formatter.scenario_started('','')
299 @formatter.step_failed(:given, 'a context')
300 @formatter.step_failed(:when, 'I say hey')
302 @out.string.should include('When I say hey (SKIPPED)')
305 it "should append SKIPPED for the a failiure after PENDING" do
306 @formatter.scenario_started('','')
307 @formatter.step_pending(:given, 'a context')
308 @formatter.step_failed(:when, 'I say hey')
310 @out.string.should include('When I say hey (SKIPPED)')
313 it 'should print some white space after each story' do
315 @formatter.story_ended 'title', 'narrative'
318 @out.string.should include("\n\n")
321 it "should print nothing for collected_steps" do
322 @formatter.collected_steps(['Given a $coloured $animal', 'Given a $n legged eel'])
323 @out.string.should == ("")
326 it "should ignore messages it doesn't care about" do
328 @formatter.this_method_does_not_exist
329 }.should_not raise_error