--- /dev/null
+require File.dirname(__FILE__) + '/../../../../spec_helper.rb'
+require 'spec/runner/formatter/story/plain_text_formatter'
+
+module Spec
+ module Runner
+ module Formatter
+ module Story
+ describe PlainTextFormatter do
+ before :each do
+ # given
+ @out = StringIO.new
+ @tweaker = mock('tweaker')
+ @tweaker.stub!(:tweak_backtrace)
+ @options = mock('options')
+ @options.stub!(:colour).and_return(false)
+ @options.stub!(:backtrace_tweaker).and_return(@tweaker)
+ @formatter = PlainTextFormatter.new(@options, @out)
+ end
+
+ it 'should summarize the number of scenarios when the run ends' do
+ # when
+ @formatter.run_started(3)
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario1')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario2')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario3')
+ @formatter.run_ended
+
+ # then
+ @out.string.should include('3 scenarios')
+ end
+
+ it 'should summarize the number of successful scenarios when the run ends' do
+ # when
+ @formatter.run_started(3)
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario1')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario2')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario3')
+ @formatter.run_ended
+
+ # then
+ @out.string.should include('3 scenarios: 3 succeeded')
+ end
+
+ it 'should summarize the number of failed scenarios when the run ends' do
+ # when
+ @formatter.run_started(3)
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario1')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops' })
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' })
+ @formatter.run_ended
+
+ # then
+ @out.string.should include("3 scenarios: 1 succeeded, 2 failed")
+ end
+
+ it 'should end cleanly (no characters on the last line) with successes' do
+ # when
+ @formatter.run_started(1)
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario')
+ @formatter.run_ended
+
+ # then
+ @out.string.should =~ /\n\z/
+ end
+
+ it 'should end cleanly (no characters on the last line) with failures' do
+ # when
+ @formatter.run_started(1)
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_failed('story', 'scenario', exception_from { raise RuntimeError, 'oops' })
+ @formatter.run_ended
+
+ # then
+ @out.string.should =~ /\n\z/
+ end
+
+ it 'should end cleanly (no characters on the last line) with pending steps' do
+ # when
+ @formatter.run_started(1)
+ @formatter.scenario_started(nil, nil)
+ @formatter.step_pending(:then, 'do pend')
+ @formatter.scenario_pending('story', 'scenario', exception_from { raise RuntimeError, 'oops' })
+ @formatter.run_ended
+
+ # then
+ @out.string.should =~ /\n\z/
+ end
+
+ it 'should summarize the number of pending scenarios when the run ends' do
+ # when
+ @formatter.run_started(3)
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario1')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_pending('story', 'scenario2', 'message')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_pending('story', 'scenario3', 'message')
+ @formatter.run_ended
+
+ # then
+ @out.string.should include("3 scenarios: 1 succeeded, 0 failed, 2 pending")
+ end
+
+ it "should only count the first failure in one scenario" do
+ # when
+ @formatter.run_started(3)
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario1')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops' })
+ @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops again' })
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' })
+ @formatter.run_ended
+
+ # then
+ @out.string.should include("3 scenarios: 1 succeeded, 2 failed")
+ end
+
+ it "should only count the first pending in one scenario" do
+ # when
+ @formatter.run_started(3)
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario1')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_pending('story', 'scenario2', 'because ...')
+ @formatter.scenario_pending('story', 'scenario2', 'because ...')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_pending('story', 'scenario3', 'because ...')
+ @formatter.run_ended
+
+ # then
+ @out.string.should include("3 scenarios: 1 succeeded, 0 failed, 2 pending")
+ end
+
+ it "should only count a failure before the first pending in one scenario" do
+ # when
+ @formatter.run_started(3)
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario1')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_pending('story', 'scenario2', exception_from { raise RuntimeError, 'oops' })
+ @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops again' })
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' })
+ @formatter.run_ended
+
+ # then
+ @out.string.should include("3 scenarios: 1 succeeded, 1 failed, 1 pending")
+ end
+
+ it 'should produce details of the first failure each failed scenario when the run ends' do
+ # when
+ @formatter.run_started(3)
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_succeeded('story', 'scenario1')
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops2' })
+ @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops2 - this one should not appear' })
+ @formatter.scenario_started(nil, nil)
+ @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops3' })
+ @formatter.run_ended
+
+ # then
+ @out.string.should include("FAILURES:\n")
+ @out.string.should include("1) story (scenario2) FAILED")
+ @out.string.should include("RuntimeError: oops2")
+ @out.string.should_not include("RuntimeError: oops2 - this one should not appear")
+ @out.string.should include("2) story (scenario3) FAILED")
+ @out.string.should include("RuntimeError: oops3")
+ end
+
+ it 'should produce details of each pending step when the run ends' do
+ # when
+ @formatter.run_started(2)
+ @formatter.story_started('story 1', 'narrative')
+ @formatter.scenario_started('story 1', 'scenario 1')
+ @formatter.step_pending(:given, 'todo 1', [])
+ @formatter.story_started('story 2', 'narrative')
+ @formatter.scenario_started('story 2', 'scenario 2')
+ @formatter.step_pending(:given, 'todo 2', [])
+ @formatter.run_ended
+
+ # then
+ @out.string.should include("Pending Steps:\n")
+ @out.string.should include("1) story 1 (scenario 1): todo 1")
+ @out.string.should include("2) story 2 (scenario 2): todo 2")
+ end
+
+ it 'should document a story title and narrative' do
+ # when
+ @formatter.story_started 'story', 'narrative'
+
+ # then
+ @out.string.should include("Story: story\n\n narrative")
+ end
+
+ it 'should document a scenario name' do
+ # when
+ @formatter.scenario_started 'story', 'scenario'
+
+ # then
+ @out.string.should include("\n\n Scenario: scenario")
+ end
+
+ it 'should document a step by sentence-casing its name' do
+ # when
+ @formatter.step_succeeded :given, 'a context'
+ @formatter.step_succeeded :when, 'an event'
+ @formatter.step_succeeded :then, 'an outcome'
+
+ # then
+ @out.string.should include("\n\n Given a context\n\n When an event\n\n Then an outcome")
+ end
+
+ it 'should document additional givens using And' do
+ # when
+ @formatter.step_succeeded :given, 'step 1'
+ @formatter.step_succeeded :given, 'step 2'
+ @formatter.step_succeeded :given, 'step 3'
+
+ # then
+ @out.string.should include(" Given step 1\n And step 2\n And step 3")
+ end
+
+ it 'should document additional events using And' do
+ # when
+ @formatter.step_succeeded :when, 'step 1'
+ @formatter.step_succeeded :when, 'step 2'
+ @formatter.step_succeeded :when, 'step 3'
+
+ # then
+ @out.string.should include(" When step 1\n And step 2\n And step 3")
+ end
+
+ it 'should document additional outcomes using And' do
+ # when
+ @formatter.step_succeeded :then, 'step 1'
+ @formatter.step_succeeded :then, 'step 2'
+ @formatter.step_succeeded :then, 'step 3'
+
+ # then
+ @out.string.should include(" Then step 1\n And step 2\n And step 3")
+ end
+
+ it 'should document a GivenScenario followed by a Given using And' do
+ # when
+ @formatter.step_succeeded :'given scenario', 'a scenario'
+ @formatter.step_succeeded :given, 'a context'
+
+ # then
+ @out.string.should include(" Given scenario a scenario\n And a context")
+ end
+
+ it 'should document steps with replaced params' do
+ @formatter.step_succeeded :given, 'a $coloured dog with $n legs', 'pink', 21
+ @out.string.should include(" Given a pink dog with 21 legs")
+ end
+
+ it 'should document regexp steps with replaced params' do
+ @formatter.step_succeeded :given, /a (pink|blue) dog with (.*) legs/, 'pink', 21
+ @out.string.should include(" Given a pink dog with 21 legs")
+ end
+
+ it "should append PENDING for the first pending step" do
+ @formatter.scenario_started('','')
+ @formatter.step_pending(:given, 'a context')
+
+ @out.string.should include('Given a context (PENDING)')
+ end
+
+ it "should append PENDING for pending after already pending" do
+ @formatter.scenario_started('','')
+ @formatter.step_pending(:given, 'a context')
+ @formatter.step_pending(:when, 'I say hey')
+
+ @out.string.should include('When I say hey (PENDING)')
+ end
+
+ it "should append FAILED for the first failiure" do
+ @formatter.scenario_started('','')
+ @formatter.step_failed(:given, 'a context')
+
+ @out.string.should include('Given a context (FAILED)')
+ end
+
+ it "should append SKIPPED for the second failiure" do
+ @formatter.scenario_started('','')
+ @formatter.step_failed(:given, 'a context')
+ @formatter.step_failed(:when, 'I say hey')
+
+ @out.string.should include('When I say hey (SKIPPED)')
+ end
+
+ it "should append SKIPPED for the a failiure after PENDING" do
+ @formatter.scenario_started('','')
+ @formatter.step_pending(:given, 'a context')
+ @formatter.step_failed(:when, 'I say hey')
+
+ @out.string.should include('When I say hey (SKIPPED)')
+ end
+
+ it 'should print some white space after each story' do
+ # when
+ @formatter.story_ended 'title', 'narrative'
+
+ # then
+ @out.string.should include("\n\n")
+ end
+
+ it "should print nothing for collected_steps" do
+ @formatter.collected_steps(['Given a $coloured $animal', 'Given a $n legged eel'])
+ @out.string.should == ("")
+ end
+
+ it "should ignore messages it doesn't care about" do
+ lambda {
+ @formatter.this_method_does_not_exist
+ }.should_not raise_error
+ end
+ end
+ end
+ end
+ end
+end