--- /dev/null
+require File.dirname(__FILE__) + '/story_helper'
+
+module Spec
+ module Story
+ describe Runner, "module" do
+ def dev_null
+ io = StringIO.new
+ def io.write(str)
+ str.to_s.size
+ end
+ return io
+ end
+
+ before :each do
+ Kernel.stub!(:at_exit)
+ @stdout, $stdout = $stdout, dev_null
+ @argv = Array.new(ARGV)
+ @runner_module = Runner.dup
+ @world_creator = World.dup
+ @runner_module.module_eval { @run_options = @story_runner = @scenario_runner = @world_creator = nil }
+ end
+
+ after :each do
+ $stdout = @stdout
+ ARGV.replace @argv
+ @runner_module.module_eval { @run_options = @story_runner = @scenario_runner = @world_creator = nil }
+ end
+
+ it 'should wire up a singleton StoryRunner' do
+ @runner_module.story_runner.should_not be_nil
+ end
+
+ it 'should set its options based on ARGV' do
+ # given
+ ARGV << '--dry-run'
+
+ # when
+ options = @runner_module.run_options
+
+ # then
+ options.dry_run.should be_true
+ end
+
+ it 'should add a reporter to the runner classes' do
+ # given
+ story_runner = mock('story runner', :null_object => true)
+ scenario_runner = mock('scenario runner', :null_object => true)
+ world_creator = mock('world', :null_object => true)
+
+ @runner_module::class_eval { @world_creator = world_creator }
+ @runner_module::StoryRunner.stub!(:new).and_return(story_runner)
+ @runner_module::ScenarioRunner.stub!(:new).and_return(scenario_runner)
+
+ # expect
+ world_creator.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter))
+ story_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter))
+ scenario_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter))
+
+ # when
+ @runner_module.story_runner
+ end
+
+ it 'should add a documenter to the runner classes if one is specified' do
+ # given
+ ARGV << "--format" << "html"
+ story_runner = mock('story runner', :null_object => true)
+ scenario_runner = mock('scenario runner', :null_object => true)
+ world_creator = mock('world', :null_object => true)
+
+ @runner_module::class_eval { @world_creator = world_creator }
+ @runner_module::StoryRunner.stub!(:new).and_return(story_runner)
+ @runner_module::ScenarioRunner.stub!(:new).and_return(scenario_runner)
+
+ # expect
+ world_creator.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter))
+ story_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter))
+ scenario_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter))
+
+ # when
+ @runner_module.story_runner
+ end
+
+ it 'should add any registered listener to the runner classes' do
+ # given
+ ARGV << "--format" << "html"
+ story_runner = mock('story runner', :null_object => true)
+ scenario_runner = mock('scenario runner', :null_object => true)
+ world_creator = mock('world', :null_object => true)
+
+ @runner_module::class_eval { @world_creator = world_creator }
+ @runner_module::StoryRunner.stub!(:new).and_return(story_runner)
+ @runner_module::ScenarioRunner.stub!(:new).and_return(scenario_runner)
+
+ listener = Object.new
+
+ # expect
+ world_creator.should_receive(:add_listener).with(listener)
+ story_runner.should_receive(:add_listener).with(listener)
+ scenario_runner.should_receive(:add_listener).with(listener)
+
+ # when
+ @runner_module.register_listener listener
+ end
+ end
+ end
+end