Permalink
Browse files

add autotest specs from rspec-1

  • Loading branch information...
1 parent c1d600c commit 82bf93e6e2eac8a20d6d34c6b0a8f6ccb874628a @dchelimsky dchelimsky committed Mar 14, 2010
Showing with 193 additions and 0 deletions.
  1. +1 −0 Rakefile
  2. +31 −0 spec/autotest/failed_results_re_spec.rb
  3. +130 −0 spec/autotest/rspec_spec.rb
  4. +10 −0 spec/spec_helper.rb
  5. +21 −0 spec/support/matchers.rb
View
@@ -23,6 +23,7 @@ begin
gem.add_development_dependency "rspec-expectations", ">= #{Rspec::Core::Version::STRING}"
gem.add_development_dependency "rspec-mocks", ">= #{Rspec::Core::Version::STRING}"
gem.add_development_dependency('cucumber', '>= 0.5.3')
+ gem.add_development_dependency('autotest', '>= 4.2.9')
gem.post_install_message = <<-EOM
#{"*"*50}
@@ -0,0 +1,31 @@
+require "spec_helper"
+
+describe "failed_results_re" do
+ it "should match a failure" do
+ re = Autotest::Rspec2.new.failed_results_re
+ re =~ "1)\n'this example' FAILED\nreason\n/path.rb:37:\n\n"
+ $1.should == "this example"
+ $2.should == "reason\n/path.rb:37:"
+ end
+
+ it "should match a failure when matcher outputs multiple lines" do
+ re = Autotest::Rspec2.new.failed_results_re
+ re =~ "1)\n'other example' FAILED\n\nreason line 1\nreason line 2\n\n(additional info)\n/path.rb:37:\n\n"
+ $1.should == "other example"
+ $2.should == "reason line 1\nreason line 2\n\n(additional info)\n/path.rb:37:"
+ end
+
+ it "should match an Error" do
+ re = Autotest::Rspec2.new.failed_results_re
+ re =~ "1)\nRuntimeError in 'this example'\nreason\n/path.rb:37:\n\n"
+ $1.should == "this example"
+ $2.should == "reason\n/path.rb:37:"
+ end
+
+ it "should match an Error that doesn't end in Error" do
+ re = Autotest::Rspec2.new.failed_results_re
+ re =~ "1)\nInvalidArgument in 'this example'\nreason\n/path.rb:37:\n\n"
+ $1.should == "this example"
+ $2.should == "reason\n/path.rb:37:"
+ end
+end
View
@@ -0,0 +1,130 @@
+require "spec_helper"
+
+describe Autotest::Rspec do
+ describe "adding spec.opts --options" do
+ before(:each) do
+ @rspec_autotest = Autotest::Rspec2.new
+ end
+
+ it "should return the command line option to add spec.opts if the options file exists" do
+ File.stub!(:exist?).and_return true
+ @rspec_autotest.add_options_if_present.should == "-O spec/spec.opts "
+ end
+
+ it "should return an empty string if no spec.opts exists" do
+ File.stub!(:exist?).and_return false
+ Autotest::Rspec2.new.add_options_if_present.should == ""
+ end
+ end
+
+ describe "commands" do
+ before(:each) do
+ @rspec_autotest = Autotest::Rspec2.new
+ @rspec_autotest.stub!(:ruby).and_return "ruby"
+ @rspec_autotest.stub!(:add_options_if_present).and_return "-O spec/spec.opts"
+
+ @ruby = @rspec_autotest.ruby
+ @spec_cmd = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'rspec'))
+ @options = @rspec_autotest.add_options_if_present
+ files = %w[file_one file_two]
+ @files_to_test = {
+ files[0] => [],
+ files[1] => []
+ }
+ # this is not the inner representation of Autotest!
+ @rspec_autotest.files_to_test = @files_to_test
+ @to_test = files.map { |f| File.expand_path(f) }.join ' '
+ end
+
+ it "should make the appropriate test command" do
+ actual = @rspec_autotest.make_test_cmd(@files_to_test)
+ expected = /#{@ruby} #{@spec_cmd} (.*) #{@options}/
+
+ actual.should match(expected)
+
+ actual =~ expected
+ $1.should =~ /#{File.expand_path('file_one')}/
+ $1.should =~ /#{File.expand_path('file_two')}/
+ end
+
+ it "should return a blank command for no files" do
+ @rspec_autotest.make_test_cmd({}).should == ''
+ end
+ end
+
+ describe "mappings" do
+
+ before(:each) do
+ @lib_file = "lib/something.rb"
+ @spec_file = "spec/something_spec.rb"
+ @rspec_autotest = Autotest::Rspec2.new
+ @rspec_autotest.hook :initialize
+ end
+
+ it "should find the spec file for a given lib file" do
+ @rspec_autotest.should map_specs([@spec_file]).to(@lib_file)
+ end
+
+ it "should find the spec file if given a spec file" do
+ @rspec_autotest.should map_specs([@spec_file]).to(@spec_file)
+ end
+
+ it "should ignore files in spec dir that aren't specs" do
+ @rspec_autotest.should map_specs([]).to("spec/spec_helper.rb")
+ end
+
+ it "should ignore untracked files (in @file)" do
+ @rspec_autotest.should map_specs([]).to("lib/untracked_file")
+ end
+ end
+
+ describe "consolidating failures" do
+ before(:each) do
+ @rspec_autotest = Autotest::Rspec2.new
+
+ @spec_file = "spec/autotest/some_spec.rb"
+ @rspec_autotest.instance_variable_set("@files", {@spec_file => Time.now})
+ @rspec_autotest.stub!(:find_files_to_test).and_return true
+ end
+
+ it "should return no failures if no failures were given in the output" do
+ @rspec_autotest.consolidate_failures([[]]).should == {}
+ end
+
+ it "should return a hash with the spec filename => spec name for each failure or error" do
+ @rspec_autotest.stub!(:test_files_for).and_return "spec/autotest/some_spec.rb"
+ failures = [
+ [
+ "false should be false",
+ "expected: true,\n got: false (using ==)\n#{@spec_file}:203:"
+ ]
+ ]
+ @rspec_autotest.consolidate_failures(failures).should == {
+ @spec_file => ["false should be false"]
+ }
+ end
+
+ it "should not include the subject file" do
+ subject_file = "lib/autotest/some.rb"
+ @rspec_autotest.stub!(:test_files_for).and_return "spec/autotest/some_spec.rb"
+ failures = [
+ [
+ "false should be false",
+ "expected: true,\n got: false (using ==)\n#{subject_file}:143:\n#{@spec_file}:203:"
+ ]
+ ]
+ @rspec_autotest.consolidate_failures(failures).keys.should_not include(subject_file)
+ end
+ end
+
+ describe "normalizing file names" do
+ it "should ensure that a single file appears in files_to_test only once" do
+ @rspec_autotest = Autotest::Rspec2.new
+ @files_to_test = {}
+ ['filename.rb', './filename.rb', File.expand_path('filename.rb')].each do |file|
+ @files_to_test[file] = []
+ end
+ @rspec_autotest.normalize(@files_to_test).should have(1).file
+ end
+ end
+end
View
@@ -6,8 +6,18 @@
require 'rspec/expectations'
require 'rspec/mocks'
+begin
+ require 'autotest'
+rescue LoadError
+ raise "You must install ZenTest to use autotest"
+end
+
+require 'autotest/rspec2'
+
Rspec::Core::ExampleGroup.send(:include, Rspec::Matchers)
+Dir['./spec/support/**/*.rb'].map {|f| require f}
+
module Rspec
module Core
module Matchers
View
@@ -0,0 +1,21 @@
+Rspec::Matchers.define :map_specs do |specs|
+ match do |autotest|
+ @specs = specs
+ @autotest = prepare(autotest)
+ autotest.test_files_for(@file) == specs
+ end
+
+ chain :to do |file|
+ @file = file
+ end
+
+ failure_message_for_should do
+ "expected #{@autotest.class} to map #{@specs.inspect} to #{@file.inspect}\ngot #{@actual.inspect}"
+ end
+
+ def prepare(autotest)
+ find_order = @specs.dup << @file
+ autotest.instance_eval { @find_order = find_order }
+ autotest
+ end
+end

0 comments on commit 82bf93e

Please sign in to comment.