Skip to content

Commit

Permalink
Runner refactoring/cleaning
Browse files Browse the repository at this point in the history
  • Loading branch information
Rémy Coutable committed Sep 29, 2011
1 parent 4ac91b4 commit ac2f83c
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 115 deletions.
70 changes: 38 additions & 32 deletions lib/guard/test/runner.rb
@@ -1,69 +1,75 @@
# encoding: utf-8

module Guard
class Test
class Runner

def self.runners
@runners ||= Dir.open(File.expand_path('../runners', __FILE__)).map { |filename| filename[/^(\w+)_guard_test_runner\.rb$/, 1] }.compact
end

def initialize(options={})
@runner_name = self.class.runners.detect { |runner| runner == options[:runner] } || self.class.runners[0]
@options = {
:bundler => File.exist?("#{Dir.pwd}/Gemfile"),
:rvm => nil,
:drb => false,
:cli => nil
def initialize(options = {})
@options = {
:bundler => File.exist?("#{Dir.pwd}/Gemfile"),
:rvm => [],
:drb => false,
:cli => ""
}.merge(options)
end

def run(paths, options={})
def run(paths, options = {})
return true if paths.empty?

message = options[:message] || "Running (#{@runner_name} runner): #{paths.join(' ') }"
::Guard::UI.info(message, :reset => true)
::Guard::UI.info(options[:message] || "Running: #{paths.join(' ')}", :reset => true)

system(test_unit_command(paths))
end

def rvm?
@rvm ||= @options[:rvm] && @options[:rvm].respond_to?(:join)
def bundler?
if @bundler.nil?
@bundler = @options[:bundler] && !drb?
end
@bundler
end

def turn?
@turn ||= begin
require 'turn'
rescue LoadError
false
def drb?
if @drb.nil?
@drb = @options[:drb]
begin
require 'spork-testunit'
rescue LoadError
end
::Guard::UI.info("Using testdrb to run the tests") if @drb
end
@drb
end

private

def test_unit_command(paths)
cmd_parts = []
cmd_parts << "rvm #{@options[:rvm].join(',')} exec" if rvm?
cmd_parts << "bundle exec" if @options[:bundler] && !turn?
cmd_parts << "rvm #{@options[:rvm].join(',')} exec" unless @options[:rvm].empty?
cmd_parts << "bundle exec" if bundler?
cmd_parts << case true
when @options[:drb]
when drb?
"testdrb"
when turn?
"turn"
else
"ruby"
end
cmd_parts << "-Itest"
cmd_parts << "-r bundler/setup" if @options[:bundler] && !@options[:drb] && !turn?
if !turn? && !@options[:drb]
cmd_parts << "-r #{File.expand_path("../runners/#{@runner_name}_guard_test_runner", __FILE__)}"
cmd_parts << "-r bundler/setup" if bundler?

unless drb?
cmd_parts << "-r #{File.expand_path("../guard_test_runner", __FILE__)}"
cmd_parts << "-e \"%w[#{paths.join(' ')}].each { |p| load p }\""
end

paths.each { |path| cmd_parts << "\"./#{path}\"" }
cmd_parts << "--runner=guard-#{@runner_name}" if turn? && !@options[:drb]

unless drb?
cmd_parts << "--use-color"
cmd_parts << "--runner=guard"
end

cmd_parts << @options[:cli]

cmd_parts.compact.join(' ')
cmd_parts.compact.join(' ').strip
end

end
Expand Down
128 changes: 45 additions & 83 deletions spec/guard/test/runner_spec.rb
Expand Up @@ -3,27 +3,34 @@

describe Guard::Test::Runner do

describe ".runners" do
it "returns [default fastfail] base on files present in the runners folder" do
described_class.runners.should == %w[default fastfail]
end
end

describe "#initialize" do
describe "sets the @runner instance variable from options" do
it "uses the default runner without :runner option given" do
it "sets default options" do
runner = described_class.new
runner.instance_variable_get(:@runner_name).should == 'default'
runner.instance_variable_get(:@options)[:bundler].should be_true
runner.instance_variable_get(:@options)[:rvm].should be_empty
runner.instance_variable_get(:@options)[:drb].should be_false
runner.instance_variable_get(:@options)[:cli].should eql ""
end

it "sets option :bundler" do
runner = described_class.new(:bundler => true)
runner.instance_variable_get(:@options)[:bundler].should be_true
end

it "sets option :rvm" do
runner = described_class.new(:rvm => '1.9.2')
runner.instance_variable_get(:@options)[:rvm].should eql '1.9.2'
end

it "uses the given :runner option if available" do
runner = described_class.new(:runner => 'fastfail')
runner.instance_variable_get(:@runner_name).should == 'fastfail'
it "sets option :drb" do
runner = described_class.new(:drb => true)
runner.instance_variable_get(:@options)[:drb].should be_true
end

it "uses the default runner if the given :runner option is not an available runner" do
runner = described_class.new(:runner => 'unknown')
runner.instance_variable_get(:@runner_name).should == 'default'
it "sets option :cli" do
runner = described_class.new(:cli => '--show-detail-immediately')
runner.instance_variable_get(:@options)[:cli].should eql '--show-detail-immediately'
end
end
end
Expand All @@ -37,15 +44,14 @@
context "when no :bundler option was given on initialize" do
subject do
runner = described_class.new
runner.stub(:turn?) { false }
runner
end

it "runs without bundler" do
subject.should_receive(:system).with(
"ruby -Itest -r #{@lib_path.join('guard/test/runners/default_guard_test_runner')} " \
"ruby -Itest -r #{@lib_path.join('guard/test/guard_test_runner')} " \
"-e \"%w[test/succeeding_test.rb].each { |p| load p }\" " \
"\"./test/succeeding_test.rb\" --runner=guard-default"
"\"./test/succeeding_test.rb\" --use-color --runner=guard"
)

subject.run(["test/succeeding_test.rb"])
Expand All @@ -55,16 +61,15 @@
context "when the :bundler option set to true on initialize" do
subject do
runner = described_class.new(:bundler => true)
runner.stub(:turn?) { false }
runner
end

it "runs with bundler" do
subject.should_receive(:system).with(
"bundle exec " \
"ruby -Itest -r bundler/setup -r #{@lib_path.join('guard/test/runners/default_guard_test_runner')} " \
"ruby -Itest -r bundler/setup -r #{@lib_path.join('guard/test/guard_test_runner')} " \
"-e \"%w[test/succeeding_test.rb].each { |p| load p }\" " \
"\"./test/succeeding_test.rb\" --runner=guard-default"
"\"./test/succeeding_test.rb\" --use-color --runner=guard"
)

subject.run(["test/succeeding_test.rb"])
Expand All @@ -76,17 +81,16 @@
context "when no :bundler option was given on initialize" do
subject do
runner = described_class.new
runner.stub(:turn?) { false }
runner
end

it "runs with bundler" do
subject.should_receive(:system).with(
"bundle exec " \
"ruby -Itest -r bundler/setup " \
"-r #{@lib_path.join('guard/test/runners/default_guard_test_runner')} " \
"-r #{@lib_path.join('guard/test/guard_test_runner')} " \
"-e \"%w[test/succeeding_test.rb].each { |p| load p }\" " \
"\"./test/succeeding_test.rb\" --runner=guard-default"
"\"./test/succeeding_test.rb\" --use-color --runner=guard"
)

subject.run(["test/succeeding_test.rb"])
Expand All @@ -96,16 +100,15 @@
context "when the :bundler option set to false on initialize" do
subject do
runner = described_class.new(:bundler => false)
runner.stub(:turn?) { false }
runner
end

it "runs without bundler" do
subject.should_receive(:system).with(
"ruby -Itest " \
"-r #{@lib_path.join('guard/test/runners/default_guard_test_runner')} " \
"-r #{@lib_path.join('guard/test/guard_test_runner')} " \
"-e \"%w[test/succeeding_test.rb].each { |p| load p }\" " \
"\"./test/succeeding_test.rb\" --runner=guard-default"
"\"./test/succeeding_test.rb\" --use-color --runner=guard"
)

subject.run(["test/succeeding_test.rb"])
Expand All @@ -115,13 +118,12 @@
context "when no :runner option was given on initialize" do
subject do
runner = described_class.new
runner.stub(:turn?) { false }
runner
end

it "displays message with the tests that will be fired" do
Guard::UI.should_receive(:info).with(
"Running (default runner): test/unit/error/error_test.rb test/unit/failing_test.rb", :reset => true
"Running: test/unit/error/error_test.rb test/unit/failing_test.rb", :reset => true
)

dev_null { subject.run(["test/unit/error/error_test.rb", "test/unit/failing_test.rb"]) }
Expand All @@ -131,55 +133,29 @@
subject.should_receive(:system).with(
"bundle exec " \
"ruby -Itest -r bundler/setup " \
"-r #{@lib_path.join('guard/test/runners/default_guard_test_runner')} " \
"-r #{@lib_path.join('guard/test/guard_test_runner')} " \
"-e \"%w[test/succeeding_test.rb].each { |p| load p }\" " \
"\"./test/succeeding_test.rb\" --runner=guard-default"
"\"./test/succeeding_test.rb\" --use-color --runner=guard"
)

subject.run(["test/succeeding_test.rb"])
end
end

%w[default fastfail].each do |runner_name|
context "when the :runner is '#{runner_name}'" do
subject do
runner = described_class.new(:runner => runner_name)
runner.stub(:turn?) { false }
runner
end

it "displays a message mentionning the runner and the test files that will be run" do
Guard::UI.should_receive(:info).with(
"Running (#{runner_name} runner): test/unit/error/error_test.rb test/unit/failing_test.rb", :reset => true
)

dev_null { subject.run(["test/unit/error/error_test.rb", "test/unit/failing_test.rb"]) }
end

it "requires #{runner_name}_guard_test_runner and runs with the --runner=guard-#{runner_name} option in the command line" do
subject.should_receive(:system).with(
"bundle exec " \
"ruby -Itest -r bundler/setup "\
"-r #{@lib_path.join("guard/test/runners/#{runner_name}_guard_test_runner")} " \
"-e \"%w[test/succeeding_test.rb].each { |p| load p }\" " \
"\"./test/succeeding_test.rb\" --runner=guard-#{runner_name}"
)

subject.run(["test/succeeding_test.rb"])
end
end
end

context "when the :rvm option is given" do
subject do
runner = described_class.new(:rvm => ['1.8.7', '1.9.2'])
runner.stub(:turn?) { true }
runner
end

it "runs with rvm exec" do
subject.should_receive(:system).with(
"rvm 1.8.7,1.9.2 exec turn -Itest \"./test/succeeding_test.rb\""
"rvm 1.8.7,1.9.2 exec " \
"bundle exec " \
"ruby -Itest -r bundler/setup " \
"-r #{@lib_path.join('guard/test/guard_test_runner')} " \
"-e \"%w[test/succeeding_test.rb].each { |p| load p }\" " \
"\"./test/succeeding_test.rb\" --use-color --runner=guard"
)

subject.run(["test/succeeding_test.rb"])
Expand All @@ -189,13 +165,16 @@
context "when the :cli option is given" do
subject do
runner = described_class.new(:cli => '--pretty')
runner.stub(:turn?) { true }
runner
end

it "adds the cli option at the end of the command" do
subject.should_receive(:system).with(
"turn -Itest \"./test/succeeding_test.rb\" --pretty"
"bundle exec " \
"ruby -Itest -r bundler/setup " \
"-r #{@lib_path.join('guard/test/guard_test_runner')} " \
"-e \"%w[test/succeeding_test.rb].each { |p| load p }\" " \
"\"./test/succeeding_test.rb\" --use-color --runner=guard --pretty"
)

subject.run(["test/succeeding_test.rb"])
Expand All @@ -213,34 +192,17 @@

it "loads and executes all the tests files" do
runner = described_class.new
runner.stub(:turn?) { false }
runner.should_receive(:system).with(
"bundle exec " \
"ruby -Itest -r bundler/setup " \
"-r #{@lib_path.join('guard/test/runners/default_guard_test_runner')} " \
"-r #{@lib_path.join('guard/test/guard_test_runner')} " \
"-e \"%w[test/error/error_test.rb test/unit/failing_test.rb].each { |p| load p }\" " \
"\"./test/error/error_test.rb\" \"./test/unit/failing_test.rb\" --runner=guard-default"
"\"./test/error/error_test.rb\" \"./test/unit/failing_test.rb\" --use-color --runner=guard"
)

runner.run(["test/error/error_test.rb", "test/unit/failing_test.rb"])
end

context "with turn present" do
subject do
runner = described_class.new
runner.stub(:turn?) { true }
runner
end

it "use the turn executable instead of ruby" do
subject.should_receive(:system).with(
"turn -Itest \"./test/succeeding_test.rb\""
)

subject.run(["test/succeeding_test.rb"])
end
end

end

end # #run
Expand Down

0 comments on commit ac2f83c

Please sign in to comment.