diff --git a/autotest/rspec.rb b/autotest/rspec.rb
index d4b77ea6b..ebafbfe91 100644
--- a/autotest/rspec.rb
+++ b/autotest/rspec.rb
@@ -1,95 +1,74 @@
require 'autotest'
+Autotest.add_hook :initialize do |at|
+ at.clear_mappings
+ # watch out: Ruby bug (1.8.6):
+ # %r(/) != /\//
+ at.add_mapping(%r%^spec/.*\.rb$%) { |filename, _|
+ filename
+ }
+ at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m|
+ ["spec/#{m[1]}_spec.rb"]
+ }
+ at.add_mapping(%r%^spec/(spec_helper|shared/.*)\.rb$%) {
+ at.files_matching %r{^spec/.*_spec\.rb$}
+ }
+end
+
class RspecCommandError < StandardError; end
class Autotest::Rspec < Autotest
-
- def initialize(kernel=Kernel, separator=File::SEPARATOR, alt_separator=File::ALT_SEPARATOR) # :nodoc:
- super()
- @kernel, @separator, @alt_separator = kernel, separator, alt_separator
- @spec_command = spec_command
- # watch out: Ruby bug (1.8.6):
- # %r(/) != /\//
- # since Ruby compares the REGEXP source, not the resulting pattern
- @test_mappings = {
- %r%^spec/.*\.rb$% => kernel.proc { |filename, _|
- filename
- },
- %r%^lib/(.*)\.rb$% => kernel.proc { |_, m|
- ["spec/#{m[1]}_spec.rb"]
- },
- %r%^spec/(spec_helper|shared/.*)\.rb$% => kernel.proc {
- files_matching %r%^spec/.*_spec\.rb$%
- }
- }
- end
-
- def tests_for_file(filename)
- super.select { |f| @files.has_key? f }
- end
-
- alias :specs_for_file :tests_for_file
-
- def failed_results(results)
- results.scan(/^\d+\)\n(?:\e\[\d*m)?(?:.*?Error in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m)
- end
+ def initialize
+ super
- def handle_results(results)
- @files_to_test = consolidate_failures failed_results(results)
- unless @files_to_test.empty? then
- hook :red
- else
- hook :green
- end unless $TESTING
- @tainted = true unless @files_to_test.empty?
+ self.failed_results_re = /^\d+\)\n(?:\e\[\d*m)?(?:.*?Error in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m
+ self.completed_re = /\Z/ # FIX: some sort of summary line at the end?
end
def consolidate_failures(failed)
filters = Hash.new { |h,k| h[k] = [] }
failed.each do |spec, failed_trace|
- @files.keys.select{|f| f =~ /spec\//}.each do |f|
- if failed_trace =~ Regexp.new(f)
- filters[f] << spec
- break
- end
+ if f = test_files_for(failed).find { |f| failed_trace =~ Regexp.new(f) } then
+ filters[f] << spec
+ break
end
end
return filters
end
def make_test_cmd(files_to_test)
- return "#{ruby} -S #{@spec_command} #{add_options_if_present} #{files_to_test.keys.flatten.join(' ')}"
+ return "#{ruby} -S #{spec_command} #{add_options_if_present} #{files_to_test.keys.flatten.join(' ')}"
end
def add_options_if_present
File.exist?("spec/spec.opts") ? "-O spec/spec.opts " : ""
end
- # Finds the proper spec command to use. Precendence
- # is set in the lazily-evaluated method spec_commands. Alias + Override
- # that in ~/.autotest to provide a different spec command
- # then the default paths provided.
- def spec_command
- spec_commands.each do |command|
- if File.exists?(command)
- return @alt_separator ? (command.gsub @separator, @alt_separator) : command
- end
+ # Finds the proper spec command to use. Precendence is set in the
+ # lazily-evaluated method spec_commands. Alias + Override that in
+ # ~/.autotest to provide a different spec command then the default
+ # paths provided.
+ def spec_command(separator=File::ALT_SEPARATOR)
+ unless defined? @spec_command then
+ @spec_command = spec_commands.find { |cmd| File.exists? cmd }
+
+ raise RspecCommandError, "No spec command could be found!" unless @spec_command
+
+ @spec_command.gsub! File::SEPARATOR, separator if separator
end
-
- raise RspecCommandError, "No spec command could be found!"
+ @spec_command
end
-
+
# Autotest will look for spec commands in the following
# locations, in this order:
#
# * bin/spec
# * default spec bin/loader installed in Rubygems
def spec_commands
[
- File.join('bin', 'spec'),
+ File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'spec')),
File.join(Config::CONFIG['bindir'], 'spec')
]
end
-
end
diff --git a/spec/Rakefile b/spec/Rakefile
index 8b45eff89..8026fd959 100644
--- a/spec/Rakefile
+++ b/spec/Rakefile
@@ -1,16 +1,29 @@
require File.join(File.dirname(__FILE__), "spec_helper.rb")
require 'rake'
require 'spec/rake/spectask'
basedir = File.dirname(__FILE__)
puppetlibdir = File.join(basedir, "../lib")
puppettestlibdir = File.join(basedir, "../test/lib")
speclibdir = File.join(basedir, "lib")
+libs = [puppetlibdir, puppettestlibdir, speclibdir]
+
desc "Run all spec unit tests"
Spec::Rake::SpecTask.new('unit') do |t|
- t.spec_files = FileList['unit/**/*.rb', 'integration/**/*.rb']
- t.libs = [puppetlibdir, puppettestlibdir, speclibdir]
+ t.spec_files = FileList['unit/**/*.rb']
+ t.libs = libs
+ t.spec_opts = ['--options', 'spec.opts']
+end
+
+desc "Run all spec integration tests"
+Spec::Rake::SpecTask.new('integration') do |t|
+ t.spec_files = FileList['integration/**/*.rb']
+ t.libs = libs
+ t.spec_opts = ['--options', 'spec.opts']
end
-task :default => [:unit]
+desc "Run all specs"
+task :all => [:unit, :integration]
+
+task :default => [:all]
diff --git a/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb b/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb
index 941baa8de..3152c1bda 100644
--- a/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb
+++ b/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb
@@ -1,31 +1,39 @@
dir = File.expand_path(File.dirname(__FILE__))
[ "#{dir}/../../lib", "#{dir}/../../test/lib"].each do |dir|
fulldir = File.expand_path(dir)
$LOAD_PATH.unshift(fulldir) unless $LOAD_PATH.include?(fulldir)
end
require 'spec'
require 'puppettest'
require 'puppettest/runnable_test'
module Spec
module Runner
- class BehaviourRunner
+ class ExampleGroupRunner
def run_behaviours
@behaviours.each do |behaviour|
# LAK:NOTE: this 'runnable' test is Puppet-specific.
next unless behaviour.runnable?
behaviour.run(@options.reporter, @options.dry_run, @options.reverse, @options.timeout)
end
end
end
end
end
module Spec
- module DSL
- class EvalModule < Module
- include PuppetTest::RunnableTest
+ module Example
+ class ExampleGroup
+ extend PuppetTest::RunnableTest
+ end
+ end
+end
+
+module Test
+ module Unit
+ class TestCase
+ extend PuppetTest::RunnableTest
end
end
end
diff --git a/spec/spec.opts b/spec/spec.opts
index 2cac5f260..2f9bf0d0a 100644
--- a/spec/spec.opts
+++ b/spec/spec.opts
@@ -1,5 +1,3 @@
--colour
---format
-s
--loadby
-mtime
\ No newline at end of file
+mtime
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 3aa3b0202..97ab007b0 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,34 +1,37 @@
dir = File.expand_path(File.dirname(__FILE__))
$LOAD_PATH.unshift("#{dir}/")
$LOAD_PATH.unshift("#{dir}/../lib")
$LOAD_PATH.unshift("#{dir}/../test/lib") # Add the old test dir, so that we can still find our local mocha and spec
# include any gems in vendor/gems
-Dir["#{dir}/../vendor/gems/**"].map do |path|
+Dir["#{dir}/../vendor/gems/**"].each do |path|
libpath = File.join(path, "lib")
if File.directory?(libpath)
$LOAD_PATH.unshift(libpath)
else
$LOAD_PATH.unshift(path)
end
end
require 'puppettest'
require 'puppettest/runnable_test'
require 'mocha'
require 'spec'
+
Spec::Runner.configure do |config|
config.mock_with :mocha
- config.prepend_before :each do
+
+ config.prepend_before :all do
+ setup_mocks_for_rspec
setup() if respond_to? :setup
end
- config.prepend_after :each do
+ config.prepend_after :all do
teardown() if respond_to? :teardown
end
end
# load any monkey-patches
Dir["#{dir}/monkey_patches/*.rb"].map { |file| require file }
diff --git a/test/lib/mocha/expectation_error.rb b/test/lib/mocha/expectation_error.rb
deleted file mode 100644
index c01482e63..000000000
--- a/test/lib/mocha/expectation_error.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-module Mocha
-
- class ExpectationError < StandardError
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/missing_expectation.rb b/test/lib/mocha/missing_expectation.rb
deleted file mode 100644
index f84227d1a..000000000
--- a/test/lib/mocha/missing_expectation.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-require 'mocha/expectation'
-
-module Mocha # :nodoc:
-
- class MissingExpectation < Expectation # :nodoc:
-
- def initialize(mock, method_name)
- super
- @invoked_count = true
- end
-
- def verify
- msg = error_message(0, 1)
- similar_expectations_list = similar_expectations.collect { |expectation| expectation.method_signature }.join("\n")
- msg << "\nSimilar expectations:\n#{similar_expectations_list}" unless similar_expectations.empty?
- error = ExpectationError.new(msg)
- error.set_backtrace(filtered_backtrace)
- raise error if @invoked_count
- end
-
- def similar_expectations
- @mock.expectations.select { |expectation| expectation.method_name == self.method_name }
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers.rb b/test/lib/mocha/parameter_matchers.rb
deleted file mode 100644
index 193f77d93..000000000
--- a/test/lib/mocha/parameter_matchers.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-module Mocha
-
- # Used as parameters for Expectation#with to restrict the parameter values which will match the expectation.
- module ParameterMatchers; end
-
-end
-
-
-Dir[File.expand_path(File.join(File.dirname(__FILE__), 'parameter_matchers', "*.rb"))].each { |lib| require lib }
diff --git a/vendor/gems/mocha-0.5.6/._RELEASE b/vendor/gems/mocha-0.5.6/._RELEASE
new file mode 100644
index 000000000..12bf79cb2
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/._RELEASE differ
diff --git a/vendor/gems/mocha-0.5.6/._Rakefile b/vendor/gems/mocha-0.5.6/._Rakefile
new file mode 100644
index 000000000..22220c1ee
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/._Rakefile differ
diff --git a/vendor/gems/mocha-0.5.6/COPYING b/vendor/gems/mocha-0.5.6/COPYING
new file mode 100644
index 000000000..8f74d7116
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/COPYING
@@ -0,0 +1,3 @@
+Copyright Revieworld Ltd. 2006
+
+You may use, copy and redistribute this library under the same terms as Ruby itself (see http://www.ruby-lang.org/en/LICENSE.txt) or under the MIT license (see MIT-LICENSE file).
diff --git a/vendor/gems/mocha-0.5.6/MIT-LICENSE b/vendor/gems/mocha-0.5.6/MIT-LICENSE
new file mode 100644
index 000000000..fa4efe793
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/MIT-LICENSE
@@ -0,0 +1,7 @@
+Copyright (c) 2006 Revieworld Ltd.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/README b/vendor/gems/mocha-0.5.6/README
new file mode 100644
index 000000000..262c6ec27
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/README
@@ -0,0 +1,35 @@
+= Mocha
+
+Mocha is a library for mocking and stubbing using a syntax like that of JMock[http://www.jmock.org], and SchMock[http://rubyforge.org/projects/schmock]. Most commonly Mocha is used in conjunction with Test::Unit[http://www.ruby-doc.org/core/classes/Test/Unit.html], but it can be used in other contexts.
+
+One of its main advantages is that it allows you to mock and stub methods on _real_ (non-mock) classes and instances. You can for example stub ActiveRecord[http://api.rubyonrails.com/classes/ActiveRecord/Base.html] instance methods like +create+, +save+, +destroy+ and even class methods like +find+ to avoid hitting the database in unit tests.
+
+Mocha provides a unified, simple and readable syntax for both traditional mocking and for mocking with _real_ objects.
+
+Mocha has been harvested from projects at Reevoo[http://www.reevoo.com] by me (James[http://blog.floehopper.org]) and my colleagues Ben[http://www.reevoo.com/blogs/bengriffiths], Chris[http://blog.seagul.co.uk] and Paul[http://po-ru.com]. Mocha is in use on real-world Rails[http://www.rubyonrails.org] projects.
+
+== Download and Installation
+
+Install the gem with the following command...
+
+ $ gem install mocha
+
+Or install the Rails[http://www.rubyonrails.org] plugin...
+
+ $ script/plugin install svn://rubyforge.org/var/svn/mocha/trunk
+
+Or download Mocha from here - http://rubyforge.org/projects/mocha
+
+== Examples
+
+* Quick Start - {Usage Examples}[link:examples/misc.html]
+* Traditional mocking - {Star Trek Example}[link:examples/mocha.html]
+* Setting expectations on real classes - {Order Example}[link:examples/stubba.html]
+* More examples on {Floehopper's Blog}[http://blog.floehopper.org]
+* {Mailing List Archives}[http://rubyforge.org/pipermail/mocha-developer/]
+
+== License
+
+Copyright Revieworld Ltd. 2006
+
+You may use, copy and redistribute this library under the same terms as {Ruby itself}[http://www.ruby-lang.org/en/LICENSE.txt] or under the {MIT license}[http://mocha.rubyforge.org/files/MIT-LICENSE.html].
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/RELEASE b/vendor/gems/mocha-0.5.6/RELEASE
new file mode 100644
index 000000000..0e8fb8573
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/RELEASE
@@ -0,0 +1,188 @@
+= 0.5.5 (r167)
+
+- Renamed Matches parameter matcher to RegexpMatches for clarity.
+- Added noframes tag to rdoc index to assist Google.
+
+= 0.5.4 (r166)
+
+- Added matches parameter matcher for matching regular expressions.
+
+= 0.5.3 (r165)
+
+- Attempt to fix packaging problems by switching to newer version (1.15.1) of gnutar and setting COPY_EXTENDED_ATTRIBUTES_DISABLE environment variable.
+- Removed unused ExpectationSequenceError exception.
+- Added instance_of and kind_of parameter matchers.
+- Added Google Webmaster meta tag to rdoc template header.
+- Put Google Webmaster meta tag in the right header i.e. the one for the index page.
+
+= 0.5.2 (r159)
+
+- Fix bug 11885 - "never doesn't work with stub_everything" submitted by Alexander Lang. In fixing this bug, also fixed undiscoverd bug where expected & actual invocation counts were being incorrectly reported which seems to have been introduced when fixes were added for invocation dispatch (see MockedMethodDispatchAcceptanceTest).
+- Previously when an expectation did not allow more invocations, it was treated as not matching. Now we prefer matching expectations which allow more invocations, but still match expectations which cannot allow more invocations. I think this may be overcomplicating things, but let's see how it goes.
+
+= 0.5.1 (r149)
+
+- Fixed bug #11583 "Mocha 0.5.0 throwing unexpected warnings". Also switched on ruby warning for all rake test tasks. Fixed majority of warnings, but some left to fix.
+
+= 0.5.0 (r147)
+
+- Parameter Matchers - I’ve added a few Hamcrest-style parameter matchers which are designed to be used inside Expectation#with. The following matchers are currently available: anything(), includes(), has_key(), has_value(), has_entry(), all_of() & any_of(). More to follow soon. The idea is eventually to get rid of the nasty parameter_block option on Expectation#with.
+
+ object = mock()
+ object.expects(:method).with(has_key('key_1'))
+ object.method('key_1' => 1, 'key_2' => 2)
+ # no verification error raised
+
+ object = mock()
+ object.expects(:method).with(has_key('key_1'))
+ object.method('key_2' => 2)
+ # verification error raised, because method was not called with Hash containing key: 'key_1'
+
+- Values Returned and Exceptions Raised on Consecutive Invocations - Allow multiple calls to Expectation#returns and Expectation#raises to build up a sequence of responses to invocations on the mock. Added syntactic sugar method Expectation#then to allow more readable expectations.
+
+ object = mock()
+ object.stubs(:method).returns(1, 2).then.raises(Exception).then.returns(4)
+ object.method # => 1
+ object.method # => 2
+ object.method # => raises exception of class Exception
+ object.method # => 4
+
+- Yields on Consecutive Invocations - Allow multiple calls to yields on single expectation to allow yield parameters to be specified for consecutive invocations.
+
+ object = mock()
+ object.stubs(:method).yields(1, 2).then.yields(3)
+ object.method { |*values| p values } # => [1, 2]
+ object.method { |*values| p values } # => [3]
+
+- Multiple Yields on Single Invocation - Added Expectation#multiple_yields to allow a mocked or stubbed method to yield multiple times for a single invocation.
+
+ object = mock()
+ object.stubs(:method).multiple_yields([1, 2], [3])
+ object.method { |*values| p values } # => [1, 2] # => [3]
+
+- Invocation Dispatch - Expectations were already being matched in reverse order i.e. the most recently defined one was being found first. This is still the case, but we now stop matching an expectation when its maximum number of expected invocations is reached. c.f. JMock v1. A stub will never stop matching by default. Hopefully this means we can soon get rid of the need to pass a Proc to Expectation#returns.
+
+ object = mock()
+ object.stubs(:method).returns(2)
+ object.expects(:method).once.returns(1)
+ object.method # => 1
+ object.method # => 2
+ object.method # => 2
+ # no verification error raised
+
+ # The following should still work...
+
+ Time.stubs(:now).returns(Time.parse('Mon Jan 01 00:00:00 UTC 2007'))
+ Time.now # => Mon Jan 01 00:00:00 UTC 2007
+ Time.stubs(:now).returns(Time.parse('Thu Feb 01 00:00:00 UTC 2007'))
+ Time.now # => Thu Feb 01 00:00:00 UTC 2007
+
+- Deprecate passing an instance of Proc to Expectation#returns.
+- Explicitly include all Rakefile dependencies in project.
+- Fixed old Stubba example.
+- Fix so that it is possible for a stubbed method to raise an Interrupt exception without a message in Ruby 1.8.6
+- Added responds_like and quacks_like.
+- Capture standard object methods before Mocha adds any.
+- Added Expectation#once method to make interface less surprising.
+- Use Rake::TestTask to run tests. Created three separate tasks to run unit, integration & acceptance tests. Split inspect_test into one file per TestCase. Deleted superfluous all_tests file.
+- Fiddled with mocha_inspect and tests to give more sensible results on x86 platform.
+- Fixed bug #7834 "infinite_range.rb makes incorrect assumption about to_f" logged by James Moore.
+
+= 0.4.0 (r92)
+
+- Allow naming of mocks (patch from Chris Roos).
+- Specify multiple return values for consecutive calls.
+- Improved consistency of expectation error messages.
+- Allow mocking of Object instance methods e.g. kind_of?, type.
+- Provide aliased versions of #expects and #stubs to allow mocking of these methods.
+- Added at_least, at_most, at_most_once methods to expectation.
+- Allow expects and stubs to take a hash of method and return values.
+- Eliminate warning: "instance variable @yield not initialized" (patch from Xavier Shay).
+- Restore instance methods on partial mocks (patch from Chris Roos).
+- Allow stubbing of a method with non-word characters in its name (patch from Paul Battley).
+- Removed coupling to Test::Unit.
+- Allow specified exception instance to be raised (patch from Chris Roos).
+- Make mock object_id appear in hex like normal Ruby inspect (patch from Paul Battley).
+- Fix path to object.rb in rdoc rake task (patch from Tomas Pospisek).
+- Reverse order in which expectations are matched, so that last expectation is matched first. This allows e.g. a call to #stubs to be effectively overridden by a call to #expects (patch from Tobias Lutke).
+- Stubba & SmartTestCase modules incorporated into Mocha module so only need to require 'mocha' - no longer need to require 'stubba'.
+- AutoMocha removed.
+
+= 0.3.3
+
+- Quick bug fix to restore instance methods on partial mocks (for Kevin Clark).
+
+= 0.3.2
+
+- Examples added.
+
+= 0.3.1
+
+- Dual licensing with MIT license added.
+
+= 0.3.0
+
+* Rails plugin.
+* Auto-verify for expectations on concrete classes.
+* Include each expectation verification in the test result assertion count.
+* Filter out noise from assertion backtraces.
+* Point assertion backtrace to line where failing expectation was created.
+* New yields method for expectations.
+* Create stubs which stub all method calls.
+* Mocks now respond_to? expected methods.
+
+= 0.2.1
+
+* Rename MochaAcceptanceTest::Rover#move method to avoid conflict with Rake (in Ruby 1.8.4 only?)
+
+= 0.2.0
+
+* Small change to SetupAndTeardown#teardown_stubs suggested by Luke Redpath (http://www.lukeredpath.co.uk) to allow use of Stubba with RSpec (http://rspec.rubyforge.org).
+* Reorganized directory structure and extracted addition of setup and teardown methods into SmartTestCase mini-library.
+* Addition of auto-verify for Mocha (but not Stubba). This means there is more significance in the choice of expects or stubs in that any expects on a mock will automatically get verified.
+
+So instead of...
+
+ wotsit = Mocha.new
+ wotsit.expects(:thingummy).with(5).returns(10)
+ doobrey = Doobrey.new(wotsit)
+ doobrey.hoojamaflip
+ wotsit.verify
+
+you need to do...
+
+ wotsit = mock()
+ wotsit.expects(:thingummy).with(5).returns(10)
+ doobrey = Doobrey.new(wotsit)
+ doobrey.hoojamaflip
+ # no need to verify
+
+There are also shortcuts as follows...
+
+instead of...
+
+ wotsit = Mocha.new
+ wotsit.expects(:thingummy).returns(10)
+ wotsit.expects(:summat).returns(25)
+
+you can have...
+
+ wotsit = mock(:thingummy => 5, :summat => 25)
+
+and instead of...
+
+ wotsit = Mocha.new
+ wotsit.stubs(:thingummy).returns(10)
+ wotsit.stubs(:summat).returns(25)
+
+you can have...
+
+ wotsit = stub(:thingummy => 5, :summat => 25)
+
+= 0.1.2
+
+* Minor tweaks
+
+= 0.1.1
+
+* Initial release.
diff --git a/vendor/gems/mocha-0.5.6/Rakefile b/vendor/gems/mocha-0.5.6/Rakefile
new file mode 100644
index 000000000..2e2f7287a
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/Rakefile
@@ -0,0 +1,149 @@
+require 'rubygems'
+require 'rake/rdoctask'
+require 'rake/gempackagetask'
+require 'rake/testtask'
+require 'rake/contrib/sshpublisher'
+
+module Mocha
+ VERSION = "0.5.6"
+end
+
+desc "Run all tests"
+task :default => :test_all
+
+task :test_all => [:test_unit, :test_integration, :test_acceptance]
+
+desc "Run unit tests"
+Rake::TestTask.new(:test_unit) do |t|
+ t.libs << 'test'
+ t.test_files = FileList['test/unit/**/*_test.rb']
+ t.verbose = true
+ t.warning = true
+end
+
+desc "Run integration tests"
+Rake::TestTask.new(:test_integration) do |t|
+ t.libs << 'test'
+ t.test_files = FileList['test/integration/*_test.rb']
+ t.verbose = true
+ t.warning = true
+end
+
+desc "Run acceptance tests"
+Rake::TestTask.new(:test_acceptance) do |t|
+ t.libs << 'test'
+ t.test_files = FileList['test/acceptance/*_test.rb']
+ t.verbose = true
+ t.warning = true
+end
+
+desc 'Generate RDoc'
+Rake::RDocTask.new do |task|
+ task.main = 'README'
+ task.title = "Mocha #{Mocha::VERSION}"
+ task.rdoc_dir = 'doc'
+ task.template = File.expand_path(File.join(File.dirname(__FILE__), "templates", "html_with_google_analytics"))
+ task.rdoc_files.include('README', 'RELEASE', 'COPYING', 'MIT-LICENSE', 'agiledox.txt', 'lib/mocha/auto_verify.rb', 'lib/mocha/mock.rb', 'lib/mocha/expectation.rb', 'lib/mocha/object.rb', 'lib/mocha/parameter_matchers.rb', 'lib/mocha/parameter_matchers')
+end
+task :rdoc => :examples
+
+desc "Upload RDoc to RubyForge"
+task :publish_rdoc => [:rdoc, :examples] do
+ Rake::SshDirPublisher.new("jamesmead@rubyforge.org", "/var/www/gforge-projects/mocha", "doc").upload
+end
+
+desc "Generate agiledox-like documentation for tests"
+file 'agiledox.txt' do
+ File.open('agiledox.txt', 'w') do |output|
+ tests = FileList['test/**/*_test.rb']
+ tests.each do |file|
+ m = %r".*/([^/].*)_test.rb".match(file)
+ output << m[1]+" should:\n"
+ test_definitions = File::readlines(file).select {|line| line =~ /.*def test.*/}
+ test_definitions.sort.each do |definition|
+ m = %r"test_(should_)?(.*)".match(definition)
+ output << " - "+m[2].gsub(/_/," ") << "\n"
+ end
+ end
+ end
+end
+
+desc "Convert example ruby files to syntax-highlighted html"
+task :examples do
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__), "vendor", "coderay-0.7.4.215", "lib"))
+ require 'coderay'
+ mkdir_p 'doc/examples'
+ File.open('doc/examples/coderay.css', 'w') do |output|
+ output << CodeRay::Encoders[:html]::CSS.new.stylesheet
+ end
+ ['mocha', 'stubba', 'misc'].each do |filename|
+ File.open("doc/examples/#{filename}.html", 'w') do |file|
+ file << ""
+ file << "
"
+ file << %q()
+ file << ""
+ file << ""
+ file << CodeRay.scan_file("examples/#{filename}.rb").html.div
+ file << ""
+ file << ""
+ end
+ end
+end
+
+Gem::manage_gems
+
+specification = Gem::Specification.new do |s|
+ s.name = "mocha"
+ s.summary = "Mocking and stubbing library"
+ s.version = Mocha::VERSION
+ s.platform = Gem::Platform::RUBY
+ s.author = 'James Mead'
+ s.description = <<-EOF
+ Mocking and stubbing library with JMock/SchMock syntax, which allows mocking and stubbing of methods on real (non-mock) classes.
+ EOF
+ s.email = 'mocha-developer@rubyforge.org'
+ s.homepage = 'http://mocha.rubyforge.org'
+ s.rubyforge_project = 'mocha'
+
+ s.has_rdoc = true
+ s.extra_rdoc_files = ['README', 'COPYING']
+ s.rdoc_options << '--title' << 'Mocha' << '--main' << 'README' << '--line-numbers'
+
+ s.autorequire = 'mocha'
+ s.add_dependency('rake')
+ s.files = FileList['{lib,test,examples}/**/*.rb', '[A-Z]*'].exclude('TODO').to_a
+end
+
+Rake::GemPackageTask.new(specification) do |package|
+ package.need_zip = true
+ package.need_tar = true
+end
+
+task :verify_user do
+ raise "RUBYFORGE_USER environment variable not set!" unless ENV['RUBYFORGE_USER']
+end
+
+task :verify_password do
+ raise "RUBYFORGE_PASSWORD environment variable not set!" unless ENV['RUBYFORGE_PASSWORD']
+end
+
+desc "Publish package files on RubyForge."
+task :publish_packages => [:verify_user, :verify_password, :package] do
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__), "vendor", "meta_project-0.4.15", "lib"))
+ require 'meta_project'
+ require 'rake/contrib/xforge'
+ release_files = FileList[
+ "pkg/mocha-#{Mocha::VERSION}.gem",
+ "pkg/mocha-#{Mocha::VERSION}.tgz",
+ "pkg/mocha-#{Mocha::VERSION}.zip"
+ ]
+
+ Rake::XForge::Release.new(MetaProject::Project::XForge::RubyForge.new('mocha')) do |release|
+ release.user_name = ENV['RUBYFORGE_USER']
+ release.password = ENV['RUBYFORGE_PASSWORD']
+ release.files = release_files.to_a
+ release.release_name = "Mocha #{Mocha::VERSION}"
+ release.release_changes = ''
+ release.release_notes = ''
+ end
+end
diff --git a/vendor/gems/mocha-0.5.6/examples/._misc.rb b/vendor/gems/mocha-0.5.6/examples/._misc.rb
new file mode 100644
index 000000000..c425bb341
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/examples/._misc.rb differ
diff --git a/vendor/gems/mocha-0.5.6/examples/._mocha.rb b/vendor/gems/mocha-0.5.6/examples/._mocha.rb
new file mode 100644
index 000000000..0c1998db8
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/examples/._mocha.rb differ
diff --git a/vendor/gems/mocha-0.5.6/examples/._stubba.rb b/vendor/gems/mocha-0.5.6/examples/._stubba.rb
new file mode 100644
index 000000000..4eae8fa0f
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/examples/._stubba.rb differ
diff --git a/vendor/gems/mocha-0.5.6/examples/misc.rb b/vendor/gems/mocha-0.5.6/examples/misc.rb
new file mode 100644
index 000000000..1cb8b55d0
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/examples/misc.rb
@@ -0,0 +1,44 @@
+require 'test/unit'
+require 'rubygems'
+require 'mocha'
+
+class MiscExampleTest < Test::Unit::TestCase
+
+ def test_mocking_a_class_method
+ product = Product.new
+ Product.expects(:find).with(1).returns(product)
+ assert_equal product, Product.find(1)
+ end
+
+ def test_mocking_an_instance_method_on_a_real_object
+ product = Product.new
+ product.expects(:save).returns(true)
+ assert product.save
+ end
+
+ def test_stubbing_instance_methods_on_real_objects
+ prices = [stub(:pence => 1000), stub(:pence => 2000)]
+ product = Product.new
+ product.stubs(:prices).returns(prices)
+ assert_equal [1000, 2000], product.prices.collect {|p| p.pence}
+ end
+
+ def test_stubbing_an_instance_method_on_all_instances_of_a_class
+ Product.any_instance.stubs(:name).returns('stubbed_name')
+ product = Product.new
+ assert_equal 'stubbed_name', product.name
+ end
+
+ def test_traditional_mocking
+ object = mock()
+ object.expects(:expected_method).with(:p1, :p2).returns(:result)
+ assert_equal :result, object.expected_method(:p1, :p2)
+ end
+
+ def test_shortcuts
+ object = stub(:method1 => :result1, :method2 => :result2)
+ assert_equal :result1, object.method1
+ assert_equal :result2, object.method2
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/examples/mocha.rb b/vendor/gems/mocha-0.5.6/examples/mocha.rb
new file mode 100644
index 000000000..863270d53
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/examples/mocha.rb
@@ -0,0 +1,26 @@
+class Enterprise
+
+ def initialize(dilithium)
+ @dilithium = dilithium
+ end
+
+ def go(warp_factor)
+ warp_factor.times { @dilithium.nuke(:anti_matter) }
+ end
+
+end
+
+require 'test/unit'
+require 'rubygems'
+require 'mocha'
+
+class EnterpriseTest < Test::Unit::TestCase
+
+ def test_should_boldly_go
+ dilithium = mock()
+ dilithium.expects(:nuke).with(:anti_matter).at_least_once # auto-verified at end of test
+ enterprise = Enterprise.new(dilithium)
+ enterprise.go(2)
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/examples/stubba.rb b/vendor/gems/mocha-0.5.6/examples/stubba.rb
new file mode 100644
index 000000000..2788d1b62
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/examples/stubba.rb
@@ -0,0 +1,65 @@
+class Order
+
+ attr_accessor :shipped_on
+
+ def total_cost
+ line_items.inject(0) { |total, line_item| total + line_item.price } + shipping_cost
+ end
+
+ def total_weight
+ line_items.inject(0) { |total, line_item| total + line_item.weight }
+ end
+
+ def shipping_cost
+ total_weight * 5 + 10
+ end
+
+ class << self
+
+ def find_all
+ # Database.connection.execute('select * from orders...
+ end
+
+ def number_shipped_since(date)
+ find_all.select { |order| order.shipped_on > date }.length
+ end
+
+ def unshipped_value
+ find_all.inject(0) { |total, order| order.shipped_on ? total : total + order.total_cost }
+ end
+
+ end
+
+end
+
+require 'test/unit'
+require 'rubygems'
+require 'mocha'
+
+class OrderTest < Test::Unit::TestCase
+
+ # illustrates stubbing instance method
+ def test_should_calculate_shipping_cost_based_on_total_weight
+ order = Order.new
+ order.stubs(:total_weight).returns(10)
+ assert_equal 60, order.shipping_cost
+ end
+
+ # illustrates stubbing class method
+ def test_should_count_number_of_orders_shipped_after_specified_date
+ now = Time.now; week_in_secs = 7 * 24 * 60 * 60
+ order_1 = Order.new; order_1.shipped_on = now - 1 * week_in_secs
+ order_2 = Order.new; order_2.shipped_on = now - 3 * week_in_secs
+ Order.stubs(:find_all).returns([order_1, order_2])
+ assert_equal 1, Order.number_shipped_since(now - 2 * week_in_secs)
+ end
+
+ # illustrates stubbing instance method for all instances of a class
+ def test_should_calculate_value_of_unshipped_orders
+ Order.stubs(:find_all).returns([Order.new, Order.new, Order.new])
+ Order.any_instance.stubs(:shipped_on).returns(nil)
+ Order.any_instance.stubs(:total_cost).returns(10)
+ assert_equal 30, Order.unshipped_value
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/lib/._mocha.rb b/vendor/gems/mocha-0.5.6/lib/._mocha.rb
new file mode 100644
index 000000000..cf6ff4839
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/._mocha.rb differ
diff --git a/test/lib/mocha.rb b/vendor/gems/mocha-0.5.6/lib/mocha.rb
similarity index 100%
rename from test/lib/mocha.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha.rb
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._any_instance_method.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._any_instance_method.rb
new file mode 100644
index 000000000..00711bd39
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._any_instance_method.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._auto_verify.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._auto_verify.rb
new file mode 100644
index 000000000..b0167dfe3
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._auto_verify.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._central.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._central.rb
new file mode 100644
index 000000000..8515018e0
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._central.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._class_method.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._class_method.rb
new file mode 100644
index 000000000..66871a56f
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._class_method.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._deprecation.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._deprecation.rb
new file mode 100644
index 000000000..3e11a4d5a
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._deprecation.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._expectation.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._expectation.rb
new file mode 100644
index 000000000..2deed467d
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._expectation.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._expectation_error.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._expectation_error.rb
new file mode 100644
index 000000000..dbb6154b3
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._expectation_error.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._expectation_list.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._expectation_list.rb
new file mode 100644
index 000000000..21a5f32b4
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._expectation_list.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._infinite_range.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._infinite_range.rb
new file mode 100644
index 000000000..07e0b709a
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._infinite_range.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._inspect.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._inspect.rb
new file mode 100644
index 000000000..28d27abde
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._inspect.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._instance_method.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._instance_method.rb
new file mode 100644
index 000000000..c11d0ea30
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._instance_method.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._metaclass.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._metaclass.rb
new file mode 100644
index 000000000..3ab4a8b5f
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._metaclass.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._method_matcher.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._method_matcher.rb
new file mode 100644
index 000000000..392843f65
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._method_matcher.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._missing_expectation.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._missing_expectation.rb
new file mode 100644
index 000000000..4049e36b4
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._missing_expectation.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._mock.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._mock.rb
new file mode 100644
index 000000000..8eefd1314
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._mock.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._object.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._object.rb
new file mode 100644
index 000000000..2fa785b57
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._object.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._parameter_matchers.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._parameter_matchers.rb
new file mode 100644
index 000000000..1a81dea1e
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._parameter_matchers.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._parameters_matcher.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._parameters_matcher.rb
new file mode 100644
index 000000000..de250a8e2
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._parameters_matcher.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._pretty_parameters.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._pretty_parameters.rb
new file mode 100644
index 000000000..0a4f4854b
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._pretty_parameters.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._return_values.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._return_values.rb
new file mode 100644
index 000000000..0d41af3d6
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._return_values.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._sequence.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._sequence.rb
new file mode 100644
index 000000000..af2494888
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._sequence.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._setup_and_teardown.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._setup_and_teardown.rb
new file mode 100644
index 000000000..fb1bde164
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._setup_and_teardown.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._single_return_value.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._single_return_value.rb
new file mode 100644
index 000000000..fec4c56f5
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._single_return_value.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._standalone.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._standalone.rb
new file mode 100644
index 000000000..f33f028a2
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._standalone.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._test_case_adapter.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._test_case_adapter.rb
new file mode 100644
index 000000000..99a49dc52
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._test_case_adapter.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/._yield_parameters.rb b/vendor/gems/mocha-0.5.6/lib/mocha/._yield_parameters.rb
new file mode 100644
index 000000000..a9646d7bb
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/._yield_parameters.rb differ
diff --git a/test/lib/mocha/any_instance_method.rb b/vendor/gems/mocha-0.5.6/lib/mocha/any_instance_method.rb
similarity index 100%
rename from test/lib/mocha/any_instance_method.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/any_instance_method.rb
diff --git a/test/lib/mocha/auto_verify.rb b/vendor/gems/mocha-0.5.6/lib/mocha/auto_verify.rb
similarity index 57%
rename from test/lib/mocha/auto_verify.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/auto_verify.rb
index dce877bde..896648bcd 100644
--- a/test/lib/mocha/auto_verify.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/auto_verify.rb
@@ -1,113 +1,118 @@
require 'mocha/mock'
+require 'mocha/sequence'
module Mocha # :nodoc:
# Methods added to TestCase allowing creation of traditional mock objects.
#
# Mocks created this way will have their expectations automatically verified at the end of the test.
#
# See Mock for methods on mock objects.
module AutoVerify
def mocks # :nodoc:
@mocks ||= []
end
def reset_mocks # :nodoc:
@mocks = nil
end
- # :call-seq: mock(name) -> mock object
- # mock(expected_methods = {}) -> mock object
- # mock(name, expected_methods = {}) -> mock object
+ # :call-seq: mock(name, &block) -> mock object
+ # mock(expected_methods = {}, &block) -> mock object
+ # mock(name, expected_methods = {}, &block) -> mock object
#
# Creates a mock object.
#
# +name+ is a +String+ identifier for the mock object.
#
# +expected_methods+ is a +Hash+ with expected method name symbols as keys and corresponding return values as values.
#
+ # +block+ is a block to be evaluated against the mock object instance, giving an alernative way to set up expectations & stubs.
+ #
# Note that (contrary to expectations set up by #stub) these expectations must be fulfilled during the test.
# def test_product
# product = mock('ipod_product', :manufacturer => 'ipod', :price => 100)
# assert_equal 'ipod', product.manufacturer
# assert_equal 100, product.price
# # an error will be raised unless both Product#manufacturer and Product#price have been called
# end
- def mock(*args)
- name, expectations = name_and_expectations_from_args(args)
- build_mock_with_expectations(:expects, expectations, name)
+ def mock(*arguments, &block)
+ name = arguments.shift if arguments.first.is_a?(String)
+ expectations = arguments.shift || {}
+ mock = Mock.new(name, &block)
+ mock.expects(expectations)
+ mocks << mock
+ mock
end
- # :call-seq: stub(name) -> mock object
- # stub(stubbed_methods = {}) -> mock object
- # stub(name, stubbed_methods = {}) -> mock object
+ # :call-seq: stub(name, &block) -> mock object
+ # stub(stubbed_methods = {}, &block) -> mock object
+ # stub(name, stubbed_methods = {}, &block) -> mock object
#
# Creates a mock object.
#
# +name+ is a +String+ identifier for the mock object.
#
# +stubbed_methods+ is a +Hash+ with stubbed method name symbols as keys and corresponding return values as values.
#
+ # +block+ is a block to be evaluated against the mock object instance, giving an alernative way to set up expectations & stubs.
+ #
# Note that (contrary to expectations set up by #mock) these expectations need not be fulfilled during the test.
# def test_product
# product = stub('ipod_product', :manufacturer => 'ipod', :price => 100)
# assert_equal 'ipod', product.manufacturer
# assert_equal 100, product.price
# # an error will not be raised even if Product#manufacturer and Product#price have not been called
# end
- def stub(*args)
- name, expectations = name_and_expectations_from_args(args)
- build_mock_with_expectations(:stubs, expectations, name)
+ def stub(*arguments, &block)
+ name = arguments.shift if arguments.first.is_a?(String)
+ expectations = arguments.shift || {}
+ stub = Mock.new(name, &block)
+ stub.stubs(expectations)
+ mocks << stub
+ stub
end
- # :call-seq: stub_everything(name) -> mock object
- # stub_everything(stubbed_methods = {}) -> mock object
- # stub_everything(name, stubbed_methods = {}) -> mock object
+ # :call-seq: stub_everything(name, &block) -> mock object
+ # stub_everything(stubbed_methods = {}, &block) -> mock object
+ # stub_everything(name, stubbed_methods = {}, &block) -> mock object
#
# Creates a mock object that accepts calls to any method.
#
# By default it will return +nil+ for any method call.
#
+ # +block+ is a block to be evaluated against the mock object instance, giving an alernative way to set up expectations & stubs.
+ #
# +name+ and +stubbed_methods+ work in the same way as for #stub.
# def test_product
# product = stub_everything('ipod_product', :price => 100)
# assert_nil product.manufacturer
# assert_nil product.any_old_method
# assert_equal 100, product.price
# end
- def stub_everything(*args)
- name, expectations = name_and_expectations_from_args(args)
- build_mock_with_expectations(:stub_everything, expectations, name)
+ def stub_everything(*arguments, &block)
+ name = arguments.shift if arguments.first.is_a?(String)
+ expectations = arguments.shift || {}
+ stub = Mock.new(name, &block)
+ stub.stub_everything
+ stub.stubs(expectations)
+ mocks << stub
+ stub
end
def verify_mocks # :nodoc:
mocks.each { |mock| mock.verify { yield if block_given? } }
end
def teardown_mocks # :nodoc:
reset_mocks
end
-
- def build_mock_with_expectations(expectation_type = :expects, expectations = {}, name = nil) # :nodoc:
- stub_everything = (expectation_type == :stub_everything)
- expectation_type = :stubs if expectation_type == :stub_everything
- mock = Mocha::Mock.new(stub_everything, name)
- expectations.each do |method, result|
- mock.__send__(expectation_type, method).returns(result)
- end
- mocks << mock
- mock
- end
- private
-
- def name_and_expectations_from_args(args) # :nodoc:
- name = args.first.is_a?(String) ? args.delete_at(0) : nil
- expectations = args.first || {}
- [name, expectations]
+ def sequence(name) # :nodoc:
+ Sequence.new(name)
end
end
end
\ No newline at end of file
diff --git a/test/lib/mocha/central.rb b/vendor/gems/mocha-0.5.6/lib/mocha/central.rb
similarity index 94%
rename from test/lib/mocha/central.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/central.rb
index 3dde7350f..0445f2151 100644
--- a/test/lib/mocha/central.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/central.rb
@@ -1,35 +1,35 @@
module Mocha
class Central
attr_accessor :stubba_methods
def initialize
self.stubba_methods = []
end
def stub(method)
unless stubba_methods.include?(method)
method.stub
stubba_methods.push method
end
end
def verify_all(&block)
unique_mocks.each { |mock| mock.verify(&block) }
end
def unique_mocks
stubba_methods.inject({}) { |mocks, method| mocks[method.mock.__id__] = method.mock; mocks }.values
end
def unstub_all
- while stubba_methods.size > 0
+ while stubba_methods.length > 0
method = stubba_methods.pop
method.unstub
end
end
end
end
\ No newline at end of file
diff --git a/test/lib/mocha/class_method.rb b/vendor/gems/mocha-0.5.6/lib/mocha/class_method.rb
similarity index 86%
rename from test/lib/mocha/class_method.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/class_method.rb
index 915fe71b5..e2178be17 100644
--- a/test/lib/mocha/class_method.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/class_method.rb
@@ -1,62 +1,66 @@
require 'mocha/metaclass'
module Mocha
class ClassMethod
attr_reader :stubbee, :method
def initialize(stubbee, method)
@stubbee, @method = stubbee, method
end
def stub
hide_original_method
define_new_method
end
def unstub
remove_new_method
restore_original_method
stubbee.reset_mocha
end
def mock
stubbee.mocha
end
def hide_original_method
stubbee.__metaclass__.class_eval "alias_method :#{hidden_method}, :#{method}" if stubbee.__metaclass__.method_defined?(method)
end
def define_new_method
stubbee.__metaclass__.class_eval "def #{method}(*args, &block); mocha.method_missing(:#{method}, *args, &block); end"
end
def remove_new_method
stubbee.__metaclass__.class_eval "remove_method :#{method}"
end
def restore_original_method
stubbee.__metaclass__.class_eval "alias_method :#{method}, :#{hidden_method}; remove_method :#{hidden_method}" if stubbee.__metaclass__.method_defined?(hidden_method)
end
def hidden_method
- method_name = method.to_s.gsub(/\W/) {|s| "_substituted_character_#{s[0]}_" }
+ if RUBY_VERSION < '1.9'
+ method_name = method.to_s.gsub(/\W/) { |s| "_substituted_character_#{s[0]}_" }
+ else
+ method_name = method.to_s.gsub(/\W/) { |s| "_substituted_character_#{s.ord}_" }
+ end
"__stubba__#{method_name}__stubba__"
end
def eql?(other)
return false unless (other.class == self.class)
(stubbee == other.stubbee) and (method == other.method)
end
alias_method :==, :eql?
def to_s
"#{stubbee}.#{method}"
end
end
end
\ No newline at end of file
diff --git a/test/lib/mocha/deprecation.rb b/vendor/gems/mocha-0.5.6/lib/mocha/deprecation.rb
similarity index 100%
rename from test/lib/mocha/deprecation.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/deprecation.rb
diff --git a/test/lib/mocha/exception_raiser.rb b/vendor/gems/mocha-0.5.6/lib/mocha/exception_raiser.rb
similarity index 100%
rename from test/lib/mocha/exception_raiser.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/exception_raiser.rb
diff --git a/test/lib/mocha/expectation.rb b/vendor/gems/mocha-0.5.6/lib/mocha/expectation.rb
similarity index 85%
rename from test/lib/mocha/expectation.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/expectation.rb
index 49b39bea9..e3da2533f 100644
--- a/test/lib/mocha/expectation.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/expectation.rb
@@ -1,378 +1,384 @@
require 'mocha/infinite_range'
-require 'mocha/pretty_parameters'
+require 'mocha/method_matcher'
+require 'mocha/parameters_matcher'
require 'mocha/expectation_error'
require 'mocha/return_values'
require 'mocha/exception_raiser'
require 'mocha/yield_parameters'
require 'mocha/is_a'
module Mocha # :nodoc:
# Methods on expectations returned from Mock#expects, Mock#stubs, Object#expects and Object#stubs.
class Expectation
- # :stopdoc:
-
- class AlwaysEqual
- def ==(other)
- true
- end
- end
-
- attr_reader :method_name, :backtrace
-
- def initialize(mock, method_name, backtrace = nil)
- @mock, @method_name = mock, method_name
- @expected_count = 1
- @parameters, @parameter_block = AlwaysEqual.new, nil
- @invoked_count, @return_values = 0, ReturnValues.new
- @backtrace = backtrace || caller
- @yield_parameters = YieldParameters.new
- end
-
- def match?(method_name, *arguments)
- return false unless @method_name == method_name
- if @parameter_block then
- return false unless @parameter_block.call(*arguments)
- else
- return false unless (@parameters == arguments)
- end
- if @expected_count.is_a?(Range) then
- return false unless @invoked_count < @expected_count.last
- else
- return false unless @invoked_count < @expected_count
- end
- return true
- end
-
- # :startdoc:
-
# :call-seq: times(range) -> expectation
#
# Modifies expectation so that the number of calls to the expected method must be within a specific +range+.
#
# +range+ can be specified as an exact integer or as a range of integers
# object = mock()
# object.expects(:expected_method).times(3)
# 3.times { object.expected_method }
# # => verify succeeds
#
# object = mock()
# object.expects(:expected_method).times(3)
# 2.times { object.expected_method }
# # => verify fails
#
# object = mock()
# object.expects(:expected_method).times(2..4)
# 3.times { object.expected_method }
# # => verify succeeds
#
# object = mock()
# object.expects(:expected_method).times(2..4)
# object.expected_method
# # => verify fails
def times(range)
@expected_count = range
self
end
# :call-seq: once() -> expectation
#
# Modifies expectation so that the expected method must be called exactly once.
# Note that this is the default behaviour for an expectation, but you may wish to use it for clarity/emphasis.
# object = mock()
# object.expects(:expected_method).once
# object.expected_method
# # => verify succeeds
#
# object = mock()
# object.expects(:expected_method).once
# object.expected_method
# object.expected_method
# # => verify fails
#
# object = mock()
# object.expects(:expected_method).once
# # => verify fails
def once()
times(1)
self
end
# :call-seq: never() -> expectation
#
# Modifies expectation so that the expected method must never be called.
# object = mock()
# object.expects(:expected_method).never
# object.expected_method
# # => verify fails
#
# object = mock()
# object.expects(:expected_method).never
# object.expected_method
# # => verify succeeds
def never
times(0)
self
end
# :call-seq: at_least(minimum_number_of_times) -> expectation
#
# Modifies expectation so that the expected method must be called at least a +minimum_number_of_times+.
# object = mock()
# object.expects(:expected_method).at_least(2)
# 3.times { object.expected_method }
# # => verify succeeds
#
# object = mock()
# object.expects(:expected_method).at_least(2)
# object.expected_method
# # => verify fails
def at_least(minimum_number_of_times)
times(Range.at_least(minimum_number_of_times))
self
end
# :call-seq: at_least_once() -> expectation
#
# Modifies expectation so that the expected method must be called at least once.
# object = mock()
# object.expects(:expected_method).at_least_once
# object.expected_method
# # => verify succeeds
#
# object = mock()
# object.expects(:expected_method).at_least_once
# # => verify fails
def at_least_once()
at_least(1)
self
end
# :call-seq: at_most(maximum_number_of_times) -> expectation
#
# Modifies expectation so that the expected method must be called at most a +maximum_number_of_times+.
# object = mock()
# object.expects(:expected_method).at_most(2)
# 2.times { object.expected_method }
# # => verify succeeds
#
# object = mock()
# object.expects(:expected_method).at_most(2)
# 3.times { object.expected_method }
# # => verify fails
def at_most(maximum_number_of_times)
times(Range.at_most(maximum_number_of_times))
self
end
# :call-seq: at_most_once() -> expectation
#
# Modifies expectation so that the expected method must be called at most once.
# object = mock()
# object.expects(:expected_method).at_most_once
# object.expected_method
# # => verify succeeds
#
# object = mock()
# object.expects(:expected_method).at_most_once
# 2.times { object.expected_method }
# # => verify fails
def at_most_once()
at_most(1)
self
end
- # :call-seq: with(*arguments, ¶meter_block) -> expectation
+ # :call-seq: with(*expected_parameters, &matching_block) -> expectation
#
- # Modifies expectation so that the expected method must be called with specified +arguments+.
+ # Modifies expectation so that the expected method must be called with +expected_parameters+.
# object = mock()
# object.expects(:expected_method).with(:param1, :param2)
# object.expected_method(:param1, :param2)
# # => verify succeeds
#
# object = mock()
# object.expects(:expected_method).with(:param1, :param2)
# object.expected_method(:param3)
# # => verify fails
# May be used with parameter matchers in Mocha::ParameterMatchers.
#
- # If a +parameter_block+ is given, the block is called with the parameters passed to the expected method.
+ # If a +matching_block+ is given, the block is called with the parameters passed to the expected method.
# The expectation is matched if the block evaluates to +true+.
# object = mock()
# object.expects(:expected_method).with() { |value| value % 4 == 0 }
# object.expected_method(16)
# # => verify succeeds
#
# object = mock()
# object.expects(:expected_method).with() { |value| value % 4 == 0 }
# object.expected_method(17)
# # => verify fails
- def with(*arguments, ¶meter_block)
- @parameters, @parameter_block = arguments, parameter_block
- class << @parameters; def to_s; join(', '); end; end
+ def with(*expected_parameters, &matching_block)
+ @parameters_matcher = ParametersMatcher.new(expected_parameters, &matching_block)
self
end
# :call-seq: yields(*parameters) -> expectation
#
# Modifies expectation so that when the expected method is called, it yields with the specified +parameters+.
# object = mock()
# object.expects(:expected_method).yields('result')
# yielded_value = nil
# object.expected_method { |value| yielded_value = value }
# yielded_value # => 'result'
# May be called multiple times on the same expectation for consecutive invocations. Also see Expectation#then.
# object = mock()
# object.stubs(:expected_method).yields(1).then.yields(2)
# yielded_values_from_first_invocation = []
# yielded_values_from_second_invocation = []
# object.expected_method { |value| yielded_values_from_first_invocation << value } # first invocation
# object.expected_method { |value| yielded_values_from_second_invocation << value } # second invocation
# yielded_values_from_first_invocation # => [1]
# yielded_values_from_second_invocation # => [2]
def yields(*parameters)
@yield_parameters.add(*parameters)
self
end
# :call-seq: multiple_yields(*parameter_groups) -> expectation
#
# Modifies expectation so that when the expected method is called, it yields multiple times per invocation with the specified +parameter_groups+.
# object = mock()
# object.expects(:expected_method).multiple_yields(['result_1', 'result_2'], ['result_3'])
# yielded_values = []
# object.expected_method { |*values| yielded_values << values }
# yielded_values # => [['result_1', 'result_2'], ['result_3]]
# May be called multiple times on the same expectation for consecutive invocations. Also see Expectation#then.
# object = mock()
# object.stubs(:expected_method).multiple_yields([1, 2], [3]).then.multiple_yields([4], [5, 6])
# yielded_values_from_first_invocation = []
# yielded_values_from_second_invocation = []
# object.expected_method { |*values| yielded_values_from_first_invocation << values } # first invocation
# object.expected_method { |*values| yielded_values_from_second_invocation << values } # second invocation
# yielded_values_from_first_invocation # => [[1, 2], [3]]
# yielded_values_from_second_invocation # => [[4], [5, 6]]
def multiple_yields(*parameter_groups)
@yield_parameters.multiple_add(*parameter_groups)
self
end
# :call-seq: returns(value) -> expectation
- # :call-seq: returns(*values) -> expectation
+ # returns(*values) -> expectation
#
# Modifies expectation so that when the expected method is called, it returns the specified +value+.
# object = mock()
# object.stubs(:stubbed_method).returns('result')
# object.stubbed_method # => 'result'
# object.stubbed_method # => 'result'
# If multiple +values+ are given, these are returned in turn on consecutive calls to the method.
# object = mock()
# object.stubs(:stubbed_method).returns(1, 2)
# object.stubbed_method # => 1
# object.stubbed_method # => 2
# May be called multiple times on the same expectation. Also see Expectation#then.
# object = mock()
# object.stubs(:expected_method).returns(1, 2).then.returns(3)
# object.expected_method # => 1
# object.expected_method # => 2
# object.expected_method # => 3
# May be called in conjunction with Expectation#raises on the same expectation.
# object = mock()
# object.stubs(:expected_method).returns(1, 2).then.raises(Exception)
# object.expected_method # => 1
# object.expected_method # => 2
# object.expected_method # => raises exception of class Exception1
# If +value+ is a +Proc+, then the expected method will return the result of calling Proc#call.
#
# This usage is _deprecated_.
# Use explicit multiple return values and/or multiple expectations instead.
#
# A +Proc+ instance will be treated the same as any other value in a future release.
# object = mock()
# object.stubs(:stubbed_method).returns(lambda { rand(100) })
# object.stubbed_method # => 41
# object.stubbed_method # => 77
def returns(*values)
@return_values += ReturnValues.build(*values)
self
end
# :call-seq: raises(exception = RuntimeError, message = nil) -> expectation
#
# Modifies expectation so that when the expected method is called, it raises the specified +exception+ with the specified +message+.
# object = mock()
# object.expects(:expected_method).raises(Exception, 'message')
# object.expected_method # => raises exception of class Exception and with message 'message'
# May be called multiple times on the same expectation. Also see Expectation#then.
# object = mock()
# object.stubs(:expected_method).raises(Exception1).then.raises(Exception2)
# object.expected_method # => raises exception of class Exception1
# object.expected_method # => raises exception of class Exception2
# May be called in conjunction with Expectation#returns on the same expectation.
# object = mock()
# object.stubs(:expected_method).raises(Exception).then.returns(2, 3)
# object.expected_method # => raises exception of class Exception1
# object.expected_method # => 2
# object.expected_method # => 3
def raises(exception = RuntimeError, message = nil)
@return_values += ReturnValues.new(ExceptionRaiser.new(exception, message))
self
end
# :call-seq: then() -> expectation
#
# Syntactic sugar to improve readability. Has no effect on state of the expectation.
# object = mock()
# object.stubs(:expected_method).returns(1, 2).then.raises(Exception).then.returns(4)
# object.expected_method # => 1
# object.expected_method # => 2
# object.expected_method # => raises exception of class Exception
# object.expected_method # => 4
def then
self
end
# :stopdoc:
+ def in_sequence(*sequences)
+ sequences.each { |sequence| sequence.constrain_as_next_in_sequence(self) }
+ self
+ end
+
+ attr_reader :backtrace
+
+ def initialize(mock, expected_method_name, backtrace = nil)
+ @mock = mock
+ @method_matcher = MethodMatcher.new(expected_method_name)
+ @parameters_matcher = ParametersMatcher.new
+ @ordering_constraints = []
+ @expected_count, @invoked_count = 1, 0
+ @return_values = ReturnValues.new
+ @yield_parameters = YieldParameters.new
+ @backtrace = backtrace || caller
+ end
+
+ def add_ordering_constraint(ordering_constraint)
+ @ordering_constraints << ordering_constraint
+ end
+
+ def in_correct_order?
+ @ordering_constraints.all? { |ordering_constraint| ordering_constraint.allows_invocation_now? }
+ end
+
+ def matches_method?(method_name)
+ @method_matcher.match?(method_name)
+ end
+
+ def match?(actual_method_name, *actual_parameters)
+ @method_matcher.match?(actual_method_name) && @parameters_matcher.match?(actual_parameters) && in_correct_order?
+ end
+
+ def invocations_allowed?
+ if @expected_count.is_a?(Range) then
+ @invoked_count < @expected_count.last
+ else
+ @invoked_count < @expected_count
+ end
+ end
+
+ def satisfied?
+ if @expected_count.is_a?(Range) then
+ @invoked_count >= @expected_count.first
+ else
+ @invoked_count >= @expected_count
+ end
+ end
+
def invoke
@invoked_count += 1
if block_given? then
@yield_parameters.next_invocation.each do |yield_parameters|
yield(*yield_parameters)
end
end
@return_values.next
end
def verify
yield(self) if block_given?
unless (@expected_count === @invoked_count) then
- error = ExpectationError.new(error_message(@expected_count, @invoked_count))
- error.set_backtrace(filtered_backtrace)
+ error = ExpectationError.new(error_message(@expected_count, @invoked_count), backtrace)
raise error
end
end
- def mocha_lib_directory
- File.expand_path(File.join(File.dirname(__FILE__), "..")) + File::SEPARATOR
- end
-
- def filtered_backtrace
- backtrace.reject { |location| Regexp.new(mocha_lib_directory).match(File.expand_path(location)) }
- end
-
def method_signature
- return "#{method_name}" if @parameters.__is_a__(AlwaysEqual)
- "#{@method_name}(#{PrettyParameters.new(@parameters).pretty})"
+ signature = "#{@mock.mocha_inspect}.#{@method_matcher.mocha_inspect}#{@parameters_matcher.mocha_inspect}"
+ signature << "; #{@ordering_constraints.map { |oc| oc.mocha_inspect }.join("; ")}" unless @ordering_constraints.empty?
+ signature
end
def error_message(expected_count, actual_count)
- "#{@mock.mocha_inspect}.#{method_signature} - expected calls: #{expected_count.mocha_inspect}, actual calls: #{actual_count}"
+ "#{method_signature} - expected calls: #{expected_count.mocha_inspect}, actual calls: #{actual_count}"
end
# :startdoc:
end
end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/expectation_error.rb b/vendor/gems/mocha-0.5.6/lib/mocha/expectation_error.rb
new file mode 100644
index 000000000..705571b85
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/expectation_error.rb
@@ -0,0 +1,15 @@
+module Mocha
+
+ class ExpectationError < StandardError
+
+ LIB_DIRECTORY = File.expand_path(File.join(File.dirname(__FILE__), "..")) + File::SEPARATOR
+
+ def initialize(message = nil, backtrace = [], lib_directory = LIB_DIRECTORY)
+ super(message)
+ filtered_backtrace = backtrace.reject { |location| Regexp.new(lib_directory).match(File.expand_path(location)) }
+ set_backtrace(filtered_backtrace)
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/expectation_list.rb b/vendor/gems/mocha-0.5.6/lib/mocha/expectation_list.rb
new file mode 100644
index 000000000..5ca13d5af
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/expectation_list.rb
@@ -0,0 +1,46 @@
+module Mocha # :nodoc:
+
+ class ExpectationList
+
+ def initialize
+ @expectations = []
+ end
+
+ def add(expectation)
+ @expectations << expectation
+ expectation
+ end
+
+ def matches_method?(method_name)
+ @expectations.any? { |expectation| expectation.matches_method?(method_name) }
+ end
+
+ def similar(method_name)
+ @expectations.select { |expectation| expectation.matches_method?(method_name) }
+ end
+
+ def detect(method_name, *arguments)
+ expectations = @expectations.reverse.select { |e| e.match?(method_name, *arguments) }
+ expectation = expectations.detect { |e| e.invocations_allowed? }
+ expectation || expectations.first
+ end
+
+ def verify(&block)
+ @expectations.each { |expectation| expectation.verify(&block) }
+ end
+
+ def to_a
+ @expectations
+ end
+
+ def to_set
+ @expectations.to_set
+ end
+
+ def length
+ @expectations.length
+ end
+
+ end
+
+end
diff --git a/test/lib/mocha/infinite_range.rb b/vendor/gems/mocha-0.5.6/lib/mocha/infinite_range.rb
similarity index 100%
rename from test/lib/mocha/infinite_range.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/infinite_range.rb
diff --git a/test/lib/mocha/inspect.rb b/vendor/gems/mocha-0.5.6/lib/mocha/inspect.rb
similarity index 100%
rename from test/lib/mocha/inspect.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/inspect.rb
diff --git a/test/lib/mocha/instance_method.rb b/vendor/gems/mocha-0.5.6/lib/mocha/instance_method.rb
similarity index 100%
rename from test/lib/mocha/instance_method.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/instance_method.rb
diff --git a/test/lib/mocha/is_a.rb b/vendor/gems/mocha-0.5.6/lib/mocha/is_a.rb
similarity index 100%
rename from test/lib/mocha/is_a.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/is_a.rb
diff --git a/test/lib/mocha/metaclass.rb b/vendor/gems/mocha-0.5.6/lib/mocha/metaclass.rb
similarity index 100%
rename from test/lib/mocha/metaclass.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/metaclass.rb
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/method_matcher.rb b/vendor/gems/mocha-0.5.6/lib/mocha/method_matcher.rb
new file mode 100644
index 000000000..6ce5f6d57
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/method_matcher.rb
@@ -0,0 +1,21 @@
+module Mocha
+
+ class MethodMatcher
+
+ attr_reader :expected_method_name
+
+ def initialize(expected_method_name)
+ @expected_method_name = expected_method_name
+ end
+
+ def match?(actual_method_name)
+ @expected_method_name == actual_method_name
+ end
+
+ def mocha_inspect
+ "#{@expected_method_name}"
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/missing_expectation.rb b/vendor/gems/mocha-0.5.6/lib/mocha/missing_expectation.rb
new file mode 100644
index 000000000..ccff6bff4
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/missing_expectation.rb
@@ -0,0 +1,17 @@
+require 'mocha/expectation'
+
+module Mocha # :nodoc:
+
+ class MissingExpectation < Expectation # :nodoc:
+
+ def verify
+ message = error_message(0, 1)
+ similar_expectations = @mock.expectations.similar(@method_matcher.expected_method_name)
+ method_signatures = similar_expectations.map { |expectation| expectation.method_signature }
+ message << "\nSimilar expectations:\n#{method_signatures.join("\n")}" unless method_signatures.empty?
+ raise ExpectationError.new(message, backtrace)
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/test/lib/mocha/mock.rb b/vendor/gems/mocha-0.5.6/lib/mocha/mock.rb
similarity index 78%
rename from test/lib/mocha/mock.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/mock.rb
index 18c23fede..59193e728 100644
--- a/test/lib/mocha/mock.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/mock.rb
@@ -1,207 +1,202 @@
require 'mocha/expectation'
+require 'mocha/expectation_list'
require 'mocha/stub'
require 'mocha/missing_expectation'
require 'mocha/metaclass'
module Mocha # :nodoc:
-
+
# Traditional mock object.
#
# Methods return an Expectation which can be further modified by methods on Expectation.
class Mock
- # :stopdoc:
-
- def initialize(stub_everything = false, name = nil)
- @stub_everything = stub_everything
- @mock_name = name
- @expectations = []
- @responder = nil
- end
-
- attr_reader :stub_everything, :expectations
-
- # :startdoc:
-
# :call-seq: expects(method_name) -> expectation
# expects(method_names) -> last expectation
#
# Adds an expectation that a method identified by +method_name+ symbol must be called exactly once with any parameters.
# Returns the new expectation which can be further modified by methods on Expectation.
# object = mock()
# object.expects(:method1)
# object.method1
# # no error raised
#
# object = mock()
# object.expects(:method1)
# # error raised, because method1 not called exactly once
# If +method_names+ is a +Hash+, an expectation will be set up for each entry using the key as +method_name+ and value as +return_value+.
# object = mock()
# object.expects(:method1 => :result1, :method2 => :result2)
#
# # exactly equivalent to
#
# object = mock()
# object.expects(:method1).returns(:result1)
# object.expects(:method2).returns(:result2)
#
# Aliased by \_\_expects\_\_
def expects(method_name_or_hash, backtrace = nil)
if method_name_or_hash.is_a?(Hash) then
method_name_or_hash.each do |method_name, return_value|
- add_expectation(Expectation.new(self, method_name, backtrace).returns(return_value))
+ ensure_method_not_already_defined(method_name)
+ @expectations.add(Expectation.new(self, method_name, backtrace).returns(return_value))
end
else
- add_expectation(Expectation.new(self, method_name_or_hash, backtrace))
+ ensure_method_not_already_defined(method_name_or_hash)
+ @expectations.add(Expectation.new(self, method_name_or_hash, backtrace))
end
end
# :call-seq: stubs(method_name) -> expectation
# stubs(method_names) -> last expectation
#
# Adds an expectation that a method identified by +method_name+ symbol may be called any number of times with any parameters.
# Returns the new expectation which can be further modified by methods on Expectation.
# object = mock()
# object.stubs(:method1)
# object.method1
# object.method1
# # no error raised
# If +method_names+ is a +Hash+, an expectation will be set up for each entry using the key as +method_name+ and value as +return_value+.
# object = mock()
# object.stubs(:method1 => :result1, :method2 => :result2)
#
# # exactly equivalent to
#
# object = mock()
# object.stubs(:method1).returns(:result1)
# object.stubs(:method2).returns(:result2)
#
# Aliased by \_\_stubs\_\_
def stubs(method_name_or_hash, backtrace = nil)
if method_name_or_hash.is_a?(Hash) then
method_name_or_hash.each do |method_name, return_value|
- add_expectation(Stub.new(self, method_name, backtrace).returns(return_value))
+ ensure_method_not_already_defined(method_name)
+ @expectations.add(Stub.new(self, method_name, backtrace).returns(return_value))
end
else
- add_expectation(Stub.new(self, method_name_or_hash, backtrace))
+ ensure_method_not_already_defined(method_name_or_hash)
+ @expectations.add(Stub.new(self, method_name_or_hash, backtrace))
end
end
# :call-seq: responds_like(responder) -> mock
#
# Constrains the +mock+ so that it can only expect or stub methods to which +responder+ responds. The constraint is only applied at method invocation time.
#
# A +NoMethodError+ will be raised if the +responder+ does not respond_to? a method invocation (even if the method has been expected or stubbed).
#
# The +mock+ will delegate its respond_to? method to the +responder+.
# class Sheep
# def chew(grass); end
# def self.number_of_legs; end
# end
#
# sheep = mock('sheep')
# sheep.expects(:chew)
# sheep.expects(:foo)
# sheep.respond_to?(:chew) # => true
# sheep.respond_to?(:foo) # => true
# sheep.chew
# sheep.foo
# # no error raised
#
# sheep = mock('sheep')
# sheep.responds_like(Sheep.new)
# sheep.expects(:chew)
# sheep.expects(:foo)
# sheep.respond_to?(:chew) # => true
# sheep.respond_to?(:foo) # => false
# sheep.chew
# sheep.foo # => raises NoMethodError exception
#
# sheep_class = mock('sheep_class')
# sheep_class.responds_like(Sheep)
# sheep_class.stubs(:number_of_legs).returns(4)
# sheep_class.expects(:foo)
# sheep_class.respond_to?(:number_of_legs) # => true
# sheep_class.respond_to?(:foo) # => false
# assert_equal 4, sheep_class.number_of_legs
# sheep_class.foo # => raises NoMethodError exception
#
# Aliased by +quacks_like+
def responds_like(object)
@responder = object
self
end
# :stopdoc:
+
+ def initialize(name = nil, &block)
+ @mock_name = name
+ @expectations = ExpectationList.new
+ @everything_stubbed = false
+ @responder = nil
+ instance_eval(&block) if block
+ end
+
+ attr_reader :everything_stubbed, :expectations
alias_method :__expects__, :expects
alias_method :__stubs__, :stubs
alias_method :quacks_like, :responds_like
def add_expectation(expectation)
- @expectations << expectation
- method_name = expectation.method_name
- self.__metaclass__.send(:undef_method, method_name) if self.__metaclass__.method_defined?(method_name)
- expectation
+ @expectations.add(expectation)
end
-
+
+ def stub_everything
+ @everything_stubbed = true
+ end
+
def method_missing(symbol, *arguments, &block)
if @responder and not @responder.respond_to?(symbol)
raise NoMethodError, "undefined method `#{symbol}' for #{self.mocha_inspect} which responds like #{@responder.mocha_inspect}"
end
- matching_expectation = matching_expectation(symbol, *arguments)
+ matching_expectation = @expectations.detect(symbol, *arguments)
if matching_expectation then
matching_expectation.invoke(&block)
- elsif stub_everything then
+ elsif @everything_stubbed then
return
else
- begin
- super_method_missing(symbol, *arguments, &block)
- rescue NoMethodError
- unexpected_method_called(symbol, *arguments)
- end
- end
- end
-
- def respond_to?(symbol)
- if @responder then
- @responder.respond_to?(symbol)
+ unexpected_method_called(symbol, *arguments)
+ end
+ end
+
+ def respond_to?(symbol)
+ if @responder then
+ @responder.respond_to?(symbol)
else
- @expectations.any? { |expectation| expectation.method_name == symbol }
- end
- end
-
- def super_method_missing(symbol, *arguments, &block)
- raise NoMethodError
+ @expectations.matches_method?(symbol)
+ end
end
-
- def unexpected_method_called(symbol, *arguments)
+
+ def unexpected_method_called(symbol, *arguments)
MissingExpectation.new(self, symbol).with(*arguments).verify
end
-
- def matching_expectation(symbol, *arguments)
- @expectations.reverse.detect { |expectation| expectation.match?(symbol, *arguments) }
- end
def verify(&block)
- @expectations.each { |expectation| expectation.verify(&block) }
+ @expectations.verify(&block)
end
def mocha_inspect
address = self.__id__ * 2
address += 0x100000000 if address < 0
@mock_name ? "#" : "#"
end
def inspect
mocha_inspect
end
+
+ def ensure_method_not_already_defined(method_name)
+ self.__metaclass__.send(:undef_method, method_name) if self.__metaclass__.method_defined?(method_name)
+ end
# :startdoc:
end
-end
\ No newline at end of file
+end
diff --git a/test/lib/mocha/multiple_yields.rb b/vendor/gems/mocha-0.5.6/lib/mocha/multiple_yields.rb
similarity index 100%
rename from test/lib/mocha/multiple_yields.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/multiple_yields.rb
diff --git a/test/lib/mocha/no_yields.rb b/vendor/gems/mocha-0.5.6/lib/mocha/no_yields.rb
similarity index 100%
rename from test/lib/mocha/no_yields.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/no_yields.rb
diff --git a/test/lib/mocha/object.rb b/vendor/gems/mocha-0.5.6/lib/mocha/object.rb
similarity index 100%
rename from test/lib/mocha/object.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/object.rb
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers.rb
new file mode 100644
index 000000000..a11047998
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers.rb
@@ -0,0 +1,25 @@
+module Mocha
+
+ # Used as parameters for Expectation#with to restrict the parameter values which will match the expectation.
+ module ParameterMatchers; end
+
+end
+
+require 'mocha/parameter_matchers/object'
+
+require 'mocha/parameter_matchers/all_of'
+require 'mocha/parameter_matchers/any_of'
+require 'mocha/parameter_matchers/any_parameters'
+require 'mocha/parameter_matchers/anything'
+require 'mocha/parameter_matchers/equals'
+require 'mocha/parameter_matchers/has_entry'
+require 'mocha/parameter_matchers/has_entries'
+require 'mocha/parameter_matchers/has_key'
+require 'mocha/parameter_matchers/has_value'
+require 'mocha/parameter_matchers/includes'
+require 'mocha/parameter_matchers/instance_of'
+require 'mocha/parameter_matchers/is_a'
+require 'mocha/parameter_matchers/kind_of'
+require 'mocha/parameter_matchers/not'
+require 'mocha/parameter_matchers/optionally'
+require 'mocha/parameter_matchers/regexp_matches'
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._all_of.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._all_of.rb
new file mode 100644
index 000000000..41edbb869
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._all_of.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._any_of.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._any_of.rb
new file mode 100644
index 000000000..ff228f5c7
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._any_of.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._any_parameters.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._any_parameters.rb
new file mode 100644
index 000000000..7f2968c8c
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._any_parameters.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._anything.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._anything.rb
new file mode 100644
index 000000000..5efdf5440
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._anything.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._base.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._base.rb
new file mode 100644
index 000000000..fc871fdda
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._base.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._equals.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._equals.rb
new file mode 100644
index 000000000..c0dfb4cf5
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._equals.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_entries.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_entries.rb
new file mode 100644
index 000000000..622858418
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_entries.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_entry.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_entry.rb
new file mode 100644
index 000000000..fe7b51cfa
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_entry.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_key.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_key.rb
new file mode 100644
index 000000000..e045911be
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_key.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_value.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_value.rb
new file mode 100644
index 000000000..a9565f2d4
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._has_value.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._includes.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._includes.rb
new file mode 100644
index 000000000..0139a2dd2
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._includes.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._instance_of.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._instance_of.rb
new file mode 100644
index 000000000..718e37697
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._instance_of.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._is_a.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._is_a.rb
new file mode 100644
index 000000000..189a411cd
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._is_a.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._kind_of.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._kind_of.rb
new file mode 100644
index 000000000..b99d0d771
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._kind_of.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._not.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._not.rb
new file mode 100644
index 000000000..72ad06517
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._not.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._object.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._object.rb
new file mode 100644
index 000000000..5b117348e
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._object.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._optionally.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._optionally.rb
new file mode 100644
index 000000000..2177fc74a
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._optionally.rb differ
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._regexp_matches.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._regexp_matches.rb
new file mode 100644
index 000000000..2b30b084a
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/._regexp_matches.rb differ
diff --git a/test/lib/mocha/parameter_matchers/all_of.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/all_of.rb
similarity index 78%
rename from test/lib/mocha/parameter_matchers/all_of.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/all_of.rb
index 343d9eea0..369eb4340 100644
--- a/test/lib/mocha/parameter_matchers/all_of.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/all_of.rb
@@ -1,39 +1,42 @@
+require 'mocha/parameter_matchers/base'
+
module Mocha
module ParameterMatchers
# :call-seq: all_of -> parameter_matcher
#
# Matches if all +matchers+ match.
# object = mock()
# object.expects(:method_1).with(all_of(includes(1), includes(3)))
# object.method_1([1, 3])
# # no error raised
#
# object = mock()
# object.expects(:method_1).with(all_of(includes(1), includes(3)))
# object.method_1([1, 2])
# # error raised, because method_1 was not called with object including 1 and 3
def all_of(*matchers)
AllOf.new(*matchers)
end
- class AllOf # :nodoc:
+ class AllOf < Base # :nodoc:
def initialize(*matchers)
@matchers = matchers
end
- def ==(parameter)
- @matchers.all? { |matcher| matcher == parameter }
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
+ @matchers.all? { |matcher| matcher.matches?([parameter]) }
end
def mocha_inspect
"all_of(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
end
end
end
end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/any_of.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/any_of.rb
similarity index 79%
rename from test/lib/mocha/parameter_matchers/any_of.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/any_of.rb
index a1f88075d..dd254b12f 100644
--- a/test/lib/mocha/parameter_matchers/any_of.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/any_of.rb
@@ -1,44 +1,47 @@
+require 'mocha/parameter_matchers/base'
+
module Mocha
module ParameterMatchers
# :call-seq: any_of -> parameter_matcher
#
# Matches if any +matchers+ match.
# object = mock()
# object.expects(:method_1).with(any_of(1, 3))
# object.method_1(1)
# # no error raised
#
# object = mock()
# object.expects(:method_1).with(any_of(1, 3))
# object.method_1(3)
# # no error raised
#
# object = mock()
# object.expects(:method_1).with(any_of(1, 3))
# object.method_1(2)
# # error raised, because method_1 was not called with 1 or 3
def any_of(*matchers)
AnyOf.new(*matchers)
end
- class AnyOf # :nodoc:
+ class AnyOf < Base # :nodoc:
def initialize(*matchers)
@matchers = matchers
end
- def ==(parameter)
- @matchers.any? { |matcher| matcher == parameter }
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
+ @matchers.any? { |matcher| matcher.matches?([parameter]) }
end
def mocha_inspect
"any_of(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
end
end
end
end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/any_parameters.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/any_parameters.rb
new file mode 100644
index 000000000..11dae83ed
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/any_parameters.rb
@@ -0,0 +1,40 @@
+require 'mocha/parameter_matchers/base'
+
+module Mocha
+
+ module ParameterMatchers
+
+ # :call-seq: any_parameters() -> parameter_matcher
+ #
+ # Matches any parameters.
+ # object = mock()
+ # object.expects(:method_1).with(any_parameters)
+ # object.method_1(1, 2, 3, 4)
+ # # no error raised
+ #
+ # object = mock()
+ # object.expects(:method_1).with(any_parameters)
+ # object.method_1(5, 6, 7, 8, 9, 0)
+ # # no error raised
+ def any_parameters
+ AnyParameters.new
+ end
+
+ class AnyParameters < Base # :nodoc:
+
+ def matches?(available_parameters)
+ while available_parameters.length > 0 do
+ available_parameters.shift
+ end
+ return true
+ end
+
+ def mocha_inspect
+ "any_parameters"
+ end
+
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/anything.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/anything.rb
similarity index 73%
rename from test/lib/mocha/parameter_matchers/anything.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/anything.rb
index 57d0eeab4..e82ef86a0 100644
--- a/test/lib/mocha/parameter_matchers/anything.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/anything.rb
@@ -1,30 +1,33 @@
+require 'mocha/parameter_matchers/base'
+
module Mocha
module ParameterMatchers
# :call-seq: anything -> parameter_matcher
#
# Matches any object.
# object = mock()
# object.expects(:method_1).with(anything)
# object.method_1('foo')
# # no error raised
def anything
Anything.new
end
- class Anything # :nodoc:
+ class Anything < Base # :nodoc:
- def ==(parameter)
+ def matches?(available_parameters)
+ available_parameters.shift
return true
end
def mocha_inspect
"anything"
end
end
end
end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/base.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/base.rb
new file mode 100644
index 000000000..6aaec51a1
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/base.rb
@@ -0,0 +1,15 @@
+module Mocha
+
+ module ParameterMatchers
+
+ class Base # :nodoc:
+
+ def to_matcher
+ self
+ end
+
+ end
+
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/equals.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/equals.rb
new file mode 100644
index 000000000..bdc61a0f5
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/equals.rb
@@ -0,0 +1,42 @@
+require 'mocha/parameter_matchers/base'
+
+module Mocha
+
+ module ParameterMatchers
+
+ # :call-seq: equals(value) -> parameter_matcher
+ #
+ # Matches +Object+ equalling +value+.
+ # object = mock()
+ # object.expects(:method_1).with(equals(2))
+ # object.method_1(2)
+ # # no error raised
+ #
+ # object = mock()
+ # object.expects(:method_1).with(equals(2))
+ # object.method_1(3)
+ # # error raised, because method_1 was not called with Object equalling 3
+ def equals(value)
+ Equals.new(value)
+ end
+
+ class Equals < Base # :nodoc:
+
+ def initialize(value)
+ @value = value
+ end
+
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
+ parameter == @value
+ end
+
+ def mocha_inspect
+ @value.mocha_inspect
+ end
+
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_entries.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_entries.rb
new file mode 100644
index 000000000..30cf025a5
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_entries.rb
@@ -0,0 +1,42 @@
+require 'mocha/parameter_matchers/base'
+
+module Mocha
+
+ module ParameterMatchers
+
+ # :call-seq: has_entries(entries) -> parameter_matcher
+ #
+ # Matches +Hash+ containing all +entries+.
+ # object = mock()
+ # object.expects(:method_1).with(has_entries('key_1' => 1, 'key_2' => 2))
+ # object.method_1('key_1' => 1, 'key_2' => 2, 'key_3' => 3)
+ # # no error raised
+ #
+ # object = mock()
+ # object.expects(:method_1).with(has_entries('key_1' => 1, 'key_2' => 2))
+ # object.method_1('key_1' => 1, 'key_2' => 99)
+ # # error raised, because method_1 was not called with Hash containing entries: 'key_1' => 1, 'key_2' => 2
+ def has_entries(entries)
+ HasEntries.new(entries)
+ end
+
+ class HasEntries < Base # :nodoc:
+
+ def initialize(entries)
+ @entries = entries
+ end
+
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
+ @entries.all? { |key, value| parameter[key] == value }
+ end
+
+ def mocha_inspect
+ "has_entries(#{@entries.mocha_inspect})"
+ end
+
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/has_entry.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_entry.rb
similarity index 53%
rename from test/lib/mocha/parameter_matchers/has_entry.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_entry.rb
index 3d7cac4e6..b6459613d 100644
--- a/test/lib/mocha/parameter_matchers/has_entry.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_entry.rb
@@ -1,39 +1,55 @@
+require 'mocha/parameter_matchers/base'
+
module Mocha
module ParameterMatchers
# :call-seq: has_entry(key, value) -> parameter_matcher
+ # has_entry(key => value) -> parameter_matcher
#
# Matches +Hash+ containing entry with +key+ and +value+.
# object = mock()
# object.expects(:method_1).with(has_entry('key_1', 1))
# object.method_1('key_1' => 1, 'key_2' => 2)
# # no error raised
#
# object = mock()
+ # object.expects(:method_1).with(has_entry('key_1' => 1))
+ # object.method_1('key_1' => 1, 'key_2' => 2)
+ # # no error raised
+ #
+ # object = mock()
# object.expects(:method_1).with(has_entry('key_1', 1))
# object.method_1('key_1' => 2, 'key_2' => 1)
# # error raised, because method_1 was not called with Hash containing entry: 'key_1' => 1
- def has_entry(key, value)
+ #
+ # object = mock()
+ # object.expects(:method_1).with(has_entry('key_1' => 1))
+ # object.method_1('key_1' => 2, 'key_2' => 1)
+ # # error raised, because method_1 was not called with Hash containing entry: 'key_1' => 1
+ def has_entry(*options)
+ key, value = options.shift, options.shift
+ key, value = key.to_a[0][0..1] if key.is_a?(Hash)
HasEntry.new(key, value)
end
-
- class HasEntry # :nodoc:
+
+ class HasEntry < Base # :nodoc:
def initialize(key, value)
@key, @value = key, value
end
- def ==(parameter)
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
parameter[@key] == @value
end
def mocha_inspect
"has_entry(#{@key.mocha_inspect}, #{@value.mocha_inspect})"
end
end
end
end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/has_key.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_key.rb
similarity index 83%
rename from test/lib/mocha/parameter_matchers/has_key.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_key.rb
index 5a1fcd2e8..247815219 100644
--- a/test/lib/mocha/parameter_matchers/has_key.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_key.rb
@@ -1,39 +1,42 @@
+require 'mocha/parameter_matchers/base'
+
module Mocha
module ParameterMatchers
# :call-seq: has_key(key) -> parameter_matcher
#
# Matches +Hash+ containing +key+.
# object = mock()
# object.expects(:method_1).with(has_key('key_1'))
# object.method_1('key_1' => 1, 'key_2' => 2)
# # no error raised
#
# object = mock()
# object.expects(:method_1).with(has_key('key_1'))
# object.method_1('key_2' => 2)
# # error raised, because method_1 was not called with Hash containing key: 'key_1'
def has_key(key)
HasKey.new(key)
end
- class HasKey # :nodoc:
+ class HasKey < Base # :nodoc:
def initialize(key)
@key = key
end
- def ==(parameter)
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
parameter.keys.include?(@key)
end
def mocha_inspect
"has_key(#{@key.mocha_inspect})"
end
end
end
end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/has_value.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_value.rb
similarity index 83%
rename from test/lib/mocha/parameter_matchers/has_value.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_value.rb
index 742f84268..2c6fe7c5e 100644
--- a/test/lib/mocha/parameter_matchers/has_value.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/has_value.rb
@@ -1,39 +1,42 @@
+require 'mocha/parameter_matchers/base'
+
module Mocha
module ParameterMatchers
# :call-seq: has_value(value) -> parameter_matcher
#
# Matches +Hash+ containing +value+.
# object = mock()
# object.expects(:method_1).with(has_value(1))
# object.method_1('key_1' => 1, 'key_2' => 2)
# # no error raised
#
# object = mock()
# object.expects(:method_1).with(has_value(1))
# object.method_1('key_2' => 2)
# # error raised, because method_1 was not called with Hash containing value: 1
def has_value(value)
HasValue.new(value)
end
- class HasValue # :nodoc:
+ class HasValue < Base # :nodoc:
def initialize(value)
@value = value
end
- def ==(parameter)
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
parameter.values.include?(@value)
end
def mocha_inspect
"has_value(#{@value.mocha_inspect})"
end
end
end
end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/includes.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/includes.rb
similarity index 80%
rename from test/lib/mocha/parameter_matchers/includes.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/includes.rb
index 0e4fbe960..4539a5c44 100644
--- a/test/lib/mocha/parameter_matchers/includes.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/includes.rb
@@ -1,37 +1,40 @@
+require 'mocha/parameter_matchers/base'
+
module Mocha
module ParameterMatchers
# :call-seq: includes(item) -> parameter_matcher
#
# Matches any object that responds true to include?(item)
# object = mock()
# object.expects(:method_1).with(includes('foo'))
# object.method_1(['foo', 'bar'])
# # no error raised
#
# object.method_1(['baz'])
# # error raised, because ['baz'] does not include 'foo'.
def includes(item)
Includes.new(item)
end
- class Includes # :nodoc:
+ class Includes < Base # :nodoc:
def initialize(item)
@item = item
end
- def ==(parameter)
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
return parameter.include?(@item)
end
def mocha_inspect
"includes(#{@item.mocha_inspect})"
end
end
end
end
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/instance_of.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/instance_of.rb
new file mode 100644
index 000000000..49b4a478d
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/instance_of.rb
@@ -0,0 +1,42 @@
+require 'mocha/parameter_matchers/base'
+
+module Mocha
+
+ module ParameterMatchers
+
+ # :call-seq: instance_of(klass) -> parameter_matcher
+ #
+ # Matches any object that is an instance of +klass+
+ # object = mock()
+ # object.expects(:method_1).with(instance_of(String))
+ # object.method_1('string')
+ # # no error raised
+ #
+ # object = mock()
+ # object.expects(:method_1).with(instance_of(String))
+ # object.method_1(99)
+ # # error raised, because method_1 was not called with an instance of String
+ def instance_of(klass)
+ InstanceOf.new(klass)
+ end
+
+ class InstanceOf < Base # :nodoc:
+
+ def initialize(klass)
+ @klass = klass
+ end
+
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
+ parameter.instance_of?(@klass)
+ end
+
+ def mocha_inspect
+ "instance_of(#{@klass.mocha_inspect})"
+ end
+
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/is_a.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/is_a.rb
new file mode 100644
index 000000000..a721db523
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/is_a.rb
@@ -0,0 +1,42 @@
+require 'mocha/parameter_matchers/base'
+
+module Mocha
+
+ module ParameterMatchers
+
+ # :call-seq: is_a(klass) -> parameter_matcher
+ #
+ # Matches any object that is a +klass+
+ # object = mock()
+ # object.expects(:method_1).with(is_a(Integer))
+ # object.method_1(99)
+ # # no error raised
+ #
+ # object = mock()
+ # object.expects(:method_1).with(is_a(Integer))
+ # object.method_1('string')
+ # # error raised, because method_1 was not called with an Integer
+ def is_a(klass)
+ IsA.new(klass)
+ end
+
+ class IsA < Base # :nodoc:
+
+ def initialize(klass)
+ @klass = klass
+ end
+
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
+ parameter.is_a?(@klass)
+ end
+
+ def mocha_inspect
+ "is_a(#{@klass.mocha_inspect})"
+ end
+
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/kind_of.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/kind_of.rb
new file mode 100644
index 000000000..710d709d0
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/kind_of.rb
@@ -0,0 +1,42 @@
+require 'mocha/parameter_matchers/base'
+
+module Mocha
+
+ module ParameterMatchers
+
+ # :call-seq: kind_of(klass) -> parameter_matcher
+ #
+ # Matches any object that is a kind of +klass+
+ # object = mock()
+ # object.expects(:method_1).with(kind_of(Integer))
+ # object.method_1(99)
+ # # no error raised
+ #
+ # object = mock()
+ # object.expects(:method_1).with(kind_of(Integer))
+ # object.method_1('string')
+ # # error raised, because method_1 was not called with a kind of Integer
+ def kind_of(klass)
+ KindOf.new(klass)
+ end
+
+ class KindOf < Base # :nodoc:
+
+ def initialize(klass)
+ @klass = klass
+ end
+
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
+ parameter.kind_of?(@klass)
+ end
+
+ def mocha_inspect
+ "kind_of(#{@klass.mocha_inspect})"
+ end
+
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/not.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/not.rb
new file mode 100644
index 000000000..ec48ade3d
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/not.rb
@@ -0,0 +1,42 @@
+require 'mocha/parameter_matchers/base'
+
+module Mocha
+
+ module ParameterMatchers
+
+ # :call-seq: Not(matcher) -> parameter_matcher
+ #
+ # Matches if +matcher+ does not match.
+ # object = mock()
+ # object.expects(:method_1).with(Not(includes(1)))
+ # object.method_1([0, 2, 3])
+ # # no error raised
+ #
+ # object = mock()
+ # object.expects(:method_1).with(Not(includes(1)))
+ # object.method_1([0, 1, 2, 3])
+ # # error raised, because method_1 was not called with object not including 1
+ def Not(matcher)
+ Not.new(matcher)
+ end
+
+ class Not < Base # :nodoc:
+
+ def initialize(matcher)
+ @matcher = matcher
+ end
+
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
+ !@matcher.matches?([parameter])
+ end
+
+ def mocha_inspect
+ "Not(#{@matcher.mocha_inspect})"
+ end
+
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/object.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/object.rb
new file mode 100644
index 000000000..f3a639bfa
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/object.rb
@@ -0,0 +1,9 @@
+require 'mocha/parameter_matchers/equals'
+
+class Object
+
+ def to_matcher
+ Mocha::ParameterMatchers::Equals.new(self)
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/optionally.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/optionally.rb
new file mode 100644
index 000000000..bb9625187
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/optionally.rb
@@ -0,0 +1,33 @@
+module Mocha
+
+ module ParameterMatchers
+
+ def optionally(*matchers)
+ Optionally.new(*matchers)
+ end
+
+ class Optionally < Base # :nodoc:
+
+ def initialize(*parameters)
+ @matchers = parameters.map { |parameter| parameter.to_matcher }
+ end
+
+ def matches?(available_parameters)
+ index = 0
+ while (available_parameters.length > 0) && (index < @matchers.length) do
+ matcher = @matchers[index]
+ return false unless matcher.matches?(available_parameters)
+ index += 1
+ end
+ return true
+ end
+
+ def mocha_inspect
+ "optionally(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
+ end
+
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/regexp_matches.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/regexp_matches.rb
new file mode 100644
index 000000000..cc46436eb
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameter_matchers/regexp_matches.rb
@@ -0,0 +1,43 @@
+require 'mocha/parameter_matchers/base'
+
+module Mocha
+
+ module ParameterMatchers
+
+ # :call-seq: regexp_matches(regexp) -> parameter_matcher
+ #
+ # Matches any object that matches the regular expression, +regexp+.
+ # object = mock()
+ # object.expects(:method_1).with(regexp_matches(/e/))
+ # object.method_1('hello')
+ # # no error raised
+ #
+ # object = mock()
+ # object.expects(:method_1).with(regexp_matches(/a/))
+ # object.method_1('hello')
+ # # error raised, because method_1 was not called with a parameter that matched the
+ # # regular expression
+ def regexp_matches(regexp)
+ RegexpMatches.new(regexp)
+ end
+
+ class RegexpMatches < Base # :nodoc:
+
+ def initialize(regexp)
+ @regexp = regexp
+ end
+
+ def matches?(available_parameters)
+ parameter = available_parameters.shift
+ parameter =~ @regexp
+ end
+
+ def mocha_inspect
+ "regexp_matches(#{@regexp.mocha_inspect})"
+ end
+
+ end
+
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/parameters_matcher.rb b/vendor/gems/mocha-0.5.6/lib/mocha/parameters_matcher.rb
new file mode 100644
index 000000000..d43ae4375
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/parameters_matcher.rb
@@ -0,0 +1,37 @@
+require 'mocha/inspect'
+require 'mocha/parameter_matchers'
+
+module Mocha
+
+ class ParametersMatcher
+
+ def initialize(expected_parameters = [ParameterMatchers::AnyParameters.new], &matching_block)
+ @expected_parameters, @matching_block = expected_parameters, matching_block
+ end
+
+ def match?(actual_parameters = [])
+ if @matching_block
+ return @matching_block.call(*actual_parameters)
+ else
+ return parameters_match?(actual_parameters)
+ end
+ end
+
+ def parameters_match?(actual_parameters)
+ matchers.all? { |matcher| matcher.matches?(actual_parameters) } && (actual_parameters.length == 0)
+ end
+
+ def mocha_inspect
+ signature = matchers.mocha_inspect
+ signature = signature.gsub(/^\[|\]$/, '')
+ signature = signature.gsub(/^\{|\}$/, '') if matchers.length == 1
+ "(#{signature})"
+ end
+
+ def matchers
+ @expected_parameters.map { |parameter| parameter.to_matcher }
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/test/lib/mocha/pretty_parameters.rb b/vendor/gems/mocha-0.5.6/lib/mocha/pretty_parameters.rb
similarity index 96%
rename from test/lib/mocha/pretty_parameters.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/pretty_parameters.rb
index 6d3c165f8..59ed636f8 100644
--- a/test/lib/mocha/pretty_parameters.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/pretty_parameters.rb
@@ -1,28 +1,28 @@
require 'mocha/inspect'
module Mocha
class PrettyParameters
def initialize(params)
@params = params
@params_string = params.mocha_inspect
end
def pretty
remove_outer_array_braces!
remove_outer_hash_braces!
@params_string
end
def remove_outer_array_braces!
@params_string = @params_string.gsub(/^\[|\]$/, '')
end
def remove_outer_hash_braces!
- @params_string = @params_string.gsub(/^\{|\}$/, '') if @params.size == 1
+ @params_string = @params_string.gsub(/^\{|\}$/, '') if @params.length == 1
end
end
end
\ No newline at end of file
diff --git a/test/lib/mocha/return_values.rb b/vendor/gems/mocha-0.5.6/lib/mocha/return_values.rb
similarity index 74%
rename from test/lib/mocha/return_values.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/return_values.rb
index ea0fbbd40..b4852c5f6 100644
--- a/test/lib/mocha/return_values.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/return_values.rb
@@ -1,31 +1,34 @@
require 'mocha/single_return_value'
module Mocha # :nodoc:
class ReturnValues # :nodoc:
def self.build(*values)
new(*values.map { |value| SingleReturnValue.new(value) })
end
attr_accessor :values
def initialize(*values)
@values = values
end
def next
- case @values.size
- when 0: nil
- when 1: @values.first.evaluate
- else @values.shift.evaluate
+ case @values.length
+ when 0
+ nil
+ when 1
+ @values.first.evaluate
+ else
+ @values.shift.evaluate
end
end
def +(other)
self.class.new(*(@values + other.values))
end
end
end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha/sequence.rb b/vendor/gems/mocha-0.5.6/lib/mocha/sequence.rb
new file mode 100644
index 000000000..ed9852e0c
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/sequence.rb
@@ -0,0 +1,42 @@
+module Mocha # :nodoc:
+
+ class Sequence
+
+ class InSequenceOrderingConstraint
+
+ def initialize(sequence, index)
+ @sequence, @index = sequence, index
+ end
+
+ def allows_invocation_now?
+ @sequence.satisfied_to_index?(@index)
+ end
+
+ def mocha_inspect
+ "in sequence #{@sequence.mocha_inspect}"
+ end
+
+ end
+
+ def initialize(name)
+ @name = name
+ @expectations = []
+ end
+
+ def constrain_as_next_in_sequence(expectation)
+ index = @expectations.length
+ @expectations << expectation
+ expectation.add_ordering_constraint(InSequenceOrderingConstraint.new(self, index))
+ end
+
+ def satisfied_to_index?(index)
+ @expectations[0...index].all? { |expectation| expectation.satisfied? }
+ end
+
+ def mocha_inspect
+ "#{@name.mocha_inspect}"
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/test/lib/mocha/setup_and_teardown.rb b/vendor/gems/mocha-0.5.6/lib/mocha/setup_and_teardown.rb
similarity index 100%
rename from test/lib/mocha/setup_and_teardown.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/setup_and_teardown.rb
diff --git a/test/lib/mocha/single_return_value.rb b/vendor/gems/mocha-0.5.6/lib/mocha/single_return_value.rb
similarity index 100%
rename from test/lib/mocha/single_return_value.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/single_return_value.rb
diff --git a/test/lib/mocha/single_yield.rb b/vendor/gems/mocha-0.5.6/lib/mocha/single_yield.rb
similarity index 100%
rename from test/lib/mocha/single_yield.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/single_yield.rb
diff --git a/test/lib/mocha/standalone.rb b/vendor/gems/mocha-0.5.6/lib/mocha/standalone.rb
similarity index 100%
rename from test/lib/mocha/standalone.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/standalone.rb
diff --git a/test/lib/mocha/stub.rb b/vendor/gems/mocha-0.5.6/lib/mocha/stub.rb
similarity index 100%
rename from test/lib/mocha/stub.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/stub.rb
diff --git a/test/lib/mocha/test_case_adapter.rb b/vendor/gems/mocha-0.5.6/lib/mocha/test_case_adapter.rb
similarity index 100%
rename from test/lib/mocha/test_case_adapter.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/test_case_adapter.rb
diff --git a/test/lib/mocha/yield_parameters.rb b/vendor/gems/mocha-0.5.6/lib/mocha/yield_parameters.rb
similarity index 83%
rename from test/lib/mocha/yield_parameters.rb
rename to vendor/gems/mocha-0.5.6/lib/mocha/yield_parameters.rb
index b1623bf71..cb5898508 100644
--- a/test/lib/mocha/yield_parameters.rb
+++ b/vendor/gems/mocha-0.5.6/lib/mocha/yield_parameters.rb
@@ -1,31 +1,31 @@
require 'mocha/no_yields'
require 'mocha/single_yield'
require 'mocha/multiple_yields'
module Mocha # :nodoc:
class YieldParameters # :nodoc:
def initialize
@parameter_groups = []
end
def next_invocation
- case @parameter_groups.size
- when 0: NoYields.new
- when 1: @parameter_groups.first
+ case @parameter_groups.length
+ when 0; NoYields.new
+ when 1; @parameter_groups.first
else @parameter_groups.shift
end
end
def add(*parameters)
@parameter_groups << SingleYield.new(*parameters)
end
def multiple_add(*parameter_groups)
@parameter_groups << MultipleYields.new(*parameter_groups)
end
end
end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/lib/mocha_standalone.rb b/vendor/gems/mocha-0.5.6/lib/mocha_standalone.rb
new file mode 100644
index 000000000..ce605811a
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/mocha_standalone.rb
@@ -0,0 +1,2 @@
+require 'mocha/standalone'
+require 'mocha/object'
diff --git a/vendor/gems/mocha-0.5.6/lib/stubba.rb b/vendor/gems/mocha-0.5.6/lib/stubba.rb
new file mode 100644
index 000000000..eade747f6
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/lib/stubba.rb
@@ -0,0 +1,2 @@
+# for backwards compatibility
+require 'mocha'
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/._deprecation_disabler.rb b/vendor/gems/mocha-0.5.6/test/._deprecation_disabler.rb
new file mode 100644
index 000000000..64a1d063a
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/._deprecation_disabler.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/._execution_point.rb b/vendor/gems/mocha-0.5.6/test/._execution_point.rb
new file mode 100644
index 000000000..dd624fd16
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/._execution_point.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/._method_definer.rb b/vendor/gems/mocha-0.5.6/test/._method_definer.rb
new file mode 100644
index 000000000..d51c1adf4
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/._method_definer.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/._test_helper.rb b/vendor/gems/mocha-0.5.6/test/._test_helper.rb
new file mode 100644
index 000000000..ef386d597
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/._test_helper.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/._test_runner.rb b/vendor/gems/mocha-0.5.6/test/._test_runner.rb
new file mode 100644
index 000000000..614cc3f52
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/._test_runner.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/._expected_invocation_count_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/._expected_invocation_count_acceptance_test.rb
new file mode 100644
index 000000000..86e37bdbb
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/acceptance/._expected_invocation_count_acceptance_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/._mocha_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/._mocha_acceptance_test.rb
new file mode 100644
index 000000000..39f36f877
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/acceptance/._mocha_acceptance_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/._mock_with_initializer_block_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/._mock_with_initializer_block_acceptance_test.rb
new file mode 100644
index 000000000..8e3a0e715
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/acceptance/._mock_with_initializer_block_acceptance_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/._mocked_methods_dispatch_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/._mocked_methods_dispatch_acceptance_test.rb
new file mode 100644
index 000000000..de0671d7e
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/acceptance/._mocked_methods_dispatch_acceptance_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/._optional_parameters_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/._optional_parameters_acceptance_test.rb
new file mode 100644
index 000000000..b21de1fbc
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/acceptance/._optional_parameters_acceptance_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/._parameter_matcher_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/._parameter_matcher_acceptance_test.rb
new file mode 100644
index 000000000..421ef5a29
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/acceptance/._parameter_matcher_acceptance_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/._partial_mocks_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/._partial_mocks_acceptance_test.rb
new file mode 100644
index 000000000..c5650224d
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/acceptance/._partial_mocks_acceptance_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/._sequence_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/._sequence_acceptance_test.rb
new file mode 100644
index 000000000..8bb33ec9f
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/acceptance/._sequence_acceptance_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/._standalone_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/._standalone_acceptance_test.rb
new file mode 100644
index 000000000..68a7236cd
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/acceptance/._standalone_acceptance_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/._stubba_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/._stubba_acceptance_test.rb
new file mode 100644
index 000000000..5140f1228
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/acceptance/._stubba_acceptance_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/expected_invocation_count_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/expected_invocation_count_acceptance_test.rb
new file mode 100644
index 000000000..c09168cb5
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/acceptance/expected_invocation_count_acceptance_test.rb
@@ -0,0 +1,187 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha'
+require 'test_runner'
+
+class ExpectedInvocationCountAcceptanceTest < Test::Unit::TestCase
+
+ include TestRunner
+
+ def test_should_pass_if_method_is_never_expected_and_is_never_called
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).never
+ 0.times { mock.method }
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_fail_if_method_is_never_expected_but_is_called_once
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).never
+ 1.times { mock.method }
+ end
+ assert_failed(test_result)
+ failure_messages = test_result.failures.map { |failure| failure.message }
+ assert_equal ['#.method(any_parameters) - expected calls: 0, actual calls: 1'], failure_messages
+ end
+
+ def test_should_pass_if_method_is_expected_twice_and_is_called_twice
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).times(2)
+ 2.times { mock.method }
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_fail_if_method_is_expected_twice_but_is_called_once
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).times(2)
+ 1.times { mock.method }
+ end
+ assert_failed(test_result)
+ failure_messages = test_result.failures.map { |failure| failure.message }
+ assert_equal ['#.method(any_parameters) - expected calls: 2, actual calls: 1'], failure_messages
+ end
+
+ def test_should_fail_if_method_is_expected_twice_but_is_called_three_times
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).times(2)
+ 3.times { mock.method }
+ end
+ assert_failed(test_result)
+ failure_messages = test_result.failures.map { |failure| failure.message }
+ assert_equal ['#.method(any_parameters) - expected calls: 2, actual calls: 3'], failure_messages
+ end
+
+ def test_should_pass_if_method_is_expected_between_two_and_four_times_and_is_called_twice
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).times(2..4)
+ 2.times { mock.method }
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_pass_if_method_is_expected_between_two_and_four_times_and_is_called_three_times
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).times(2..4)
+ 3.times { mock.method }
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_pass_if_method_is_expected_between_two_and_four_times_and_is_called_four_times
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).times(2..4)
+ 4.times { mock.method }
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_fail_if_method_is_expected_between_two_and_four_times_and_is_called_once
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).times(2..4)
+ 1.times { mock.method }
+ end
+ assert_failed(test_result)
+ failure_messages = test_result.failures.map { |failure| failure.message }
+ assert_equal ['#.method(any_parameters) - expected calls: 2..4, actual calls: 1'], failure_messages
+ end
+
+ def test_should_fail_if_method_is_expected_between_two_and_four_times_and_is_called_five_times
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).times(2..4)
+ 5.times { mock.method }
+ end
+ assert_failed(test_result)
+ failure_messages = test_result.failures.map { |failure| failure.message }
+ assert_equal ['#.method(any_parameters) - expected calls: 2..4, actual calls: 5'], failure_messages
+ end
+
+ def test_should_pass_if_method_is_expected_at_least_once_and_is_called_once
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).at_least_once
+ 1.times { mock.method }
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_pass_if_method_is_expected_at_least_once_and_is_called_twice
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).at_least_once
+ 2.times { mock.method }
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_fail_if_method_is_expected_at_least_once_but_is_never_called
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).at_least_once
+ 0.times { mock.method }
+ end
+ assert_failed(test_result)
+ failure_messages = test_result.failures.map { |failure| failure.message }
+ assert_equal ['#.method(any_parameters) - expected calls: at least 1, actual calls: 0'], failure_messages
+ end
+
+ def test_should_pass_if_method_is_expected_at_most_once_and_is_never_called
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).at_most_once
+ 0.times { mock.method }
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_pass_if_method_is_expected_at_most_once_and_called_once
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).at_most_once
+ 1.times { mock.method }
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_fail_if_method_is_expected_at_most_once_but_is_called_twice
+ test_result = run_test do
+ mock = mock('mock')
+ mock.expects(:method).at_most_once
+ 2.times { mock.method }
+ end
+ assert_failed(test_result)
+ failure_messages = test_result.failures.map { |failure| failure.message }
+ assert_equal ['#.method(any_parameters) - expected calls: at most 1, actual calls: 2'], failure_messages
+ end
+
+ def test_should_pass_if_method_is_never_expected_and_is_never_called_even_if_everything_is_stubbed
+ test_result = run_test do
+ stub = stub_everything('stub')
+ stub.expects(:method).never
+ 0.times { stub.method }
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_fail_if_method_is_never_expected_but_is_called_once_even_if_everything_is_stubbed
+ test_result = run_test do
+ stub = stub_everything('stub')
+ stub.expects(:method).never
+ 1.times { stub.method }
+ end
+ assert_failed(test_result)
+ failure_messages = test_result.failures.map { |failure| failure.message }
+ assert_equal ['#.method(any_parameters) - expected calls: 0, actual calls: 1'], failure_messages
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/mocha_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/mocha_acceptance_test.rb
new file mode 100644
index 000000000..4e38b4e57
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/acceptance/mocha_acceptance_test.rb
@@ -0,0 +1,98 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha'
+
+class MochaAcceptanceTest < Test::Unit::TestCase
+
+ class Rover
+
+ def initialize(left_track, right_track, steps_per_metre, steps_per_degree)
+ @left_track, @right_track, @steps_per_metre, @steps_per_degree = left_track, right_track, steps_per_metre, steps_per_degree
+ end
+
+ def forward(metres)
+ @left_track.step(metres * @steps_per_metre)
+ @right_track.step(metres * @steps_per_metre)
+ wait
+ end
+
+ def backward(metres)
+ forward(-metres)
+ end
+
+ def left(degrees)
+ @left_track.step(-degrees * @steps_per_degree)
+ @right_track.step(+degrees * @steps_per_degree)
+ wait
+ end
+
+ def right(degrees)
+ left(-degrees)
+ end
+
+ def wait
+ while (@left_track.moving? or @right_track.moving?); end
+ end
+
+ end
+
+ def test_should_step_both_tracks_forward_ten_steps
+ left_track = mock('left_track')
+ right_track = mock('right_track')
+ steps_per_metre = 5
+ rover = Rover.new(left_track, right_track, steps_per_metre, nil)
+
+ left_track.expects(:step).with(10)
+ right_track.expects(:step).with(10)
+
+ left_track.stubs(:moving?).returns(false)
+ right_track.stubs(:moving?).returns(false)
+
+ rover.forward(2)
+ end
+
+ def test_should_step_both_tracks_backward_ten_steps
+ left_track = mock('left_track')
+ right_track = mock('right_track')
+ steps_per_metre = 5
+ rover = Rover.new(left_track, right_track, steps_per_metre, nil)
+
+ left_track.expects(:step).with(-10)
+ right_track.expects(:step).with(-10)
+
+ left_track.stubs(:moving?).returns(false)
+ right_track.stubs(:moving?).returns(false)
+
+ rover.backward(2)
+ end
+
+ def test_should_step_left_track_forwards_five_steps_and_right_track_backwards_five_steps
+ left_track = mock('left_track')
+ right_track = mock('right_track')
+ steps_per_degree = 5.0 / 90.0
+ rover = Rover.new(left_track, right_track, nil, steps_per_degree)
+
+ left_track.expects(:step).with(+5)
+ right_track.expects(:step).with(-5)
+
+ left_track.stubs(:moving?).returns(false)
+ right_track.stubs(:moving?).returns(false)
+
+ rover.right(90)
+ end
+
+ def test_should_step_left_track_backwards_five_steps_and_right_track_forwards_five_steps
+ left_track = mock('left_track')
+ right_track = mock('right_track')
+ steps_per_degree = 5.0 / 90.0
+ rover = Rover.new(left_track, right_track, nil, steps_per_degree)
+
+ left_track.expects(:step).with(-5)
+ right_track.expects(:step).with(+5)
+
+ left_track.stubs(:moving?).returns(false)
+ right_track.stubs(:moving?).returns(false)
+
+ rover.left(90)
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/mock_with_initializer_block_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/mock_with_initializer_block_acceptance_test.rb
new file mode 100644
index 000000000..51488e61f
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/acceptance/mock_with_initializer_block_acceptance_test.rb
@@ -0,0 +1,44 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha'
+require 'test_runner'
+
+class MockWithInitializerBlockAcceptanceTest < Test::Unit::TestCase
+
+ include TestRunner
+
+ def test_should_expect_two_method_invocations_and_receive_both_of_them
+ test_result = run_test do
+ mock = mock() do
+ expects(:method_1)
+ expects(:method_2)
+ end
+ mock.method_1
+ mock.method_2
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_expect_two_method_invocations_but_receive_only_one_of_them
+ test_result = run_test do
+ mock = mock() do
+ expects(:method_1)
+ expects(:method_2)
+ end
+ mock.method_1
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_stub_methods
+ test_result = run_test do
+ mock = mock() do
+ stubs(:method_1).returns(1)
+ stubs(:method_2).returns(2)
+ end
+ assert_equal 1, mock.method_1
+ assert_equal 2, mock.method_2
+ end
+ assert_passed(test_result)
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/mocked_methods_dispatch_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/mocked_methods_dispatch_acceptance_test.rb
new file mode 100644
index 000000000..d77021553
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/acceptance/mocked_methods_dispatch_acceptance_test.rb
@@ -0,0 +1,71 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha'
+require 'test_runner'
+
+class MockedMethodDispatchAcceptanceTest < Test::Unit::TestCase
+
+ include TestRunner
+
+ def test_should_find_latest_matching_expectation
+ test_result = run_test do
+ mock = mock()
+ mock.stubs(:method).returns(1)
+ mock.stubs(:method).returns(2)
+ assert_equal 2, mock.method
+ assert_equal 2, mock.method
+ assert_equal 2, mock.method
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_find_latest_expectation_which_has_not_stopped_matching
+ test_result = run_test do
+ mock = mock()
+ mock.stubs(:method).returns(1)
+ mock.stubs(:method).once.returns(2)
+ assert_equal 2, mock.method
+ assert_equal 1, mock.method
+ assert_equal 1, mock.method
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_keep_finding_later_stub_and_so_never_satisfy_earlier_expectation
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).returns(1)
+ mock.stubs(:method).returns(2)
+ assert_equal 2, mock.method
+ assert_equal 2, mock.method
+ assert_equal 2, mock.method
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_find_later_expectation_until_it_stops_matching_then_find_earlier_stub
+ test_result = run_test do
+ mock = mock()
+ mock.stubs(:method).returns(1)
+ mock.expects(:method).returns(2)
+ assert_equal 2, mock.method
+ assert_equal 1, mock.method
+ assert_equal 1, mock.method
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_find_latest_expectation_with_range_of_expected_invocation_count_which_has_not_stopped_matching
+ test_result = run_test do
+ mock = mock()
+ mock.stubs(:method).returns(1)
+ mock.stubs(:method).times(2..3).returns(2)
+ assert_equal 2, mock.method
+ assert_equal 2, mock.method
+ assert_equal 2, mock.method
+ assert_equal 1, mock.method
+ assert_equal 1, mock.method
+ end
+ assert_passed(test_result)
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/optional_parameters_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/optional_parameters_acceptance_test.rb
new file mode 100644
index 000000000..3a6f8322e
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/acceptance/optional_parameters_acceptance_test.rb
@@ -0,0 +1,63 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha'
+require 'test_runner'
+
+class OptionalParameterMatcherAcceptanceTest < Test::Unit::TestCase
+
+ include TestRunner
+
+ def test_should_pass_if_all_required_parameters_match_and_no_optional_parameters_are_supplied
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(1, 2, optionally(3, 4))
+ mock.method(1, 2)
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_pass_if_all_required_and_optional_parameters_match_and_some_optional_parameters_are_supplied
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(1, 2, optionally(3, 4))
+ mock.method(1, 2, 3)
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_pass_if_all_required_and_optional_parameters_match_and_all_optional_parameters_are_supplied
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(1, 2, optionally(3, 4))
+ mock.method(1, 2, 3, 4)
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_fail_if_all_required_and_optional_parameters_match_but_too_many_optional_parameters_are_supplied
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(1, 2, optionally(3, 4))
+ mock.method(1, 2, 3, 4, 5)
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_fail_if_all_required_parameters_match_but_some_optional_parameters_do_not_match
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(1, 2, optionally(3, 4))
+ mock.method(1, 2, 4)
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_fail_if_all_required_parameters_match_but_no_optional_parameters_match
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(1, 2, optionally(3, 4))
+ mock.method(1, 2, 4, 5)
+ end
+ assert_failed(test_result)
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/parameter_matcher_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/parameter_matcher_acceptance_test.rb
new file mode 100644
index 000000000..c23880d16
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/acceptance/parameter_matcher_acceptance_test.rb
@@ -0,0 +1,117 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha'
+require 'test_runner'
+
+class ParameterMatcherAcceptanceTest < Test::Unit::TestCase
+
+ include TestRunner
+
+ def test_should_match_hash_parameter_with_specified_key
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(has_key(:key_1))
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_not_match_hash_parameter_with_specified_key
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(has_key(:key_1))
+ mock.method(:key_2 => 'value_2')
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_match_hash_parameter_with_specified_value
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(has_value('value_1'))
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_not_match_hash_parameter_with_specified_value
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(has_value('value_1'))
+ mock.method(:key_2 => 'value_2')
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_match_hash_parameter_with_specified_key_value_pair
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(has_entry(:key_1, 'value_1'))
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_not_match_hash_parameter_with_specified_key_value_pair
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(has_entry(:key_1, 'value_2'))
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_match_hash_parameter_with_specified_hash_entry
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(has_entry(:key_1 => 'value_1'))
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_not_match_hash_parameter_with_specified_hash_entry
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(has_entry(:key_1 => 'value_2'))
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_match_hash_parameter_with_specified_entries
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(has_entries(:key_1 => 'value_1', :key_2 => 'value_2'))
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2', :key_3 => 'value_3')
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_not_match_hash_parameter_with_specified_entries
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(has_entries(:key_1 => 'value_1', :key_2 => 'value_2'))
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_3')
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_match_parameter_that_matches_regular_expression
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(regexp_matches(/meter/))
+ mock.method('this parameter should match')
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_not_match_parameter_that_does_not_match_regular_expression
+ test_result = run_test do
+ mock = mock()
+ mock.expects(:method).with(regexp_matches(/something different/))
+ mock.method('this parameter should not match')
+ end
+ assert_failed(test_result)
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/partial_mocks_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/partial_mocks_acceptance_test.rb
new file mode 100644
index 000000000..20fc7b84e
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/acceptance/partial_mocks_acceptance_test.rb
@@ -0,0 +1,40 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha'
+require 'test_runner'
+
+class PartialMockAcceptanceTest < Test::Unit::TestCase
+
+ include TestRunner
+
+ def test_should_pass_if_all_expectations_are_satisfied
+ test_result = run_test do
+ partial_mock_one = "partial_mock_one"
+ partial_mock_two = "partial_mock_two"
+
+ partial_mock_one.expects(:first)
+ partial_mock_one.expects(:second)
+ partial_mock_two.expects(:third)
+
+ partial_mock_one.first
+ partial_mock_one.second
+ partial_mock_two.third
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_fail_if_all_expectations_are_not_satisfied
+ test_result = run_test do
+ partial_mock_one = "partial_mock_one"
+ partial_mock_two = "partial_mock_two"
+
+ partial_mock_one.expects(:first)
+ partial_mock_one.expects(:second)
+ partial_mock_two.expects(:third)
+
+ partial_mock_one.first
+ partial_mock_two.third
+ end
+ assert_failed(test_result)
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/sequence_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/sequence_acceptance_test.rb
new file mode 100644
index 000000000..3be6e7d75
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/acceptance/sequence_acceptance_test.rb
@@ -0,0 +1,179 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha'
+require 'test_runner'
+
+class SequenceAcceptanceTest < Test::Unit::TestCase
+
+ include TestRunner
+
+ def test_should_constrain_invocations_to_occur_in_expected_order
+ test_result = run_test do
+ mock = mock()
+ sequence = sequence('one')
+
+ mock.expects(:first).in_sequence(sequence)
+ mock.expects(:second).in_sequence(sequence)
+
+ mock.second
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_allow_invocations_in_sequence
+ test_result = run_test do
+ mock = mock()
+ sequence = sequence('one')
+
+ mock.expects(:first).in_sequence(sequence)
+ mock.expects(:second).in_sequence(sequence)
+
+ mock.first
+ mock.second
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_constrain_invocations_to_occur_in_expected_order_even_if_expected_on_different_mocks
+ test_result = run_test do
+ mock_one = mock('1')
+ mock_two = mock('2')
+ sequence = sequence('one')
+
+ mock_one.expects(:first).in_sequence(sequence)
+ mock_two.expects(:second).in_sequence(sequence)
+
+ mock_two.second
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_allow_invocations_in_sequence_even_if_expected_on_different_mocks
+ test_result = run_test do
+ mock_one = mock('1')
+ mock_two = mock('2')
+ sequence = sequence('one')
+
+ mock_one.expects(:first).in_sequence(sequence)
+ mock_two.expects(:second).in_sequence(sequence)
+
+ mock_one.first
+ mock_two.second
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_constrain_invocations_to_occur_in_expected_order_even_if_expected_on_partial_mocks
+ test_result = run_test do
+ partial_mock_one = "1"
+ partial_mock_two = "2"
+ sequence = sequence('one')
+
+ partial_mock_one.expects(:first).in_sequence(sequence)
+ partial_mock_two.expects(:second).in_sequence(sequence)
+
+ partial_mock_two.second
+ end
+ assert_failed(test_result)
+ end
+
+ def test_should_allow_invocations_in_sequence_even_if_expected_on_partial_mocks
+ test_result = run_test do
+ partial_mock_one = "1"
+ partial_mock_two = "2"
+ sequence = sequence('one')
+
+ partial_mock_one.expects(:first).in_sequence(sequence)
+ partial_mock_two.expects(:second).in_sequence(sequence)
+
+ partial_mock_one.first
+ partial_mock_two.second
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_allow_stub_expectations_to_be_skipped_in_sequence
+ test_result = run_test do
+ mock = mock()
+ sequence = sequence('one')
+
+ mock.expects(:first).in_sequence(sequence)
+ s = mock.stubs(:second).in_sequence(sequence)
+ mock.expects(:third).in_sequence(sequence)
+
+ mock.first
+ mock.third
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_regard_sequences_as_independent_of_each_other
+ test_result = run_test do
+ mock = mock()
+ sequence_one = sequence('one')
+ sequence_two = sequence('two')
+
+ mock.expects(:first).in_sequence(sequence_one)
+ mock.expects(:second).in_sequence(sequence_one)
+
+ mock.expects(:third).in_sequence(sequence_two)
+ mock.expects(:fourth).in_sequence(sequence_two)
+
+ mock.first
+ mock.third
+ mock.second
+ mock.fourth
+ end
+ assert_passed(test_result)
+ end
+
+ def test_should_include_sequence_in_failure_message
+ test_result = run_test do
+ mock = mock()
+ sequence = sequence('one')
+
+ mock.expects(:first).in_sequence(sequence)
+ mock.expects(:second).in_sequence(sequence)
+
+ mock.second
+ end
+ assert_failed(test_result)
+ assert_match Regexp.new("in sequence 'one'"), test_result.failures.first.message
+ end
+
+ def test_should_allow_expectations_to_be_in_more_than_one_sequence
+ test_result = run_test do
+ mock = mock()
+ sequence_one = sequence('one')
+ sequence_two = sequence('two')
+
+ mock.expects(:first).in_sequence(sequence_one)
+ mock.expects(:second).in_sequence(sequence_two)
+ mock.expects(:three).in_sequence(sequence_one).in_sequence(sequence_two)
+
+ mock.first
+ mock.three
+ end
+ assert_failed(test_result)
+ assert_match Regexp.new("in sequence 'one'"), test_result.failures.first.message
+ assert_match Regexp.new("in sequence 'two'"), test_result.failures.first.message
+ end
+
+ def test_should_have_shortcut_for_expectations_to_be_in_more_than_one_sequence
+ test_result = run_test do
+ mock = mock()
+ sequence_one = sequence('one')
+ sequence_two = sequence('two')
+
+ mock.expects(:first).in_sequence(sequence_one)
+ mock.expects(:second).in_sequence(sequence_two)
+ mock.expects(:three).in_sequence(sequence_one, sequence_two)
+
+ mock.first
+ mock.three
+ end
+ assert_failed(test_result)
+ assert_match Regexp.new("in sequence 'one'"), test_result.failures.first.message
+ assert_match Regexp.new("in sequence 'two'"), test_result.failures.first.message
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/standalone_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/standalone_acceptance_test.rb
new file mode 100644
index 000000000..1e101d7ca
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/acceptance/standalone_acceptance_test.rb
@@ -0,0 +1,131 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha_standalone'
+
+class NotATestUnitAssertionFailedError < StandardError
+end
+
+class NotATestUnitTestCase
+
+ include Mocha::Standalone
+
+ attr_reader :assertion_count
+
+ def initialize
+ @assertion_count = 0
+ end
+
+ def run(test_method)
+ mocha_setup
+ begin
+ prepare
+ begin
+ send(test_method)
+ mocha_verify { @assertion_count += 1 }
+ rescue Mocha::ExpectationError => e
+ new_error = NotATestUnitAssertionFailedError.new(e.message)
+ new_error.set_backtrace(e.backtrace)
+ raise new_error
+ ensure
+ cleanup
+ end
+ ensure
+ mocha_teardown
+ end
+ end
+
+ def prepare
+ end
+
+ def cleanup
+ end
+
+end
+
+class SampleTest < NotATestUnitTestCase
+
+ def mocha_with_fulfilled_expectation
+ mockee = mock()
+ mockee.expects(:blah)
+ mockee.blah
+ end
+
+ def mocha_with_unfulfilled_expectation
+ mockee = mock()
+ mockee.expects(:blah)
+ end
+
+ def mocha_with_unexpected_invocation
+ mockee = mock()
+ mockee.blah
+ end
+
+ def stubba_with_fulfilled_expectation
+ stubbee = Class.new { define_method(:blah) {} }.new
+ stubbee.expects(:blah)
+ stubbee.blah
+ end
+
+ def stubba_with_unfulfilled_expectation
+ stubbee = Class.new { define_method(:blah) {} }.new
+ stubbee.expects(:blah)
+ end
+
+ def mocha_with_matching_parameter
+ mockee = mock()
+ mockee.expects(:blah).with(has_key(:wibble))
+ mockee.blah(:wibble => 1)
+ end
+
+ def mocha_with_non_matching_parameter
+ mockee = mock()
+ mockee.expects(:blah).with(has_key(:wibble))
+ mockee.blah(:wobble => 2)
+ end
+
+end
+
+require 'test/unit'
+
+class StandaloneAcceptanceTest < Test::Unit::TestCase
+
+ attr_reader :sample_test
+
+ def setup
+ @sample_test = SampleTest.new
+ end
+
+ def test_should_pass_mocha_test
+ assert_nothing_raised { sample_test.run(:mocha_with_fulfilled_expectation) }
+ assert_equal 1, sample_test.assertion_count
+ end
+
+ def test_should_fail_mocha_test_due_to_unfulfilled_exception
+ assert_raises(NotATestUnitAssertionFailedError) { sample_test.run(:mocha_with_unfulfilled_expectation) }
+ assert_equal 1, sample_test.assertion_count
+ end
+
+ def test_should_fail_mocha_test_due_to_unexpected_invocation
+ assert_raises(NotATestUnitAssertionFailedError) { sample_test.run(:mocha_with_unexpected_invocation) }
+ assert_equal 0, sample_test.assertion_count
+ end
+
+ def test_should_pass_stubba_test
+ assert_nothing_raised { sample_test.run(:stubba_with_fulfilled_expectation) }
+ assert_equal 1, sample_test.assertion_count
+ end
+
+ def test_should_fail_stubba_test
+ assert_raises(NotATestUnitAssertionFailedError) { sample_test.run(:stubba_with_unfulfilled_expectation) }
+ assert_equal 1, sample_test.assertion_count
+ end
+
+ def test_should_pass_mocha_test_with_matching_parameter
+ assert_nothing_raised { sample_test.run(:mocha_with_matching_parameter) }
+ assert_equal 1, sample_test.assertion_count
+ end
+
+ def test_should_fail_mocha_test_with_non_matching_parameter
+ assert_raises(NotATestUnitAssertionFailedError) { sample_test.run(:mocha_with_non_matching_parameter) }
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/acceptance/stubba_acceptance_test.rb b/vendor/gems/mocha-0.5.6/test/acceptance/stubba_acceptance_test.rb
new file mode 100644
index 000000000..93d8d1259
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/acceptance/stubba_acceptance_test.rb
@@ -0,0 +1,102 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha'
+
+class Widget
+
+ def model
+ 'original_model'
+ end
+
+ class << self
+
+ def find(options)
+ []
+ end
+
+ def create(attributes)
+ Widget.new
+ end
+
+ end
+
+end
+
+module Thingy
+
+ def self.wotsit
+ :hoojamaflip
+ end
+
+end
+
+class StubbaAcceptanceTest < Test::Unit::TestCase
+
+ def test_should_stub_instance_method
+ widget = Widget.new
+ widget.expects(:model).returns('different_model')
+ assert_equal 'different_model', widget.model
+ end
+
+ def test_should_stub_module_method
+ should_stub_module_method
+ end
+
+ def test_should_stub_module_method_again
+ should_stub_module_method
+ end
+
+ def test_should_stub_class_method
+ should_stub_class_method
+ end
+
+ def test_should_stub_class_method_again
+ should_stub_class_method
+ end
+
+ def test_should_stub_instance_method_on_any_instance_of_a_class
+ should_stub_instance_method_on_any_instance_of_a_class
+ end
+
+ def test_should_stub_instance_method_on_any_instance_of_a_class_again
+ should_stub_instance_method_on_any_instance_of_a_class
+ end
+
+ def test_should_stub_two_different_class_methods
+ should_stub_two_different_class_methods
+ end
+
+ def test_should_stub_two_different_class_methods_again
+ should_stub_two_different_class_methods
+ end
+
+ private
+
+ def should_stub_module_method
+ Thingy.expects(:wotsit).returns(:dooda)
+ assert_equal :dooda, Thingy.wotsit
+ end
+
+ def should_stub_class_method
+ widgets = [Widget.new]
+ Widget.expects(:find).with(:all).returns(widgets)
+ assert_equal widgets, Widget.find(:all)
+ end
+
+ def should_stub_two_different_class_methods
+ found_widgets = [Widget.new]
+ created_widget = Widget.new
+ Widget.expects(:find).with(:all).returns(found_widgets)
+ Widget.expects(:create).with(:model => 'wombat').returns(created_widget)
+ assert_equal found_widgets, Widget.find(:all)
+ assert_equal created_widget, Widget.create(:model => 'wombat')
+ end
+
+ def should_stub_instance_method_on_any_instance_of_a_class
+ Widget.any_instance.expects(:model).at_least_once.returns('another_model')
+ widget_1 = Widget.new
+ widget_2 = Widget.new
+ assert_equal 'another_model', widget_1.model
+ assert_equal 'another_model', widget_2.model
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/active_record_test_case.rb b/vendor/gems/mocha-0.5.6/test/active_record_test_case.rb
new file mode 100644
index 000000000..ae6507380
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/active_record_test_case.rb
@@ -0,0 +1,36 @@
+module ActiveRecordTestCase
+
+ def setup_with_fixtures
+ methods_called << :setup_with_fixtures
+ end
+
+ alias_method :setup, :setup_with_fixtures
+
+ def teardown_with_fixtures
+ methods_called << :teardown_with_fixtures
+ end
+
+ alias_method :teardown, :teardown_with_fixtures
+
+ def self.method_added(method)
+ case method.to_s
+ when 'setup'
+ unless method_defined?(:setup_without_fixtures)
+ alias_method :setup_without_fixtures, :setup
+ define_method(:setup) do
+ setup_with_fixtures
+ setup_without_fixtures
+ end
+ end
+ when 'teardown'
+ unless method_defined?(:teardown_without_fixtures)
+ alias_method :teardown_without_fixtures, :teardown
+ define_method(:teardown) do
+ teardown_without_fixtures
+ teardown_with_fixtures
+ end
+ end
+ end
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/deprecation_disabler.rb b/vendor/gems/mocha-0.5.6/test/deprecation_disabler.rb
new file mode 100644
index 000000000..c57fb3c9a
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/deprecation_disabler.rb
@@ -0,0 +1,15 @@
+require 'mocha/deprecation'
+
+module DeprecationDisabler
+
+ def disable_deprecations
+ original_mode = Mocha::Deprecation.mode
+ Mocha::Deprecation.mode = :disabled
+ begin
+ yield
+ ensure
+ Mocha::Deprecation.mode = original_mode
+ end
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/execution_point.rb b/vendor/gems/mocha-0.5.6/test/execution_point.rb
new file mode 100644
index 000000000..33c85699e
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/execution_point.rb
@@ -0,0 +1,34 @@
+class ExecutionPoint
+
+ attr_reader :backtrace
+
+ def self.current
+ new(caller)
+ end
+
+ def initialize(backtrace)
+ @backtrace = backtrace
+ end
+
+ def file_name
+ /\A(.*?):\d+/.match(@backtrace.first)[1]
+ end
+
+ def line_number
+ Integer(/\A.*?:(\d+)/.match(@backtrace.first)[1])
+ end
+
+ def ==(other)
+ return false unless other.is_a?(ExecutionPoint)
+ (file_name == other.file_name) and (line_number == other.line_number)
+ end
+
+ def to_s
+ "file: #{file_name} line: #{line_number}"
+ end
+
+ def inspect
+ to_s
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/integration/._mocha_test_result_integration_test.rb b/vendor/gems/mocha-0.5.6/test/integration/._mocha_test_result_integration_test.rb
new file mode 100644
index 000000000..78cbfbe92
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/integration/._mocha_test_result_integration_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/integration/._stubba_integration_test.rb b/vendor/gems/mocha-0.5.6/test/integration/._stubba_integration_test.rb
new file mode 100644
index 000000000..c88497c45
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/integration/._stubba_integration_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/integration/._stubba_test_result_integration_test.rb b/vendor/gems/mocha-0.5.6/test/integration/._stubba_test_result_integration_test.rb
new file mode 100644
index 000000000..931f6315d
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/integration/._stubba_test_result_integration_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/integration/mocha_test_result_integration_test.rb b/vendor/gems/mocha-0.5.6/test/integration/mocha_test_result_integration_test.rb
new file mode 100644
index 000000000..d5f29e845
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/integration/mocha_test_result_integration_test.rb
@@ -0,0 +1,105 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/standalone'
+require 'mocha/test_case_adapter'
+require 'execution_point'
+
+class MochaTestResultIntegrationTest < Test::Unit::TestCase
+
+ def test_should_include_expectation_verification_in_assertion_count
+ test_result = run_test do
+ object = mock()
+ object.expects(:message)
+ object.message
+ end
+ assert_equal 1, test_result.assertion_count
+ end
+
+ def test_should_include_assertions_in_assertion_count
+ test_result = run_test do
+ assert true
+ end
+ assert_equal 1, test_result.assertion_count
+ end
+
+ def test_should_not_include_stubbing_expectation_verification_in_assertion_count
+ test_result = run_test do
+ object = mock()
+ object.stubs(:message)
+ object.message
+ end
+ assert_equal 0, test_result.assertion_count
+ end
+
+ def test_should_include_expectation_verification_failure_in_failure_count
+ test_result = run_test do
+ object = mock()
+ object.expects(:message)
+ end
+ assert_equal 1, test_result.failure_count
+ end
+
+ def test_should_include_unexpected_verification_failure_in_failure_count
+ test_result = run_test do
+ object = mock()
+ object.message
+ end
+ assert_equal 1, test_result.failure_count
+ end
+
+ def test_should_include_assertion_failure_in_failure_count
+ test_result = run_test do
+ flunk
+ end
+ assert_equal 1, test_result.failure_count
+ end
+
+ def test_should_display_backtrace_indicating_line_number_where_expects_was_called
+ test_result = Test::Unit::TestResult.new
+ faults = []
+ test_result.add_listener(Test::Unit::TestResult::FAULT, &lambda { |fault| faults << fault })
+ execution_point = nil
+ run_test(test_result) do
+ object = mock()
+ execution_point = ExecutionPoint.current; object.expects(:message)
+ end
+ assert_equal 1, faults.length
+ assert_equal execution_point, ExecutionPoint.new(faults.first.location)
+ end
+
+ def test_should_display_backtrace_indicating_line_number_where_unexpected_method_was_called
+ test_result = Test::Unit::TestResult.new
+ faults = []
+ test_result.add_listener(Test::Unit::TestResult::FAULT, &lambda { |fault| faults << fault })
+ execution_point = nil
+ run_test(test_result) do
+ object = mock()
+ execution_point = ExecutionPoint.current; object.message
+ end
+ assert_equal 1, faults.length
+ assert_equal execution_point, ExecutionPoint.new(faults.first.location)
+ end
+
+ def test_should_display_backtrace_indicating_line_number_where_failing_assertion_was_called
+ test_result = Test::Unit::TestResult.new
+ faults = []
+ test_result.add_listener(Test::Unit::TestResult::FAULT, &lambda { |fault| faults << fault })
+ execution_point = nil
+ run_test(test_result) do
+ execution_point = ExecutionPoint.current; flunk
+ end
+ assert_equal 1, faults.length
+ assert_equal execution_point, ExecutionPoint.new(faults.first.location)
+ end
+
+ def run_test(test_result = Test::Unit::TestResult.new, &block)
+ test_class = Class.new(Test::Unit::TestCase) do
+ include Mocha::Standalone
+ include Mocha::TestCaseAdapter
+ define_method(:test_me, &block)
+ end
+ test = test_class.new(:test_me)
+ test.run(test_result) {}
+ test_result
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/integration/stubba_integration_test.rb b/vendor/gems/mocha-0.5.6/test/integration/stubba_integration_test.rb
new file mode 100644
index 000000000..4285c179a
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/integration/stubba_integration_test.rb
@@ -0,0 +1,89 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+
+require 'mocha/object'
+require 'mocha/test_case_adapter'
+require 'mocha/standalone'
+
+class StubbaIntegrationTest < Test::Unit::TestCase
+
+ class DontMessWithMe
+ def self.my_class_method
+ :original_return_value
+ end
+ def my_instance_method
+ :original_return_value
+ end
+ end
+
+ def test_should_stub_class_method_within_test
+ test = build_test do
+ DontMessWithMe.expects(:my_class_method).returns(:new_return_value)
+ assert_equal :new_return_value, DontMessWithMe.my_class_method
+ end
+
+ test_result = Test::Unit::TestResult.new
+ test.run(test_result) {}
+ assert test_result.passed?
+ end
+
+ def test_should_leave_stubbed_class_method_unchanged_after_test
+ test = build_test do
+ DontMessWithMe.expects(:my_class_method).returns(:new_return_value)
+ end
+
+ test.run(Test::Unit::TestResult.new) {}
+ assert_equal :original_return_value, DontMessWithMe.my_class_method
+ end
+
+ def test_should_reset_class_expectations_after_test
+ test = build_test do
+ DontMessWithMe.expects(:my_class_method)
+ end
+
+ test.run(Test::Unit::TestResult.new) {}
+ assert_equal 0, DontMessWithMe.mocha.expectations.length
+ end
+
+ def test_should_stub_instance_method_within_test
+ instance = DontMessWithMe.new
+ test = build_test do
+ instance.expects(:my_instance_method).returns(:new_return_value)
+ assert_equal :new_return_value, instance.my_instance_method
+ end
+ test_result = Test::Unit::TestResult.new
+ test.run(test_result) {}
+ assert test_result.passed?
+ end
+
+ def test_should_leave_stubbed_instance_method_unchanged_after_test
+ instance = DontMessWithMe.new
+ test = build_test do
+ instance.expects(:my_instance_method).returns(:new_return_value)
+ end
+
+ test.run(Test::Unit::TestResult.new) {}
+ assert_equal :original_return_value, instance.my_instance_method
+ end
+
+ def test_should_reset_instance_expectations_after_test
+ instance = DontMessWithMe.new
+ test = build_test do
+ instance.expects(:my_instance_method).returns(:new_return_value)
+ end
+
+ test.run(Test::Unit::TestResult.new) {}
+ assert_equal 0, instance.mocha.expectations.length
+ end
+
+ private
+
+ def build_test(&block)
+ test_class = Class.new(Test::Unit::TestCase) do
+ include Mocha::Standalone
+ include Mocha::TestCaseAdapter
+ define_method(:test_me, &block)
+ end
+ test_class.new(:test_me)
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/integration/stubba_test_result_integration_test.rb b/vendor/gems/mocha-0.5.6/test/integration/stubba_test_result_integration_test.rb
new file mode 100644
index 000000000..34264e7c6
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/integration/stubba_test_result_integration_test.rb
@@ -0,0 +1,85 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/object'
+require 'mocha/standalone'
+require 'mocha/test_case_adapter'
+require 'execution_point'
+
+class StubbaTestResultIntegrationTest < Test::Unit::TestCase
+
+ def test_should_include_expectation_verification_in_assertion_count
+ test_result = run_test do
+ object = Class.new { def message; end }.new
+ object.expects(:message)
+ object.message
+ end
+ assert_equal 1, test_result.assertion_count
+ end
+
+ def test_should_include_assertions_in_assertion_count
+ test_result = run_test do
+ assert true
+ end
+ assert_equal 1, test_result.assertion_count
+ end
+
+ def test_should_not_include_stubbing_expectation_verification_in_assertion_count
+ test_result = run_test do
+ object = Class.new { def message; end }.new
+ object.stubs(:message)
+ object.message
+ end
+ assert_equal 0, test_result.assertion_count
+ end
+
+ def test_should_include_expectation_verification_failure_in_failure_count
+ test_result = run_test do
+ object = Class.new { def message; end }.new
+ object.expects(:message)
+ end
+ assert_equal 1, test_result.failure_count
+ end
+
+ def test_should_include_assertion_failure_in_failure_count
+ test_result = run_test do
+ flunk
+ end
+ assert_equal 1, test_result.failure_count
+ end
+
+ def test_should_display_backtrace_indicating_line_number_where_expects_was_called
+ test_result = Test::Unit::TestResult.new
+ faults = []
+ test_result.add_listener(Test::Unit::TestResult::FAULT, &lambda { |fault| faults << fault })
+ execution_point = nil
+ run_test(test_result) do
+ object = Class.new { def message; end }.new
+ execution_point = ExecutionPoint.current; object.expects(:message)
+ end
+ assert_equal 1, faults.length
+ assert_equal execution_point, ExecutionPoint.new(faults.first.location)
+ end
+
+ def test_should_display_backtrace_indicating_line_number_where_failing_assertion_was_called
+ test_result = Test::Unit::TestResult.new
+ faults = []
+ test_result.add_listener(Test::Unit::TestResult::FAULT, &lambda { |fault| faults << fault })
+ execution_point = nil
+ run_test(test_result) do
+ execution_point = ExecutionPoint.current; flunk
+ end
+ assert_equal 1, faults.length
+ assert_equal execution_point, ExecutionPoint.new(faults.first.location)
+ end
+
+ def run_test(test_result = Test::Unit::TestResult.new, &block)
+ test_class = Class.new(Test::Unit::TestCase) do
+ include Mocha::Standalone
+ include Mocha::TestCaseAdapter
+ define_method(:test_me, &block)
+ end
+ test = test_class.new(:test_me)
+ test.run(test_result) {}
+ test_result
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/method_definer.rb b/vendor/gems/mocha-0.5.6/test/method_definer.rb
new file mode 100644
index 000000000..1aef8868b
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/method_definer.rb
@@ -0,0 +1,18 @@
+require 'mocha/metaclass'
+
+class Object
+
+ def define_instance_method(method_symbol, &block)
+ __metaclass__.send(:define_method, method_symbol, block)
+ end
+
+ def replace_instance_method(method_symbol, &block)
+ raise "Cannot replace #{method_symbol} as #{self} does not respond to it." unless self.respond_to?(method_symbol)
+ define_instance_method(method_symbol, &block)
+ end
+
+ def define_instance_accessor(*symbols)
+ symbols.each { |symbol| __metaclass__.send(:attr_accessor, symbol) }
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/test_helper.rb b/vendor/gems/mocha-0.5.6/test/test_helper.rb
new file mode 100644
index 000000000..dc0494273
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/test_helper.rb
@@ -0,0 +1,12 @@
+unless defined?(STANDARD_OBJECT_PUBLIC_INSTANCE_METHODS)
+ STANDARD_OBJECT_PUBLIC_INSTANCE_METHODS = Object.public_instance_methods
+end
+
+$:.unshift File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
+$:.unshift File.expand_path(File.join(File.dirname(__FILE__)))
+$:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'unit'))
+$:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'unit', 'parameter_matchers'))
+$:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'integration'))
+$:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'acceptance'))
+
+require 'test/unit'
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/test_runner.rb b/vendor/gems/mocha-0.5.6/test/test_runner.rb
new file mode 100644
index 000000000..fbadd9297
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/test_runner.rb
@@ -0,0 +1,31 @@
+require 'test/unit/testresult'
+require 'test/unit/testcase'
+require 'mocha/standalone'
+require 'mocha/test_case_adapter'
+
+module TestRunner
+
+ def run_test(test_result = Test::Unit::TestResult.new, &block)
+ test_class = Class.new(Test::Unit::TestCase) do
+ include Mocha::Standalone
+ include Mocha::TestCaseAdapter
+ define_method(:test_me, &block)
+ end
+ test = test_class.new(:test_me)
+ test.run(test_result) {}
+ class << test_result
+ attr_reader :failures, :errors
+ end
+ test_result
+ end
+
+ def assert_passed(test_result)
+ flunk "Test failed unexpectedly with message: #{test_result.failures}" if test_result.failure_count > 0
+ flunk "Test failed unexpectedly with message: #{test_result.errors}" if test_result.error_count > 0
+ end
+
+ def assert_failed(test_result)
+ flunk "Test passed unexpectedly" if test_result.passed?
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._any_instance_method_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._any_instance_method_test.rb
new file mode 100644
index 000000000..83d91fdf2
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._any_instance_method_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._auto_verify_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._auto_verify_test.rb
new file mode 100644
index 000000000..9052afc95
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._auto_verify_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._central_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._central_test.rb
new file mode 100644
index 000000000..a8cc77d1a
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._central_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._class_method_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._class_method_test.rb
new file mode 100644
index 000000000..30c6ce8de
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._class_method_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._expectation_error_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._expectation_error_test.rb
new file mode 100644
index 000000000..6bd7f7152
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._expectation_error_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._expectation_list_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._expectation_list_test.rb
new file mode 100644
index 000000000..753636a0f
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._expectation_list_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._expectation_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._expectation_test.rb
new file mode 100644
index 000000000..b92a766c0
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._expectation_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._hash_inspect_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._hash_inspect_test.rb
new file mode 100644
index 000000000..2d092d906
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._hash_inspect_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._method_matcher_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._method_matcher_test.rb
new file mode 100644
index 000000000..5de837673
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._method_matcher_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._missing_expectation_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._missing_expectation_test.rb
new file mode 100644
index 000000000..166d7827f
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._missing_expectation_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._mock_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._mock_test.rb
new file mode 100644
index 000000000..e9005d167
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._mock_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._object_inspect_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._object_inspect_test.rb
new file mode 100644
index 000000000..e39ba3134
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._object_inspect_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._parameters_matcher_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._parameters_matcher_test.rb
new file mode 100644
index 000000000..ca04d98e7
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._parameters_matcher_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/._sequence_test.rb b/vendor/gems/mocha-0.5.6/test/unit/._sequence_test.rb
new file mode 100644
index 000000000..ec9e9d76e
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/._sequence_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/any_instance_method_test.rb b/vendor/gems/mocha-0.5.6/test/unit/any_instance_method_test.rb
new file mode 100644
index 000000000..804fcde2b
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/any_instance_method_test.rb
@@ -0,0 +1,126 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'method_definer'
+require 'mocha/mock'
+require 'mocha/any_instance_method'
+
+class AnyInstanceMethodTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_hide_original_method
+ klass = Class.new { def method_x; end }
+ method = AnyInstanceMethod.new(klass, :method_x)
+ hidden_method_x = method.hidden_method.to_sym
+
+ method.hide_original_method
+
+ assert klass.method_defined?(hidden_method_x)
+ end
+
+ def test_should_not_hide_original_method_if_it_is_not_defined
+ klass = Class.new
+ method = AnyInstanceMethod.new(klass, :method_x)
+ hidden_method_x = method.hidden_method.to_sym
+
+ method.hide_original_method
+
+ assert_equal false, klass.method_defined?(hidden_method_x)
+ end
+
+ def test_should_define_a_new_method
+ klass = Class.new { def method_x; end }
+ method = AnyInstanceMethod.new(klass, :method_x)
+ mocha = Mock.new
+ mocha.expects(:method_x).with(:param1, :param2).returns(:result)
+ any_instance = Object.new
+ any_instance.define_instance_method(:mocha) { mocha }
+ klass.define_instance_method(:any_instance) { any_instance }
+
+ method.hide_original_method
+ method.define_new_method
+
+ instance = klass.new
+ result = instance.method_x(:param1, :param2)
+
+ assert_equal :result, result
+ mocha.verify
+ end
+
+ def test_should_restore_original_method
+ klass = Class.new { def method_x; end }
+ method = AnyInstanceMethod.new(klass, :method_x)
+ hidden_method_x = method.hidden_method.to_sym
+ klass.send(:define_method, hidden_method_x, Proc.new { :original_result })
+
+ method.remove_new_method
+ method.restore_original_method
+
+ instance = klass.new
+ assert_equal :original_result, instance.method_x
+ assert !klass.method_defined?(hidden_method_x)
+ end
+
+ def test_should_not_restore_original_method_if_hidden_method_not_defined
+ klass = Class.new { def method_x; :new_result; end }
+ method = AnyInstanceMethod.new(klass, :method_x)
+
+ method.restore_original_method
+
+ instance = klass.new
+ assert_equal :new_result, instance.method_x
+ end
+
+ def test_should_call_remove_new_method
+ klass = Class.new { def method_x; end }
+ any_instance = Mock.new
+ any_instance.stubs(:reset_mocha)
+ klass.define_instance_method(:any_instance) { any_instance }
+ method = AnyInstanceMethod.new(klass, :method_x)
+ method.replace_instance_method(:restore_original_method) { }
+ method.define_instance_accessor(:remove_called)
+ method.replace_instance_method(:remove_new_method) { self.remove_called = true }
+
+ method.unstub
+
+ assert method.remove_called
+ end
+
+ def test_should_call_restore_original_method
+ klass = Class.new { def method_x; end }
+ any_instance = Mock.new
+ any_instance.stubs(:reset_mocha)
+ klass.define_instance_method(:any_instance) { any_instance }
+ method = AnyInstanceMethod.new(klass, :method_x)
+ method.replace_instance_method(:remove_new_method) { }
+ method.define_instance_accessor(:restore_called)
+ method.replace_instance_method(:restore_original_method) { self.restore_called = true }
+
+ method.unstub
+
+ assert method.restore_called
+ end
+
+ def test_should_call_reset_mocha
+ klass = Class.new { def method_x; end }
+ any_instance = Class.new { attr_accessor :mocha_was_reset; def reset_mocha; self.mocha_was_reset = true; end }.new
+ klass.define_instance_method(:any_instance) { any_instance }
+ method = AnyInstanceMethod.new(klass, :method_x)
+ method.replace_instance_method(:remove_new_method) { }
+ method.replace_instance_method(:restore_original_method) { }
+
+ method.unstub
+
+ assert any_instance.mocha_was_reset
+ end
+
+ def test_should_return_any_instance_mocha_for_stubbee
+ mocha = Object.new
+ any_instance = Object.new
+ any_instance.define_instance_method(:mocha) { mocha }
+ stubbee = Class.new
+ stubbee.define_instance_method(:any_instance) { any_instance }
+ method = AnyInstanceMethod.new(stubbee, :method_name)
+ assert_equal stubbee.any_instance.mocha, method.mock
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/array_inspect_test.rb b/vendor/gems/mocha-0.5.6/test/unit/array_inspect_test.rb
new file mode 100644
index 000000000..9cc06a456
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/array_inspect_test.rb
@@ -0,0 +1,16 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/inspect'
+
+class ArrayInstanceTest < Test::Unit::TestCase
+
+ def test_should_use_inspect
+ array = [1, 2]
+ assert_equal array.inspect, array.mocha_inspect
+ end
+
+ def test_should_use_mocha_inspect_on_each_item
+ array = [1, 2, "chris"]
+ assert_equal "[1, 2, 'chris']", array.mocha_inspect
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/auto_verify_test.rb b/vendor/gems/mocha-0.5.6/test/unit/auto_verify_test.rb
new file mode 100644
index 000000000..10a612457
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/auto_verify_test.rb
@@ -0,0 +1,129 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/auto_verify'
+require 'method_definer'
+
+class AutoVerifyTest < Test::Unit::TestCase
+
+ attr_reader :test_case
+
+ def setup
+ @test_case = Object.new
+ class << test_case
+ include Mocha::AutoVerify
+ end
+ end
+
+ def test_should_build_mock
+ mock = test_case.mock
+ assert mock.is_a?(Mocha::Mock)
+ end
+
+ def test_should_add_expectations_to_mock
+ mock = test_case.mock(:method_1 => 'result_1', :method_2 => 'result_2')
+ assert_equal 'result_1', mock.method_1
+ assert_equal 'result_2', mock.method_2
+ end
+
+ def test_should_build_stub
+ stub = test_case.stub
+ assert stub.is_a?(Mocha::Mock)
+ end
+
+ def test_should_add_expectation_to_stub
+ stub = test_case.stub(:method_1 => 'result_1', :method_2 => 'result_2')
+ assert_equal 'result_1', stub.method_1
+ assert_equal 'result_2', stub.method_2
+ end
+
+ def test_should_build_stub_that_stubs_all_methods
+ stub = test_case.stub_everything
+ assert stub.everything_stubbed
+ end
+
+ def test_should_add_expectations_to_stub_that_stubs_all_methods
+ stub = test_case.stub_everything(:method_1 => 'result_1', :method_2 => 'result_2')
+ assert_equal 'result_1', stub.method_1
+ assert_equal 'result_2', stub.method_2
+ end
+
+ def test_should_always_new_mock
+ assert_not_equal test_case.mock, test_case.mock
+ end
+
+ def test_should_always_build_new_stub
+ assert_not_equal test_case.stub, test_case.stub
+ end
+
+ def test_should_always_build_new_stub_that_stubs_all_methods
+ assert_not_equal test_case.stub, test_case.stub
+ end
+
+ def test_should_store_each_new_mock
+ expected = Array.new(3) { test_case.mock }
+ assert_equal expected, test_case.mocks
+ end
+
+ def test_should_store_each_new_stub
+ expected = Array.new(3) { test_case.stub }
+ assert_equal expected, test_case.mocks
+ end
+
+ def test_should_store_each_new_stub_that_stubs_all_methods
+ expected = Array.new(3) { test_case.stub_everything }
+ assert_equal expected, test_case.mocks
+ end
+
+ def test_should_verify_each_mock
+ mocks = Array.new(3) do
+ mock = Object.new
+ mock.define_instance_accessor(:verify_called)
+ class << mock
+ def verify(&block)
+ self.verify_called = true
+ end
+ end
+ mock
+ end
+ test_case.replace_instance_method(:mocks) { mocks }
+ test_case.verify_mocks
+ assert mocks.all? { |mock| mock.verify_called }
+ end
+
+ def test_should_yield_to_block_for_each_assertion
+ mock_class = Class.new do
+ def verify(&block); yield; end
+ end
+ mock = mock_class.new
+ test_case.replace_instance_method(:mocks) { [mock] }
+ yielded = false
+ test_case.verify_mocks { yielded = true }
+ assert yielded
+ end
+
+ def test_should_reset_mocks_on_teardown
+ mock = Class.new { define_method(:verify) {} }.new
+ test_case.mocks << mock
+ test_case.teardown_mocks
+ assert test_case.mocks.empty?
+ end
+
+ def test_should_create_named_mock
+ mock = test_case.mock('named_mock')
+ assert_equal '#', mock.mocha_inspect
+ end
+
+ def test_should_create_named_stub
+ stub = test_case.stub('named_stub')
+ assert_equal '#', stub.mocha_inspect
+ end
+
+ def test_should_create_named_stub_that_stubs_all_methods
+ stub = test_case.stub_everything('named_stub')
+ assert_equal '#', stub.mocha_inspect
+ end
+
+ def test_should_build_sequence
+ assert_not_nil test_case.sequence('name')
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/central_test.rb b/vendor/gems/mocha-0.5.6/test/unit/central_test.rb
new file mode 100644
index 000000000..2cc834591
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/central_test.rb
@@ -0,0 +1,124 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+
+require 'mocha/central'
+require 'mocha/mock'
+require 'method_definer'
+
+class CentralTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_start_with_empty_stubba_methods
+ stubba = Central.new
+
+ assert_equal [], stubba.stubba_methods
+ end
+
+ def test_should_stub_method_if_not_already_stubbed
+ method = Mock.new
+ method.expects(:stub)
+ stubba = Central.new
+
+ stubba.stub(method)
+
+ method.verify
+ end
+
+ def test_should_not_stub_method_if_already_stubbed
+ method = Mock.new
+ method.expects(:stub).times(0)
+ stubba = Central.new
+ stubba_methods = Mock.new
+ stubba_methods.stubs(:include?).with(method).returns(true)
+ stubba.stubba_methods = stubba_methods
+
+ stubba.stub(method)
+
+ method.verify
+ end
+
+ def test_should_record_method
+ method = Mock.new
+ method.expects(:stub)
+ stubba = Central.new
+
+ stubba.stub(method)
+
+ assert_equal [method], stubba.stubba_methods
+ end
+
+ def test_should_unstub_all_methods
+ stubba = Central.new
+ method_1 = Mock.new
+ method_1.expects(:unstub)
+ method_2 = Mock.new
+ method_2.expects(:unstub)
+ stubba.stubba_methods = [method_1, method_2]
+
+ stubba.unstub_all
+
+ assert_equal [], stubba.stubba_methods
+ method_1.verify
+ method_2.verify
+ end
+
+ def test_should_collect_mocks_from_all_methods
+ method_1 = Mock.new
+ method_1.stubs(:mock).returns(:mock_1)
+
+ method_2 = Mock.new
+ method_2.stubs(:mock).returns(:mock_2)
+
+ stubba = Central.new
+ stubba.stubba_methods = [method_1, method_2]
+
+ assert_equal 2, stubba.unique_mocks.length
+ assert stubba.unique_mocks.include?(:mock_1)
+ assert stubba.unique_mocks.include?(:mock_2)
+ end
+
+ def test_should_return_unique_mochas
+ method_1 = Mock.new
+ method_1.stubs(:mock).returns(:mock_1)
+
+ method_2 = Mock.new
+ method_2.stubs(:mock).returns(:mock_1)
+
+ stubba = Central.new
+ stubba.stubba_methods = [method_1, method_2]
+
+ assert_equal [:mock_1], stubba.unique_mocks
+ end
+
+ def test_should_call_verify_on_all_unique_mocks
+ mock_class = Class.new do
+ attr_accessor :verify_called
+ def verify
+ self.verify_called = true
+ end
+ end
+ mocks = [mock_class.new, mock_class.new]
+ stubba = Central.new
+ stubba.replace_instance_method(:unique_mocks) { mocks }
+
+ stubba.verify_all
+
+ assert mocks.all? { |mock| mock.verify_called }
+ end
+
+ def test_should_call_verify_on_all_unique_mochas
+ mock_class = Class.new do
+ def verify(&block)
+ yield if block_given?
+ end
+ end
+ stubba = Central.new
+ stubba.replace_instance_method(:unique_mocks) { [mock_class.new] }
+ yielded = false
+
+ stubba.verify_all { yielded = true }
+
+ assert yielded
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/class_method_test.rb b/vendor/gems/mocha-0.5.6/test/unit/class_method_test.rb
new file mode 100644
index 000000000..95d059908
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/class_method_test.rb
@@ -0,0 +1,200 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'method_definer'
+require 'mocha/mock'
+
+require 'mocha/class_method'
+
+class ClassMethodTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_provide_hidden_version_of_method_name_starting_with_prefix
+ method = ClassMethod.new(nil, :original_method_name)
+ assert_match(/^__stubba__/, method.hidden_method)
+ end
+
+ def test_should_provide_hidden_version_of_method_name_ending_with_suffix
+ method = ClassMethod.new(nil, :original_method_name)
+ assert_match(/__stubba__$/, method.hidden_method)
+ end
+
+ def test_should_provide_hidden_version_of_method_name_including_original_method_name
+ method = ClassMethod.new(nil, :original_method_name)
+ assert_match(/original_method_name/, method.hidden_method)
+ end
+
+ def test_should_provide_hidden_version_of_method_name_substituting_question_mark
+ method = ClassMethod.new(nil, :question_mark?)
+ assert_no_match(/\?/, method.hidden_method)
+ assert_match(/question_mark_substituted_character_63/, method.hidden_method)
+ end
+
+ def test_should_provide_hidden_version_of_method_name_substituting_exclamation_mark
+ method = ClassMethod.new(nil, :exclamation_mark!)
+ assert_no_match(/!/, method.hidden_method)
+ assert_match(/exclamation_mark_substituted_character_33/, method.hidden_method)
+ end
+
+ def test_should_provide_hidden_version_of_method_name_substituting_equals_sign
+ method = ClassMethod.new(nil, :equals_sign=)
+ assert_no_match(/\=/, method.hidden_method)
+ assert_match(/equals_sign_substituted_character_61/, method.hidden_method)
+ end
+
+ def test_should_provide_hidden_version_of_method_name_substituting_brackets
+ method = ClassMethod.new(nil, :[])
+ assert_no_match(/\[\]/, method.hidden_method)
+ assert_match(/substituted_character_91__substituted_character_93/, method.hidden_method)
+ end
+
+ def test_should_provide_hidden_version_of_method_name_substituting_plus_sign
+ method = ClassMethod.new(nil, :+)
+ assert_no_match(/\+/, method.hidden_method)
+ assert_match(/substituted_character_43/, method.hidden_method)
+ end
+
+ def test_should_hide_original_method
+ klass = Class.new { def self.method_x; end }
+ method = ClassMethod.new(klass, :method_x)
+ hidden_method_x = method.hidden_method
+
+ method.hide_original_method
+
+ assert klass.respond_to?(hidden_method_x)
+ end
+
+ def test_should_respond_to_original_method_name_after_original_method_has_been_hidden
+ klass = Class.new { def self.original_method_name; end }
+ method = ClassMethod.new(klass, :original_method_name)
+ hidden_method_x = method.hidden_method
+
+ method.hide_original_method
+
+ assert klass.respond_to?(:original_method_name)
+ end
+
+ def test_should_not_hide_original_method_if_method_not_defined
+ klass = Class.new
+ method = ClassMethod.new(klass, :method_x)
+ hidden_method_x = method.hidden_method
+
+ method.hide_original_method
+
+ assert_equal false, klass.respond_to?(hidden_method_x)
+ end
+
+ def test_should_define_a_new_method_which_should_call_mocha_method_missing
+ klass = Class.new { def self.method_x; end }
+ mocha = Mocha::Mock.new
+ klass.define_instance_method(:mocha) { mocha }
+ mocha.expects(:method_x).with(:param1, :param2).returns(:result)
+ method = ClassMethod.new(klass, :method_x)
+
+ method.hide_original_method
+ method.define_new_method
+ result = klass.method_x(:param1, :param2)
+
+ assert_equal :result, result
+ mocha.verify
+ end
+
+ def test_should_remove_new_method
+ klass = Class.new { def self.method_x; end }
+ method = ClassMethod.new(klass, :method_x)
+
+ method.remove_new_method
+
+ assert_equal false, klass.respond_to?(:method_x)
+ end
+
+ def test_should_restore_original_method
+ klass = Class.new { def self.method_x; end }
+ method = ClassMethod.new(klass, :method_x)
+ hidden_method_x = method.hidden_method.to_sym
+ klass.define_instance_method(hidden_method_x) { :original_result }
+
+ method.remove_new_method
+ method.restore_original_method
+
+ assert_equal :original_result, klass.method_x
+ assert_equal false, klass.respond_to?(hidden_method_x)
+ end
+
+ def test_should_not_restore_original_method_if_hidden_method_is_not_defined
+ klass = Class.new { def self.method_x; :new_result; end }
+ method = ClassMethod.new(klass, :method_x)
+
+ method.restore_original_method
+
+ assert_equal :new_result, klass.method_x
+ end
+
+ def test_should_call_hide_original_method
+ klass = Class.new { def self.method_x; end }
+ method = ClassMethod.new(klass, :method_x)
+ method.hide_original_method
+ method.define_instance_accessor(:hide_called)
+ method.replace_instance_method(:hide_original_method) { self.hide_called = true }
+
+ method.stub
+
+ assert method.hide_called
+ end
+
+ def test_should_call_define_new_method
+ klass = Class.new { def self.method_x; end }
+ method = ClassMethod.new(klass, :method_x)
+ method.define_instance_accessor(:define_called)
+ method.replace_instance_method(:define_new_method) { self.define_called = true }
+
+ method.stub
+
+ assert method.define_called
+ end
+
+ def test_should_call_remove_new_method
+ klass = Class.new { def self.method_x; end }
+ klass.define_instance_method(:reset_mocha) { }
+ method = ClassMethod.new(klass, :method_x)
+ method.define_instance_accessor(:remove_called)
+ method.replace_instance_method(:remove_new_method) { self.remove_called = true }
+
+ method.unstub
+
+ assert method.remove_called
+ end
+
+ def test_should_call_restore_original_method
+ klass = Class.new { def self.method_x; end }
+ klass.define_instance_method(:reset_mocha) { }
+ method = ClassMethod.new(klass, :method_x)
+ method.define_instance_accessor(:restore_called)
+ method.replace_instance_method(:restore_original_method) { self.restore_called = true }
+
+ method.unstub
+
+ assert method.restore_called
+ end
+
+ def test_should_call_reset_mocha
+ klass = Class.new { def self.method_x; end }
+ klass.define_instance_accessor(:reset_called)
+ klass.define_instance_method(:reset_mocha) { self.reset_called = true }
+ method = ClassMethod.new(klass, :method_x)
+ method.replace_instance_method(:restore_original_method) { }
+
+ method.unstub
+
+ assert klass.reset_called
+ end
+
+ def test_should_return_mock_for_stubbee
+ mocha = Object.new
+ stubbee = Object.new
+ stubbee.define_instance_accessor(:mocha) { mocha }
+ stubbee.mocha = nil
+ method = ClassMethod.new(stubbee, :method_name)
+ assert_equal stubbee.mocha, method.mock
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/date_time_inspect_test.rb b/vendor/gems/mocha-0.5.6/test/unit/date_time_inspect_test.rb
new file mode 100644
index 000000000..8a9b2ee02
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/date_time_inspect_test.rb
@@ -0,0 +1,21 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/inspect'
+
+class TimeDateInspectTest < Test::Unit::TestCase
+
+ def test_should_use_include_date_in_seconds
+ time = Time.now
+ assert_equal "#{time.inspect} (#{time.to_f} secs)", time.mocha_inspect
+ end
+
+ def test_should_use_to_s_for_date
+ date = Date.new(2006, 1, 1)
+ assert_equal date.to_s, date.mocha_inspect
+ end
+
+ def test_should_use_to_s_for_datetime
+ datetime = DateTime.new(2006, 1, 1)
+ assert_equal datetime.to_s, datetime.mocha_inspect
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/expectation_error_test.rb b/vendor/gems/mocha-0.5.6/test/unit/expectation_error_test.rb
new file mode 100644
index 000000000..6206acf64
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/expectation_error_test.rb
@@ -0,0 +1,24 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/expectation_error'
+
+class ExpectationErrorTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_exclude_mocha_locations_from_backtrace
+ mocha_lib = "/username/workspace/mocha_wibble/lib/"
+ backtrace = [ mocha_lib + 'exclude/me/1', mocha_lib + 'exclude/me/2', '/keep/me', mocha_lib + 'exclude/me/3']
+ expectation_error = ExpectationError.new(nil, backtrace, mocha_lib)
+ assert_equal ['/keep/me'], expectation_error.backtrace
+ end
+
+ def test_should_determine_path_for_mocha_lib_directory
+ assert_match Regexp.new("/lib/$"), ExpectationError::LIB_DIRECTORY
+ end
+
+ def test_should_set_error_message
+ expectation_error = ExpectationError.new('message')
+ assert_equal 'message', expectation_error.message
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/expectation_list_test.rb b/vendor/gems/mocha-0.5.6/test/unit/expectation_list_test.rb
new file mode 100644
index 000000000..59dd410a1
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/expectation_list_test.rb
@@ -0,0 +1,75 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/expectation_list'
+require 'mocha/expectation'
+require 'set'
+require 'method_definer'
+
+class ExpectationListTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_return_added_expectation
+ expectation_list = ExpectationList.new
+ expectation = Expectation.new(nil, :my_method)
+ assert_same expectation, expectation_list.add(expectation)
+ end
+
+ def test_should_find_matching_expectation
+ expectation_list = ExpectationList.new
+ expectation1 = Expectation.new(nil, :my_method).with(:argument1, :argument2)
+ expectation2 = Expectation.new(nil, :my_method).with(:argument3, :argument4)
+ expectation_list.add(expectation1)
+ expectation_list.add(expectation2)
+ assert_same expectation2, expectation_list.detect(:my_method, :argument3, :argument4)
+ end
+
+ def test_should_find_most_recent_matching_expectation
+ expectation_list = ExpectationList.new
+ expectation1 = Expectation.new(nil, :my_method).with(:argument1, :argument2)
+ expectation2 = Expectation.new(nil, :my_method).with(:argument1, :argument2)
+ expectation_list.add(expectation1)
+ expectation_list.add(expectation2)
+ assert_same expectation2, expectation_list.detect(:my_method, :argument1, :argument2)
+ end
+
+ def test_should_find_most_recent_matching_expectation_but_give_preference_to_those_allowing_invocations
+ expectation_list = ExpectationList.new
+ expectation1 = Expectation.new(nil, :my_method)
+ expectation2 = Expectation.new(nil, :my_method)
+ expectation1.define_instance_method(:invocations_allowed?) { true }
+ expectation2.define_instance_method(:invocations_allowed?) { false }
+ expectation_list.add(expectation1)
+ expectation_list.add(expectation2)
+ assert_same expectation1, expectation_list.detect(:my_method)
+ end
+
+ def test_should_find_most_recent_matching_expectation_if_no_matching_expectations_allow_invocations
+ expectation_list = ExpectationList.new
+ expectation1 = Expectation.new(nil, :my_method)
+ expectation2 = Expectation.new(nil, :my_method)
+ expectation1.define_instance_method(:invocations_allowed?) { false }
+ expectation2.define_instance_method(:invocations_allowed?) { false }
+ expectation_list.add(expectation1)
+ expectation_list.add(expectation2)
+ assert_same expectation2, expectation_list.detect(:my_method)
+ end
+
+ def test_should_find_expectations_for_the_same_method_no_matter_what_the_arguments
+ expectation_list = ExpectationList.new
+ expectation1 = Expectation.new(nil, :my_method).with(:argument1, :argument2)
+ expectation_list.add(expectation1)
+ expectation2 = Expectation.new(nil, :my_method).with(:argument3, :argument4)
+ expectation_list.add(expectation2)
+ assert_equal [expectation1, expectation2].to_set, expectation_list.similar(:my_method).to_set
+ end
+
+ def test_should_ignore_expectations_for_different_methods
+ expectation_list = ExpectationList.new
+ expectation1 = Expectation.new(nil, :method1).with(:argument1, :argument2)
+ expectation_list.add(expectation1)
+ expectation2 = Expectation.new(nil, :method2).with(:argument1, :argument2)
+ expectation_list.add(expectation2)
+ assert_equal [expectation2], expectation_list.similar(:method2)
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/expectation_raiser_test.rb b/vendor/gems/mocha-0.5.6/test/unit/expectation_raiser_test.rb
new file mode 100644
index 000000000..3b46d8fd8
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/expectation_raiser_test.rb
@@ -0,0 +1,28 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+
+require 'mocha/exception_raiser'
+
+class ExceptionRaiserTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_raise_exception_with_specified_class_and_default_message
+ exception_class = Class.new(StandardError)
+ raiser = ExceptionRaiser.new(exception_class, nil)
+ exception = assert_raises(exception_class) { raiser.evaluate }
+ assert_equal exception_class.to_s, exception.message
+ end
+
+ def test_should_raise_exception_with_specified_class_and_message
+ exception_class = Class.new(StandardError)
+ raiser = ExceptionRaiser.new(exception_class, 'message')
+ exception = assert_raises(exception_class) { raiser.evaluate }
+ assert_equal 'message', exception.message
+ end
+
+ def test_should_raise_interrupt_exception_with_default_message_so_it_works_in_ruby_1_8_6
+ raiser = ExceptionRaiser.new(Interrupt, nil)
+ assert_raises(Interrupt) { raiser.evaluate }
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/expectation_test.rb b/vendor/gems/mocha-0.5.6/test/unit/expectation_test.rb
new file mode 100644
index 000000000..cdb38eb9b
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/expectation_test.rb
@@ -0,0 +1,483 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'method_definer'
+require 'mocha/expectation'
+require 'mocha/sequence'
+require 'execution_point'
+require 'deprecation_disabler'
+
+class ExpectationTest < Test::Unit::TestCase
+
+ include Mocha
+ include DeprecationDisabler
+
+ def new_expectation
+ Expectation.new(nil, :expected_method)
+ end
+
+ def test_should_match_calls_to_same_method_with_any_parameters
+ assert new_expectation.match?(:expected_method, 1, 2, 3)
+ end
+
+ def test_should_match_calls_to_same_method_with_exactly_zero_parameters
+ expectation = new_expectation.with()
+ assert expectation.match?(:expected_method)
+ end
+
+ def test_should_not_match_calls_to_same_method_with_more_than_zero_parameters
+ expectation = new_expectation.with()
+ assert !expectation.match?(:expected_method, 1, 2, 3)
+ end
+
+ def test_should_match_calls_to_same_method_with_expected_parameter_values
+ expectation = new_expectation.with(1, 2, 3)
+ assert expectation.match?(:expected_method, 1, 2, 3)
+ end
+
+ def test_should_match_calls_to_same_method_with_parameters_constrained_as_expected
+ expectation = new_expectation.with() {|x, y, z| x + y == z}
+ assert expectation.match?(:expected_method, 1, 2, 3)
+ end
+
+ def test_should_not_match_calls_to_different_method_with_parameters_constrained_as_expected
+ expectation = new_expectation.with() {|x, y, z| x + y == z}
+ assert !expectation.match?(:different_method, 1, 2, 3)
+ end
+
+ def test_should_not_match_calls_to_different_methods_with_no_parameters
+ assert !new_expectation.match?(:unexpected_method)
+ end
+
+ def test_should_not_match_calls_to_same_method_with_too_few_parameters
+ expectation = new_expectation.with(1, 2, 3)
+ assert !expectation.match?(:unexpected_method, 1, 2)
+ end
+
+ def test_should_not_match_calls_to_same_method_with_too_many_parameters
+ expectation = new_expectation.with(1, 2)
+ assert !expectation.match?(:unexpected_method, 1, 2, 3)
+ end
+
+ def test_should_not_match_calls_to_same_method_with_unexpected_parameter_values
+ expectation = new_expectation.with(1, 2, 3)
+ assert !expectation.match?(:unexpected_method, 1, 0, 3)
+ end
+
+ def test_should_not_match_calls_to_same_method_with_parameters_not_constrained_as_expected
+ expectation = new_expectation.with() {|x, y, z| x + y == z}
+ assert !expectation.match?(:expected_method, 1, 0, 3)
+ end
+
+ def test_should_allow_invocations_until_expected_invocation_count_is_one_and_actual_invocation_count_would_be_two
+ expectation = new_expectation.times(1)
+ assert expectation.invocations_allowed?
+ expectation.invoke
+ assert !expectation.invocations_allowed?
+ end
+
+ def test_should_allow_invocations_until_expected_invocation_count_is_two_and_actual_invocation_count_would_be_three
+ expectation = new_expectation.times(2)
+ assert expectation.invocations_allowed?
+ expectation.invoke
+ assert expectation.invocations_allowed?
+ expectation.invoke
+ assert !expectation.invocations_allowed?
+ end
+
+ def test_should_allow_invocations_until_expected_invocation_count_is_a_range_from_two_to_three_and_actual_invocation_count_would_be_four
+ expectation = new_expectation.times(2..3)
+ assert expectation.invocations_allowed?
+ expectation.invoke
+ assert expectation.invocations_allowed?
+ expectation.invoke
+ assert expectation.invocations_allowed?
+ expectation.invoke
+ assert !expectation.invocations_allowed?
+ end
+
+ def test_should_store_provided_backtrace
+ backtrace = Object.new
+ expectation = Expectation.new(nil, :expected_method, backtrace)
+ assert_equal backtrace, expectation.backtrace
+ end
+
+ def test_should_default_backtrace_to_caller
+ execution_point = ExecutionPoint.current; expectation = Expectation.new(nil, :expected_method)
+ assert_equal execution_point, ExecutionPoint.new(expectation.backtrace)
+ end
+
+ def test_should_not_yield
+ yielded = false
+ new_expectation.invoke() { yielded = true }
+ assert_equal false, yielded
+ end
+
+ def test_should_yield_no_parameters
+ expectation = new_expectation().yields()
+ yielded_parameters = nil
+ expectation.invoke() { |*parameters| yielded_parameters = parameters }
+ assert_equal Array.new, yielded_parameters
+ end
+
+ def test_should_yield_with_specified_parameters
+ expectation = new_expectation().yields(1, 2, 3)
+ yielded_parameters = nil
+ expectation.invoke() { |*parameters| yielded_parameters = parameters }
+ assert_equal [1, 2, 3], yielded_parameters
+ end
+
+ def test_should_yield_different_parameters_on_consecutive_invocations
+ expectation = new_expectation().yields(1, 2, 3).yields(4, 5)
+ yielded_parameters = []
+ expectation.invoke() { |*parameters| yielded_parameters << parameters }
+ expectation.invoke() { |*parameters| yielded_parameters << parameters }
+ assert_equal [[1, 2, 3], [4, 5]], yielded_parameters
+ end
+
+ def test_should_yield_multiple_times_for_single_invocation
+ expectation = new_expectation().multiple_yields([1, 2, 3], [4, 5])
+ yielded_parameters = []
+ expectation.invoke() { |*parameters| yielded_parameters << parameters }
+ assert_equal [[1, 2, 3], [4, 5]], yielded_parameters
+ end
+
+ def test_should_yield_multiple_times_for_first_invocation_and_once_for_second_invocation
+ expectation = new_expectation().multiple_yields([1, 2, 3], [4, 5]).then.yields(6, 7)
+ yielded_parameters = []
+ expectation.invoke() { |*parameters| yielded_parameters << parameters }
+ expectation.invoke() { |*parameters| yielded_parameters << parameters }
+ assert_equal [[1, 2, 3], [4, 5], [6, 7]], yielded_parameters
+ end
+
+ def test_should_return_specified_value
+ expectation = new_expectation.returns(99)
+ assert_equal 99, expectation.invoke
+ end
+
+ def test_should_return_same_specified_value_multiple_times
+ expectation = new_expectation.returns(99)
+ assert_equal 99, expectation.invoke
+ assert_equal 99, expectation.invoke
+ end
+
+ def test_should_return_specified_values_on_consecutive_calls
+ expectation = new_expectation.returns(99, 100, 101)
+ assert_equal 99, expectation.invoke
+ assert_equal 100, expectation.invoke
+ assert_equal 101, expectation.invoke
+ end
+
+ def test_should_return_specified_values_on_consecutive_calls_even_if_values_are_modified
+ values = [99, 100, 101]
+ expectation = new_expectation.returns(*values)
+ values.shift
+ assert_equal 99, expectation.invoke
+ assert_equal 100, expectation.invoke
+ assert_equal 101, expectation.invoke
+ end
+
+ def test_should_return_nil_by_default
+ assert_nil new_expectation.invoke
+ end
+
+ def test_should_return_nil_if_no_value_specified
+ expectation = new_expectation.returns()
+ assert_nil expectation.invoke
+ end
+
+ def test_should_return_evaluated_proc
+ proc = lambda { 99 }
+ expectation = new_expectation.returns(proc)
+ result = nil
+ disable_deprecations { result = expectation.invoke }
+ assert_equal 99, result
+ end
+
+ def test_should_return_evaluated_proc_without_using_is_a_method
+ proc = lambda { 99 }
+ proc.define_instance_accessor(:called)
+ proc.called = false
+ proc.replace_instance_method(:is_a?) { self.called = true; true}
+ expectation = new_expectation.returns(proc)
+ disable_deprecations { expectation.invoke }
+ assert_equal false, proc.called
+ end
+
+ def test_should_raise_runtime_exception
+ expectation = new_expectation.raises
+ assert_raise(RuntimeError) { expectation.invoke }
+ end
+
+ def test_should_raise_custom_exception
+ exception = Class.new(Exception)
+ expectation = new_expectation.raises(exception)
+ assert_raise(exception) { expectation.invoke }
+ end
+
+ def test_should_raise_same_instance_of_custom_exception
+ exception_klass = Class.new(StandardError)
+ expected_exception = exception_klass.new
+ expectation = new_expectation.raises(expected_exception)
+ actual_exception = assert_raise(exception_klass) { expectation.invoke }
+ assert_same expected_exception, actual_exception
+ end
+
+ def test_should_use_the_default_exception_message
+ expectation = new_expectation.raises(Exception)
+ exception = assert_raise(Exception) { expectation.invoke }
+ assert_equal Exception.new.message, exception.message
+ end
+
+ def test_should_raise_custom_exception_with_message
+ exception_msg = "exception message"
+ expectation = new_expectation.raises(Exception, exception_msg)
+ exception = assert_raise(Exception) { expectation.invoke }
+ assert_equal exception_msg, exception.message
+ end
+
+ def test_should_return_values_then_raise_exception
+ expectation = new_expectation.returns(1, 2).then.raises()
+ assert_equal 1, expectation.invoke
+ assert_equal 2, expectation.invoke
+ assert_raise(RuntimeError) { expectation.invoke }
+ end
+
+ def test_should_raise_exception_then_return_values
+ expectation = new_expectation.raises().then.returns(1, 2)
+ assert_raise(RuntimeError) { expectation.invoke }
+ assert_equal 1, expectation.invoke
+ assert_equal 2, expectation.invoke
+ end
+
+ def test_should_not_raise_error_on_verify_if_expected_call_was_made
+ expectation = new_expectation
+ expectation.invoke
+ assert_nothing_raised(ExpectationError) {
+ expectation.verify
+ }
+ end
+
+ def test_should_raise_error_on_verify_if_call_expected_once_but_invoked_twice
+ expectation = new_expectation.once
+ expectation.invoke
+ expectation.invoke
+ assert_raises(ExpectationError) {
+ expectation.verify
+ }
+ end
+
+ def test_should_raise_error_on_verify_if_call_expected_once_but_not_invoked
+ expectation = new_expectation.once
+ assert_raises(ExpectationError) {
+ expectation.verify
+ }
+ end
+
+ def test_should_not_raise_error_on_verify_if_call_expected_once_and_invoked_once
+ expectation = new_expectation.once
+ expectation.invoke
+ assert_nothing_raised(ExpectationError) {
+ expectation.verify
+ }
+ end
+
+ def test_should_not_raise_error_on_verify_if_expected_call_was_made_at_least_once
+ expectation = new_expectation.at_least_once
+ 3.times {expectation.invoke}
+ assert_nothing_raised(ExpectationError) {
+ expectation.verify
+ }
+ end
+
+ def test_should_raise_error_on_verify_if_expected_call_was_not_made_at_least_once
+ expectation = new_expectation.with(1, 2, 3).at_least_once
+ e = assert_raise(ExpectationError) {
+ expectation.verify
+ }
+ assert_match(/expected calls: at least 1, actual calls: 0/i, e.message)
+ end
+
+ def test_should_not_raise_error_on_verify_if_expected_call_was_made_expected_number_of_times
+ expectation = new_expectation.times(2)
+ 2.times {expectation.invoke}
+ assert_nothing_raised(ExpectationError) {
+ expectation.verify
+ }
+ end
+
+ def test_should_expect_call_not_to_be_made
+ expectation = new_expectation
+ expectation.define_instance_accessor(:how_many_times)
+ expectation.replace_instance_method(:times) { |how_many_times| self.how_many_times = how_many_times }
+ expectation.never
+ assert_equal 0, expectation.how_many_times
+ end
+
+ def test_should_raise_error_on_verify_if_expected_call_was_made_too_few_times
+ expectation = new_expectation.times(2)
+ 1.times {expectation.invoke}
+ e = assert_raise(ExpectationError) {
+ expectation.verify
+ }
+ assert_match(/expected calls: 2, actual calls: 1/i, e.message)
+ end
+
+ def test_should_raise_error_on_verify_if_expected_call_was_made_too_many_times
+ expectation = new_expectation.times(2)
+ 3.times {expectation.invoke}
+ assert_raise(ExpectationError) {
+ expectation.verify
+ }
+ end
+
+ def test_should_yield_self_to_block
+ expectation = new_expectation
+ expectation.invoke
+ yielded_expectation = nil
+ expectation.verify { |x| yielded_expectation = x }
+ assert_equal expectation, yielded_expectation
+ end
+
+ def test_should_yield_to_block_before_raising_exception
+ yielded = false
+ assert_raise(ExpectationError) {
+ new_expectation.verify { |x| yielded = true }
+ }
+ assert yielded
+ end
+
+ def test_should_store_backtrace_from_point_where_expectation_was_created
+ execution_point = ExecutionPoint.current; expectation = Expectation.new(nil, :expected_method)
+ assert_equal execution_point, ExecutionPoint.new(expectation.backtrace)
+ end
+
+ def test_should_set_backtrace_on_assertion_failed_error_to_point_where_expectation_was_created
+ execution_point = ExecutionPoint.current; expectation = Expectation.new(nil, :expected_method)
+ error = assert_raise(ExpectationError) {
+ expectation.verify
+ }
+ assert_equal execution_point, ExecutionPoint.new(error.backtrace)
+ end
+
+ def test_should_display_expectation_in_exception_message
+ options = [:a, :b, {:c => 1, :d => 2}]
+ expectation = new_expectation.with(*options)
+ exception = assert_raise(ExpectationError) { expectation.verify }
+ assert exception.message.include?(expectation.method_signature)
+ end
+
+ class FakeMock
+
+ def initialize(name)
+ @name = name
+ end
+
+ def mocha_inspect
+ @name
+ end
+
+ end
+
+ def test_should_raise_error_with_message_indicating_which_method_was_expected_to_be_called_on_which_mock_object_with_which_parameters_and_in_what_sequences
+ mock = FakeMock.new('mock')
+ sequence_one = Sequence.new('one')
+ sequence_two = Sequence.new('two')
+ expectation = Expectation.new(mock, :expected_method).with(1, 2, {'a' => true, :b => false}, [1, 2, 3]).in_sequence(sequence_one, sequence_two)
+ e = assert_raise(ExpectationError) { expectation.verify }
+ assert_match "mock.expected_method(1, 2, {'a' => true, :b => false}, [1, 2, 3]); in sequence 'one'; in sequence 'two'", e.message
+ end
+
+ class FakeConstraint
+
+ def initialize(allows_invocation_now)
+ @allows_invocation_now = allows_invocation_now
+ end
+
+ def allows_invocation_now?
+ @allows_invocation_now
+ end
+
+ end
+
+ def test_should_be_in_correct_order_if_all_ordering_constraints_allow_invocation_now
+ constraint_one = FakeConstraint.new(allows_invocation_now = true)
+ constraint_two = FakeConstraint.new(allows_invocation_now = true)
+ expectation = Expectation.new(nil, :method_one)
+ expectation.add_ordering_constraint(constraint_one)
+ expectation.add_ordering_constraint(constraint_two)
+ assert expectation.in_correct_order?
+ end
+
+ def test_should_not_be_in_correct_order_if_one_ordering_constraint_does_not_allow_invocation_now
+ constraint_one = FakeConstraint.new(allows_invocation_now = true)
+ constraint_two = FakeConstraint.new(allows_invocation_now = false)
+ expectation = Expectation.new(nil, :method_one)
+ expectation.add_ordering_constraint(constraint_one)
+ expectation.add_ordering_constraint(constraint_two)
+ assert !expectation.in_correct_order?
+ end
+
+ def test_should_match_if_all_ordering_constraints_allow_invocation_now
+ constraint_one = FakeConstraint.new(allows_invocation_now = true)
+ constraint_two = FakeConstraint.new(allows_invocation_now = true)
+ expectation = Expectation.new(nil, :method_one)
+ expectation.add_ordering_constraint(constraint_one)
+ expectation.add_ordering_constraint(constraint_two)
+ assert expectation.match?(:method_one)
+ end
+
+ def test_should_not_match_if_one_ordering_constraints_does_not_allow_invocation_now
+ constraint_one = FakeConstraint.new(allows_invocation_now = true)
+ constraint_two = FakeConstraint.new(allows_invocation_now = false)
+ expectation = Expectation.new(nil, :method_one)
+ expectation.add_ordering_constraint(constraint_one)
+ expectation.add_ordering_constraint(constraint_two)
+ assert !expectation.match?(:method_one)
+ end
+
+ def test_should_not_be_satisfied_when_required_invocation_has_not_been_made
+ expectation = Expectation.new(nil, :method_one).times(1)
+ assert !expectation.satisfied?
+ end
+
+ def test_should_be_satisfied_when_required_invocation_has_been_made
+ expectation = Expectation.new(nil, :method_one).times(1)
+ expectation.invoke
+ assert expectation.satisfied?
+ end
+
+ def test_should_not_be_satisfied_when_minimum_number_of_invocations_has_not_been_made
+ expectation = Expectation.new(nil, :method_one).at_least(2)
+ expectation.invoke
+ assert !expectation.satisfied?
+ end
+
+ def test_should_be_satisfied_when_minimum_number_of_invocations_has_been_made
+ expectation = Expectation.new(nil, :method_one).at_least(2)
+ 2.times { expectation.invoke }
+ assert expectation.satisfied?
+ end
+
+ class FakeSequence
+
+ attr_reader :expectations
+
+ def initialize
+ @expectations = []
+ end
+
+ def constrain_as_next_in_sequence(expectation)
+ @expectations << expectation
+ end
+
+ end
+
+ def test_should_tell_sequences_to_constrain_expectation_as_next_in_sequence
+ sequence_one = FakeSequence.new
+ sequence_two = FakeSequence.new
+ expectation = Expectation.new(nil, :method_one)
+ assert_equal expectation, expectation.in_sequence(sequence_one, sequence_two)
+ assert_equal [expectation], sequence_one.expectations
+ assert_equal [expectation], sequence_two.expectations
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/hash_inspect_test.rb b/vendor/gems/mocha-0.5.6/test/unit/hash_inspect_test.rb
new file mode 100644
index 000000000..15ad41544
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/hash_inspect_test.rb
@@ -0,0 +1,16 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/inspect'
+
+class HashInspectTest < Test::Unit::TestCase
+
+ def test_should_keep_spacing_between_key_value
+ hash = {:a => true}
+ assert_equal '{:a => true}', hash.mocha_inspect
+ end
+
+ def test_should_use_mocha_inspect_on_each_item
+ hash = {:a => 'mocha'}
+ assert_equal "{:a => 'mocha'}", hash.mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/infinite_range_test.rb b/vendor/gems/mocha-0.5.6/test/unit/infinite_range_test.rb
new file mode 100644
index 000000000..7b4c8a4cb
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/infinite_range_test.rb
@@ -0,0 +1,53 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/infinite_range'
+require 'date'
+
+class InfiniteRangeTest < Test::Unit::TestCase
+
+ def test_should_include_values_at_or_above_minimum
+ range = Range.at_least(10)
+ assert(range === 10)
+ assert(range === 11)
+ assert(range === 1000000)
+ end
+
+ def test_should_not_include_values_below_minimum
+ range = Range.at_least(10)
+ assert_false(range === 0)
+ assert_false(range === 9)
+ assert_false(range === -11)
+ end
+
+ def test_should_be_human_readable_description_for_at_least
+ assert_equal "at least 10", Range.at_least(10).mocha_inspect
+ end
+
+ def test_should_include_values_at_or_below_maximum
+ range = Range.at_most(10)
+ assert(range === 10)
+ assert(range === 0)
+ assert(range === -1000000)
+ end
+
+ def test_should_not_include_values_above_maximum
+ range = Range.at_most(10)
+ assert_false(range === 11)
+ assert_false(range === 1000000)
+ end
+
+ def test_should_be_human_readable_description_for_at_most
+ assert_equal "at most 10", Range.at_most(10).mocha_inspect
+ end
+
+ def test_should_be_same_as_standard_to_string
+ assert_equal((1..10).to_s, (1..10).mocha_inspect)
+ assert_equal((1...10).to_s, (1...10).mocha_inspect)
+ date_range = Range.new(Date.parse('2006-01-01'), Date.parse('2007-01-01'))
+ assert_equal date_range.to_s, date_range.mocha_inspect
+ end
+
+ def assert_false(condition)
+ assert(!condition)
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/metaclass_test.rb b/vendor/gems/mocha-0.5.6/test/unit/metaclass_test.rb
new file mode 100644
index 000000000..956bcb45b
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/metaclass_test.rb
@@ -0,0 +1,22 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/metaclass'
+
+class MetaclassTest < Test::Unit::TestCase
+
+ def test_should_return_objects_singleton_class
+ object = Object.new
+ assert_raises(NoMethodError) { object.success? }
+
+ object = Object.new
+ assert object.__metaclass__.ancestors.include?(Object)
+ assert object.__metaclass__.ancestors.include?(Kernel)
+ assert object.__metaclass__.is_a?(Class)
+
+ object.__metaclass__.class_eval { def success?; true; end }
+ assert object.success?
+
+ object = Object.new
+ assert_raises(NoMethodError) { object.success? }
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/method_matcher_test.rb b/vendor/gems/mocha-0.5.6/test/unit/method_matcher_test.rb
new file mode 100644
index 000000000..0167433e4
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/method_matcher_test.rb
@@ -0,0 +1,23 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/method_matcher'
+
+class MethodMatcherTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_match_if_actual_method_name_is_same_as_expected_method_name
+ method_matcher = MethodMatcher.new(:method_name)
+ assert method_matcher.match?(:method_name)
+ end
+
+ def test_should_not_match_if_actual_method_name_is_not_same_as_expected_method_name
+ method_matcher = MethodMatcher.new(:method_name)
+ assert !method_matcher.match?(:different_method_name)
+ end
+
+ def test_should_describe_what_method_is_expected
+ method_matcher = MethodMatcher.new(:method_name)
+ assert_equal "method_name", method_matcher.mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/missing_expectation_test.rb b/vendor/gems/mocha-0.5.6/test/unit/missing_expectation_test.rb
new file mode 100644
index 000000000..9d3b45aa7
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/missing_expectation_test.rb
@@ -0,0 +1,42 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+
+require 'mocha/missing_expectation'
+require 'mocha/mock'
+
+class MissingExpectationTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_report_similar_expectations
+ mock = Mock.new
+ expectation_1 = mock.expects(:method_one).with(1)
+ expectation_2 = mock.expects(:method_one).with(1, 1)
+ expectation_3 = mock.expects(:method_two).with(2)
+
+ missing_expectation = MissingExpectation.new(mock, :method_one)
+ exception = assert_raise(ExpectationError) { missing_expectation.verify }
+
+ expected_message = [
+ "#{missing_expectation.error_message(0, 1)}",
+ "Similar expectations:",
+ "#{expectation_1.method_signature}",
+ "#{expectation_2.method_signature}"
+ ].join("\n")
+
+ assert_equal expected_message, exception.message
+ end
+
+ def test_should_not_report_similar_expectations_if_there_are_none
+ mock = Mock.new
+ mock.expects(:method_two).with(2)
+ mock.expects(:method_two).with(2, 2)
+
+ missing_expectation = MissingExpectation.new(mock, :method_one)
+ exception = assert_raise(ExpectationError) { missing_expectation.verify }
+
+ expected_message = "#{missing_expectation.error_message(0, 1)}"
+
+ assert_equal expected_message, exception.message
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/mock_test.rb b/vendor/gems/mocha-0.5.6/test/unit/mock_test.rb
new file mode 100644
index 000000000..f844bc81d
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/mock_test.rb
@@ -0,0 +1,323 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/mock'
+require 'mocha/expectation_error'
+require 'set'
+
+class MockTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_set_single_expectation
+ mock = Mock.new
+ mock.expects(:method1).returns(1)
+ assert_nothing_raised(ExpectationError) do
+ assert_equal 1, mock.method1
+ end
+ end
+
+ def test_should_build_and_store_expectations
+ mock = Mock.new
+ expectation = mock.expects(:method1)
+ assert_not_nil expectation
+ assert_equal [expectation], mock.expectations.to_a
+ end
+
+ def test_should_not_stub_everything_by_default
+ mock = Mock.new
+ assert_equal false, mock.everything_stubbed
+ end
+
+ def test_should_stub_everything
+ mock = Mock.new
+ mock.stub_everything
+ assert_equal true, mock.everything_stubbed
+ end
+
+ def test_should_display_object_id_for_mocha_inspect_if_mock_has_no_name
+ mock = Mock.new
+ assert_match Regexp.new("^#$"), mock.mocha_inspect
+ end
+
+ def test_should_display_name_for_mocha_inspect_if_mock_has_name
+ mock = Mock.new('named_mock')
+ assert_equal "#", mock.mocha_inspect
+ end
+
+ def test_should_display_object_id_for_inspect_if_mock_has_no_name
+ mock = Mock.new
+ assert_match Regexp.new("^#$"), mock.inspect
+ end
+
+ def test_should_display_name_for_inspect_if_mock_has_name
+ mock = Mock.new('named_mock')
+ assert_equal "#", mock.inspect
+ end
+
+ def test_should_be_able_to_extend_mock_object_with_module
+ mock = Mock.new
+ assert_nothing_raised(ExpectationError) { mock.extend(Module.new) }
+ end
+
+ def test_should_be_equal
+ mock = Mock.new
+ assert_equal true, mock.eql?(mock)
+ end
+
+ if RUBY_VERSION < '1.9'
+ OBJECT_METHODS = STANDARD_OBJECT_PUBLIC_INSTANCE_METHODS.reject { |m| m =~ /^__.*__$/ }
+ else
+ OBJECT_METHODS = STANDARD_OBJECT_PUBLIC_INSTANCE_METHODS.reject { |m| m =~ /^__.*__$/ || m == :object_id }
+ end
+
+ def test_should_be_able_to_mock_standard_object_methods
+ mock = Mock.new
+ OBJECT_METHODS.each { |method| mock.__expects__(method.to_sym).returns(method) }
+ OBJECT_METHODS.each { |method| assert_equal method, mock.__send__(method.to_sym) }
+ assert_nothing_raised(ExpectationError) { mock.verify }
+ end
+
+ def test_should_be_able_to_stub_standard_object_methods
+ mock = Mock.new
+ OBJECT_METHODS.each { |method| mock.__stubs__(method.to_sym).returns(method) }
+ OBJECT_METHODS.each { |method| assert_equal method, mock.__send__(method.to_sym) }
+ end
+
+ def test_should_create_and_add_expectations
+ mock = Mock.new
+ expectation1 = mock.expects(:method1)
+ expectation2 = mock.expects(:method2)
+ assert_equal [expectation1, expectation2].to_set, mock.expectations.to_set
+ end
+
+ def test_should_pass_backtrace_into_expectation
+ mock = Mock.new
+ backtrace = Object.new
+ expectation = mock.expects(:method1, backtrace)
+ assert_equal backtrace, expectation.backtrace
+ end
+
+ def test_should_pass_backtrace_into_stub
+ mock = Mock.new
+ backtrace = Object.new
+ stub = mock.stubs(:method1, backtrace)
+ assert_equal backtrace, stub.backtrace
+ end
+
+ def test_should_create_and_add_stubs
+ mock = Mock.new
+ stub1 = mock.stubs(:method1)
+ stub2 = mock.stubs(:method2)
+ assert_equal [stub1, stub2].to_set, mock.expectations.to_set
+ end
+
+ def test_should_invoke_expectation_and_return_result
+ mock = Mock.new
+ mock.expects(:my_method).returns(:result)
+ result = mock.my_method
+ assert_equal :result, result
+ end
+
+ def test_should_not_raise_error_if_stubbing_everything
+ mock = Mock.new
+ mock.stub_everything
+ result = nil
+ assert_nothing_raised(ExpectationError) do
+ result = mock.unexpected_method
+ end
+ assert_nil result
+ end
+
+ def test_should_raise_assertion_error_for_unexpected_method_call
+ mock = Mock.new
+ error = assert_raise(ExpectationError) do
+ mock.unexpected_method_called(:my_method, :argument1, :argument2)
+ end
+ assert_match(/my_method/, error.message)
+ assert_match(/argument1/, error.message)
+ assert_match(/argument2/, error.message)
+ end
+
+ def test_should_indicate_unexpected_method_called
+ mock = Mock.new
+ class << mock
+ attr_accessor :symbol, :arguments
+ def unexpected_method_called(symbol, *arguments)
+ self.symbol, self.arguments = symbol, arguments
+ end
+ end
+ mock.my_method(:argument1, :argument2)
+ assert_equal :my_method, mock.symbol
+ assert_equal [:argument1, :argument2], mock.arguments
+ end
+
+ def test_should_verify_that_all_expectations_have_been_fulfilled
+ mock = Mock.new
+ mock.expects(:method1)
+ mock.expects(:method2)
+ mock.method1
+ assert_raise(ExpectationError) do
+ mock.verify
+ end
+ end
+
+ def test_should_report_possible_expectations
+ mock = Mock.new
+ mock.expects(:expected_method).with(1)
+ exception = assert_raise(ExpectationError) { mock.expected_method(2) }
+ assert_equal "#{mock.mocha_inspect}.expected_method(2) - expected calls: 0, actual calls: 1\nSimilar expectations:\n#{mock.mocha_inspect}.expected_method(1)", exception.message
+ end
+
+ def test_should_pass_block_through_to_expectations_verify_method
+ mock = Mock.new
+ expected_expectation = mock.expects(:method1)
+ mock.method1
+ expectations = []
+ mock.verify() { |expectation| expectations << expectation }
+ assert_equal [expected_expectation], expectations
+ end
+
+ def test_should_yield_supplied_parameters_to_block
+ mock = Mock.new
+ parameters_for_yield = [1, 2, 3]
+ mock.expects(:method1).yields(*parameters_for_yield)
+ yielded_parameters = nil
+ mock.method1() { |*parameters| yielded_parameters = parameters }
+ assert_equal parameters_for_yield, yielded_parameters
+ end
+
+ def test_should_set_up_multiple_expectations_with_return_values
+ mock = Mock.new
+ mock.expects(:method1 => :result1, :method2 => :result2)
+ assert_equal :result1, mock.method1
+ assert_equal :result2, mock.method2
+ end
+
+ def test_should_set_up_multiple_stubs_with_return_values
+ mock = Mock.new
+ mock.stubs(:method1 => :result1, :method2 => :result2)
+ assert_equal :result1, mock.method1
+ assert_equal :result2, mock.method2
+ end
+
+ def test_should_keep_returning_specified_value_for_stubs
+ mock = Mock.new
+ mock.stubs(:method1).returns(1)
+ assert_equal 1, mock.method1
+ assert_equal 1, mock.method1
+ end
+
+ def test_should_keep_returning_specified_value_for_expects
+ mock = Mock.new
+ mock.expects(:method1).times(2).returns(1)
+ assert_equal 1, mock.method1
+ assert_equal 1, mock.method1
+ end
+
+ def test_should_match_most_recent_call_to_expects
+ mock = Mock.new
+ mock.expects(:method1).returns(0)
+ mock.expects(:method1).returns(1)
+ assert_equal 1, mock.method1
+ end
+
+ def test_should_match_most_recent_call_to_stubs
+ mock = Mock.new
+ mock.stubs(:method1).returns(0)
+ mock.stubs(:method1).returns(1)
+ assert_equal 1, mock.method1
+ end
+
+ def test_should_match_most_recent_call_to_stubs_or_expects
+ mock = Mock.new
+ mock.stubs(:method1).returns(0)
+ mock.expects(:method1).returns(1)
+ assert_equal 1, mock.method1
+ end
+
+ def test_should_match_most_recent_call_to_expects_or_stubs
+ mock = Mock.new
+ mock.expects(:method1).returns(0)
+ mock.stubs(:method1).returns(1)
+ assert_equal 1, mock.method1
+ end
+
+ def test_should_respond_to_expected_method
+ mock = Mock.new
+ mock.expects(:method1)
+ assert_equal true, mock.respond_to?(:method1)
+ end
+
+ def test_should_not_respond_to_unexpected_method
+ mock = Mock.new
+ assert_equal false, mock.respond_to?(:method1)
+ end
+
+ def test_should_respond_to_methods_which_the_responder_does_responds_to
+ instance = Class.new do
+ define_method(:respond_to?) { |symbol| true }
+ end.new
+ mock = Mock.new
+ mock.responds_like(instance)
+ assert_equal true, mock.respond_to?(:invoked_method)
+ end
+
+ def test_should_not_respond_to_methods_which_the_responder_does_not_responds_to
+ instance = Class.new do
+ define_method(:respond_to?) { |symbol| false }
+ end.new
+ mock = Mock.new
+ mock.responds_like(instance)
+ assert_equal false, mock.respond_to?(:invoked_method)
+ end
+
+ def test_should_return_itself_to_allow_method_chaining
+ mock = Mock.new
+ assert_same mock.responds_like(Object.new), mock
+ end
+
+ def test_should_not_raise_no_method_error_if_mock_is_not_restricted_to_respond_like_a_responder
+ instance = Class.new do
+ define_method(:respond_to?) { true }
+ end.new
+ mock = Mock.new
+ mock.stubs(:invoked_method)
+ assert_nothing_raised(NoMethodError) { mock.invoked_method }
+ end
+
+ def test_should_not_raise_no_method_error_if_responder_does_respond_to_invoked_method
+ instance = Class.new do
+ define_method(:respond_to?) { |symbol| true }
+ end.new
+ mock = Mock.new
+ mock.responds_like(instance)
+ mock.stubs(:invoked_method)
+ assert_nothing_raised(NoMethodError) { mock.invoked_method }
+ end
+
+ def test_should_raise_no_method_error_if_responder_does_not_respond_to_invoked_method
+ instance = Class.new do
+ define_method(:respond_to?) { |symbol| false }
+ define_method(:mocha_inspect) { 'mocha_inspect' }
+ end.new
+ mock = Mock.new
+ mock.responds_like(instance)
+ mock.stubs(:invoked_method)
+ assert_raises(NoMethodError) { mock.invoked_method }
+ end
+
+ def test_should_raise_no_method_error_with_message_indicating_that_mock_is_constrained_to_respond_like_responder
+ instance = Class.new do
+ define_method(:respond_to?) { |symbol| false }
+ define_method(:mocha_inspect) { 'mocha_inspect' }
+ end.new
+ mock = Mock.new
+ mock.responds_like(instance)
+ mock.stubs(:invoked_method)
+ begin
+ mock.invoked_method
+ rescue NoMethodError => e
+ assert_match(/which responds like mocha_inspect/, e.message)
+ end
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/multiple_yields_test.rb b/vendor/gems/mocha-0.5.6/test/unit/multiple_yields_test.rb
new file mode 100644
index 000000000..65724a8fb
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/multiple_yields_test.rb
@@ -0,0 +1,18 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+
+require 'mocha/multiple_yields'
+
+class MultipleYieldsTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_provide_parameters_for_multiple_yields_in_single_invocation
+ parameter_group = MultipleYields.new([1, 2, 3], [4, 5])
+ parameter_groups = []
+ parameter_group.each do |parameters|
+ parameter_groups << parameters
+ end
+ assert_equal [[1, 2, 3], [4, 5]], parameter_groups
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/no_yield_test.rb b/vendor/gems/mocha-0.5.6/test/unit/no_yield_test.rb
new file mode 100644
index 000000000..544d1ef25
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/no_yield_test.rb
@@ -0,0 +1,18 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+
+require 'mocha/no_yields'
+
+class NoYieldsTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_provide_parameters_for_no_yields_in_single_invocation
+ parameter_group = NoYields.new
+ parameter_groups = []
+ parameter_group.each do |parameters|
+ parameter_groups << parameters
+ end
+ assert_equal [], parameter_groups
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/object_inspect_test.rb b/vendor/gems/mocha-0.5.6/test/unit/object_inspect_test.rb
new file mode 100644
index 000000000..56d84a96d
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/object_inspect_test.rb
@@ -0,0 +1,37 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/inspect'
+require 'method_definer'
+
+class ObjectInspectTest < Test::Unit::TestCase
+
+ def test_should_return_default_string_representation_of_object_not_including_instance_variables
+ object = Object.new
+ class << object
+ attr_accessor :attribute
+ end
+ object.attribute = 'instance_variable'
+ assert_match Regexp.new("^#$"), object.mocha_inspect
+ assert_no_match(/instance_variable/, object.mocha_inspect)
+ end
+
+ def test_should_return_customized_string_representation_of_object
+ object = Object.new
+ class << object
+ define_method(:inspect) { 'custom_inspect' }
+ end
+ assert_equal 'custom_inspect', object.mocha_inspect
+ end
+
+ def test_should_use_underscored_id_instead_of_object_id_or_id_so_that_they_can_be_stubbed
+ object = Object.new
+ object.define_instance_accessor(:called)
+ object.called = false
+ object.replace_instance_method(:object_id) { self.called = true; 1 }
+ if RUBY_VERSION < '1.9'
+ object.replace_instance_method(:id) { self.called = true; 1 }
+ end
+ object.mocha_inspect
+ assert_equal false, object.called
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/object_test.rb b/vendor/gems/mocha-0.5.6/test/unit/object_test.rb
new file mode 100644
index 000000000..660b7d24f
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/object_test.rb
@@ -0,0 +1,165 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/mock'
+require 'method_definer'
+
+require 'mocha/object'
+
+class ObjectTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_build_mocha
+ instance = Object.new
+ mocha = instance.mocha
+ assert_not_nil mocha
+ assert mocha.is_a?(Mock)
+ end
+
+ def test_should_reuse_existing_mocha
+ instance = Object.new
+ mocha_1 = instance.mocha
+ mocha_2 = instance.mocha
+ assert_equal mocha_1, mocha_2
+ end
+
+ def test_should_reset_mocha
+ instance = Object.new
+ assert_nil instance.reset_mocha
+ end
+
+ def test_should_stub_instance_method
+ instance = Object.new
+ $stubba = Mock.new
+ $stubba.expects(:stub).with(Mocha::InstanceMethod.new(instance, :method1))
+ instance.expects(:method1)
+ $stubba.verify
+ end
+
+ def test_should_build_and_store_expectation
+ instance = Object.new
+ $stubba = Mock.new
+ $stubba.stubs(:stub)
+ expectation = instance.expects(:method1)
+ assert_equal [expectation], instance.mocha.expectations.to_a
+ end
+
+ def test_should_verify_expectations
+ instance = Object.new
+ $stubba = Mock.new
+ $stubba.stubs(:stub)
+ instance.expects(:method1).with(:value1, :value2)
+ assert_raise(ExpectationError) { instance.verify }
+ end
+
+ def test_should_pass_backtrace_into_expects
+ instance = Object.new
+ $stubba = Mock.new
+ $stubba.stubs(:stub)
+ mocha = Object.new
+ mocha.define_instance_accessor(:expects_parameters)
+ mocha.define_instance_method(:expects) { |*parameters| self.expects_parameters = parameters }
+ backtrace = Object.new
+ instance.define_instance_method(:mocha) { mocha }
+ instance.define_instance_method(:caller) { backtrace }
+ instance.expects(:method1)
+ assert_equal [:method1, backtrace], mocha.expects_parameters
+ end
+
+ def test_should_pass_backtrace_into_stubs
+ instance = Object.new
+ $stubba = Mock.new
+ $stubba.stubs(:stub)
+ mocha = Object.new
+ mocha.define_instance_accessor(:stubs_parameters)
+ mocha.define_instance_method(:stubs) { |*parameters| self.stubs_parameters = parameters }
+ backtrace = Object.new
+ instance.define_instance_method(:mocha) { mocha }
+ instance.define_instance_method(:caller) { backtrace }
+ instance.stubs(:method1)
+ assert_equal [:method1, backtrace], mocha.stubs_parameters
+ end
+
+ def test_should_build_any_instance_object
+ klass = Class.new
+ any_instance = klass.any_instance
+ assert_not_nil any_instance
+ assert any_instance.is_a?(Class::AnyInstance)
+ end
+
+ def test_should_return_same_any_instance_object
+ klass = Class.new
+ any_instance_1 = klass.any_instance
+ any_instance_2 = klass.any_instance
+ assert_equal any_instance_1, any_instance_2
+ end
+
+ def test_should_stub_class_method
+ klass = Class.new
+ $stubba = Mock.new
+ $stubba.expects(:stub).with(Mocha::ClassMethod.new(klass, :method1))
+ klass.expects(:method1)
+ $stubba.verify
+ end
+
+ def test_should_build_and_store_class_method_expectation
+ klass = Class.new
+ $stubba = Mock.new
+ $stubba.stubs(:stub)
+ expectation = klass.expects(:method1)
+ assert_equal [expectation], klass.mocha.expectations.to_a
+ end
+
+ def test_should_stub_module_method
+ mod = Module.new
+ $stubba = Mock.new
+ $stubba.expects(:stub).with(Mocha::ClassMethod.new(mod, :method1))
+ mod.expects(:method1)
+ $stubba.verify
+ end
+
+ def test_should_build_and_store_module_method_expectation
+ mod = Module.new
+ $stubba = Mock.new
+ $stubba.stubs(:stub)
+ expectation = mod.expects(:method1)
+ assert_equal [expectation], mod.mocha.expectations.to_a
+ end
+
+ def test_should_use_stubba_instance_method_for_object
+ assert_equal Mocha::InstanceMethod, Object.new.stubba_method
+ end
+
+ def test_should_use_stubba_class_method_for_module
+ assert_equal Mocha::ClassMethod, Module.new.stubba_method
+ end
+
+ def test_should_use_stubba_class_method_for_class
+ assert_equal Mocha::ClassMethod, Class.new.stubba_method
+ end
+
+ def test_should_use_stubba_class_method_for_any_instance
+ assert_equal Mocha::AnyInstanceMethod, Class::AnyInstance.new(nil).stubba_method
+ end
+
+ def test_should_stub_self_for_object
+ object = Object.new
+ assert_equal object, object.stubba_object
+ end
+
+ def test_should_stub_self_for_module
+ mod = Module.new
+ assert_equal mod, mod.stubba_object
+ end
+
+ def test_should_stub_self_for_class
+ klass = Class.new
+ assert_equal klass, klass.stubba_object
+ end
+
+ def test_should_stub_relevant_class_for_any_instance
+ klass = Class.new
+ any_instance = Class::AnyInstance.new(klass)
+ assert_equal klass, any_instance.stubba_object
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._all_of_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._all_of_test.rb
new file mode 100644
index 000000000..8494bfb37
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._all_of_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._any_of_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._any_of_test.rb
new file mode 100644
index 000000000..41d4c70da
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._any_of_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._anything_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._anything_test.rb
new file mode 100644
index 000000000..bbb511c34
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._anything_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_entries_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_entries_test.rb
new file mode 100644
index 000000000..d519eaa00
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_entries_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_entry_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_entry_test.rb
new file mode 100644
index 000000000..e38bb38b7
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_entry_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_key_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_key_test.rb
new file mode 100644
index 000000000..72858bd13
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_key_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_value_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_value_test.rb
new file mode 100644
index 000000000..85a2e1c06
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._has_value_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._includes_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._includes_test.rb
new file mode 100644
index 000000000..ca7d6d9ca
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._includes_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._instance_of_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._instance_of_test.rb
new file mode 100644
index 000000000..14618a7f4
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._instance_of_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._is_a_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._is_a_test.rb
new file mode 100644
index 000000000..51949f3fb
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._is_a_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._kind_of_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._kind_of_test.rb
new file mode 100644
index 000000000..773437881
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._kind_of_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._not_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._not_test.rb
new file mode 100644
index 000000000..d892eabbe
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._not_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._regexp_matches_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._regexp_matches_test.rb
new file mode 100644
index 000000000..2ceba479a
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._regexp_matches_test.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._stub_matcher.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._stub_matcher.rb
new file mode 100644
index 000000000..bc56613bf
Binary files /dev/null and b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/._stub_matcher.rb differ
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/all_of_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/all_of_test.rb
new file mode 100644
index 000000000..14028f52e
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/all_of_test.rb
@@ -0,0 +1,26 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/all_of'
+require 'mocha/inspect'
+require 'stub_matcher'
+
+class AllOfTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_if_all_matchers_match
+ matcher = all_of(Stub::Matcher.new(true), Stub::Matcher.new(true), Stub::Matcher.new(true))
+ assert matcher.matches?(['any_old_value'])
+ end
+
+ def test_should_not_match_if_any_matcher_does_not_match
+ matcher = all_of(Stub::Matcher.new(true), Stub::Matcher.new(false), Stub::Matcher.new(true))
+ assert !matcher.matches?(['any_old_value'])
+ end
+
+ def test_should_describe_matcher
+ matcher = all_of(Stub::Matcher.new(true), Stub::Matcher.new(false), Stub::Matcher.new(true))
+ assert_equal 'all_of(matcher(true), matcher(false), matcher(true))', matcher.mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/any_of_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/any_of_test.rb
new file mode 100644
index 000000000..503d6dc9d
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/any_of_test.rb
@@ -0,0 +1,26 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/any_of'
+require 'mocha/inspect'
+require 'stub_matcher'
+
+class AnyOfTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_if_any_matchers_match
+ matcher = any_of(Stub::Matcher.new(false), Stub::Matcher.new(true), Stub::Matcher.new(false))
+ assert matcher.matches?(['any_old_value'])
+ end
+
+ def test_should_not_match_if_no_matchers_match
+ matcher = any_of(Stub::Matcher.new(false), Stub::Matcher.new(false), Stub::Matcher.new(false))
+ assert !matcher.matches?(['any_old_value'])
+ end
+
+ def test_should_describe_matcher
+ matcher = any_of(Stub::Matcher.new(false), Stub::Matcher.new(true), Stub::Matcher.new(false))
+ assert_equal 'any_of(matcher(false), matcher(true), matcher(false))', matcher.mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/anything_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/anything_test.rb
new file mode 100644
index 000000000..42a88a16a
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/anything_test.rb
@@ -0,0 +1,21 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/anything'
+require 'mocha/inspect'
+
+class AnythingTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_anything
+ matcher = anything
+ assert matcher.matches?([:something])
+ assert matcher.matches?([{'x' => 'y'}])
+ end
+
+ def test_should_describe_matcher
+ matcher = anything
+ assert_equal "anything", matcher.mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_entries_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_entries_test.rb
new file mode 100644
index 000000000..cb85265f8
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_entries_test.rb
@@ -0,0 +1,30 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/has_entries'
+require 'mocha/inspect'
+
+class HasEntriesTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_hash_including_specified_entries
+ matcher = has_entries(:key_1 => 'value_1', :key_2 => 'value_2')
+ assert matcher.matches?([{ :key_1 => 'value_1', :key_2 => 'value_2', :key_3 => 'value_3' }])
+ end
+
+ def test_should_not_match_hash_not_including_specified_entries
+ matcher = has_entries(:key_1 => 'value_2', :key_2 => 'value_2', :key_3 => 'value_3')
+ assert !matcher.matches?([{ :key_1 => 'value_1', :key_2 => 'value_2' }])
+ end
+
+ def test_should_describe_matcher
+ matcher = has_entries(:key_1 => 'value_1', :key_2 => 'value_2')
+ description = matcher.mocha_inspect
+ matches = /has_entries\((.*)\)/.match(description)
+ assert_not_nil matches[0]
+ entries = eval(matches[1])
+ assert_equal 'value_1', entries[:key_1]
+ assert_equal 'value_2', entries[:key_2]
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_entry_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_entry_test.rb
new file mode 100644
index 000000000..3717b33b0
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_entry_test.rb
@@ -0,0 +1,40 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/has_entry'
+require 'mocha/inspect'
+
+class HasEntryTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_hash_including_specified_key_value_pair
+ matcher = has_entry(:key_1, 'value_1')
+ assert matcher.matches?([{ :key_1 => 'value_1', :key_2 => 'value_2' }])
+ end
+
+ def test_should_not_match_hash_not_including_specified_key_value_pair
+ matcher = has_entry(:key_1, 'value_2')
+ assert !matcher.matches?([{ :key_1 => 'value_1', :key_2 => 'value_2' }])
+ end
+
+ def test_should_match_hash_including_specified_entry
+ matcher = has_entry(:key_1 => 'value_1')
+ assert matcher.matches?([{ :key_1 => 'value_1', :key_2 => 'value_2' }])
+ end
+
+ def test_should_not_match_hash_not_including_specified_entry
+ matcher = has_entry(:key_1 => 'value_2')
+ assert !matcher.matches?([{ :key_1 => 'value_1', :key_2 => 'value_2' }])
+ end
+
+ def test_should_describe_matcher_with_key_value_pair
+ matcher = has_entry(:key_1, 'value_1')
+ assert_equal "has_entry(:key_1, 'value_1')", matcher.mocha_inspect
+ end
+
+ def test_should_describe_matcher_with_entry
+ matcher = has_entry(:key_1 => 'value_1')
+ assert_equal "has_entry(:key_1, 'value_1')", matcher.mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_key_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_key_test.rb
new file mode 100644
index 000000000..bc9f5065d
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_key_test.rb
@@ -0,0 +1,25 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/has_key'
+require 'mocha/inspect'
+
+class HasKeyTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_hash_including_specified_key
+ matcher = has_key(:key_1)
+ assert matcher.matches?([{ :key_1 => 1, :key_2 => 2 }])
+ end
+
+ def test_should_not_match_hash_not_including_specified_key
+ matcher = has_key(:key_1)
+ assert !matcher.matches?([{ :key_2 => 2 }])
+ end
+
+ def test_should_describe_matcher
+ matcher = has_key(:key)
+ assert_equal 'has_key(:key)', matcher.mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_value_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_value_test.rb
new file mode 100644
index 000000000..6c8957fd0
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/has_value_test.rb
@@ -0,0 +1,25 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/has_value'
+require 'mocha/inspect'
+
+class HasValueTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_hash_including_specified_value
+ matcher = has_value('value_1')
+ assert matcher.matches?([{ :key_1 => 'value_1', :key_2 => 'value_2' }])
+ end
+
+ def test_should_not_match_hash_not_including_specified_value
+ matcher = has_value('value_1')
+ assert !matcher.matches?([{ :key_2 => 'value_2' }])
+ end
+
+ def test_should_describe_matcher
+ matcher = has_value('value_1')
+ assert_equal "has_value('value_1')", matcher.mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/includes_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/includes_test.rb
new file mode 100644
index 000000000..70fb649d2
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/includes_test.rb
@@ -0,0 +1,25 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/includes'
+require 'mocha/inspect'
+
+class IncludesTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_object_including_value
+ matcher = includes(:x)
+ assert matcher.matches?([[:x, :y, :z]])
+ end
+
+ def test_should_not_match_object_that_does_not_include_value
+ matcher = includes(:not_included)
+ assert !matcher.matches?([[:x, :y, :z]])
+ end
+
+ def test_should_describe_matcher
+ matcher = includes(:x)
+ assert_equal "includes(:x)", matcher.mocha_inspect
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/instance_of_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/instance_of_test.rb
new file mode 100644
index 000000000..415b79a48
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/instance_of_test.rb
@@ -0,0 +1,25 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/instance_of'
+require 'mocha/inspect'
+
+class InstanceOfTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_object_that_is_an_instance_of_specified_class
+ matcher = instance_of(String)
+ assert matcher.matches?(['string'])
+ end
+
+ def test_should_not_match_object_that_is_not_an_instance_of_specified_class
+ matcher = instance_of(String)
+ assert !matcher.matches?([99])
+ end
+
+ def test_should_describe_matcher
+ matcher = instance_of(String)
+ assert_equal "instance_of(String)", matcher.mocha_inspect
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/is_a_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/is_a_test.rb
new file mode 100644
index 000000000..c9ef91965
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/is_a_test.rb
@@ -0,0 +1,25 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/is_a'
+require 'mocha/inspect'
+
+class IsATest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_object_that_is_a_specified_class
+ matcher = is_a(Integer)
+ assert matcher.matches?([99])
+ end
+
+ def test_should_not_match_object_that_is_not_a_specified_class
+ matcher = is_a(Integer)
+ assert !matcher.matches?(['string'])
+ end
+
+ def test_should_describe_matcher
+ matcher = is_a(Integer)
+ assert_equal "is_a(Integer)", matcher.mocha_inspect
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/kind_of_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/kind_of_test.rb
new file mode 100644
index 000000000..1167e5c9e
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/kind_of_test.rb
@@ -0,0 +1,25 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/kind_of'
+require 'mocha/inspect'
+
+class KindOfTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_object_that_is_a_kind_of_specified_class
+ matcher = kind_of(Integer)
+ assert matcher.matches?([99])
+ end
+
+ def test_should_not_match_object_that_is_not_a_kind_of_specified_class
+ matcher = kind_of(Integer)
+ assert !matcher.matches?(['string'])
+ end
+
+ def test_should_describe_matcher
+ matcher = kind_of(Integer)
+ assert_equal "kind_of(Integer)", matcher.mocha_inspect
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/not_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/not_test.rb
new file mode 100644
index 000000000..4cb6790a9
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/not_test.rb
@@ -0,0 +1,26 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/not'
+require 'mocha/inspect'
+require 'stub_matcher'
+
+class NotTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_if_matcher_does_not_match
+ matcher = Not(Stub::Matcher.new(false))
+ assert matcher.matches?(['any_old_value'])
+ end
+
+ def test_should_not_match_if_matcher_does_match
+ matcher = Not(Stub::Matcher.new(true))
+ assert !matcher.matches?(['any_old_value'])
+ end
+
+ def test_should_describe_matcher
+ matcher = Not(Stub::Matcher.new(true))
+ assert_equal 'Not(matcher(true))', matcher.mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/regexp_matches_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/regexp_matches_test.rb
new file mode 100644
index 000000000..a8294bfe0
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/regexp_matches_test.rb
@@ -0,0 +1,25 @@
+require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
+
+require 'mocha/parameter_matchers/regexp_matches'
+require 'mocha/inspect'
+
+class MatchesTest < Test::Unit::TestCase
+
+ include Mocha::ParameterMatchers
+
+ def test_should_match_parameter_matching_regular_expression
+ matcher = regexp_matches(/oo/)
+ assert matcher.matches?(['foo'])
+ end
+
+ def test_should_not_match_parameter_not_matching_regular_expression
+ matcher = regexp_matches(/oo/)
+ assert !matcher.matches?(['bar'])
+ end
+
+ def test_should_describe_matcher
+ matcher = regexp_matches(/oo/)
+ assert_equal "regexp_matches(/oo/)", matcher.mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/stub_matcher.rb b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/stub_matcher.rb
new file mode 100644
index 000000000..920ced23b
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameter_matchers/stub_matcher.rb
@@ -0,0 +1,23 @@
+module Stub
+
+ class Matcher
+
+ attr_accessor :value
+
+ def initialize(matches)
+ @matches = matches
+ end
+
+ def matches?(available_parameters)
+ value = available_parameters.shift
+ @value = value
+ @matches
+ end
+
+ def mocha_inspect
+ "matcher(#{@matches})"
+ end
+
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/parameters_matcher_test.rb b/vendor/gems/mocha-0.5.6/test/unit/parameters_matcher_test.rb
new file mode 100644
index 000000000..612805e45
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/parameters_matcher_test.rb
@@ -0,0 +1,121 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/parameters_matcher'
+
+class ParametersMatcherTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_match_any_actual_parameters_if_no_expected_parameters_specified
+ parameters_matcher = ParametersMatcher.new
+ assert parameters_matcher.match?(actual_parameters = [1, 2, 3])
+ end
+
+ def test_should_match_if_actual_parameters_are_same_as_expected_parameters
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5, 6])
+ assert parameters_matcher.match?(actual_parameters = [4, 5, 6])
+ end
+
+ def test_should_not_match_if_actual_parameters_are_different_from_expected_parameters
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5, 6])
+ assert !parameters_matcher.match?(actual_parameters = [1, 2, 3])
+ end
+
+ def test_should_not_match_if_there_are_less_actual_parameters_than_expected_parameters
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5, 6])
+ assert !parameters_matcher.match?(actual_parameters = [4, 5])
+ end
+
+ def test_should_not_match_if_there_are_more_actual_parameters_than_expected_parameters
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5])
+ assert !parameters_matcher.match?(actual_parameters = [4, 5, 6])
+ end
+
+ def test_should_not_match_if_not_all_required_parameters_are_supplied
+ optionals = ParameterMatchers::Optionally.new(6, 7)
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5, optionals])
+ assert !parameters_matcher.match?(actual_parameters = [4])
+ end
+
+ def test_should_match_if_all_required_parameters_match_and_no_optional_parameters_are_supplied
+ optionals = ParameterMatchers::Optionally.new(6, 7)
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5, optionals])
+ assert parameters_matcher.match?(actual_parameters = [4, 5])
+ end
+
+ def test_should_match_if_all_required_and_optional_parameters_match_and_some_optional_parameters_are_supplied
+ optionals = ParameterMatchers::Optionally.new(6, 7)
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5, optionals])
+ assert parameters_matcher.match?(actual_parameters = [4, 5, 6])
+ end
+
+ def test_should_match_if_all_required_and_optional_parameters_match_and_all_optional_parameters_are_supplied
+ optionals = ParameterMatchers::Optionally.new(6, 7)
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5, optionals])
+ assert parameters_matcher.match?(actual_parameters = [4, 5, 6, 7])
+ end
+
+ def test_should_not_match_if_all_required_and_optional_parameters_match_but_too_many_optional_parameters_are_supplied
+ optionals = ParameterMatchers::Optionally.new(6, 7)
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5, optionals])
+ assert !parameters_matcher.match?(actual_parameters = [4, 5, 6, 7, 8])
+ end
+
+ def test_should_not_match_if_all_required_parameters_match_but_some_optional_parameters_do_not_match
+ optionals = ParameterMatchers::Optionally.new(6, 7)
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5, optionals])
+ assert !parameters_matcher.match?(actual_parameters = [4, 5, 6, 0])
+ end
+
+ def test_should_not_match_if_some_required_parameters_do_not_match_although_all_optional_parameters_do_match
+ optionals = ParameterMatchers::Optionally.new(6, 7)
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5, optionals])
+ assert !parameters_matcher.match?(actual_parameters = [4, 0, 6])
+ end
+
+ def test_should_not_match_if_all_required_parameters_match_but_no_optional_parameters_match
+ optionals = ParameterMatchers::Optionally.new(6, 7)
+ parameters_matcher = ParametersMatcher.new(expected_parameters = [4, 5, optionals])
+ assert !parameters_matcher.match?(actual_parameters = [4, 5, 0, 0])
+ end
+
+ def test_should_match_if_actual_parameters_satisfy_matching_block
+ parameters_matcher = ParametersMatcher.new { |x, y| x + y == 3 }
+ assert parameters_matcher.match?(actual_parameters = [1, 2])
+ end
+
+ def test_should_not_match_if_actual_parameters_do_not_satisfy_matching_block
+ parameters_matcher = ParametersMatcher.new { |x, y| x + y == 3 }
+ assert !parameters_matcher.match?(actual_parameters = [2, 3])
+ end
+
+ def test_should_remove_outer_array_braces
+ params = [1, 2, [3, 4]]
+ parameters_matcher = ParametersMatcher.new(params)
+ assert_equal '(1, 2, [3, 4])', parameters_matcher.mocha_inspect
+ end
+
+ def test_should_display_numeric_arguments_as_is
+ params = [1, 2, 3]
+ parameters_matcher = ParametersMatcher.new(params)
+ assert_equal '(1, 2, 3)', parameters_matcher.mocha_inspect
+ end
+
+ def test_should_remove_curly_braces_if_hash_is_only_argument
+ params = [{:a => 1, :z => 2}]
+ parameters_matcher = ParametersMatcher.new(params)
+ assert_nil parameters_matcher.mocha_inspect.index('{')
+ assert_nil parameters_matcher.mocha_inspect.index('}')
+ end
+
+ def test_should_not_remove_curly_braces_if_hash_is_not_the_only_argument
+ params = [1, {:a => 1}]
+ parameters_matcher = ParametersMatcher.new(params)
+ assert_equal '(1, {:a => 1})', parameters_matcher.mocha_inspect
+ end
+
+ def test_should_indicate_that_matcher_will_match_any_actual_parameters
+ parameters_matcher = ParametersMatcher.new
+ assert_equal '(any_parameters)', parameters_matcher.mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/return_values_test.rb b/vendor/gems/mocha-0.5.6/test/unit/return_values_test.rb
new file mode 100644
index 000000000..01ddfbcd5
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/return_values_test.rb
@@ -0,0 +1,63 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+
+require 'mocha/return_values'
+
+class ReturnValuesTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_return_nil
+ values = ReturnValues.new
+ assert_nil values.next
+ end
+
+ def test_should_keep_returning_nil
+ values = ReturnValues.new
+ values.next
+ assert_nil values.next
+ assert_nil values.next
+ end
+
+ def test_should_return_evaluated_single_return_value
+ values = ReturnValues.new(SingleReturnValue.new('value'))
+ assert_equal 'value', values.next
+ end
+
+ def test_should_keep_returning_evaluated_single_return_value
+ values = ReturnValues.new(SingleReturnValue.new('value'))
+ values.next
+ assert_equal 'value', values.next
+ assert_equal 'value', values.next
+ end
+
+ def test_should_return_consecutive_evaluated_single_return_values
+ values = ReturnValues.new(SingleReturnValue.new('value_1'), SingleReturnValue.new('value_2'))
+ assert_equal 'value_1', values.next
+ assert_equal 'value_2', values.next
+ end
+
+ def test_should_keep_returning_last_of_consecutive_evaluated_single_return_values
+ values = ReturnValues.new(SingleReturnValue.new('value_1'), SingleReturnValue.new('value_2'))
+ values.next
+ values.next
+ assert_equal 'value_2', values.next
+ assert_equal 'value_2', values.next
+ end
+
+ def test_should_build_single_return_values_for_each_values
+ values = ReturnValues.build('value_1', 'value_2', 'value_3').values
+ assert_equal 'value_1', values[0].evaluate
+ assert_equal 'value_2', values[1].evaluate
+ assert_equal 'value_3', values[2].evaluate
+ end
+
+ def test_should_combine_two_sets_of_return_values
+ values_1 = ReturnValues.build('value_1')
+ values_2 = ReturnValues.build('value_2a', 'value_2b')
+ values = (values_1 + values_2).values
+ assert_equal 'value_1', values[0].evaluate
+ assert_equal 'value_2a', values[1].evaluate
+ assert_equal 'value_2b', values[2].evaluate
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/sequence_test.rb b/vendor/gems/mocha-0.5.6/test/unit/sequence_test.rb
new file mode 100644
index 000000000..544b3fe9c
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/sequence_test.rb
@@ -0,0 +1,104 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/sequence'
+require 'mocha/expectation'
+
+class SequenceTest < Test::Unit::TestCase
+
+ include Mocha
+
+ class FakeExpectation
+
+ attr_reader :ordering_constraints
+
+ def initialize(satisfied = false)
+ @satisfied = satisfied
+ @ordering_constraints = []
+ end
+
+ def add_ordering_constraint(ordering_constraint)
+ @ordering_constraints << ordering_constraint
+ end
+
+ def satisfied?
+ @satisfied
+ end
+
+ end
+
+ def test_should_be_satisfied_if_no_expectations_added
+ sequence = Sequence.new('name')
+ assert sequence.satisfied_to_index?(0)
+ end
+
+ def test_should_be_satisfied_if_one_unsatisfied_expectations_added_but_it_is_not_included_by_index
+ sequence = Sequence.new('name')
+ expectation = FakeExpectation.new(satisfied = false)
+ sequence.constrain_as_next_in_sequence(expectation)
+ assert sequence.satisfied_to_index?(0)
+ end
+
+ def test_should_not_be_satisfied_if_one_unsatisfied_expectations_added_and_it_is_included_by_index
+ sequence = Sequence.new('name')
+ expectation = FakeExpectation.new(satisfied = false)
+ sequence.constrain_as_next_in_sequence(expectation)
+ assert !sequence.satisfied_to_index?(1)
+ end
+
+ def test_should_be_satisfied_if_one_satisfied_expectations_added_and_it_is_included_by_index
+ sequence = Sequence.new('name')
+ expectation = FakeExpectation.new(satisfied = true)
+ sequence.constrain_as_next_in_sequence(expectation)
+ assert sequence.satisfied_to_index?(1)
+ end
+
+ def test_should_not_be_satisfied_if_one_satisfied_and_one_unsatisfied_expectation_added_and_both_are_included_by_index
+ sequence = Sequence.new('name')
+ expectation_one = FakeExpectation.new(satisfied = true)
+ expectation_two = FakeExpectation.new(satisfied = false)
+ sequence.constrain_as_next_in_sequence(expectation_one)
+ sequence.constrain_as_next_in_sequence(expectation_two)
+ assert !sequence.satisfied_to_index?(2)
+ end
+
+ def test_should_be_satisfied_if_two_satisfied_expectations_added_and_both_are_included_by_index
+ sequence = Sequence.new('name')
+ expectation_one = FakeExpectation.new(satisfied = true)
+ expectation_two = FakeExpectation.new(satisfied = true)
+ sequence.constrain_as_next_in_sequence(expectation_one)
+ sequence.constrain_as_next_in_sequence(expectation_two)
+ assert sequence.satisfied_to_index?(2)
+ end
+
+ def test_should_add_ordering_constraint_to_expectation
+ sequence = Sequence.new('name')
+ expectation = FakeExpectation.new
+ sequence.constrain_as_next_in_sequence(expectation)
+ assert_equal 1, expectation.ordering_constraints.length
+ end
+
+ def test_should_not_allow_invocation_of_second_method_when_first_n_sequence_has_not_been_invoked
+ sequence = Sequence.new('name')
+ expectation_one = FakeExpectation.new(satisfied = false)
+ expectation_two = FakeExpectation.new(satisfied = false)
+ sequence.constrain_as_next_in_sequence(expectation_one)
+ sequence.constrain_as_next_in_sequence(expectation_two)
+ assert !expectation_two.ordering_constraints[0].allows_invocation_now?
+ end
+
+ def test_should_allow_invocation_of_second_method_when_first_in_sequence_has_been_invoked
+ sequence = Sequence.new('name')
+ expectation_one = FakeExpectation.new(satisfied = true)
+ expectation_two = FakeExpectation.new(satisfied = false)
+ sequence.constrain_as_next_in_sequence(expectation_one)
+ sequence.constrain_as_next_in_sequence(expectation_two)
+ assert expectation_two.ordering_constraints[0].allows_invocation_now?
+ end
+
+ def test_should_describe_ordering_constraint_as_being_part_of_named_sequence
+ sequence = Sequence.new('wibble')
+ expectation = FakeExpectation.new
+ sequence.constrain_as_next_in_sequence(expectation)
+ assert_equal "in sequence 'wibble'", expectation.ordering_constraints[0].mocha_inspect
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/setup_and_teardown_test.rb b/vendor/gems/mocha-0.5.6/test/unit/setup_and_teardown_test.rb
new file mode 100644
index 000000000..83247888e
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/setup_and_teardown_test.rb
@@ -0,0 +1,76 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/mock'
+
+require 'mocha/setup_and_teardown'
+
+class SetupAndTeardownTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_instantiate_new_stubba
+ test_case = stubbed_test_case_class.new
+ test_case.setup_stubs
+
+ assert $stubba
+ assert $stubba.is_a?(Mocha::Central)
+ end
+
+ def test_should_verify_all_expectations
+ test_case = stubbed_test_case_class.new
+ stubba = Mock.new
+ stubba.expects(:verify_all)
+ $stubba = stubba
+
+ test_case.verify_stubs
+
+ stubba.verify
+ end
+
+ def test_should_yield_to_block_for_each_assertion
+ test_case = stubbed_test_case_class.new
+ $stubba = Mock.new
+ $stubba.stubs(:verify_all).yields
+ yielded = false
+
+ test_case.verify_stubs { yielded = true }
+
+ assert_equal true, yielded
+ end
+
+ def test_should_unstub_all_stubbed_methods
+ test_case = stubbed_test_case_class.new
+ stubba = Mock.new
+ stubba.expects(:unstub_all)
+ $stubba = stubba
+
+ test_case.teardown_stubs
+
+ stubba.verify
+ end
+
+ def test_should_set_stubba_to_nil
+ test_case = stubbed_test_case_class.new
+ $stubba = Mock.new
+ $stubba.stubs(:unstub_all)
+
+ test_case.teardown_stubs
+
+ assert_nil $stubba
+ end
+
+ def test_should_not_raise_exception_if_no_stubba_central_available
+ test_case = stubbed_test_case_class.new
+ $stubba = nil
+ assert_nothing_raised { test_case.teardown_stubs }
+ end
+
+ private
+
+ def stubbed_test_case_class
+ Class.new do
+ include Mocha::SetupAndTeardown
+ end
+ end
+
+end
+
diff --git a/vendor/gems/mocha-0.5.6/test/unit/single_return_value_test.rb b/vendor/gems/mocha-0.5.6/test/unit/single_return_value_test.rb
new file mode 100644
index 000000000..9d3d799b0
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/single_return_value_test.rb
@@ -0,0 +1,33 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+
+require 'mocha/single_return_value'
+require 'deprecation_disabler'
+
+class SingleReturnValueTest < Test::Unit::TestCase
+
+ include Mocha
+ include DeprecationDisabler
+
+ def test_should_return_value
+ value = SingleReturnValue.new('value')
+ assert_equal 'value', value.evaluate
+ end
+
+ def test_should_return_result_of_calling_proc
+ proc = lambda { 'value' }
+ value = SingleReturnValue.new(proc)
+ result = nil
+ disable_deprecations { result = value.evaluate }
+ assert_equal 'value', result
+ end
+
+ def test_should_indicate_deprecated_use_of_expectation_returns_method
+ proc = lambda {}
+ value = SingleReturnValue.new(proc)
+ Deprecation.messages = []
+ disable_deprecations { value.evaluate }
+ expected_message = "use of Expectation#returns with instance of Proc - see Expectation#returns RDoc for alternatives"
+ assert_equal [expected_message], Deprecation.messages
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/single_yield_test.rb b/vendor/gems/mocha-0.5.6/test/unit/single_yield_test.rb
new file mode 100644
index 000000000..12bd0a2fd
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/single_yield_test.rb
@@ -0,0 +1,18 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+
+require 'mocha/single_yield'
+
+class SingleYieldTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_provide_parameters_for_single_yield_in_single_invocation
+ parameter_group = SingleYield.new(1, 2, 3)
+ parameter_groups = []
+ parameter_group.each do |parameters|
+ parameter_groups << parameters
+ end
+ assert_equal [[1, 2, 3]], parameter_groups
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/string_inspect_test.rb b/vendor/gems/mocha-0.5.6/test/unit/string_inspect_test.rb
new file mode 100644
index 000000000..43b9c4e32
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/string_inspect_test.rb
@@ -0,0 +1,11 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/inspect'
+
+class StringInspectTest < Test::Unit::TestCase
+
+ def test_should_replace_escaped_quotes_with_single_quote
+ string = "my_string"
+ assert_equal "'my_string'", string.mocha_inspect
+ end
+
+end
diff --git a/vendor/gems/mocha-0.5.6/test/unit/stub_test.rb b/vendor/gems/mocha-0.5.6/test/unit/stub_test.rb
new file mode 100644
index 000000000..a225963b9
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/stub_test.rb
@@ -0,0 +1,24 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+require 'mocha/stub'
+
+class StubTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_always_verify_successfully
+ stub = Stub.new(nil, :expected_method)
+ assert stub.verify
+ stub.invoke
+ assert stub.verify
+ end
+
+ def test_should_match_successfully_for_any_number_of_invocations
+ stub = Stub.new(nil, :expected_method)
+ assert stub.match?(:expected_method)
+ stub.invoke
+ assert stub.match?(:expected_method)
+ stub.invoke
+ assert stub.match?(:expected_method)
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/mocha-0.5.6/test/unit/yield_parameters_test.rb b/vendor/gems/mocha-0.5.6/test/unit/yield_parameters_test.rb
new file mode 100644
index 000000000..4e93f1336
--- /dev/null
+++ b/vendor/gems/mocha-0.5.6/test/unit/yield_parameters_test.rb
@@ -0,0 +1,93 @@
+require File.join(File.dirname(__FILE__), "..", "test_helper")
+
+require 'mocha/yield_parameters'
+require 'mocha/no_yields'
+require 'mocha/single_yield'
+require 'mocha/multiple_yields'
+
+class YieldParametersTest < Test::Unit::TestCase
+
+ include Mocha
+
+ def test_should_return_null_yield_parameter_group_by_default
+ yield_parameters = YieldParameters.new
+ assert yield_parameters.next_invocation.is_a?(NoYields)
+ end
+
+ def test_should_return_single_yield_parameter_group
+ yield_parameters = YieldParameters.new
+ yield_parameters.add(1, 2, 3)
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(SingleYield)
+ assert_equal [1, 2, 3], parameter_group.parameters
+ end
+
+ def test_should_keep_returning_single_yield_parameter_group
+ yield_parameters = YieldParameters.new
+ yield_parameters.add(1, 2, 3)
+ yield_parameters.next_invocation
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(SingleYield)
+ assert_equal [1, 2, 3], parameter_group.parameters
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(SingleYield)
+ assert_equal [1, 2, 3], parameter_group.parameters
+ end
+
+ def test_should_return_consecutive_single_yield_parameter_groups
+ yield_parameters = YieldParameters.new
+ yield_parameters.add(1, 2, 3)
+ yield_parameters.add(4, 5)
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(SingleYield)
+ assert_equal [1, 2, 3], parameter_group.parameters
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(SingleYield)
+ assert_equal [4, 5], parameter_group.parameters
+ end
+
+ def test_should_return_multiple_yield_parameter_group
+ yield_parameters = YieldParameters.new
+ yield_parameters.multiple_add([1, 2, 3], [4, 5])
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(MultipleYields)
+ assert_equal [[1, 2, 3], [4, 5]], parameter_group.parameter_groups
+ end
+
+ def test_should_keep_returning_multiple_yield_parameter_group
+ yield_parameters = YieldParameters.new
+ yield_parameters.multiple_add([1, 2, 3], [4, 5])
+ yield_parameters.next_invocation
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(MultipleYields)
+ assert_equal [[1, 2, 3], [4, 5]], parameter_group.parameter_groups
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(MultipleYields)
+ assert_equal [[1, 2, 3], [4, 5]], parameter_group.parameter_groups
+ end
+
+ def test_should_return_consecutive_multiple_yield_parameter_groups
+ yield_parameters = YieldParameters.new
+ yield_parameters.multiple_add([1, 2, 3], [4, 5])
+ yield_parameters.multiple_add([6, 7], [8, 9, 0])
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(MultipleYields)
+ assert_equal [[1, 2, 3], [4, 5]], parameter_group.parameter_groups
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(MultipleYields)
+ assert_equal [[6, 7], [8, 9, 0]], parameter_group.parameter_groups
+ end
+
+ def test_should_return_consecutive_single_and_multiple_yield_parameter_groups
+ yield_parameters = YieldParameters.new
+ yield_parameters.add(1, 2, 3)
+ yield_parameters.multiple_add([4, 5, 6], [7, 8])
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(SingleYield)
+ assert_equal [1, 2, 3], parameter_group.parameters
+ parameter_group = yield_parameters.next_invocation
+ assert parameter_group.is_a?(MultipleYields)
+ assert_equal [[4, 5, 6], [7, 8]], parameter_group.parameter_groups
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/CHANGES b/vendor/gems/rspec/CHANGES
index e17793323..887c9d857 100644
--- a/vendor/gems/rspec/CHANGES
+++ b/vendor/gems/rspec/CHANGES
@@ -1,885 +1,1045 @@
+== Version 1.1.3
+
+Maintenance release.
+
+* Tightened up exceptions list in autotest/rails_spec. Closes #264.
+* Applied patch from Ryan Davis for ZenTest-3.9.0 compatibility
+* Applied patch from Kero to add step_upcoming to story listeners. Closes #253.
+* Fixed bug where the wrong named error was not always caught by "should raise_error"
+* Applied patch from Luis Lavena: No coloured output on Windows due missing RUBYOPT. Closes #244.
+* Applied patch from Craig Demyanovich to add support for "should_not render_template" to rspec_on_rails. Closes #241.
+* Added --pattern (-p for short) option to control what files get loaded. Defaults to '**/*_spec.rb'
+* Exit with non-0 exit code if examples *or tests* (in test/unit interop mode) fail. Closes #203.
+* Moved at_exit hook to a method in Spec::Runner which only runs if specs get loaded. Closes #242.
+* Applied patch from kakutani ensuring that base_view_path gets cleared after each view example. Closes #235.
+* More tweaks to regexp step names
+* Fixed focused specs in nested ExampleGroups. Closes #225.
+
+== Version 1.1.2
+
+Minor bug fixes/enhancements.
+
+* RSpec's Autotest subclasses compatible with ZenTest-3.8.0 (thanks to Ryan Davis for making it easier on Autotest subs).
+* Applied patch from idl to add spec/lib to rake stats. Closes #226.
+* calling setup_fixtures and teardown_fixtures for Rails >= r8570. Closes #219.
+* Applied patch from Josh Knowles using ActiveSupport's Inflector (when available) to make 'should have' read a bit better. Closes #197.
+* Fixed regression in 1.1 that caused failing examples to fail to generate their own names. Closes #209.
+* Applied doc patch from Jens Krämer for capturing content_for
+* Applied patch from Alexander Lang to clean up story steps after each story. Closes #198.
+* Applied patch from Josh Knowles to support 'string_or_response.should have_text(...)'. Closes #193.
+* Applied patch from Ian Dees to quiet the Story Runner backtrace. Closes #183.
+* Complete support for defining steps with regexp 'names'.
+
+== Version 1.1.1
+
+Bug fix release.
+
+* Fix regression in 1.1.0 that caused transactions to not get rolled back between examples.
+* Applied patch from Bob Cotton to reintroduce ExampleGroup.description_options. Closes LH[#186]
+
+== Version 1.1.0
+
+The "tell me a story and go nest yourself" release.
+
+* Applied patch from Mike Vincent to handle generators rails > 2.0.1. Closes LH[#181]
+* Formatter.pending signature changed so it gets passed an ExampleGroup instance instead of the name ( LH[#180])
+* Fixed LH[#180] Spec::Rails::Example::ModelExampleGroup and friends show up in rspec/rails output
+* Spec::Rails no longer loads ActiveRecord extensions if it's disabled in config/boot.rb
+* Applied LH[#178] small annoyances running specs with warnings enabled (Patch from Mikko Lehtonen)
+* Tighter integration with Rails fixtures. Take advantage of fixture caching to get performance improvements (Thanks to Pat Maddox, Nick Kallen, Jonathan Barnes, and Curtis)
+
+== Version 1.1.0-RC1
+
+Textmate Bundle users - this release adds a new RSpec bundle that highlights describe, it, before and after and
+provides navigation to descriptions and examples (rather than classes and methods). When you first install this,
+it is going to try to hijack all of your .rb files. All you need to do is open a .rb file that does not end with
+'spec.rb' and change the bundle selection from RSpec to Ruby. TextMate will do the right thing from then on.
+
+Shortcuts for tab-activated snippets all follow the TextMate convention of 2 or 3 letters of the first word, followed by the first letter of each subsequent word. So "should have_at_least" would be triggered by shhal.
+
+We reduced the scope for running spec directories, files, a single file or individual spec in TextMate to source.ruby.rspec. This allowed us to restore the standard Ruby shortcuts:
+
+CMD-R runs all the specs in one file
+CMD-SHIFT-R runs an individual spec
+CMD-OPT-R runs any files or directories selected in the TextMate drawer
+
+rspec_on_rails users - don't forget to run script/generate rspec
+
+* Added shared_examples_for method, which you can (should) use instead of describe Foo, :shared => true
+* Applied LH[#168] Fix describe Object, "description contains a # in it" (Patch from Martin Emde)
+* Applied LH[#15] Reverse loading of ActionView::Base helper modules (Patch from Mark Van Holstyn)
+* Applied LH[#149] Update contribute page to point towards lighthouse (Patch from Josh Knowles)
+* Applied LH[#142] verify_rcov fails with latest rcov (Patch from Kyle Hargraves)
+* Applied LH[#10] Allow stubs to yield and return values (Patch from Pat Maddox)
+* Fixed LH[#139] version.rb in trunk missing svn last changed number
+* Applied LH[#14] Adding support for by_at_least/by_at_most in Change matcher (Patch from Saimon Moore)
+* Applied LH[#12] Fix for TM when switching to alternate file (Patch from Trevor Squires)
+* Applied LH[#133] ExampleMatcher should match against before(:all) (Patch from Bob Cotton)
+* Applied LH[#134] Only load spec inside spec_helper.rb (Patch from Mark Van Holstyn)
+* RSpec now bails immediately if there are examples with identical names.
+* Applied LH[#132] Plain Text stories should support Given and Given: (Patch from Jarkko Laine)
+* Applied patch from Pat Maddox: Story Mediator - the glue that binds the plain text story parser with the rest of the system
+* Applied LH[#16] Have SimpleMatchers expose their description for specdocs (Patch from Bryan Helmkamp)
+* Stories now support --colour
+* Changed the DSL modules to Example (i.e. Spec::Example instead of Spec::DSL)
+* Applied [#15608] Story problem if parenthesis used in Given, When, Then or And (Patch from Sinclair Bain)
+* Applied [#15659] GivenScenario fails when it is a RailsStory (Patch from Nathan Sutton)
+* Fixed [#15639] rcov exclusion configuration. (Spec::Rails projects can configure rcov with spec/rcov.opts)
+* The rdoc formatter (--format rdoc) is gone. It was buggy and noone was using it.
+* Changed Spec::DSL::Behaviour to Spec::DSL::ExampleGroup
+* Changed Spec::DSL::SharedBehaviour to Spec::DSL::SharedExampleGroup
+* Applied [#14023] Small optimization for heavily proxied objects. (Patch from Ian Leitch)
+* Applied [#13943] ProfileFormatter (Top 10 slowest examples) (Patch from Ian Leitch)
+* Fixed [#15232] heckle is not working correctly in trunk (as of r2801)
+* Applied [#14399] Show pending reasons in HTML report (Patch from Bryan Helmkamp)
+* Discovered fixed: [#10263] mock "leak" when setting an expectation in a block passed to mock#should_receive
+* Fixed [#14671] Spec::DSL::ExampleRunner gives "NO NAME because of --dry-run" for every example for 'rake spec:doc'
+* Fixed [#14543] rspec_scaffold broken with Rails 2.0
+* Removed Patch [#10577] Rails with Oracle breaks 0.9.2 - was no longer necessary since we moved describe to the Main object (instead of Object)
+* Fixed [#14527] specs run twice on rails 1.2.4 and rspec/rspec_on_rails trunk
+* Applied [#14043] Change output ordering to show pending before errors (Patch from Mike Mangino)
+* Applied [#14095] Don't have ./script/generate rspec create previous_failures.txt (Patch from Bryan Helmkamp)
+* Applied [#14254] Improved error handling for Object#should and Object#should_not (Patch from Antti Tarvainen)
+* Applied [#14186] Remove dead code from message_expecation.rb (Patch from Antti Tarvainen)
+* Applied [#14183] Tiny improvement on mock_spec.rb (Patch from Antti Tarvainen)
+* Applied [#14208] Fix to Mock#method_missing raising NameErrors instead of MockExpectationErrors (Patch from Antti Tarvainen)
+* Applied [#14255] Fixed examples in mock_spec.rb and shared_behaviour_spec.rb (Patch from Antti Tarvainen)
+* Applied [#14362] partially mocking objects that define == can blow up (Patch from Pat Maddox)
+* test_ methods with an arity of 0 defined in a describe block or Example object will be run as an Example, providing a seamless transition from Test::Unit
+* Removed BehaviourRunner
+* Fixed [#13969] Spec Failures on Trunk w/ Autotest
+* Applied [#14156] False positives with should_not (Patch from Antti Tarvainen)
+* Applied [#14170] route_for and params_from internal specs fixed (Patch from Antti Tarvainen)
+* Fixed [#14166] Cannot build trunk
+* Applied [#14142] Fix for bug #11602: Nested #have_tag specifications fails on the wrong line number (Patch from Antti Tarvainen)
+* Removed warn_if_no_files argument and feature
+* Steps (Given/When/Then) with no blocks are treated as pending
+* Applied [#13913] Scenario should treat no code block as pending (Patch from Evan Light)
+* Fixed [#13370] Weird mock expectation error (Patch from Mike Mangino)
+* Applied [#13952] Fix for performance regression introduced in r2096 (Patch from Ian Leitch)
+* Applied [#13881] Dynamically include Helpers that are included on ActionView::Base (Patch from Brandon Keepers)
+* Applied [#13833] ActionView::Helpers::JavaScriptMacrosHelper removed after 1.2.3 (Patch from Yurii Rashkovskii)
+* Applied [#13814] RSpec on Rails w/ fixture-scenarios (Patch from Shintaro Kakutani)
+* Add ability to define Example subclass instead of using describe
+* Applied Patch from James Edward Gray II to improve syntax highlighting in TextMate
+* Fixed [#13579] NoMethodError not raised for missing helper methods
+* Fixed [#13713] form helper method 'select' can not be called when calling custom helper methods from specs
+* Example subclasses Test::Unit::TestCase
+* Added stub_everything method to create a stub that will return itself for any message it doesn't understand
+* Added stories directory with stories/all.rb and stories/helper.rb when you script/generate rspec
+* Applied [#13554] Add "And" so you can say Given... And... When... Then... And...
+* Applied [#11254] RSpec syntax coloring and function pop-up integration in TextMate (Patch from Wincent Colaiuta)
+* Applied [#13143] ActionView::Helpers::RecordIdentificationHelper should be included if present (Patch from Jay Levitt)
+* Applied [#13567] patch to allow stubs to yield consecutive values (Patch from Rupert Voelcker)
+* Applied [#13559] reverse version of route_for (Patch from Rupert Voelcker)
+* Added [#13532] /lib specs should get base EvalContext
+* Applied [#13451] Add a null_object option to mock_model (Patch from James Deville)
+* Applied [#11919] Making non-implemented specs easy in textmate (Patch from Scott Taylor)
+* Applied [#13274] ThrowSymbol recognized a NameError triggered by Kernel#method_missing as a thrown Symbol
+* Applied [#12722] the alternate file command does not work in rails views due to scope (Patch from Carl Porth)
+* Behaviour is now a Module that is used by Example class methods and SharedBehaviour
+* Added ExampleDefinition
+* Added story runner framework based on rbehave [#12628]
+* Applied [#13336] Helper directory incorrect for rake stats in statsetup task (Patch from Curtis Miller)
+* Applied [#13339] Add the ability for spec_parser to parse describes with :behaviour_type set (Patch from Will Leinweber and Dav Yaginuma)
+* Fixed [#13271] incorrect behaviour with expect_render and stub_render
+* Applied [#13129] Fix failing specs in spec_distributed (Patch from Bob Cotton)
+* Applied [#13118] Rinda support for Spec::Distributed (Patch from Bob Cotton)
+* Removed BehaviourEval
+* Removed Behaviour#inherit
+* Moved implementation of install_dependencies to example_rails_app
+* Renamed RSPEC_DEPS to VENDOR_DEPS
+* Added Example#not_implemented?
+* You can now stub!(:msg).with(specific args)
+* describe("A", Hash, "with one element") will generate description "A Hash with one element" (Tip from Ola Bini)
+* Applied [#13016] [DOC] Point out that view specs render, well, a view (Patch from Jay Levitt)
+* Applied [#13078] Develop rspec with autotest (Patch from Scott Taylor)
+* Fixed [#13065] Named routes throw a NoMethodError in Helper specs (Patches from James Deville and Mike Mangino)
+* Added (back) the verbose attribute in Spec::Rake::SpecTask
+* Changed documentation to point at the new http svn URL, which is more accessible.
+
== Version 1.0.8
Another bugfix release - this time to resolve the version mismatch
== Version 1.0.7
Quick bugfix release to ensure that you don't have to have the rspec gem installed
in order to use autotest with rspec_on_rails.
* Fixed [#13015] autotest gives failure in 'spec_command' after upgrade 1.0.5 to 1.0.6
== Version 1.0.6
The "holy cow, batman, it's been a long time since we released and there are a ton of bug
fixes, patches and even new features" release.
Warning: Spec::Rails users: In fixing 11508, we've removed the raise_controller_errors method. As long as you
follow the upgrade instructions and run 'script/generate rspec' you'll be fine, but if you skip this
step you need to manually go into spec_helper.rb and remove the call to that method (if present - it
might not be if you haven't upgraded in a while).
Warning: Implementors of custom formatters. Formatters will now be sent an Example object instead of just a
String for #example_started, #example_passed and #example_failed. In certain scenarios
(Spec::Ui with Spec::Distributed), the formatter must ask the Example for its sequence number instead of
keeping track of a sequence number internal to the formatter. Most of you shouldn't need to upgrade
your formatters though - the Example#to_s method returns the example name/description, so you should be
able to use the passed Example instance as if it were a String.
* Applied [#12986] Autotest Specs + Refactoring (Patch from Scott Tayler)
* Added a #close method to formatters, which allows them to gracefully close streams.
* Applied [#12935] Remove requirement that mocha must be installed as a gem when used as mocking framework. (Patch from Ryan Kinderman).
* Fixed [#12893] RSpec's Autotest should work with rspec's trunk
* Fixed [#12865] Partial mock error when object has an @options instance var
-* Applied [#12701] Allow checking of content captured with content_for in view specs (Patch from Jens Krämer)
+* Applied [#12701] Allow checking of content captured with content_for in view specs (Patch from Jens Kr�mer)
* Applied [#12817] Cannot include same shared behaviour when required with absolute paths (Patch from Ian Leitch)
* Applied [#12719] rspec_on_rails should not include pagination helper (Patch from Matthijs Langenberg)
* Fixed [#12714] helper spec not finding rails core helpers
* Applied [#12611] should_not redirect_to implementation (Patch from Yurii Rashkovskii)
* Applied [#12682] Not correctly aliasing original 'stub!' and 'should_receive' methods for ApplicationController (Patch from Matthijs Langenberg)
* Disabled controller.should_receive(:render) and controller.stub!(:render). Use expect_render or stub_render instead.
* Applied [#12484] Allow a Behaviour's Description to flow through to the Formatter (Patch from Bob Cotton)
* Fixed [#12448] The spec:plugins rake task from rspec_on_rails should ignore specs from the rspec_on_rails plugin
* Applied [#12300] rr integration (patch from Kyle Hargraves)
* Implemented [#12284] mock_with :rr (integration with RR mock framework: http://rubyforge.org/projects/pivotalrb/)
* Applied [#12237] (tiny) added full path to mate in switch_command (Patch from Carl Porth)
* Formatters will now be sent an Example object instead of just a String for certain methods
* All Spec::Rake::SpecTask attributes can now be procs, which allows for lazy evaluation.
* Changed the Spec::Ui interfaces slightly. See examples.
* Applied [#12174] mishandling of paths with spaces in spec_mate switch_command (Patch from Carl Porth)
* Implemented [#8315] File "Go to..." functionality
* Applied [#11917] Cleaner Spec::Ui error for failed Selenium connection (Patch from Ian Dees)
* Applied [#11888] rspec_on_rails spews out warnings when assert_select is used with an XML response (Patch from Ian Leitch)
* Applied [#12010] Nicer failure message formatting (Patch from Wincent Colaiuta)
* Applied [#12156] smooth open mate patch (Patch from Ienaga Eiji)
* Applied [#10577] Rails with Oracle breaks 0.9.2. (Patch from Sinclair Bain)
* Fixed [#12079] auto-generated example name incomplete: should have 1 error on ....]
* Applied [#12066] Docfix for mocks/mocks.page (Patch from Kyle Hargraves)
* Fixed [#11891] script/generate rspec_controller fails to create appropriate views (from templates) on edge rails
-* Applied [#11921] Adds the correct controller_name from derived_controller_name() to the ViewExampleController (Patch from Eloy Duran)
+* Applied [#11921] Adds the correct controller_name from derived_controller_name() to the ViewExampleGroupController (Patch from Eloy Duran)
* Fixed [#11903] config.include with behaviour_type 'hash' does not work
* Examples without blocks and pending is now reported with a P instead of a *
* Pending blocks that now pass are rendered blue
* New behaviour for after: If an after block raises an error, the other ones will still run instead of bailing at the first.
* Made it possible to run spec from RSpec.tmbundle with --drb against a Rails spec_server.
* Applied [#11868] Add ability for pending to optionally hold a failing block and to fail when it passes (Patch from Bob Cotton)
* Fixed [#11843] watir_behaviour missing from spec_ui gem
* Added 'switch between source and spec file' command in Spec::Mate (based on code from Ruy Asan)
* Applied [#11509] Documentation - RSpec requires hpricot
* Applied [#11807] Daemonize spec_server and rake tasks to manage them. (patch from Kyosuke MOROHASHI)
* Added pending(message) method
* Fixed [#11777] should render_template doesn't check paths correctly
* Fixed [#11749] Use of 'rescue => e' does not catch all exceptions
* Fixed [#11793] should raise_error('with a message') does not work correctly
* Fixed [#11774] Mocks should respond to :kind_of? in the same way they respond to :is_a?
* Fixed [#11508] Exceptions are not raised for Controller Specs (removed experimental raise_controller_errors)
* Applied [#11615] Partial mock methods give ambiguous failures when given a method name as a String (Patch from Jay Phillips)
* Fixed [#11545] Rspec doesn't handle should_receive on ActiveRecord associations (Patch from Ian White)
* Fixed [#11514] configuration.use_transactional_fixtures is ALWAYS true, regardless of assignment
* Improved generated RESTful controller examples to cover both successful and unsuccessful POST and PUT
* Changed TextMate snippets for controllers to pass controller class names to #describe rather than controller_name.
* Changed TextMate snippets for mocks to use no_args() and any_args() instead of the deprecated Symbols.
* Applied [#11500] Documentation: no rails integration specs in 1.0
* Renamed SpecMate's shortcuts for running all examples and focused examples to avoid conflicts (CMD-d and CMD-i)
* Added a TextMate snippet for custom matchers, lifted from Geoffrey Grosenbach's RSpec peepcode show.
* The translator translates mock constraints to the new matchers that were introduced in 1.0.4
* Documented environment variables for Spec::Rake::SpecTask. Renamed SPECOPTS and RCOVOPTS to SPEC_OPTS and RCOV_OPTS.
* Fixed [#10534] Windows: undefined method 'controller_name'
== Version 1.0.5
Bug fixes. Autotest plugin tweaks.
* Fixed [#11378] fix to 10814 broke drb (re-opened #10814)
* Fixed [#11223] Unable to access flash from rails helper specs
* Fixed [#11337] autotest runs specs redundantly
* Fixed [#11258] windows: autotest won't run
* Applied [#11253] Tweaks to autotest file mappings (Patch from Wincent Colaiuta)
* Applied [#11252] Should be able to re-load file containing shared behaviours without raising an exception (Patch from Wincent Colaiuta)
* Fixed [#11247] standalone autotest doesn't work because of unneeded autotest.rb
* Applied [#11221] Autotest support does not work w/o Rails Gem installed (Patch from Josh Knowles)
== Version 1.0.4
The getting ready for JRuby release.
* Fixed [#11181] behaviour_type scoping of config.before(:each) is not working
* added mock argument constraint matchers (anything(), boolean(), an_instance_of(Type)) which work with rspec or mocha
* added mock argument constraint matchers (any_args(), no_args()) which only work with rspec
* deprecated rspec's symbol mock argument constraint matchers (:any_args, :no_args, :anything, :boolean, :numeric, :string)
* Added tarball of rspec_on_rails to the release build to support folks working behind a firewall that blocks svn access.
* Fixed [#11137] rspec incorrectly handles flash after resetting the session
* Fixed [#11143] Views code for ActionController::Base#render broke between 1.0.0 and 1.0.3 on Rails Edge r6731
* Added raise_controller_errors for controller examples in Spec::Rails
== Version 1.0.3
Bug fixes.
* Fixed [#11104] Website uses old specify notation
* Applied [#11101] StringHelpers.starts_with?(prefix) assumes a string parameter for _prefix_
* Removed 'rescue nil' which was hiding errors in controller examples.
* Fixed [#11075] controller specs fail when using mocha without integrated_views
* Fixed problem with redirect_to failing incorrectly against edge rails.
* Fixed [#11082] RspecResourceGenerator should be RspecScaffoldGenerator
* Fixed [#10959] Focused Examples do not work for Behaviour defined with constant with modules
== Version 1.0.2
This is just to align the version numbers in rspec and rspec_on_rails.
== Version 1.0.1
This is a maintenance release with mostly cleaning up, and one minor enhancement -
Modules are automatically included when described directly.
* Renamed Spec::Rails' rspec_resource generator to rspec_scaffold.
* Removed Spec::Rails' be_feed matcher since it's based on assert_select_feed which is not part of Rails (despite that docs for assert_select_encoded says it is).
* describe(SomeModule) will include that module in the examples. Like for Spec::Rails helpers, but now also in core.
* Header in HTML report will be yellow instead of red if there is one failed example
* Applied [#10951] Odd instance variable name in rspec_model template (patch from Kyle Hargraves)
* Improved integration with autotest (Patches from Ryan Davis and David Goodland)
* Some small fixes to make all specs run on JRuby.
== Version 1.0.0
The stake in the ground release. This represents a commitment to the API as it is. No significant
backwards compatibility changes in the API are expected after this release.
* Fixed [#10923] have_text matcher does not support should_not
* Fixed [#10673] should > and should >= broken
* Applied [#10921] Allow verify_rcov to accept greater than threshold coverage %'s via configuration
* Applied [#10920] Added support for not implemented examples (Patch from Chad Humphries and Ken Barker)
* Patch to allow not implemented examples. This works by not providing a block to the example. (Patch from Chad Humphries, Ken Barker)
* Yanked support for Rails 1.1.6 in Spec::Rails
* RSpec.tmbundle uses CMD-SHIFT-R to run focused examples now.
* Spec::Rails now bundles a spec:rcov task by default (suggestion from Kurt Schrader)
* Fixed [#10814] Runner loads shared code, test cases require them again
* Fixed [#10753] Global before and after
* Fixed [#10774] Allow before and after to be specified in config II
* Refactored Spec::Ui examples to use new global before and after blocks.
* Added instructions about how to get Selenium working with Spec::Ui (spec_ui/examples/selenium/README.txt)
* Fixed [#10805] selenium.rb missing from gem?
* Added rdocs explaining how to deal with errors in Rails' controller actions
* Applied [#10770] Finer grained includes.
* Fixed [#10747] Helper methods defined in shared specs are not visible when shared spec is used
* Fixed [#10748] Shared descriptions in separate files causes 'already exists' error
* Applied [#10698] Running with --drb executes specs twice (patch from Ruy Asan)
* Fixed [#10871] 0.9.4 - Focussed spec runner fails to run specs in descriptions with type and string when there is no leading space in the string
== Version 0.9.4
This release introduces massive improvements to Spec::Ui - the user interface functional testing
extension to RSpec. There are also some minor bug fixes to the RSpec core.
* Massive improvements to Spec::Ui. Complete support for all Watir's ie.xxx(how, what) methods. Inline screenshots and HTML.
* Reactivated --timeout, which had mysteriously been deactivated in a recent release.
* Fixed [#10669] Kernel#describe override does not cover Kernel#context
* Applied [#10636] Added spec for OptionParser in Runner (Patch from Scott Taylor)
* Added [#10516] should_include should be able to accept multiple items
* Applied [#10631] redirect_to matcher doesn't respect request.host (Patch from Tim Lucas)
* Each formatter now flushes their own IO. This is to avoid buffering of output.
* Fixed [#10670] IVarProxy#delete raises exception when instance variable does not exist
== Version 0.9.3
This is a bugfix release.
* Fixed [#10594] Failing Custom Matcher show NAME NOT GENERATED description
* describe(SomeType, "#message") will not add a space: "SomeType#message" (likewise for '.')
* describe(SomeType, "message") will have a decription with a space: "SomeType message"
* Applied [#10566] prepend_before and prepend_after callbacks
* Applied [#10567] Call setup and teardown using before and after callbacks
== Version 0.9.2
This is a quick maintenance release.
* Added some website love
* Fixed [#10542] reverse predicate matcher syntax
* Added a spec:translate Rake task to make 0.9 translation easier with Spec:Rails
* Better translation of should_redirect_to
* Fixed --colour support for Windows. This is a regression that was introduced in 0.9.1
* Applied [#10460] Make SpecRunner easier to instantiate without using commandline args
== Version 0.9.1
This release introduces #describe and #it (aliased as #context and #specify for
backwards compatibility). This allows you to express specs like this:
describe SomeClass do # Creates a Behaviour
it "should do something" do # Creates an Example
end
end
The command line features four new options that give you more control over what specs
are being run and in what order. This can be used to verify that your specs are
independent (by running in opposite order with --reverse). It can also be used to cut
down feedback time by running the most recently modified specs first (--loadby mtime --reverse).
Further, --example replaces the old --spec option, and it can now take a file name of
spec names as an alternative to just a spec name. The --format failing_examples:file.txt
option allows you to output an --example compatible file, which makes it possible to only
rerun the specs that failed in the last run. Spec::Rails uses all of these four options
by default to optimise your RSpec experience.
There is now a simple configuration model. For Spec::Rails, you do something like this:
Spec::Runner.configure do |config|
config.use_transactional_fixtures = true
config.use_instantiated_fixtures = false
config.fixture_path = RAILS_ROOT + '/spec/fixtures'
end
You can now use mocha or flexmock with RSpec if you prefer either to
RSpec's own mock framework. Just put this:
Spec::Runner.configure do |config|
config.mock_with :mocha
end
or this:
Spec::Runner.configure do |config|
config.mock_with :flexmock
end
in a file that is loaded before your specs. You can also
configure included modules and predicate_matchers:
Spec::Runner.configure do |config|
config.include SomeModule
config.predicate_matchers[:does_something?] = :do_something
end
See Spec::DSL::Behaviour for more on predicate_matchers
* Sugar FREE!
* Added [10434 ] Please Make -s synonymous with -e for autotest compat. This is temporary until autotest uses -e instead of -s.
* Fixed [#10133] custom predicate matchers
* Applied [#10473] Add should exist (new matcher) - Patch from Bret Pettichord
* Added another formatter: failing_behaviours. Writes the names of the failing behaviours for use with --example.
* Applied [#10315] Patch to fix pre_commit bug 10313 - pre_commit_rails: doesn't always build correctly (Patch from Antii Tarvainen)
* Applied [#10245] Patch to HTML escape the behavior name when using HTML Formatter (Patch from Josh Knowles)
* Applied [#10410] redirect_to does not behave consistently with regards to query string parameter ordering (Patch from Nicholas Evans)
* Applied [#9605] Patch for ER 9472, shared behaviour (Patch by Bob Cotton)
* The '--format rdoc' option no longer causes a dry-run by default. --dry-run must be used explicitly.
* It's possible to specify the output file in the --format option (See explanation in --help)
* Several --format options may be specified to output several formats in one run.
* The --out option is gone. Use --format html:path/to/my.html instead (or similar).
* Spec::Runner::Formatter::BaseTextFormatter#initialize only takes one argument - an IO. dry_run and color are setters.
* Made Spec::Ui *much* easier to install. It will be released separately. Check out trunk/spec_ui/examples
* HTML reports now include a syntax highlighted snippet of the source code where the spec failed (needs the syntax gem)
* Added [#10262] Better Helper testing of Erb evaluation block helpers
* Added [#9735] support flexmock (thanks to Jim Weirich for his modifications to flexmock to support this)
* Spec::Rails controller specs will no longer let mock exception ripple through to the response.
* Fixed [#9260] IvarProxy does not act like a hash.
* Applied [#9458] The rspec_scaffold generator does not take into account class nesting (Patch from Steve Tendon)
* Applied [#9132] Rakefile spec:doc can fail without preparing database (Patch from Steve Ross)
* Applied [#9678] Custom runner command line switch, and multi-threaded runner (Patch from Bob Cotton)
* Applied [#9926] Rakefile - RSPEC_DEPS constant as an Array of Hashes instead of an Array of Arrays (Patch from Scott Taylor)
* Applied [#9925] Changed ".rhtml" to "template" in REST spec generator (Patch from Scott Taylor)
* Applied [#9852] Patch for RSpec's Website using Webgen 0.4.2 (Patch from Scott Taylor)
* Fixed [#6523] Run rspec on rails without a db
* Fixed [#9295] rake spec should run anything in the spec directory (not just rspec's standard dirs)
* Added [#9786] infer controller and helper names from the described type
* Fixed [#7795] form_tag renders action='/view_spec' in view specs
* Fixed [#9767] rspec_on_rails should not define rescue_action on controllers
* Fixed [#9421] --line doesn't work with behaviours that use class names
* Fixed [#9760] rspec generators incompatible with changes to edge rails
* Added [#9786] infer controller and helper names from the described type
* Applied a simplified version of [#9282] Change to allow running specs from textmate with rspec installed as a rails plugin (and no rspec gem installed)
* Applied [#9700] Make Spec::DSL::Example#name public / Add a --timeout switch. A great way to prevent specs from getting slow.
* In Rails, script/generate rspec will generate a spec.opts file that optimises faster/more efficient running of specs.
* Added [#9522] support using rspec's expectations with test/unit
* Moved rspec_on_rails up to the project root, simplifying the download url
* Fixed [#8103] RSpec not installing spec script correctly.
* The --spec option is replaced by the --example option.
* The --loadby option no longer supports a file argument. Use --example file_name instead.
* The --example option can now take a file name as an argument. The file should contain example names.
* Internal classes are named Behaviour/Example (rather than Context/Specification).
* You can now use mocha by saying config.mock_with :mocha in a spec_helper
* before_context_eval is replaced by before_eval.
* Applied [#9509] allow spaced options in spec.opts
* Applied [#9510] Added File for Ruby 1.8.6
* Applied [#9511] Clarification to README file in spec/
* Moved all of the Spec::Rails specs down to the plugins directory - now you can run the specs after you install.
* Updated RSpec.tmbundle to the 0.9 syntax and replaced context/specify with describe/it.
* Applied [#9232] ActionController::Base#render is sometimes protected (patch from Dan Manges)
* Added --reverse option, allowing contexts/specs to be run in reverse order.
* Added --loadby option, allowing better control over load order for spec files. mtime and file.txt supported.
* Implemented [#8696] --order option (see --reverse and --loadby)
* Added describe/it as aliases for context/specify - suggestion from Dan North.
* Applied [#7637] [PATCH] add skip-migration option to rspec_scaffold generator
* Added [#9167] string.should have_tag
* Changed script/rails_spec_server to script/spec_server and added script/spec (w/ path to vendor/plugins/rspec)
* Fixed [#8897] Error when mixing controller spec with/without integrated views and using template system other than rhtml
* Updated sample app specs to 0.9 syntax
* Updated generated specs to 0.9 syntax
* Applied [#8994] trunk: generated names for be_ specs (Multiple patches from Yurii Rashkovskii)
* Applied [#9983]: Allow before and after to be called in BehaviourEval. This is useful for shared examples.
== Version 0.8.2
Replaced assert_select fork with an assert_select wrapper for have_tag. This means that "should have_rjs" no longer supports :hide or :effect, but you can still use should_have_rjs for those.
== Version 0.8.1
Quick "in house" bug-fix
== Version 0.8.0
This release introduces a new approach to handling expectations using Expression Matchers.
See Upgrade[http://rspec.rubyforge.org/upgrade.html], Spec::Expectations, Spec::Matchers and RELEASE-PLAN for more info.
This release also improves the spec command line by adding DRb support and making it possible to
store command line options in a file. This means a more flexible RSpec experience with Rails,
Rake and editor plugins like TextMate.
It also sports myriad new features, bug fixes, patches and general goodness:
* Fixed [#8928] rspec_on_rails 0.8.0-RC1 controller tests make double call to setup_with_fixtures
* Fixed [#8925] Documentation bug in 0.8.0RC1 rspec website
* Applied [#8132] [PATCH] RSpec breaks "rake db:sessions:create" in a rails project that has the rspec_on_rails plugin (Patch from Erik Kastner)
* Fixed [#8789] --line and --spec not working when the context has parenhesis in the name
* Added [#8783] auto generate spec names from last expectation
* --heckle now fails if the heckled class or module is not found.
* Fixed [#8771] Spec::Mocks::BaseExpectation#with converts hash params to array of arrays with #collect
* Fixed [#8750] should[_not]_include backwards compatibility between 0.8.0-RC1 and 0.7.5.1 broken
* Fixed [#8646] Context Runner does not report on Non standard exceptions and return a 0 return code
* RSpec on Rails' spec_helper.rb will only force RAILS_ENV to test if it was not specified on the command line.
* Fixed [#5485] proc#should_raise and proc#should_not_raise output
* Added [#8484] should_receive with blocks
* Applied [#8218] heckle_runner.rb doesn't work with heckle >= 1.2.0 (Patch from Michal Kwiatkowski)
* Fixed [#8240] Cryptic error message when no controller_name
* Applied [#7461] [PATCH] Contexts don't call Module::included when they include a module
* Removed unintended block of test/unit assertions in rspec_on_rails - they should all, in theory, now be accessible
* Added mock_model method to RSpec on Rails, which stubs common methods. Based on http://metaclass.org/2006/12/22/making-a-mockery-of-activerecord
* Fixed [#8165] Partial Mock Errors when respond_to? is true but the method is not in the object
* Fixed [#7611] Partial Mocks override Subclass methods
* Fixed [#8302] Strange side effect when mocking a class method
* Applied [#8316] to_param should return a stringified key in resource generator's controller spec (Patch from Chris Anderson)
* Applied [#8216] shortcut for creating object stub
* Applied [#8008] Correct generated specs for view when calling resource generator (Patch from Jonathan Tron)
* Fixed [#7754] Command-R fails to run spec in TextMate (added instruction from Luke Redpath to the website)
* Fixed [#7826] RSpect.tmbundle web page out of date.
* RSpec on Rails specs are now running against RoR 1.2.1 and 1.2.2
* rspec_scaffold now generates specs for views
* In a Rails app, RSpec core is only loaded when RAILS_ENV==test (init.rb)
* Added support for target.should arbitrary_expectation_handler and target.should_not arbitrary_expectation_handler
* Fixed [#7533] Spec suite fails and the process exits with a code 0
* Fixed [#7565] Subsequent stub! calls for method fail to override the first call to method
* Applied [#7524] Incorrect Documentation for 'pattern' in Rake task (patch from Stephen Duncan)
* Fixed [#7409] default fixtures do not appear to run.
* Fixed [#7507] "render..and return" doesn't return
* Fixed [#7509] rcov/rspec incorrectly includes boot.rb (Patch from Courtenay)
* Fixed [#7506] unnecessary complex output on failure of response.should be_redirect
* Applied [#6098] Make scaffold_resource generator. Based on code from Pat Maddox.
* The drbspec command is gone. Use spec --drb instead.
* The drb option is gone from the Rake task. Pass --drb to spec_opts instead.
* New -X/--drb option for running specs against a server like spec/rails' script/rails_spec_server
* New -O/--options and -G/--generate flags for file-based options (handy for spec/rails)
* Applied [#7339] Turn off caching in HTML reports
* Applied [#7419] "c option for colorizing output does not work with rails_spec" (Patch from Shintaro Kakutani)
* Applied [#7406] [PATCH] 0.7.5 rspec_on_rails loads fixtures into development database (Patch from Wilson Bilkovich)
* Applied [#7387] Allow stubs to return consecutive values (Patch from Pat Maddox)
* Applied [#7393] Fix for rake task (Patch from Pat Maddox)
* Reinstated support for response.should_render (in addition to controller.should_render)
== Version 0.7.5.1
Bug fix release to allow downloads of rspec gem using rubygems 0.9.1.
== Version 0.7.5
This release adds support for Heckle - Seattle'rb's code mutation tool.
There are also several bug fixes to the RSpec core and the RSpec on Rails plugin.
* Removed svn:externals on rails versions and plugins
* Applied [#7345] Adding context_setup and context_teardown, with specs and 100% rcov
* Applied [#7320] [PATCH] Allow XHR requests in controller specs to render RJS templates
* Applied [#7319] Migration code uses drop_column when it should use remove_column (patch from Pat Maddox)
* Added support for Heckle
* Applied [#7282] dump results even if spec is interrupted (patch from Kouhei Sutou)
* Applied [#7277] model.should_have(n).errors_on(:attribute) (patch from Wilson Bilkovich)
* Applied [#7270] RSpec render_partial colliding with simply_helpful (patch from David Goodlad)
* Added [#7250] stubs should support throwing
* Added [#7249] stubs should support yielding
* Fixed [#6760] fatal error when accessing nested finders in rspec
* Fixed [#7179] script/generate rspec_scaffold generates incorrect helper name
* Added preliminary support for assert_select (response.should_have)
* Fixed [#6971] and_yield does not work when the arity is -1
* Fixed [#6898] Can we separate rspec from the plugins?
* Added [#7025] should_change should accept a block
* Applied [#6989] partials with locals (patch from Micah Martin)
* Applied [#7023] Typo in team.page
== Version 0.7.4
This release features a complete redesign of the reports generated with --format html.
As usual there are many bug fixes - mostly related to spec/rails.
* Applied [#7010] Fixes :spacer_template does not work w/ view spec (patch from Shintaro Kakutani)
* Applied [#6798] ensure two ':' in the first backtrace line for Emacs's 'next-error' command (patch from Kouhei Sutou)
* Added Much nicer reports to generated website
* Much nicer reports with --format --html (patch from Luke Redpath)
* Applied [#6959] Calls to render and redirect in controllers should return true
* Fixed [#6981] helper method is not available in partial template.
* Added [#6978] mock should tell you the expected and actual args when receiving the right message with the wrong args
* Added the possibility to tweak the output of the HtmlFormatter (by overriding extra_failure_content).
* Fixed [#6936] View specs don't include ApplicationHelper by default
* Fixed [#6903] Rendering a partial in a view makes the view spec blow up
* Added callback library from Brian Takita
* Added [#6925] support controller.should_render :action_name
* Fixed [#6884] intermittent errors related to method binding
* Fixed [#6870] rspec on edge rails spec:controller fixture loading fails
* Using obj.inspect for all messages
* Improved performance by getting rid of instance_exec (instance_eval is good enough because we never need to pass it args)
== Version 0.7.3
Almost normal bug fix/new feature release.
A couple of things you need to change in your rails specs:
# spec_helper.rb is a little different (see http://rspec.rubyforge.org/upgrade.html)
# use controller.should_render before OR after the action (controller.should_have_rendered is deprecated)
* Applied [#6577] messy mock backtrace when frozen to edge rails (patch from Jay Levitt)
* Fixed [#6674] rspec_on_rails fails on @session deprecation warning
* Fixed [#6780] routing() was failing...fix included - works for 1.1.6 and edge (1.2)
* Fixed [#6835] bad message with arbitrary predicate
* Added [#6731] Partial templates rendered
* Fixed [#6713] helper methods not rendered in view tests?
* Fixed [#6707] cannot run controller / helper tests via rails_spec or spec only works with rake
* Applied [#6417] lambda {...}.should_change(receiver, :message) (patch from Wilson Bilkovich)
* Eliminated dependency on ZenTest
* Fixed [#6650] Reserved characters in the TextMate bundle break svn on Win32
* Fixed [#6643] script/generate rspec_controller: invalid symbol generation for 'controller_name' for *modularized* controllers
* The script/rails_spec command has been moved to bin/drbspec in RSpec core (installed by the gem)
== Version 0.7.2
This release introduces a brand new RSpec bundle for TextMate, plus some small bugfixes.
* Packaged RSpec.tmbundle.tgz as part of the distro
* Fixed [#6593] Add moving progress bar to HtmlFormatter using Javascript
* Applied [#6265] should_raise should accept an Exception object
* Fixed [#6616] Can't run Rails specs with RSpec.tmbundle
* Fixed [#6411] Can't run Rails specs with ruby
* Added [#6589] New -l --line option. This is useful for IDE/editor runners/extensions.
* Fixed [#6615] controller.should_render_rjs should support :partial => 'path/to/template'
== Version 0.7.1
Bug fixes and a couple o' new features.
* Fixed [#6575] Parse error in aliasing the partial mock original method (patch by Brian Takita)
* Fixed [#6277] debris left by stubbing (trunk) [submitted by dastels] (fixed by fix to [#6575])
* Fixed [#6575] Parse error in aliasing the partial mock original method
* Fixed [#6555] should_have_tag does not match documentation
* Fixed [#6567] SyntaxError should not stop entire run
* Fixed [#6558] integrated views look for template even when redirected
* Fixed [#6547] response.should be_redirect broken in 0.7.0
* Applied [#6471] Easy way to spec routes
* Applied [#6587] Rspec on Rails displays "Spec::Rails::ContextFactory" as context name
* Applied [#6514] Document has trivial typos.
* Added [#6560] controller.session should be available before the action
* Added support for should_have_rjs :visual_effect
* Different printing and colours for unmet expectations (red) and other exceptions (magenta)
* Simplified method_missing on mock_methods to make it less invasive on partial mocks.
== Version 0.7.0
This is the "Grow up and eat your own dog food release". RSpec is now used on itself and
we're no longer using Test::Unit to test it. Although, we are still extending Test::Unit
for the rails plugin (indirectly - through ZenTest)
IMPORTANT NOTE: THIS RELEASE IS NOT 100% BACKWARDS COMPATIBLE TO 0.6.x
There are a few changes that will require that you change your existing specs.
RSpec now handles equality exactly like ruby does:
# actual.should_equal(expected) will pass if actual.equal?(expected) returns true
# actual.should eql(expected) will pass if actual.eql?(expected) returns true
# actual.should == expected will pass if actual == expected) returns true
At the high level, eql? implies equivalence, while equal? implies object identity. For more
information on how ruby deals w/ equality, you should do this:
ri equal?
or look at this:
http://www.ruby-doc.org/core/classes/Object.html#M001057
Also, we left in should_be as a synonym for should_equal, so the only specs that should break are the
ones using should_equal (which used to use == instead of .equal?).
Lastly, should_be used to handle true and false differently from any other values. We've removed
this special handling, so now actual.should_be true will fail for any value other than true (it
used to pass for any non-nil, non-false value), and actual.should_be false will fail for any
value other than false (it used to pass for nil or false).
Here's what you'll need to do to update your specs:
# search for "should_equal" and replace with "should_eql"
# run specs
If any specs still fail, they are probably related to should be_true or should_be_false using
non-boolean values. Those you'll just have to inspect manually and adjust appropriately (sorry!).
--------------------------------------------------
Specifying multiple return values in mocks now works like this:
mock.should_receive(:message).and_return(1,2,3)
It used to work like this:
mock.should_receive(:message).and_return([1,2,3])
but we decided that was counter intuitive and otherwise lame.
Here's what you'll need to do to update your specs:
# search for "and_return(["
# get rid of the "[" and "]"
--------------------------------------------------
RSpec on Rails now supports the following (thanks to ZenTest upon which it is built):
# Separate specs for models, views, controllers and helpers
# Controller specs are completely decoupled from the views by default (though you can tell them to couple themselves if you prefer)
# View specs are completely decoupled from app-specific controllers
See http://rspec.rubyforge.org/documentation/rails/index.html for more information
--------------------------------------------------
As usual, there are also other new features and bug fixes:
* Added lots of documentation on mocks/stubs and the rails plugin.
* Added support for assigns[key] syntax for controller specs (to align w/ pre-existing syntax for view specs)
* Added support for controller.should_redirect_to
* RSpec on Rails automatically checks whether it's compatible with the installed RSpec
* Applied [#6393] rspec_on_rails uses deprecated '@response' instead of the accessor
* RSpec now has 100% spec coverage(!)
* Added support for stubbing and partial mocking
* Progress (....F..F.) is now coloured. Tweaked patch from KAKUTANI Shintaro.
* Backtrace now excludes the rcov runner (/usr/local/bin/rcov)
* Fixed [#5539] predicates do not work w/ rails
* Added [#6091] support for Regexp matching messages sent to should_raise
* Added [#6333] support for Regexp matching in mock arguments
* Applied [#6283] refactoring of diff support to allow selectable formats and custom differs
* Fixed [#5564] "ruby spec_file.rb" doesn't work the same way as "spec spec_file.rb"
* Fixed [#6056] Multiple output of failing-spec notice
* Fixed [#6233] Colours in specdoc
* Applied [#6207] Allows --diff option to diff target and expected's #inspect output (Patch by Lachie Cox)
* Fixed [#6203] Failure messages are misleading - consider using inspect.
* Added [#6334] subject.should_have_xyz will try to call subject.has_xyz? - use this for hash.should_have_key(key)
* Fixed [#6017] Rake task should ignore empty or non-existent spec-dirs
== Version 0.6.4
In addition to a number of bug fixes and patches, this release begins to formalize the support for
RSpec on Rails.
* Added Christopher Petrilli's TextMate bundle to vendor/textmate/RSpec.tmbundle
* Fixed [#5909], once again supporting multi_word_predicates
* Applied [#5873] - response.should_have_rjs (initial patch from Jake Howerton, based on ARTS by Kevin Clark)
* Added generation of view specs for rspec_on_rails
* Applied [#5815] active_record_subclass.should_have(3).records
* Added support in "rake stats" for view specs (in spec/views)
* Applied [#5801] QuickRef.pdf should say RSpec, not rSpec
* Applied [#5728] rails_spec_runner fails on Windows (Patch from Lindsay Evans).
* Applied [#5708] RSpec Rails plugin rspec_controller generator makes specs that do not parse.
* Cleaned up RSpec on Rails so it doesn't pollute as much during bootstrapping.
* Added support for response.should_have_tag and response.should_not_have_tag (works just like assert_tag in rails)
* Added new -c, --colour, --color option for colourful (red/green) output. Inspired from Pat Eyler's Redgreen gem.
* Added examples for Watir and Selenium under the gem's vendor directory.
* Renamed rails_spec_runner to rails_spec_server (as referred to in the docs)
* Added support for trying a plural for arbitrary predicates. E.g. Album.should_exist(:name => "Hey Jude") will call Album.exists?(:name => "Hey Jude")
* Added support for should_have to work with methods taking args returning a collection. E.g. @dave.should_have(3).albums_i_have_that_this_guy_doesnt(@aslak)
* Added [#5570] should_not_receive(:msg).with(:specific, "args")
* Applied [#5065] to support using define_method rather than method_missing to capture expected messages on mocks. Thanks to Eero Saynatkari for the tip that made it work.
* Restructured directories and Modules in order to separate rspec into three distinct Modules: Spec::Expectations, Spec::Runner and Spec::Mocks. This will allow us to more easily integrate other mock frameworks and/or allow test/unit users to take advantage of the expectation API.
* Applied [#5620] support any boolean method and arbitrary comparisons (5.should_be < 6) (Patch from Mike Williams)
== Version 0.6.3
This release fixes some minor bugs related to RSpec on Rails
Note that if you upgrade a rails app with this version of the rspec_on_rails plugin
you should remove your lib/tasks/rspec.rake if it exists.
* Backtraces from drb (and other standard ruby libraries) are now stripped from backtraces.
* Applied [#5557] Put rspec.rake into the task directory of the RSpec on Rails plugin (Patch from Daniel Siemssen)
* Applied [#5556] rails_spec_server loads environment.rb twice (Patch from Daniel Siemssen)
== Version 0.6.2
This release fixes a couple of regressions with the rake task that were introduced in the previous version (0.6.1)
* Fixed [#5518] ruby -w: warnings in 0.6.1
* Applied [#5525] fix rake task path to spec tool for gem-installed rspec (patch from Riley Lynch)
* Fixed a teensey regression with the rake task - introduced in 0.6.1. The spec command is now quoted so it works on windows.
== Version 0.6.1
This is the "fix the most annoying bugs release" of RSpec. There are 9 bugfixes this time.
Things that may break backwards compatibility:
1) Spec::Rake::SpecTask no longer has the options attribute. Use ruby_opts, spec_opts and rcov_opts instead.
* Fixed [#4891] RCOV task failing on windows
* Fixed [#4896] Shouldn't modify user's $LOAD_PATH (Tip from Gavin Sinclair)
* Fixed [#5369] ruby -w: warnings in RSpec 0.5.16 (Tip from Suraj Kurapati)
* Applied [#5141] ExampleMatcher doesn't escape strings before matching (Patch from Nikolai Weibull).
* Fixed [#5224] Move 'require diff-lcs' from test_helper.rb to diff_test.rb (Tip from Chris Roos)
* Applied [#5449] Rake stats for specs (Patch from Nick Sieger)
* Applied [#5468, #5058] Fix spec runner to correctly run controller specs (Patch from Daniel Siemssen)
* Applied fixes to rails_spec_server to improve its ability to run several times. (Patch from Daniel Siemssen)
* Changed RCov::VerifyTask to fail if the coverage is above the threshold. This is to ensure it gets bumped when coverage improves.
== Version 0.6.0
This release makes an official commitment to underscore_syntax (with no more support for dot.syntax)
* Fixed bug (5292) that caused mock argument matching to fail
* Converted ALL tests to use underscore syntax
* Fixed all remaining problems with underscores revealed by converting all the tests to underscores
* Enhanced sugar to support combinations of methods (i.e. once.and_return)
* Simplified helper structure taking advantage of dot/underscore combos (i.e. should.be.an_instance_of, which can be expressed as should be_an_instance_of)
* Added support for at_most in mocks
* Added support for should_not_receive(:msg) (will be removing should_receive(:msg).never some time soon)
* Added support for should_have_exactly(5).items_in_collection
== Version 0.5.16
This release improves Rails support and test2spec translation.
* Fixed underscore problems that occurred when RSpec was used in Rails
* Simplified the Rails support by packaging it as a plugin instead of a generator gem.
* Fixed [#5063] 'rspec_on_rails' require line in spec_helper.rb
* Added pre_commit rake task to reduce risk of regressions. Useful for RSpec developers and patchers.
* Added failure_message to RSpec Rake task
* test2spec now defines converted helper methods outside of the setup block (bug #5057).
== Version 0.5.15
This release removes a prematurely added feature that shouldn't have been added.
* Removed support for differences that was added in 0.5.14. The functionality is not aligned with RSpec's vision.
== Version 0.5.14
This release introduces better ways to extend specs, improves some of the core API and
a experimental support for faster rails specs.
* Added proc methods for specifying differences (increments and decrements). See difference_test.rb
* Methods can now be defined alongside specs. This obsoletes the need for defining methods in setup. (Patch #5002 from Brian Takita)
* Sugar (underscores) now works correctly with should be_a_kind_of and should be_an_instance_of
* Added support for include and inherit in contexts. (Patch #4971 from Brian Takita)
* Added rails_spec and rails_spec_server for faster specs on rails (still buggy - help needed)
* Fixed bug that caused should_render to break if given a :symbol (in Rails)
* Added support for comparing exception message in should_raise and should_not_raise
== Version 0.5.13
This release fixes some subtle bugs in the mock API.
* Use fully-qualified class name of Exceptions in failure message. Easier to debug that way.
* Fixed a bug that caused mocks to yield a one-element array (rather than the element) when one yield arg specified.
* Mocks not raise AmbiguousReturnError if an explicit return is used at the same time as an expectation block.
* Blocks passed to yielding mocks can now raise without causing mock verification to fail.
== Version 0.5.12
This release adds diff support for failure messages, a HTML formatter plus some other
minor enhancements.
* Added HTML formatter.
* Added fail_on_error option to spectask.
* Added support for diffing, using the diff-lcs Rubygem (#2648).
* Remove RSpec on Rails files from backtrace (#4694).
* All of RSpec's own tests run successfully after translation with test2spec.
* Added --verbose mode for test2spec - useful for debugging when classes fail to translate.
* Output of various formatters is now flushed - to get more continuous output.
== Version 0.5.11
This release makes test2spec usable with Rails (with some manual steps).
See http://rspec.rubyforge.org/tools/rails.html for more details
* test2spec now correctly translates bodies of helper methods (non- test_*, setup and teardown ones).
* Added more documentation about how to get test2spec to work with Rails.
== Version 0.5.10
This version features a second rewrite of test2spec - hopefully better than the previous one.
* Improved test2spec's internals. It now transforms the syntax tree before writing out the code.
== Version 0.5.9
This release improves test2spec by allowing more control over the output
* Added --template option to test2spec, which allows for custom output driven by ERB
* Added --quiet option to test2spec
* Removed unnecessary dependency on RubyToC
== Version 0.5.8
This release features a new Test::Unit to RSpec translation tool.
Also note that the RubyGem of the previous release (0.5.7) was corrupt.
We're close to being able to translate all of RSpec's own Test::Unit
tests and have them run successfully!
* Updated test2spec documentation.
* Replaced old test2rspec with a new test2spec, which is based on ParseTree and RubyInline.
== Version 0.5.7
This release changes examples and documentation to recommend underscores rather than dots,
and addresses some bugfixes and changes to the spec commandline.
* spec DIR now works correctly, recursing down and slurping all *.rb files
* All documentation and examples are now using '_' instead of '.'
* Custom external formatters can now be specified via --require and --format.
== Version 0.5.6
This release fixes a bug in the Rails controller generator
* The controller generator did not write correct source code (missing 'do'). Fixed.
== Version 0.5.5
This release adds initial support for Ruby on Rails in the rspec_generator gem.
* [Rails] Reorganised Lachie's original code to be a generator packaged as a gem rather than a plugin.
* [Rails] Imported code from http://lachie.info/svn/projects/rails_plugins/rspec_on_rails (Written by Lachie Cox)
* Remove stack trace lines from TextMate's Ruby bundle
* Better error message from spectask when no spec files are found.
== Version 0.5.4
The "the tutorial is ahead of the gem" release
* Support for running a single spec with --spec
* Exitcode is now 1 unless all specs pass, in which case it's 0.
* -v, --version now both mean the same thing
* For what was verbose output (-v), use --format specdoc or -f s
* --format rdoc always runs in dry-run mode
* Removed --doc and added --format and --dry-run
* Refactored towards more pluggable formatters
* Use webgen's execute tag when generating website (more accurate)
* Fixed incorrect quoting of spec_opts in SpecTask
* Added patch to enable underscored shoulds like 1.should_equal(1) - patch from Rich Kilmer
* Removed most inherited instance method from Mock, making more methods mockable.
* Made the RCovVerify task part of the standard toolset.
* Documented Rake task and how to use it with Rcov
* Implemented tags for website (hooking into ERB, RedCloth and syntax)
* RSpec Rake task now takes spec_opts and out params so it can be used for doc generation
* RCov integration for RSpec Rake task (#4058)
* Group all results instead of printing them several times (#4057)
* Mocks can now yield
* Various improvements to error reporting (including #4191)
* backtrace excludes rspec code - use -b to include it
* split examples into examples (passing) and failing_examples
== Version 0.5.3
The "hurry up, CoR is in two days" release.
* Don't run rcov by default
* Make separate task for running tests with RCov
* Added Rake task to fail build if coverage drops below a certain threshold
* Even more failure output cleanup (simplification)
* Added duck_type constraint for mocks
== Version 0.5.2
This release has minor improvements to the commandline and fixes some gem warnings
* Readded README to avoid RDoc warnings
* Added --version switch to commandline
* More changes to the mock API
== Version 0.5.1
This release is the first release of RSpec with a new website. It will look better soon.
* Added initial documentation for API
* Added website based on webgen
* Modified test task to use rcov
* Deleted unused code (thanks, rcov!)
* Various changes to the mock API,
* Various improvements to failure reporting
== Version 0.5.0
This release introduces a new API and obsolesces previous versions.
* Moved source code to separate subfolders
* Added new DSL runner based on instance_exec
* Added spike for testdox/rdoc generation
* merge Astels' and Chelimsky's work on ShouldHelper
* this would be 0.5.0 if I updated the documentation
* it breaks all of your existing specifications. We're not sorry.
== Version 0.3.2
The "srbaker is an idiot" release.
* also forgot to update the path to the actual Subversion repository
* this should be it
== Version 0.3.1
This is just 0.3.0, but with the TUTORIAL added to the documentation list.
* forgot to include TUTORIAL in the documentation
== Version 0.3.0
It's been a while since last release, lots of new stuff is available. For instance:
* improvements to the runners
* addition of should_raise expectation (thanks to Brian Takita)
* some documentation improvements
* RSpec usable as a DSL
== Version 0.2.0
This release provides a tutorial for new users wishing to get started with
RSpec, and many improvements.
* improved reporting in the spec runner output
* update the examples to the new mock api
* added TUTORIAL, a getting started document for new users of RSpec
== Version 0.1.7
This release improves installation and documentation, mock integration and error reporting.
* Comparison errors now print the class name too.
* Mocks now take an optional +options+ parameter to specify behaviour.
* Removed __expects in favour of should_receive
* Added line number reporting in mock error messages for unreceived message expectations.
* Added should_match and should_not_match.
* Added a +mock+ method to Spec::Context which will create mocks that autoverify (no need to call __verify).
* Mocks now require names in the constructor to ensure sensible error messages.
* Made 'spec' executable and updated usage instructions in README accordingly.
* Made more parts of the Spec::Context API private to avoid accidental usage.
* Added more RDoc to Spec::Context.
== Version 0.1.6
More should methods.
* Added should_match and should_not_match.
== Version 0.1.5
Included examples and tests in gem.
== Version 0.1.4
More tests on block based Mock expectations.
== Version 0.1.3
Improved mocking:
* block based Mock expectations.
== Version 0.1.2
This release adds some improvements to the mock API and minor syntax improvements
* Added Mock.should_expect for a more consistent DSL.
* Added MockExpectation.and_returns for a better DSL.
* Made Mock behave as a null object after a call to Mock.ignore_missing
* Internal syntax improvements.
* Improved exception trace by adding exception class name to error message.
* Renamed some tests for better consistency.
== Version 0.1.1
This release adds some shoulds and improves error reporting
* Added should be_same_as and should_not be_same_as.
* Improved error reporting for comparison expectations.
== Version 0.1.0
This is the first preview release of RSpec, a Behaviour-Driven Development library for Ruby
* Added Rake script with tasks for gems, rdoc etc.
* Added an XForge task to make release go easier.
diff --git a/vendor/gems/rspec/EXAMPLES.rd b/vendor/gems/rspec/EXAMPLES.rd
deleted file mode 100644
index ac1d40b3e..000000000
--- a/vendor/gems/rspec/EXAMPLES.rd
+++ /dev/null
@@ -1,111 +0,0 @@
-# Examples with no descriptions
-# * should equal 5
-# * should be < 5
-# * should include "a"
-# * should respond to #size
-# State created in before(:all)
-# * should be accessible from example
-# * should not have sideffects
-# BehaveAsExample::BluesGuitarist
-# * should behave as guitarist
-# BehaveAsExample::RockGuitarist
-# * should behave as guitarist
-# BehaveAsExample::ClassicGuitarist
-# * should not behave as guitarist
-# Animals::Mouse
-# * should eat cheese
-# * should not eat cat
-# Some integers
-# * The root of 1 square should be 1
-# * The root of 2 square should be 2
-# * The root of 3 square should be 3
-# * The root of 4 square should be 4
-# * The root of 5 square should be 5
-# * The root of 6 square should be 6
-# * The root of 7 square should be 7
-# * The root of 8 square should be 8
-# * The root of 9 square should be 9
-# * The root of 10 square should be 10
-# A FileAccessor
-# * should open a file and pass it to the processor's process method
-# Greeter
-# * should say Hi to person
-# * should say Hi to nobody
-# a context with helper a method
-# * should make that method available to specs
-# An IoProcessor
-# * should raise nothing when the file is exactly 32 bytes
-# * should raise an exception when the file length is less than 32 bytes
-# A legacy spec
-# * should work fine
-# A consumer of a mock
-# * should be able to send messages to the mock
-# a mock
-# * should be able to mock the same message twice w/ different args
-# * should be able to mock the same message twice w/ different args in reverse order
-# A partial mock
-# * should work at the class level
-# * should revert to the original after each spec
-# * can be mocked w/ ordering
-# pending example (using pending method)
-# * pending example (using pending method) should be reported as "PENDING: for some reason" [PENDING: for some reason]
-# pending example (with no block)
-# * pending example (with no block) should be reported as "PENDING: Not Yet Implemented" [PENDING: Not Yet Implemented]
-# pending example (with block for pending)
-# * pending example (with block for pending) should have a failing block, passed to pending, reported as "PENDING: for some reason" [PENDING: for some reason]
-# BDD framework
-# * should be adopted quickly
-# * should be intuitive
-# SharedBehaviourExample::OneThing
-# * should do what things do
-# * should have access to helper methods defined in the shared behaviour
-# SharedBehaviourExample::AnotherThing
-# * should do what things do
-# Stack (empty)
-# * should be empty
-# * should not be full
-# * should add to the top when sent #push
-# * should complain when sent #peek
-# * should complain when sent #pop
-# Stack (with one item)
-# * should not be empty
-# * should return the top item when sent #peek
-# * should NOT remove the top item when sent #peek
-# * should return the top item when sent #pop
-# * should remove the top item when sent #pop
-# * should not be full
-# * should add to the top when sent #push
-# Stack (with one item less than capacity)
-# * should not be empty
-# * should return the top item when sent #peek
-# * should NOT remove the top item when sent #peek
-# * should return the top item when sent #pop
-# * should remove the top item when sent #pop
-# * should not be full
-# * should add to the top when sent #push
-# Stack (full)
-# * should be full
-# * should not be empty
-# * should return the top item when sent #peek
-# * should NOT remove the top item when sent #peek
-# * should return the top item when sent #pop
-# * should remove the top item when sent #pop
-# * should complain on #push
-# A consumer of a stub
-# * should be able to stub methods on any Object
-# A stubbed method on a class
-# * should return the stubbed value
-# * should revert to the original method after each spec
-# * can stub! and mock the same message
-# A mock
-# * can stub!
-# * can stub! and mock
-# * can stub! and mock the same message
-# RSpec should integrate with Test::Unit::TestCase
-# * TestCase#setup should be called.
-# * RSpec should be able to access TestCase methods
-# * RSpec should be able to accept included modules
-
-Finished in 0.030063 seconds
-
-78 examples, 0 failures, 3 pending
diff --git a/vendor/gems/rspec/README b/vendor/gems/rspec/README
index ee351245d..0683b0deb 100644
--- a/vendor/gems/rspec/README
+++ b/vendor/gems/rspec/README
@@ -1,71 +1,71 @@
== RSpec
-RSpec is a Behaviour Definition Framework intended for use in Behaviour
-Driven Development. RSpec plays the same role that a unit testing framework
-would play in a Test Driven Development environment, but does so using
-words and structures that better support BDD.
+RSpec is a Behaviour Driven Development framework with tools to express User Stories
+with Executable Scenarios and Executable Examples at the code level.
-RSpec ships with four modules:
+RSpec ships with several modules:
+
+Spec::Story provides a framework for expressing User Stories
+
+Spec::Example provides a framework for expressing code Examples
Spec::Matchers provides Expression Matchers for use with Spec::Expectations
and Spec::Mocks.
Spec::Expectations supports setting expectations on your objects so you
can do things like:
result.should equal(expected_result)
Spec::Mocks supports creating Mock Objects, Stubs, and adding Mock/Stub
behaviour to your existing objects.
-Spec::Runner provides a very small but powerful DSL for writing executable
-examples of how your code should work.
-
== Installation
The simplest approach is to install the gem:
gem install -r rspec #mac users must sudo
== Building the RSpec gem
If you prefer to build the gem locally, check out source from svn://rubyforge.org/var/svn/rspec/trunk. Then
do the following:
rake gem
gem install pkg/rspec-0.x.x.gem (you may have to sudo)
== Running RSpec's specs
In order to run RSpec's full suite of specs (rake pre_commit) you must install the following gems:
* rake # Runs the build script
* rcov # Verifies that the code is 100% covered by specs
-* webgen # Generates the static HTML website
-* RedCloth # Required by webgen
-* syntax # Required by our own custom webgen extension to highlight ruby code
+* webby # Generates the static HTML website
+* syntax # Required to highlight ruby code
* diff-lcs # Required if you use the --diff switch
* win32console # Required by the --colour switch if you're on Windows
* meta_project # Required in order to make releases at RubyForge
* heckle # Required if you use the --heckle switch
* hpricot # Used for parsing HTML from the HTML output formatter in RSpec's own specs
Once those are all installed, you should be able to run the suite with the following steps:
* svn co svn://rubyforge.org/var/svn/rspec/trunk rspec
* cd rspec
* rake install_dependencies
* cd example_rails_app
* export RSPEC_RAILS_VERSION=1.2.3
* rake rspec:generate_mysql_config
* mysql -u root < db/mysql_setup.sql
* cd ..
* rake pre_commit
-
Note that RSpec itself - once built - doesn't have any dependencies outside the Ruby core
and stdlib - with a few exceptions:
* The spec command line uses diff-lcs when --diff is specified.
* The spec command line uses heckle when --heckle is specified.
* The Spec::Rake::SpecTask needs RCov if RCov is enabled in the task.
See http://rspec.rubyforge.org for further documentation.
+
+== Contributing
+
diff --git a/vendor/gems/rspec/Rakefile b/vendor/gems/rspec/Rakefile
index 24ed57963..c60d5d466 100644
--- a/vendor/gems/rspec/Rakefile
+++ b/vendor/gems/rspec/Rakefile
@@ -1,304 +1,279 @@
$:.unshift('lib')
require 'rubygems'
require 'rake/gempackagetask'
require 'rake/contrib/rubyforgepublisher'
require 'rake/clean'
require 'rake/rdoctask'
+require 'rake/testtask'
require 'spec/version'
dir = File.dirname(__FILE__)
-$LOAD_PATH.unshift(File.expand_path("#{dir}/../pre_commit/lib"))
+$LOAD_PATH.unshift(File.expand_path("#{dir}/pre_commit/lib"))
require "pre_commit"
# Some of the tasks are in separate files since they are also part of the website documentation
load File.dirname(__FILE__) + '/rake_tasks/examples.rake'
-load File.dirname(__FILE__) + '/rake_tasks/examples_specdoc.rake'
load File.dirname(__FILE__) + '/rake_tasks/examples_with_rcov.rake'
load File.dirname(__FILE__) + '/rake_tasks/failing_examples_with_html.rake'
load File.dirname(__FILE__) + '/rake_tasks/verify_rcov.rake'
PKG_NAME = "rspec"
PKG_VERSION = Spec::VERSION::STRING
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
PKG_FILES = FileList[
'[A-Z]*',
'lib/**/*.rb',
- 'spec/**/*.rb',
+ 'spec/**/*',
'examples/**/*',
- 'plugins/**/*'
+ 'failing_examples/**/*',
+ 'plugins/**/*',
+ 'stories/**/*',
+ 'pre_commit/**/*',
+ 'rake_tasks/**/*'
]
-FileUtils.touch(File.dirname(__FILE__) + '/previous_failures.txt')
task :default => [:verify_rcov]
+task :verify_rcov => [:spec, :stories]
desc "Run all specs"
Spec::Rake::SpecTask.new do |t|
- t.spec_files = FileList[
- 'spec/**/*_spec.rb',
- '../RSpec.tmbundle/Support/spec/*_spec.rb'
- # TODO: get these in too - need to fix coverage
- # '../spec_ui/spec/**/*_spec.rb'
- ]
- t.spec_opts = ['--options', 'spec.opts']
- t.rcov = true
- t.rcov_dir = '../doc/output/coverage'
- t.rcov_opts = ['--exclude', 'spec\/spec,bin\/spec,examples']
+ t.spec_files = FileList['spec/**/*_spec.rb']
+ t.spec_opts = ['--options', 'spec/spec.opts']
+ unless ENV['NO_RCOV']
+ t.rcov = true
+ t.rcov_dir = '../doc/output/coverage'
+ t.rcov_opts = ['--exclude', 'spec\/spec,bin\/spec,examples,\/var\/lib\/gems,\/Library\/Ruby,\.autotest']
+ end
end
-desc "Run all translated specs"
-Spec::Rake::SpecTask.new('translated_specs') do |t|
- t.spec_files = FileList['translated_specs/**/*_spec.rb'].exclude( # These translate, but have other quirks
- 'translated_specs/spec/translator_spec.rb',
- 'translated_specs/spec/runner/formatter/html_formatter_spec.rb',
- 'translated_specs/spec/runner/option_parser_spec.rb'
- )
- t.spec_opts = ['--options', 'spec.opts']
- t.rcov = true
- t.rcov_dir = '../doc/output/coverage'
- t.rcov_opts = ['--exclude', 'spec\/spec,bin\/spec,examples']
+desc "Run all stories"
+task :stories do
+ html = 'story_server/prototype/rspec_stories.html'
+ ruby "stories/all.rb --colour --format plain --format html:#{html}"
+ unless IO.read(html) =~ //m
+ raise 'highlighted parameters are broken in story HTML'
+ end
end
desc "Run all specs and store html output in doc/output/report.html"
Spec::Rake::SpecTask.new('spec_html') do |t|
- t.spec_files = FileList['spec/**/*_spec.rb', 'vendor/RSpec.tmbundle/Support/spec/*_spec.rb']
+ t.spec_files = FileList['spec/**/*_spec.rb', '../../RSpec.tmbundle/Support/spec/*_spec.rb']
t.spec_opts = ['--format html:../doc/output/report.html','--backtrace']
end
desc "Run all failing examples"
Spec::Rake::SpecTask.new('failing_examples') do |t|
t.spec_files = FileList['failing_examples/**/*_spec.rb']
end
-desc 'Generate HTML documentation for website'
-task :webgen do
- core.webgen
-end
-
desc 'Generate RDoc'
rd = Rake::RDocTask.new do |rdoc|
rdoc.rdoc_dir = '../doc/output/rdoc'
rdoc.options << '--title' << 'RSpec' << '--line-numbers' << '--inline-source' << '--main' << 'README'
- rdoc.rdoc_files.include('README', 'CHANGES', 'MIT-LICENSE', 'EXAMPLES.rd', 'UPGRADE', 'lib/**/*.rb')
-end
-
-desc "Generate EXAMPLES.rb"
-task :rdoc do
- core.rdoc
+ rdoc.rdoc_files.include('README', 'CHANGES', 'MIT-LICENSE', 'UPGRADE', 'lib/**/*.rb')
end
spec = Gem::Specification.new do |s|
s.name = PKG_NAME
s.version = PKG_VERSION
s.summary = Spec::VERSION::DESCRIPTION
s.description = <<-EOF
RSpec is a behaviour driven development (BDD) framework for Ruby. RSpec was
created in response to Dave Astels' article _A New Look at Test Driven Development_
which can be read at: http://daveastels.com/index.php?p=5 RSpec is intended to
provide the features discussed in Dave's article.
EOF
s.files = PKG_FILES.to_a
s.require_path = 'lib'
s.has_rdoc = true
s.rdoc_options = rd.options
s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$|^EXAMPLES.rd$/ }.to_a
- s.autorequire = 'spec'
s.bindir = 'bin'
s.executables = ['spec', 'spec_translator']
s.default_executable = 'spec'
s.author = "RSpec Development Team"
s.email = "rspec-devel@rubyforge.org"
s.homepage = "http://rspec.rubyforge.org"
+ s.platform = Gem::Platform::RUBY
s.rubyforge_project = "rspec"
end
Rake::GemPackageTask.new(spec) do |pkg|
pkg.need_zip = true
pkg.need_tar = true
end
def egrep(pattern)
Dir['**/*.rb'].each do |fn|
count = 0
open(fn) do |f|
while line = f.gets
count += 1
if line =~ pattern
puts "#{fn}:#{count}:#{line}"
end
end
end
end
end
desc "Look for TODO and FIXME tags in the code"
task :todo do
egrep /(FIXME|TODO|TBD)/
end
task :clobber do
core.clobber
end
-task :release => [:clobber, :verify_committed, :verify_user, :spec, :publish_packages, :tag, :publish_website, :publish_news]
+task :release => [:clobber, :verify_committed, :verify_user, :spec, :publish_packages, :tag, :publish_news]
desc "Verifies that there is no uncommitted code"
task :verify_committed do
IO.popen('svn stat') do |io|
io.each_line do |line|
raise "\n!!! Do a svn commit first !!!\n\n" if line =~ /^\s*M\s*/
end
end
end
desc "Creates a tag in svn"
task :tag do
from = `svn info #{File.dirname(__FILE__)}`.match(/URL: (.*)\/rspec/n)[1]
to = from.gsub(/trunk/, "tags/#{Spec::VERSION::TAG}")
current = from.gsub(/trunk/, "tags/CURRENT")
puts "Creating tag in SVN"
tag_cmd = "svn cp #{from} #{to} -m \"Tag release #{Spec::VERSION::FULL_VERSION}\""
`#{tag_cmd}` ; raise "ERROR: #{tag_cmd}" unless $? == 0
puts "Removing CURRENT"
remove_current_cmd = "svn rm #{current} -m \"Remove tags/CURRENT\""
`#{remove_current_cmd}` ; raise "ERROR: #{remove_current_cmd}" unless $? == 0
puts "Re-Creating CURRENT"
create_current_cmd = "svn cp #{to} #{current} -m \"Copy #{Spec::VERSION::TAG} to tags/CURRENT\""
`#{create_current_cmd}` ; "ERROR: #{create_current_cmd}" unless $? == 0
end
desc "Run this task before you commit. You should see 'OK TO COMMIT'"
task(:pre_commit) {core.pre_commit}
desc "Build the website, but do not publish it"
task(:website) {core.website}
-task :rdoc_rails do
- core.rdoc_rails
-end
+task(:rdoc_rails) {core.rdoc_rails}
task :verify_user do
raise "RUBYFORGE_USER environment variable not set!" unless ENV['RUBYFORGE_USER']
end
desc "Upload Website to RubyForge"
task :publish_website => [:verify_user, :website] do
unless Spec::VERSION::RELEASE_CANDIDATE
publisher = Rake::SshDirPublisher.new(
"rspec-website@rubyforge.org",
"/var/www/gforge-projects/#{PKG_NAME}",
"../doc/output"
)
publisher.upload
else
puts "** Not publishing packages to RubyForge - this is a prerelease"
end
end
desc "Upload Website archive to RubyForge"
task :archive_website => [:verify_user, :website] do
publisher = Rake::SshDirPublisher.new(
"rspec-website@rubyforge.org",
"/var/www/gforge-projects/#{PKG_NAME}/#{Spec::VERSION::TAG}",
"../doc/output"
)
publisher.upload
end
desc "Package the Rails plugin"
task :package_rspec_on_rails do
mkdir 'pkg' rescue nil
rm_rf 'pkg/rspec_on_rails' rescue nil
`svn export ../rspec_on_rails pkg/rspec_on_rails-#{PKG_VERSION}`
Dir.chdir 'pkg' do
`tar cvzf rspec_on_rails-#{PKG_VERSION}.tgz rspec_on_rails-#{PKG_VERSION}`
end
end
task :pkg => :package_rspec_on_rails
desc "Package the RSpec.tmbundle"
task :package_tmbundle do
mkdir 'pkg' rescue nil
rm_rf 'pkg/RSpec.tmbundle' rescue nil
`svn export ../RSpec.tmbundle pkg/RSpec.tmbundle`
Dir.chdir 'pkg' do
`tar cvzf RSpec-#{PKG_VERSION}.tmbundle.tgz RSpec.tmbundle`
end
end
task :pkg => :package_tmbundle
-desc "Package the Spec::Ui gem"
-task :package_spec_ui do
- Dir.chdir '../spec_ui' do
- `rake clobber gem`
- end
-end
-task :pkg => :package_spec_ui
-
desc "Publish gem+tgz+zip on RubyForge. You must make sure lib/version.rb is aligned with the CHANGELOG file"
task :publish_packages => [:verify_user, :package] do
- require File.dirname(__FILE__) + '/../spec_ui/lib/spec/ui/version'
release_files = FileList[
"pkg/#{PKG_FILE_NAME}.gem",
"pkg/#{PKG_FILE_NAME}.tgz",
"pkg/rspec_on_rails-#{PKG_VERSION}.tgz",
"pkg/#{PKG_FILE_NAME}.zip",
- "pkg/RSpec-#{PKG_VERSION}.tmbundle.tgz",
- "../spec_ui/pkg/spec_ui-#{Spec::Ui::VERSION::STRING}.gem"
+ "pkg/RSpec-#{PKG_VERSION}.tmbundle.tgz"
]
unless Spec::VERSION::RELEASE_CANDIDATE
require 'meta_project'
require 'rake/contrib/xforge'
Rake::XForge::Release.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |xf|
# Never hardcode user name and password in the Rakefile!
xf.user_name = ENV['RUBYFORGE_USER']
xf.files = release_files.to_a
xf.release_name = "RSpec #{PKG_VERSION}"
end
else
puts "SINCE THIS IS A PRERELEASE, FILES ARE UPLOADED WITH SSH, NOT TO THE RUBYFORGE FILE SECTION"
puts "YOU MUST TYPE THE PASSWORD #{release_files.length} TIMES..."
host = "rspec-website@rubyforge.org"
remote_dir = "/var/www/gforge-projects/#{PKG_NAME}"
publisher = Rake::SshFilePublisher.new(
host,
remote_dir,
File.dirname(__FILE__),
*release_files
)
publisher.upload
puts "UPLADED THE FOLLOWING FILES:"
release_files.each do |file|
name = file.match(/pkg\/(.*)/)[1]
puts "* http://rspec.rubyforge.org/#{name}"
end
puts "They are not linked to anywhere, so don't forget to tell people!"
end
end
desc "Publish news on RubyForge"
task :publish_news => [:verify_user] do
unless Spec::VERSION::RELEASE_CANDIDATE
require 'meta_project'
require 'rake/contrib/xforge'
Rake::XForge::NewsPublisher.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |news|
# Never hardcode user name and password in the Rakefile!
news.user_name = ENV['RUBYFORGE_USER']
end
else
puts "** Not publishing news to RubyForge - this is a prerelease"
end
end
def core
PreCommit::Core.new(self)
end
diff --git a/vendor/gems/rspec/TODO b/vendor/gems/rspec/TODO
new file mode 100644
index 000000000..250bb66c2
--- /dev/null
+++ b/vendor/gems/rspec/TODO
@@ -0,0 +1,2 @@
+=== Before releasing 1.1.0:
+
diff --git a/vendor/gems/rspec/bin/spec b/vendor/gems/rspec/bin/spec
index a7e6ce0cb..283176d76 100755
--- a/vendor/gems/rspec/bin/spec
+++ b/vendor/gems/rspec/bin/spec
@@ -1,3 +1,4 @@
+#!/usr/bin/env ruby
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
require 'spec'
-::Spec::Runner::CommandLine.run(ARGV, STDERR, STDOUT, true, true)
+exit ::Spec::Runner::CommandLine.run(rspec_options)
diff --git a/vendor/gems/rspec/bin/spec_translator b/vendor/gems/rspec/bin/spec_translator
old mode 100644
new mode 100755
index 9df11dad2..abd50b743
--- a/vendor/gems/rspec/bin/spec_translator
+++ b/vendor/gems/rspec/bin/spec_translator
@@ -1,8 +1,8 @@
-#!/usr/bin/env ruby
-raise "\n\nUsage: spec_translator from_dir to_dir\n\n" if ARGV.size != 2
-$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
-require 'spec/translator'
-t = ::Spec::Translator.new
-from = ARGV[0]
-to = ARGV[1]
-t.translate(from, to)
+#!/usr/bin/env ruby
+raise "\n\nUsage: spec_translator from_dir to_dir\n\n" if ARGV.size != 2
+$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
+require 'spec/translator'
+t = ::Spec::Translator.new
+from = ARGV[0]
+to = ARGV[1]
+t.translate(from, to)
diff --git a/vendor/gems/rspec/examples/helper_method_example.rb b/vendor/gems/rspec/examples/helper_method_example.rb
deleted file mode 100644
index 5f94cf151..000000000
--- a/vendor/gems/rspec/examples/helper_method_example.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-require File.dirname(__FILE__) + '/spec_helper'
-
-describe "a context with helper a method" do
- def helper_method
- "received call"
- end
-
- it "should make that method available to specs" do
- helper_method.should == "received call"
- end
-end
diff --git a/vendor/gems/rspec/examples/multi_threaded_behaviour_runner.rb b/vendor/gems/rspec/examples/multi_threaded_behaviour_runner.rb
deleted file mode 100644
index e2824a61e..000000000
--- a/vendor/gems/rspec/examples/multi_threaded_behaviour_runner.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-
-class MultiThreadedBehaviourRunner < Spec::Runner::BehaviourRunner
- def initialize(options)
- super
- # configure these
- @thread_count = 4
- @thread_wait = 0
- end
-
- def run_behaviours(behaviours)
- @threads = []
- q = Queue.new
- behaviours.each { |b| q << b}
- @thread_count.times do
- @threads << Thread.new(q) do |queue|
- while not queue.empty?
- behaviour = queue.pop
- behaviour.run(@options.reporter, @options.dry_run, @options.reverse)
- end
- end
- sleep @thread_wait
- end
- @threads.each {|t| t.join}
- end
-end
diff --git a/vendor/gems/rspec/examples/auto_spec_description_example.rb b/vendor/gems/rspec/examples/pure/autogenerated_docstrings_example.rb
similarity index 100%
copy from vendor/gems/rspec/examples/auto_spec_description_example.rb
copy to vendor/gems/rspec/examples/pure/autogenerated_docstrings_example.rb
diff --git a/vendor/gems/rspec/examples/before_and_after_example.rb b/vendor/gems/rspec/examples/pure/before_and_after_example.rb
similarity index 92%
rename from vendor/gems/rspec/examples/before_and_after_example.rb
rename to vendor/gems/rspec/examples/pure/before_and_after_example.rb
index 09e3805fb..7db6274ef 100644
--- a/vendor/gems/rspec/examples/before_and_after_example.rb
+++ b/vendor/gems/rspec/examples/pure/before_and_after_example.rb
@@ -1,39 +1,40 @@
+require File.dirname(__FILE__) + '/spec_helper'
$global = 0
describe "State created in before(:all)" do
before :all do
@sideeffect = 1
$global +=1
end
before :each do
@isolated = 1
end
it "should be accessible from example" do
@sideeffect.should == 1
$global.should == 1
@isolated.should == 1
@sideeffect += 1
@isolated += 1
end
it "should not have sideffects" do
@sideeffect.should == 1
$global.should == 2
@isolated.should == 1
@sideeffect += 1
@isolated += 1
end
after :each do
$global += 1
end
after :all do
$global.should == 3
$global = 0
end
end
diff --git a/vendor/gems/rspec/examples/behave_as_example.rb b/vendor/gems/rspec/examples/pure/behave_as_example.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/gems/rspec/examples/behave_as_example.rb
rename to vendor/gems/rspec/examples/pure/behave_as_example.rb
diff --git a/vendor/gems/rspec/examples/custom_expectation_matchers.rb b/vendor/gems/rspec/examples/pure/custom_expectation_matchers.rb
similarity index 100%
rename from vendor/gems/rspec/examples/custom_expectation_matchers.rb
rename to vendor/gems/rspec/examples/pure/custom_expectation_matchers.rb
diff --git a/vendor/gems/rspec/examples/custom_formatter.rb b/vendor/gems/rspec/examples/pure/custom_formatter.rb
similarity index 89%
rename from vendor/gems/rspec/examples/custom_formatter.rb
rename to vendor/gems/rspec/examples/pure/custom_formatter.rb
index 851c9906f..c449fdc2e 100644
--- a/vendor/gems/rspec/examples/custom_formatter.rb
+++ b/vendor/gems/rspec/examples/pure/custom_formatter.rb
@@ -1,11 +1,12 @@
+require File.dirname(__FILE__) + '/spec_helper'
require 'spec/runner/formatter/progress_bar_formatter'
# Example of a formatter with custom bactrace printing. Run me with:
# ruby bin/spec failing_examples -r examples/custom_formatter.rb -f CustomFormatter
class CustomFormatter < Spec::Runner::Formatter::ProgressBarFormatter
def backtrace_line(line)
line.gsub(/([^:]*\.rb):(\d*)/) do
"#{$1}:#{$2} "
end
end
end
diff --git a/vendor/gems/rspec/examples/dynamic_spec.rb b/vendor/gems/rspec/examples/pure/dynamic_spec.rb
similarity index 100%
rename from vendor/gems/rspec/examples/dynamic_spec.rb
rename to vendor/gems/rspec/examples/pure/dynamic_spec.rb
diff --git a/vendor/gems/rspec/examples/file_accessor.rb b/vendor/gems/rspec/examples/pure/file_accessor.rb
similarity index 88%
rename from vendor/gems/rspec/examples/file_accessor.rb
rename to vendor/gems/rspec/examples/pure/file_accessor.rb
index 16bc45dbb..ff6fb743c 100644
--- a/vendor/gems/rspec/examples/file_accessor.rb
+++ b/vendor/gems/rspec/examples/pure/file_accessor.rb
@@ -1,18 +1,19 @@
+require File.dirname(__FILE__) + '/spec_helper'
class FileAccessor
def open_and_handle_with(pathname, processor)
pathname.open do |io|
processor.process(io)
end
end
end
if __FILE__ == $0
require File.dirname(__FILE__) + '/io_processor'
require 'pathname'
accessor = FileAccessor.new
io_processor = IoProcessor.new
file = Pathname.new ARGV[0]
accessor.open_and_handle_with(file, io_processor)
end
diff --git a/vendor/gems/rspec/examples/file_accessor_spec.rb b/vendor/gems/rspec/examples/pure/file_accessor_spec.rb
similarity index 100%
rename from vendor/gems/rspec/examples/file_accessor_spec.rb
rename to vendor/gems/rspec/examples/pure/file_accessor_spec.rb
diff --git a/vendor/gems/rspec/examples/greeter_spec.rb b/vendor/gems/rspec/examples/pure/greeter_spec.rb
similarity index 92%
rename from vendor/gems/rspec/examples/greeter_spec.rb
rename to vendor/gems/rspec/examples/pure/greeter_spec.rb
index 7d67e3187..ec7669dcc 100644
--- a/vendor/gems/rspec/examples/greeter_spec.rb
+++ b/vendor/gems/rspec/examples/pure/greeter_spec.rb
@@ -1,30 +1,31 @@
+require File.dirname(__FILE__) + '/spec_helper'
# greeter.rb
#
# Based on http://glu.ttono.us/articles/2006/12/19/tormenting-your-tests-with-heckle
#
# Run with:
#
# spec greeter_spec.rb --heckle Greeter
#
class Greeter
def initialize(person = nil)
@person = person
end
def greet
@person.nil? ? "Hi there!" : "Hi #{@person}!"
end
end
describe "Greeter" do
it "should say Hi to person" do
greeter = Greeter.new("Kevin")
greeter.greet.should == "Hi Kevin!"
end
it "should say Hi to nobody" do
greeter = Greeter.new
# Uncomment the next line to make Heckle happy
#greeter.greet.should == "Hi there!"
end
end
diff --git a/vendor/gems/rspec/examples/pure/helper_method_example.rb b/vendor/gems/rspec/examples/pure/helper_method_example.rb
new file mode 100644
index 000000000..d97f19e65
--- /dev/null
+++ b/vendor/gems/rspec/examples/pure/helper_method_example.rb
@@ -0,0 +1,14 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+module HelperMethodExample
+ describe "an example group with helper a method" do
+ def helper_method
+ "received call"
+ end
+
+ it "should make that method available to specs" do
+ helper_method.should == "received call"
+ end
+ end
+end
+
diff --git a/vendor/gems/rspec/examples/io_processor.rb b/vendor/gems/rspec/examples/pure/io_processor.rb
similarity index 100%
rename from vendor/gems/rspec/examples/io_processor.rb
rename to vendor/gems/rspec/examples/pure/io_processor.rb
diff --git a/vendor/gems/rspec/examples/io_processor_spec.rb b/vendor/gems/rspec/examples/pure/io_processor_spec.rb
similarity index 100%
rename from vendor/gems/rspec/examples/io_processor_spec.rb
rename to vendor/gems/rspec/examples/pure/io_processor_spec.rb
diff --git a/vendor/gems/rspec/examples/legacy_spec.rb b/vendor/gems/rspec/examples/pure/legacy_spec.rb
similarity index 70%
rename from vendor/gems/rspec/examples/legacy_spec.rb
rename to vendor/gems/rspec/examples/pure/legacy_spec.rb
index 61669e7e6..c86369515 100644
--- a/vendor/gems/rspec/examples/legacy_spec.rb
+++ b/vendor/gems/rspec/examples/pure/legacy_spec.rb
@@ -1,10 +1,11 @@
+require File.dirname(__FILE__) + '/spec_helper'
context "A legacy spec" do
setup do
end
specify "should work fine" do
end
teardown do
end
end
diff --git a/vendor/gems/rspec/examples/mocking_example.rb b/vendor/gems/rspec/examples/pure/mocking_example.rb
similarity index 100%
rename from vendor/gems/rspec/examples/mocking_example.rb
rename to vendor/gems/rspec/examples/pure/mocking_example.rb
diff --git a/vendor/gems/rspec/examples/pure/multi_threaded_behaviour_runner.rb b/vendor/gems/rspec/examples/pure/multi_threaded_behaviour_runner.rb
new file mode 100644
index 000000000..36edcd497
--- /dev/null
+++ b/vendor/gems/rspec/examples/pure/multi_threaded_behaviour_runner.rb
@@ -0,0 +1,28 @@
+class MultiThreadedExampleGroupRunner < Spec::Runner::ExampleGroupRunner
+ def initialize(options, arg)
+ super(options)
+ # configure these
+ @thread_count = 4
+ @thread_wait = 0
+ end
+
+ def run
+ @threads = []
+ q = Queue.new
+ example_groups.each { |b| q << b}
+ success = true
+ @thread_count.times do
+ @threads << Thread.new(q) do |queue|
+ while not queue.empty?
+ example_group = queue.pop
+ success &= example_group.suite.run(nil)
+ end
+ end
+ sleep @thread_wait
+ end
+ @threads.each {|t| t.join}
+ success
+ end
+end
+
+MultiThreadedBehaviourRunner = MultiThreadedExampleGroupRunner
\ No newline at end of file
diff --git a/vendor/gems/rspec/examples/pure/nested_classes_example.rb b/vendor/gems/rspec/examples/pure/nested_classes_example.rb
new file mode 100644
index 000000000..abe43b0a6
--- /dev/null
+++ b/vendor/gems/rspec/examples/pure/nested_classes_example.rb
@@ -0,0 +1,36 @@
+require File.dirname(__FILE__) + '/spec_helper'
+require File.dirname(__FILE__) + '/stack'
+
+class StackExamples < Spec::ExampleGroup
+ describe(Stack)
+ before(:each) do
+ @stack = Stack.new
+ end
+end
+
+class EmptyStackExamples < StackExamples
+ describe("when empty")
+ it "should be empty" do
+ @stack.should be_empty
+ end
+end
+
+class AlmostFullStackExamples < StackExamples
+ describe("when almost full")
+ before(:each) do
+ (1..9).each {|n| @stack.push n}
+ end
+ it "should be full" do
+ @stack.should_not be_full
+ end
+end
+
+class FullStackExamples < StackExamples
+ describe("when full")
+ before(:each) do
+ (1..10).each {|n| @stack.push n}
+ end
+ it "should be full" do
+ @stack.should be_full
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/examples/partial_mock_example.rb b/vendor/gems/rspec/examples/pure/partial_mock_example.rb
similarity index 100%
copy from vendor/gems/rspec/examples/partial_mock_example.rb
copy to vendor/gems/rspec/examples/pure/partial_mock_example.rb
diff --git a/vendor/gems/rspec/examples/pending_example.rb b/vendor/gems/rspec/examples/pure/pending_example.rb
similarity index 100%
rename from vendor/gems/rspec/examples/pending_example.rb
rename to vendor/gems/rspec/examples/pure/pending_example.rb
diff --git a/vendor/gems/rspec/examples/predicate_example.rb b/vendor/gems/rspec/examples/pure/predicate_example.rb
similarity index 100%
copy from vendor/gems/rspec/examples/predicate_example.rb
copy to vendor/gems/rspec/examples/pure/predicate_example.rb
diff --git a/vendor/gems/rspec/examples/priority.txt b/vendor/gems/rspec/examples/pure/priority.txt
similarity index 100%
rename from vendor/gems/rspec/examples/priority.txt
rename to vendor/gems/rspec/examples/pure/priority.txt
diff --git a/vendor/gems/rspec/examples/pure/shared_example_group_example.rb b/vendor/gems/rspec/examples/pure/shared_example_group_example.rb
new file mode 100644
index 000000000..fb81af1ec
--- /dev/null
+++ b/vendor/gems/rspec/examples/pure/shared_example_group_example.rb
@@ -0,0 +1,81 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+module SharedExampleGroupExample
+ class OneThing
+ def what_things_do
+ "stuff"
+ end
+ end
+
+ class AnotherThing
+ def what_things_do
+ "stuff"
+ end
+ end
+
+ class YetAnotherThing
+ def what_things_do
+ "stuff"
+ end
+ end
+
+ # A SharedExampleGroup is an example group that doesn't get run.
+ # You can create one like this:
+ share_examples_for "most things" do
+ def helper_method
+ "helper method"
+ end
+
+ it "should do what things do" do
+ @thing.what_things_do.should == "stuff"
+ end
+ end
+
+ # A SharedExampleGroup is also module. If you create one like this
+ # it gets assigned to the constant AllThings
+ share_as :MostThings do
+ def helper_method
+ "helper method"
+ end
+
+ it "should do what things do" do
+ @thing.what_things_do.should == "stuff"
+ end
+ end
+
+ describe OneThing do
+ # Now you can include the shared example group like this, which
+ # feels more like what you might say ...
+ it_should_behave_like "most things"
+
+ before(:each) { @thing = OneThing.new }
+
+ it "should have access to helper methods defined in the shared example group" do
+ helper_method.should == "helper method"
+ end
+ end
+
+ describe AnotherThing do
+ # ... or you can include the example group like this, which
+ # feels more like the programming language we love.
+ it_should_behave_like MostThings
+
+ before(:each) { @thing = AnotherThing.new }
+
+ it "should have access to helper methods defined in the shared example group" do
+ helper_method.should == "helper method"
+ end
+ end
+
+ describe YetAnotherThing do
+ # ... or you can include the example group like this, which
+ # feels more like the programming language we love.
+ include MostThings
+
+ before(:each) { @thing = AnotherThing.new }
+
+ it "should have access to helper methods defined in the shared example group" do
+ helper_method.should == "helper method"
+ end
+ end
+end
diff --git a/vendor/gems/rspec/examples/pure/shared_stack_examples.rb b/vendor/gems/rspec/examples/pure/shared_stack_examples.rb
new file mode 100644
index 000000000..7a0816250
--- /dev/null
+++ b/vendor/gems/rspec/examples/pure/shared_stack_examples.rb
@@ -0,0 +1,38 @@
+require File.join(File.dirname(__FILE__), *%w[spec_helper])
+
+shared_examples_for "non-empty Stack" do
+
+ it { @stack.should_not be_empty }
+
+ it "should return the top item when sent #peek" do
+ @stack.peek.should == @last_item_added
+ end
+
+ it "should NOT remove the top item when sent #peek" do
+ @stack.peek.should == @last_item_added
+ @stack.peek.should == @last_item_added
+ end
+
+ it "should return the top item when sent #pop" do
+ @stack.pop.should == @last_item_added
+ end
+
+ it "should remove the top item when sent #pop" do
+ @stack.pop.should == @last_item_added
+ unless @stack.empty?
+ @stack.pop.should_not == @last_item_added
+ end
+ end
+
+end
+
+shared_examples_for "non-full Stack" do
+
+ it { @stack.should_not be_full }
+
+ it "should add to the top when sent #push" do
+ @stack.push "newly added top item"
+ @stack.peek.should == "newly added top item"
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/examples/pure/spec_helper.rb b/vendor/gems/rspec/examples/pure/spec_helper.rb
new file mode 100644
index 000000000..1e880796c
--- /dev/null
+++ b/vendor/gems/rspec/examples/pure/spec_helper.rb
@@ -0,0 +1,3 @@
+lib_path = File.expand_path("#{File.dirname(__FILE__)}/../../lib")
+$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
+require 'spec'
diff --git a/vendor/gems/rspec/examples/stack.rb b/vendor/gems/rspec/examples/pure/stack.rb
similarity index 100%
rename from vendor/gems/rspec/examples/stack.rb
rename to vendor/gems/rspec/examples/pure/stack.rb
diff --git a/vendor/gems/rspec/examples/stack_spec.rb b/vendor/gems/rspec/examples/pure/stack_spec.rb
similarity index 58%
rename from vendor/gems/rspec/examples/stack_spec.rb
rename to vendor/gems/rspec/examples/pure/stack_spec.rb
index 22d8a652b..2a769da00 100644
--- a/vendor/gems/rspec/examples/stack_spec.rb
+++ b/vendor/gems/rspec/examples/pure/stack_spec.rb
@@ -1,97 +1,63 @@
require File.dirname(__FILE__) + '/spec_helper'
require File.dirname(__FILE__) + "/stack"
-
-describe "non-empty Stack", :shared => true do
- # NOTE that this one auto-generates the description "should not be empty"
- it { @stack.should_not be_empty }
-
- it "should return the top item when sent #peek" do
- @stack.peek.should == @last_item_added
- end
-
- it "should NOT remove the top item when sent #peek" do
- @stack.peek.should == @last_item_added
- @stack.peek.should == @last_item_added
- end
-
- it "should return the top item when sent #pop" do
- @stack.pop.should == @last_item_added
- end
-
- it "should remove the top item when sent #pop" do
- @stack.pop.should == @last_item_added
- unless @stack.empty?
- @stack.pop.should_not == @last_item_added
- end
- end
-end
-
-describe "non-full Stack", :shared => true do
- # NOTE that this one auto-generates the description "should not be full"
- it { @stack.should_not be_full }
-
- it "should add to the top when sent #push" do
- @stack.push "newly added top item"
- @stack.peek.should == "newly added top item"
- end
-end
+require File.dirname(__FILE__) + '/shared_stack_examples'
describe Stack, " (empty)" do
before(:each) do
@stack = Stack.new
end
# NOTE that this one auto-generates the description "should be empty"
it { @stack.should be_empty }
it_should_behave_like "non-full Stack"
it "should complain when sent #peek" do
lambda { @stack.peek }.should raise_error(StackUnderflowError)
end
it "should complain when sent #pop" do
lambda { @stack.pop }.should raise_error(StackUnderflowError)
end
end
describe Stack, " (with one item)" do
before(:each) do
@stack = Stack.new
@stack.push 3
@last_item_added = 3
end
it_should_behave_like "non-empty Stack"
it_should_behave_like "non-full Stack"
end
describe Stack, " (with one item less than capacity)" do
before(:each) do
@stack = Stack.new
(1..9).each { |i| @stack.push i }
@last_item_added = 9
end
it_should_behave_like "non-empty Stack"
it_should_behave_like "non-full Stack"
end
describe Stack, " (full)" do
before(:each) do
@stack = Stack.new
(1..10).each { |i| @stack.push i }
@last_item_added = 10
end
# NOTE that this one auto-generates the description "should be full"
it { @stack.should be_full }
it_should_behave_like "non-empty Stack"
it "should complain on #push" do
lambda { @stack.push Object.new }.should raise_error(StackOverflowError)
end
end
diff --git a/vendor/gems/rspec/examples/pure/stack_spec_with_nested_example_groups.rb b/vendor/gems/rspec/examples/pure/stack_spec_with_nested_example_groups.rb
new file mode 100644
index 000000000..05f6ad464
--- /dev/null
+++ b/vendor/gems/rspec/examples/pure/stack_spec_with_nested_example_groups.rb
@@ -0,0 +1,67 @@
+require File.dirname(__FILE__) + '/spec_helper'
+require File.dirname(__FILE__) + '/stack'
+require File.dirname(__FILE__) + '/shared_stack_examples'
+
+describe Stack do
+
+ before(:each) do
+ @stack = Stack.new
+ end
+
+ describe "(empty)" do
+
+ it { @stack.should be_empty }
+
+ it_should_behave_like "non-full Stack"
+
+ it "should complain when sent #peek" do
+ lambda { @stack.peek }.should raise_error(StackUnderflowError)
+ end
+
+ it "should complain when sent #pop" do
+ lambda { @stack.pop }.should raise_error(StackUnderflowError)
+ end
+
+ end
+
+ describe "(with one item)" do
+
+ before(:each) do
+ @stack.push 3
+ @last_item_added = 3
+ end
+
+ it_should_behave_like "non-empty Stack"
+ it_should_behave_like "non-full Stack"
+
+ end
+
+ describe "(with one item less than capacity)" do
+
+ before(:each) do
+ (1..9).each { |i| @stack.push i }
+ @last_item_added = 9
+ end
+
+ it_should_behave_like "non-empty Stack"
+ it_should_behave_like "non-full Stack"
+ end
+
+ describe "(full)" do
+
+ before(:each) do
+ (1..10).each { |i| @stack.push i }
+ @last_item_added = 10
+ end
+
+ it { @stack.should be_full }
+
+ it_should_behave_like "non-empty Stack"
+
+ it "should complain on #push" do
+ lambda { @stack.push Object.new }.should raise_error(StackOverflowError)
+ end
+
+ end
+
+end
diff --git a/vendor/gems/rspec/examples/stubbing_example.rb b/vendor/gems/rspec/examples/pure/stubbing_example.rb
similarity index 100%
rename from vendor/gems/rspec/examples/stubbing_example.rb
rename to vendor/gems/rspec/examples/pure/stubbing_example.rb
diff --git a/vendor/gems/rspec/examples/shared_behaviours_example.rb b/vendor/gems/rspec/examples/shared_behaviours_example.rb
deleted file mode 100644
index 33c924643..000000000
--- a/vendor/gems/rspec/examples/shared_behaviours_example.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-require File.dirname(__FILE__) + '/spec_helper'
-
-module SharedBehaviourExample
- class OneThing
- def what_things_do
- "stuff"
- end
- end
-
- class AnotherThing
- def what_things_do
- "stuff"
- end
- end
-
- describe "All Things", :shared => true do
- def helper_method
- "helper method"
- end
-
- it "should do what things do" do
- @thing.what_things_do.should == "stuff"
- end
- end
-
- describe OneThing do
- it_should_behave_like "All Things"
- before(:each) { @thing = OneThing.new }
-
- it "should have access to helper methods defined in the shared behaviour" do
- helper_method.should == "helper method"
- end
- end
-
- describe AnotherThing do
- it_should_behave_like "All Things"
- before(:each) { @thing = AnotherThing.new }
- end
-end
diff --git a/vendor/gems/rspec/examples/spec_helper.rb b/vendor/gems/rspec/examples/spec_helper.rb
deleted file mode 100644
index 61f51fbdb..000000000
--- a/vendor/gems/rspec/examples/spec_helper.rb
+++ /dev/null
@@ -1 +0,0 @@
-require File.dirname(__FILE__) + '/../lib/spec'
diff --git a/vendor/gems/rspec/examples/stories/adder.rb b/vendor/gems/rspec/examples/stories/adder.rb
new file mode 100644
index 000000000..0b027b0ff
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/adder.rb
@@ -0,0 +1,13 @@
+class Adder
+ def initialize
+ @addends = []
+ end
+
+ def <<(val)
+ @addends << val
+ end
+
+ def sum
+ @addends.inject(0) { |sum_so_far, val| sum_so_far + val }
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/examples/stories/addition b/vendor/gems/rspec/examples/stories/addition
new file mode 100644
index 000000000..58f092990
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/addition
@@ -0,0 +1,34 @@
+This is a story about a calculator. The text up here above the Story: declaration
+won't be processed, so you can write whatever you wish!
+
+Story: simple addition
+
+ As an accountant
+ I want to add numbers
+ So that I can count beans
+
+ Scenario: add one plus one
+ Given an addend of 1
+ And an addend of 1
+
+ When the addends are addeds
+
+ Then the sum should be 3
+ And the corks should be popped
+
+ Scenario: add two plus five
+ Given an addend of 2
+ And an addend of 5
+
+ When the addends are added
+
+ Then the sum should be 7
+ Then it should snow
+
+ Scenario: add three more
+ GivenScenario add two plus five
+ And an addend of 3
+
+ When the addends are added
+
+ Then the sum should be 10
diff --git a/vendor/gems/rspec/examples/stories/addition.rb b/vendor/gems/rspec/examples/stories/addition.rb
new file mode 100644
index 000000000..e43f5cf39
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/addition.rb
@@ -0,0 +1,9 @@
+require File.join(File.dirname(__FILE__), "helper")
+require File.join(File.dirname(__FILE__), "adder")
+
+# with_steps_for :addition, :more_addition do
+with_steps_for :addition, :more_addition do
+ # Then("the corks should be popped") { }
+ run File.expand_path(__FILE__).gsub(".rb","")
+end
+
diff --git a/vendor/gems/rspec/examples/stories/calculator.rb b/vendor/gems/rspec/examples/stories/calculator.rb
new file mode 100644
index 000000000..390437c55
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/calculator.rb
@@ -0,0 +1,65 @@
+$:.push File.join(File.dirname(__FILE__), *%w[.. .. lib])
+require 'spec'
+
+class AdditionMatchers < Spec::Story::StepGroup
+ steps do |add|
+ add.given("an addend of $addend") do |addend|
+ @adder ||= Adder.new
+ @adder << addend.to_i
+ end
+ end
+end
+
+steps = AdditionMatchers.new do |add|
+ add.then("the sum should be $sum") do |sum|
+ @sum.should == sum.to_i
+ end
+end
+
+steps.when("they are added") do
+ @sum = @adder.sum
+end
+
+# This Story uses steps (see above) instead of blocks
+# passed to Given, When and Then
+
+Story "addition", %{
+ As an accountant
+ I want to add numbers
+ So that I can count some beans
+}, :steps => steps do
+ Scenario "2 + 3" do
+ Given "an addend of 2"
+ And "an addend of 3"
+ When "they are added"
+ Then "the sum should be 5"
+ end
+
+ # This scenario uses GivenScenario, which silently runs
+ # all the steps in a previous scenario.
+
+ Scenario "add 4 more" do
+ GivenScenario "2 + 3"
+ Given "an addend of 4"
+ When "they are added"
+ Then "the sum should be 9"
+ end
+end
+
+# And the class that makes the story pass
+
+class Adder
+ def << addend
+ addends << addend
+ end
+
+ def sum
+ @addends.inject(0) do |result, addend|
+ result + addend.to_i
+ end
+ end
+
+ def addends
+ @addends ||= []
+ end
+end
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/README.txt b/vendor/gems/rspec/examples/stories/game-of-life/README.txt
new file mode 100644
index 000000000..9624ad411
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/README.txt
@@ -0,0 +1,21 @@
+John Conway's Game of Life
+
+The Rules
+---------
+The Game of Life was invented by John Conway (as you might have gathered).
+The game is played on a field of cells, each of which has eight neighbors (adjacent cells).
+A cell is either occupied (by an organism) or not.
+The rules for deriving a generation from the previous one are these:
+
+Survival
+--------
+If an occupied cell has 2 or 3 neighbors, the organism survives to the next generation.
+
+Death
+-----
+If an occupied cell has 0, 1, 4, 5, 6, 7, or 8 occupied neighbors, the organism dies
+(0, 1: of loneliness; 4 thru 8: of overcrowding).
+
+Birth
+-----
+If an unoccupied cell has 3 occupied neighbors, it becomes occupied.
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/everything.rb b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/everything.rb
new file mode 100644
index 000000000..90a281da5
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/everything.rb
@@ -0,0 +1,6 @@
+$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'lib')
+$:.unshift File.join(File.dirname(__FILE__), '..')
+
+require 'spec'
+require 'behaviour/examples/examples'
+require 'behaviour/stories/stories'
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/examples/examples.rb b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/examples/examples.rb
new file mode 100644
index 000000000..1cadfb3c1
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/examples/examples.rb
@@ -0,0 +1,3 @@
+require 'spec'
+require 'behaviour/examples/game_behaviour'
+require 'behaviour/examples/grid_behaviour'
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb
new file mode 100644
index 000000000..ff5b357f0
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb
@@ -0,0 +1,35 @@
+require 'life'
+
+describe Game do
+ it 'should have a grid' do
+ # given
+ game = Game.new(5, 5)
+
+ # then
+ game.grid.should be_kind_of(Grid)
+ end
+
+ it 'should create a cell' do
+ # given
+ game = Game.new(2, 2)
+ expected_grid = Grid.from_string( 'X. ..' )
+
+ # when
+ game.create_at(0, 0)
+
+ # then
+ game.grid.should == expected_grid
+ end
+
+ it 'should destroy a cell' do
+ # given
+ game = Game.new(2,2)
+ game.grid = Grid.from_string('X. ..')
+
+ # when
+ game.destroy_at(0,0)
+
+ # then
+ game.grid.should == Grid.from_string('.. ..')
+ end
+end
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb
new file mode 100644
index 000000000..5be3af519
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb
@@ -0,0 +1,66 @@
+describe Grid do
+ it 'should be empty when created' do
+ # given
+ expected_contents = [
+ [0, 0, 0],
+ [0, 0, 0]
+ ]
+ grid = Grid.new(2, 3)
+
+ # when
+ contents = grid.contents
+
+ # then
+ contents.should == expected_contents
+ end
+
+ it 'should compare equal based on its contents' do
+ # given
+ grid1 = Grid.new(2, 3)
+ grid2 = Grid.new(2, 3)
+
+ # then
+ grid1.should == grid2
+ end
+
+ it 'should be able to replace its contents' do
+ # given
+ grid = Grid.new(2,2)
+ new_contents = [[0,1,0], [1,0,1]]
+
+ # when
+ grid.contents = new_contents
+
+ # then
+ grid.contents.should == new_contents
+ grid.rows.should == 2
+ grid.columns.should == 3
+ end
+
+ it 'should add an organism' do
+ # given
+ grid = Grid.new(2, 2)
+ expected = Grid.new(2, 2)
+ expected.contents = [[1,0],[0,0]]
+
+ # when
+ grid.create_at(0,0)
+
+ # then
+ grid.should == expected
+ end
+
+ it 'should create itself from a string' do
+ # given
+ expected = Grid.new 3, 3
+ expected.create_at(0,0)
+ expected.create_at(1,0)
+ expected.create_at(2,2)
+
+ # when
+ actual = Grid.from_string "X.. X.. ..X"
+
+ # then
+ actual.should == expected
+ end
+end
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story
new file mode 100644
index 000000000..8374e86c5
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story
@@ -0,0 +1,21 @@
+Story: cells with less than two neighbours die
+
+As a game producer
+I want cells with less than two neighbours to die
+So that I can illustrate how the game works to people with money
+
+Scenario: cells with zero or one neighbour die
+
+Given the grid looks like
+........
+.XX.XX..
+.XX.....
+....X...
+........
+When the next step occurs
+Then the grid should look like
+........
+.XX.....
+.XX.....
+........
+........
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story
new file mode 100644
index 000000000..0d30b59be
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story
@@ -0,0 +1,21 @@
+Story: cells with more than three neighbours die
+
+As a game producer
+I want cells with more than three neighbours to die
+So that I can show the people with money how we are getting on
+
+Scenario: blink
+
+Given the grid looks like
+.....
+...XX
+...XX
+.XX..
+.XX..
+When the next step occurs
+Then the grid should look like
+.....
+...XX
+....X
+.X...
+.XX..
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story
new file mode 100644
index 000000000..cbc248e73
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story
@@ -0,0 +1,42 @@
+Story: Empty spaces with three neighbours create a cell
+
+As a game producer
+I want empty cells with three neighbours to die
+So that I have a minimum feature set to ship
+
+Scenario: the glider
+
+Given the grid looks like
+...X..
+..X...
+..XXX.
+......
+......
+When the next step occurs
+Then the grid should look like
+......
+..X.X.
+..XX..
+...X..
+......
+When the next step occurs
+Then the grid should look like
+......
+..X...
+..X.X.
+..XX..
+......
+When the next step occurs
+Then the grid should look like
+......
+...X..
+.XX...
+..XX..
+......
+When the next step occurs
+Then the grid should look like
+......
+..X...
+.X....
+.XXX..
+......
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story
new file mode 100644
index 000000000..88895cb69
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story
@@ -0,0 +1,42 @@
+Story: I can create a cell
+
+As a game producer
+I want to create a cell
+So that I can show the grid to people
+
+Scenario: nothing to see here
+
+Given a 3 x 3 game
+Then the grid should look like
+...
+...
+...
+
+Scenario: all on its lonesome
+
+Given a 3 x 3 game
+When I create a cell at 1, 1
+Then the grid should look like
+...
+.X.
+...
+
+Scenario: the grid has three cells
+
+Given a 3 x 3 game
+When I create a cell at 0, 0
+and I create a cell at 0, 1
+and I create a cell at 2, 2
+Then the grid should look like
+XX.
+...
+..X
+
+Scenario: more cells more more
+
+Given the grid has three cells
+When I create a celll at 3, 1
+Then the grid should look like
+XX.
+..X
+..X
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story
new file mode 100644
index 000000000..a9cf1ac64
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story
@@ -0,0 +1,17 @@
+Story: I can kill a cell
+
+As a game producer
+I want to kill a cell
+So that when I make a mistake I dont have to start again
+
+Scenario: bang youre dead
+
+Given the grid looks like
+XX.
+.X.
+..X
+When I destroy the cell at 0, 1
+Then the grid should look like
+X..
+.X.
+..X
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story
new file mode 100644
index 000000000..aeeede77d
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story
@@ -0,0 +1,53 @@
+Story: The grid wraps
+
+As a game player
+I want the grid to wrap
+So that untidy stuff at the edges is avoided
+
+Scenario: crowded in the corners
+
+Given the grid looks like
+X.X
+...
+X.X
+When the next step is taken
+Then the grid should look like
+X.X
+...
+X.X
+
+
+Scenario: the glider returns
+
+Given the glider
+......
+..X...
+.X....
+.XXX..
+......
+When the next step is taken
+and the next step is taken
+and the next step is taken
+and the next step is taken
+Then the grid should look like
+......
+......
+.X....
+X.....
+XXX...
+When the next step is taken
+Then the grid should look like
+.X....
+......
+......
+X.X...
+XX....
+When the next step is taken
+Then the grid should look like
+XX....
+......
+......
+X.....
+X.X...
+
+
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb
new file mode 100644
index 000000000..81f86baba
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb
@@ -0,0 +1,52 @@
+require File.join(File.dirname(__FILE__), *%w[helper])
+
+Story "I can create a cell",
+ %(As a game producer
+ I want to create a cell
+ So that I can show the grid to people), :steps_for => :life do
+
+ Scenario "nothing to see here" do
+ Given "a game with dimensions", 3, 3 do |rows,cols|
+ @game = Game.new(rows,cols)
+ end
+
+ Then "the grid should look like", %(
+ ...
+ ...
+ ...
+ )
+ end
+
+ Scenario "all on its lonesome" do
+ Given "a game with dimensions", 2, 2
+ When "I create a cell at", 1, 1 do |row,col|
+ @game.create_at(row,col)
+ end
+ Then "the grid should look like", %(
+ ..
+ .X
+ )
+ end
+
+ Scenario "the grid has three cells" do
+ Given "a game with dimensions", 3, 3
+ When "I create a cell at", 0, 0
+ When "I create a cell at", 0, 1
+ When "I create a cell at", 2, 2
+ Then "the grid should look like", %(
+ XX.
+ ...
+ ..X
+ )
+ end
+
+ Scenario "more cells more more" do
+ GivenScenario "the grid has three cells"
+ When "I create a cell at", 2, 0
+ Then "the grid should look like", %(
+ XX.
+ ...
+ X.X
+ )
+ end
+end
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/helper.rb b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/helper.rb
new file mode 100644
index 000000000..70ed21ec5
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/helper.rb
@@ -0,0 +1,6 @@
+dir = File.dirname(__FILE__)
+$LOAD_PATH.unshift(File.expand_path("#{dir}/../../../../../../rspec/lib"))
+require 'spec'
+$LOAD_PATH.unshift(File.expand_path("#{dir}/../../"))
+require "#{dir}/../../life"
+require File.join(File.dirname(__FILE__), *%w[steps])
\ No newline at end of file
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb
new file mode 100644
index 000000000..7ae2d912d
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb
@@ -0,0 +1,26 @@
+require File.join(File.dirname(__FILE__), *%w[helper])
+
+Story 'I can kill a cell',
+ %(As a game producer
+ I want to kill a cell
+ So that when I make a mistake I don't have to start again), :steps_for => :life do
+
+ Scenario "bang, you're dead" do
+
+ Given 'a game that looks like', %(
+ XX.
+ .X.
+ ..X
+ ) do |dots|
+ @game = Game.from_string dots
+ end
+ When 'I destroy the cell at', 0, 1 do |row,col|
+ @game.destroy_at(row,col)
+ end
+ Then 'the grid should look like', %(
+ X..
+ .X.
+ ..X
+ )
+ end
+end
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/steps.rb b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/steps.rb
new file mode 100644
index 000000000..793590d70
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/steps.rb
@@ -0,0 +1,5 @@
+steps_for :life do
+ Then "the grid should look like" do |dots|
+ @game.grid.should == Grid.from_string(dots)
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/stories.rb b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/stories.rb
new file mode 100644
index 000000000..e60fe01de
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/stories.rb
@@ -0,0 +1,3 @@
+require File.join(File.dirname(__FILE__), *%w[helper])
+require 'behaviour/stories/create_a_cell'
+require 'behaviour/stories/kill_a_cell'
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/stories.txt b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/stories.txt
new file mode 100644
index 000000000..d8f809be3
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/behaviour/stories/stories.txt
@@ -0,0 +1,22 @@
+Story: Show the game field
+ As a game player
+ I want to see the field
+ so that I can observe the progress of the organisms
+
+Scenario: an empty field
+ Given a new game starts
+ When the game displays the field
+ Then the field should be empty
+
+
+
+
+
+StoryBuilder story = stories.createStory().called("a story")
+ .asA("person")
+ .iWant("to do something")
+ .soThat("I can rule the world");
+story.addScenario().called("happy path").as()
+ .given("some context")
+ .when("some event happens")
+ .then("expect some outcome");
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/life.rb b/vendor/gems/rspec/examples/stories/game-of-life/life.rb
new file mode 100644
index 000000000..88263bd00
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/life.rb
@@ -0,0 +1,3 @@
+$: << File.dirname(__FILE__)
+require 'life/game'
+require 'life/grid'
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/life/game.rb b/vendor/gems/rspec/examples/stories/game-of-life/life/game.rb
new file mode 100644
index 000000000..5411b01bf
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/life/game.rb
@@ -0,0 +1,23 @@
+class Game
+ attr_accessor :grid
+ def initialize(rows,cols)
+ @grid = Grid.new(rows, cols)
+ end
+
+ def create_at(row,col)
+ @grid.create_at(row,col)
+ end
+
+ def destroy_at(row,col)
+ @grid.destroy_at(row, col)
+ end
+
+ def self.from_string(dots)
+ grid = Grid.from_string(dots)
+ game = new(grid.rows, grid.columns)
+ game.instance_eval do
+ @grid = grid
+ end
+ return game
+ end
+end
diff --git a/vendor/gems/rspec/examples/stories/game-of-life/life/grid.rb b/vendor/gems/rspec/examples/stories/game-of-life/life/grid.rb
new file mode 100644
index 000000000..aca23087c
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/game-of-life/life/grid.rb
@@ -0,0 +1,43 @@
+class Grid
+
+ attr_accessor :contents
+
+ def initialize(rows, cols)
+ @contents = []
+ rows.times do @contents << [0] * cols end
+ end
+
+ def rows
+ @contents.size
+ end
+
+ def columns
+ @contents[0].size
+ end
+
+ def ==(other)
+ self.contents == other.contents
+ end
+
+ def create_at(row,col)
+ @contents[row][col] = 1
+ end
+
+ def destroy_at(row,col)
+ @contents[row][col] = 0
+ end
+
+ def self.from_string(str)
+ row_strings = str.split(' ')
+ grid = new(row_strings.size, row_strings[0].size)
+
+ row_strings.each_with_index do |row, row_index|
+ row_chars = row.split(//)
+ row_chars.each_with_index do |col_char, col_index|
+ grid.create_at(row_index, col_index) if col_char == 'X'
+ end
+ end
+ return grid
+ end
+
+end
diff --git a/vendor/gems/rspec/examples/stories/helper.rb b/vendor/gems/rspec/examples/stories/helper.rb
new file mode 100644
index 000000000..2e825b278
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/helper.rb
@@ -0,0 +1,9 @@
+$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
+require 'spec/story'
+
+# won't have to do this once plain_text_story_runner is moved into the library
+# require File.join(File.dirname(__FILE__), "plain_text_story_runner")
+
+Dir[File.join(File.dirname(__FILE__), "steps/*.rb")].each do |file|
+ require file
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/examples/stories/steps/addition_steps.rb b/vendor/gems/rspec/examples/stories/steps/addition_steps.rb
new file mode 100644
index 000000000..3f27095a9
--- /dev/null
+++ b/vendor/gems/rspec/examples/stories/steps/addition_steps.rb
@@ -0,0 +1,18 @@
+require File.expand_path("#{File.dirname(__FILE__)}/../helper")
+
+# This creates steps for :addition
+steps_for(:addition) do
+ Given("an addend of $addend") do |addend|
+ @adder ||= Adder.new
+ @adder << addend.to_i
+ end
+end
+
+# This appends to them
+steps_for(:addition) do
+ When("the addends are added") { @sum = @adder.sum }
+end
+
+steps_for(:more_addition) do
+ Then("the sum should be $sum") { |sum| @sum.should == sum.to_i }
+end
diff --git a/vendor/gems/rspec/examples/test_case_adapter_example.rb b/vendor/gems/rspec/examples/test_case_adapter_example.rb
deleted file mode 100644
index 02ba3be17..000000000
--- a/vendor/gems/rspec/examples/test_case_adapter_example.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-#This is an example of using RSpec's expectations in test/unit.
-$LOAD_PATH.unshift File.join(File.dirname(__FILE__), "..", "lib")
-
-require 'test/unit'
-require 'spec/test_case_adapter'
-
-class IntegratingRSpecExpectationsIntoTestCaseTest < Test::Unit::TestCase
-
- def test_should_support_rspecs_equality_expectations
- 5.should == 5
- end
-
- def test_should_support_rspecs_comparison_expectations
- 5.should be > 4
- end
-
- class Band
- def players
- ["John", "Paul", "George", "Ringo"]
- end
- end
-
- def test_should_support_rspecs_collection_expectations
- Band.new.should have(4).players
- end
-end
diff --git a/vendor/gems/rspec/examples/test_case_spec.rb b/vendor/gems/rspec/examples/test_case_spec.rb
deleted file mode 100644
index 4ffa2c598..000000000
--- a/vendor/gems/rspec/examples/test_case_spec.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-require File.dirname(__FILE__) + '/spec_helper'
-require 'test/unit'
-
-class RSpecIntegrationTest < Test::Unit::TestCase
- def self.fixtures(*args)
- @@fixtures = true
- end
-
- def self.verify_class_method
- @@fixtures.should == true
- end
-
- def setup
- @test_case_setup_called = true
- end
-
- def teardown
- @test_case_teardown_called = true
- end
-
- def run(result)
- end
-
- def helper_method
- @helper_method_called = true
- end
-end
-
-module RandomHelperModule
- def random_task
- @random_task_called = true
- end
-end
-
-describe "RSpec should integrate with Test::Unit::TestCase" do
- inherit RSpecIntegrationTest
- include RandomHelperModule
-
- fixtures :some_table
-
- prepend_before(:each) {setup}
-
- before(:each) do
- @rspec_setup_called = true
- end
-
- it "TestCase#setup should be called." do
- @test_case_setup_called.should be_true
- @rspec_setup_called.should be_true
- end
-
- it "RSpec should be able to access TestCase methods" do
- helper_method
- @helper_method_called.should be_true
- end
-
- it "RSpec should be able to accept included modules" do
- random_task
- @random_task_called.should be_true
- end
-
- after(:each) do
- RSpecIntegrationTest.verify_class_method
- end
-end
diff --git a/vendor/gems/rspec/failing_examples/README.txt b/vendor/gems/rspec/failing_examples/README.txt
new file mode 100644
index 000000000..38c667d92
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/README.txt
@@ -0,0 +1,7 @@
+"Why have failing examples?", you might ask.
+
+They allow us to see failure messages. RSpec wants to provide meaningful and helpful failure messages. The failures in this directory not only provide you a way of seeing the failure messages, but they provide RSpec's own specs a way of describing what they should look like and ensuring they stay correct.
+
+To see the types of messages you can expect, stand in this directory and run:
+
+../bin/spec ./*.rb
\ No newline at end of file
diff --git a/vendor/gems/rspec/failing_examples/diffing_spec.rb b/vendor/gems/rspec/failing_examples/diffing_spec.rb
new file mode 100644
index 000000000..85e13e8c0
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/diffing_spec.rb
@@ -0,0 +1,36 @@
+describe "Running specs with --diff" do
+ it "should print diff of different strings" do
+ uk = <<-EOF
+RSpec is a
+behaviour driven development
+framework for Ruby
+EOF
+ usa = <<-EOF
+RSpec is a
+behavior driven development
+framework for Ruby
+EOF
+ usa.should == uk
+ end
+
+ class Animal
+ def initialize(name,species)
+ @name,@species = name,species
+ end
+
+ def inspect
+ <<-EOA
+
+ EOA
+ end
+ end
+
+ it "should print diff of different objects' pretty representation" do
+ expected = Animal.new "bob", "giraffe"
+ actual = Animal.new "bob", "tortoise"
+ expected.should eql(actual)
+ end
+end
diff --git a/vendor/gems/rspec/examples/auto_spec_description_example.rb b/vendor/gems/rspec/failing_examples/failing_autogenerated_docstrings_example.rb
similarity index 56%
rename from vendor/gems/rspec/examples/auto_spec_description_example.rb
rename to vendor/gems/rspec/failing_examples/failing_autogenerated_docstrings_example.rb
index a4928ef4a..8a7d2490e 100644
--- a/vendor/gems/rspec/examples/auto_spec_description_example.rb
+++ b/vendor/gems/rspec/failing_examples/failing_autogenerated_docstrings_example.rb
@@ -1,19 +1,19 @@
require File.dirname(__FILE__) + '/spec_helper'
# Run spec w/ -fs to see the output of this file
-describe "Examples with no descriptions" do
+describe "Failing examples with no descriptions" do
# description is auto-generated as "should equal(5)" based on the last #should
it do
- 3.should equal(3)
+ 3.should equal(2)
5.should equal(5)
end
- it { 3.should be < 5 }
+ it { 3.should be > 5 }
- it { ["a"].should include("a") }
+ it { ["a"].should include("b") }
- it { [1,2,3].should respond_to(:size) }
+ it { [1,2,3].should_not respond_to(:size) }
end
diff --git a/vendor/gems/rspec/failing_examples/failure_in_setup.rb b/vendor/gems/rspec/failing_examples/failure_in_setup.rb
new file mode 100644
index 000000000..2a807a99a
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/failure_in_setup.rb
@@ -0,0 +1,10 @@
+describe "This example" do
+
+ before(:each) do
+ NonExistentClass.new
+ end
+
+ it "should be listed as failing in setup" do
+ end
+
+end
diff --git a/vendor/gems/rspec/failing_examples/failure_in_teardown.rb b/vendor/gems/rspec/failing_examples/failure_in_teardown.rb
new file mode 100644
index 000000000..6458ea2b8
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/failure_in_teardown.rb
@@ -0,0 +1,10 @@
+describe "This example" do
+
+ it "should be listed as failing in teardown" do
+ end
+
+ after(:each) do
+ NonExistentClass.new
+ end
+
+end
diff --git a/vendor/gems/rspec/failing_examples/mocking_example.rb b/vendor/gems/rspec/failing_examples/mocking_example.rb
new file mode 100644
index 000000000..caf2db036
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/mocking_example.rb
@@ -0,0 +1,40 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+describe "Mocker" do
+
+ it "should be able to call mock()" do
+ mock = mock("poke me")
+ mock.should_receive(:poke)
+ mock.poke
+ end
+
+ it "should fail when expected message not received" do
+ mock = mock("poke me")
+ mock.should_receive(:poke)
+ end
+
+ it "should fail when messages are received out of order" do
+ mock = mock("one two three")
+ mock.should_receive(:one).ordered
+ mock.should_receive(:two).ordered
+ mock.should_receive(:three).ordered
+ mock.one
+ mock.three
+ mock.two
+ end
+
+ it "should get yelled at when sending unexpected messages" do
+ mock = mock("don't talk to me")
+ mock.should_not_receive(:any_message_at_all)
+ mock.any_message_at_all
+ end
+
+ it "has a bug we need to fix" do
+ pending "here is the bug" do
+ # Actually, no. It's fixed. This will fail because it passes :-)
+ mock = mock("Bug")
+ mock.should_receive(:hello)
+ mock.hello
+ end
+ end
+end
diff --git a/vendor/gems/rspec/failing_examples/mocking_with_flexmock.rb b/vendor/gems/rspec/failing_examples/mocking_with_flexmock.rb
new file mode 100644
index 000000000..6e79ece0e
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/mocking_with_flexmock.rb
@@ -0,0 +1,26 @@
+# stub frameworks like to gum up Object, so this is deliberately
+# set NOT to run so that you don't accidentally run it when you
+# run this dir.
+
+# To run it, stand in this directory and say:
+#
+# RUN_FLEXMOCK_EXAMPLE=true ruby ../bin/spec mocking_with_flexmock.rb
+
+if ENV['RUN_FLEXMOCK_EXAMPLE']
+ Spec::Runner.configure do |config|
+ config.mock_with :flexmock
+ end
+
+ describe "Flexmocks" do
+ it "should fail when the expected message is received with wrong arguments" do
+ m = flexmock("now flex!")
+ m.should_receive(:msg).with("arg").once
+ m.msg("other arg")
+ end
+
+ it "should fail when the expected message is not received at all" do
+ m = flexmock("now flex!")
+ m.should_receive(:msg).with("arg").once
+ end
+ end
+end
diff --git a/vendor/gems/rspec/failing_examples/mocking_with_mocha.rb b/vendor/gems/rspec/failing_examples/mocking_with_mocha.rb
new file mode 100644
index 000000000..f14a1a3e5
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/mocking_with_mocha.rb
@@ -0,0 +1,25 @@
+# stub frameworks like to gum up Object, so this is deliberately
+# set NOT to run so that you don't accidentally run it when you
+# run this dir.
+
+# To run it, stand in this directory and say:
+#
+# RUN_MOCHA_EXAMPLE=true ruby ../bin/spec mocking_with_mocha.rb
+
+if ENV['RUN_MOCHA_EXAMPLE']
+ Spec::Runner.configure do |config|
+ config.mock_with :mocha
+ end
+ describe "Mocha framework" do
+ it "should should be made available by saying config.mock_with :mocha" do
+ m = mock()
+ m.expects(:msg).with("arg")
+ m.msg
+ end
+ it "should should be made available by saying config.mock_with :mocha" do
+ o = Object.new
+ o.expects(:msg).with("arg")
+ o.msg
+ end
+ end
+end
diff --git a/vendor/gems/rspec/failing_examples/mocking_with_rr.rb b/vendor/gems/rspec/failing_examples/mocking_with_rr.rb
new file mode 100644
index 000000000..0d2b4fe04
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/mocking_with_rr.rb
@@ -0,0 +1,27 @@
+# stub frameworks like to gum up Object, so this is deliberately
+# set NOT to run so that you don't accidentally run it when you
+# run this dir.
+
+# To run it, stand in this directory and say:
+#
+# RUN_RR_EXAMPLE=true ruby ../bin/spec mocking_with_rr.rb
+
+if ENV['RUN_RR_EXAMPLE']
+ Spec::Runner.configure do |config|
+ config.mock_with :rr
+ end
+ describe "RR framework" do
+ it "should should be made available by saying config.mock_with :rr" do
+ o = Object.new
+ mock(o).msg("arg")
+ o.msg
+ end
+ it "should should be made available by saying config.mock_with :rr" do
+ o = Object.new
+ mock(o) do |m|
+ m.msg("arg")
+ end
+ o.msg
+ end
+ end
+end
diff --git a/vendor/gems/rspec/examples/partial_mock_example.rb b/vendor/gems/rspec/failing_examples/partial_mock_example.rb
similarity index 50%
rename from vendor/gems/rspec/examples/partial_mock_example.rb
rename to vendor/gems/rspec/failing_examples/partial_mock_example.rb
index 841ec8847..6d0554055 100644
--- a/vendor/gems/rspec/examples/partial_mock_example.rb
+++ b/vendor/gems/rspec/failing_examples/partial_mock_example.rb
@@ -1,28 +1,20 @@
require File.dirname(__FILE__) + '/spec_helper'
class MockableClass
def self.find id
return :original_return
end
end
describe "A partial mock" do
- it "should work at the class level" do
+ it "should work at the class level (but fail here due to the type mismatch)" do
MockableClass.should_receive(:find).with(1).and_return {:stub_return}
- MockableClass.find(1).should equal(:stub_return)
+ MockableClass.find("1").should equal(:stub_return)
end
it "should revert to the original after each spec" do
MockableClass.find(1).should equal(:original_return)
end
- it "can be mocked w/ ordering" do
- MockableClass.should_receive(:msg_1).ordered
- MockableClass.should_receive(:msg_2).ordered
- MockableClass.should_receive(:msg_3).ordered
- MockableClass.msg_1
- MockableClass.msg_2
- MockableClass.msg_3
- end
end
diff --git a/vendor/gems/rspec/examples/predicate_example.rb b/vendor/gems/rspec/failing_examples/predicate_example.rb
similarity index 72%
rename from vendor/gems/rspec/examples/predicate_example.rb
rename to vendor/gems/rspec/failing_examples/predicate_example.rb
index 1202bb670..53b6367e2 100644
--- a/vendor/gems/rspec/examples/predicate_example.rb
+++ b/vendor/gems/rspec/failing_examples/predicate_example.rb
@@ -1,27 +1,29 @@
require File.dirname(__FILE__) + '/spec_helper'
class BddFramework
def intuitive?
true
end
-
+
def adopted_quickly?
- true
+ #this will cause failures because it reallly SHOULD be adopted quickly
+ false
end
end
describe "BDD framework" do
before(:each) do
@bdd_framework = BddFramework.new
end
it "should be adopted quickly" do
+ #this will fail because it reallly SHOULD be adopted quickly
@bdd_framework.should be_adopted_quickly
end
-
+
it "should be intuitive" do
@bdd_framework.should be_intuitive
end
end
diff --git a/vendor/gems/rspec/failing_examples/raising_example.rb b/vendor/gems/rspec/failing_examples/raising_example.rb
new file mode 100644
index 000000000..e40b51ec8
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/raising_example.rb
@@ -0,0 +1,47 @@
+describe "This example" do
+
+ it "should show that a NoMethodError is raised but an Exception was expected" do
+ proc { ''.nonexistent_method }.should raise_error
+ end
+
+ it "should pass" do
+ proc { ''.nonexistent_method }.should raise_error(NoMethodError)
+ end
+
+ it "should show that a NoMethodError is raised but a SyntaxError was expected" do
+ proc { ''.nonexistent_method }.should raise_error(SyntaxError)
+ end
+
+ it "should show that nothing is raised when SyntaxError was expected" do
+ proc { }.should raise_error(SyntaxError)
+ end
+
+ it "should show that a NoMethodError is raised but a Exception was expected" do
+ proc { ''.nonexistent_method }.should_not raise_error
+ end
+
+ it "should show that a NoMethodError is raised" do
+ proc { ''.nonexistent_method }.should_not raise_error(NoMethodError)
+ end
+
+ it "should also pass" do
+ proc { ''.nonexistent_method }.should_not raise_error(SyntaxError)
+ end
+
+ it "should show that a NoMethodError is raised when nothing expected" do
+ proc { ''.nonexistent_method }.should_not raise_error(Exception)
+ end
+
+ it "should show that the wrong message was received" do
+ proc { raise StandardError.new("what is an enterprise?") }.should raise_error(StandardError, "not this")
+ end
+
+ it "should show that the unexpected error/message was thrown" do
+ proc { raise StandardError.new("abc") }.should_not raise_error(StandardError, "abc")
+ end
+
+ it "should pass too" do
+ proc { raise StandardError.new("abc") }.should_not raise_error(StandardError, "xyz")
+ end
+
+end
diff --git a/vendor/gems/rspec/failing_examples/spec_helper.rb b/vendor/gems/rspec/failing_examples/spec_helper.rb
new file mode 100644
index 000000000..f8d657554
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/spec_helper.rb
@@ -0,0 +1,3 @@
+lib_path = File.expand_path("#{File.dirname(__FILE__)}/../lib")
+$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
+require "spec"
diff --git a/vendor/gems/rspec/failing_examples/syntax_error_example.rb b/vendor/gems/rspec/failing_examples/syntax_error_example.rb
new file mode 100644
index 000000000..c9bb90774
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/syntax_error_example.rb
@@ -0,0 +1,7 @@
+describe "when passing a block to a matcher" do
+ it "you should use {} instead of do/end" do
+ Object.new.should satisfy do
+ "this block is being passed to #should instead of #satisfy - use {} instead"
+ end
+ end
+end
diff --git a/vendor/gems/rspec/failing_examples/team_spec.rb b/vendor/gems/rspec/failing_examples/team_spec.rb
new file mode 100644
index 000000000..41a44e551
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/team_spec.rb
@@ -0,0 +1,44 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+
+class Team
+ attr_reader :players
+ def initialize
+ @players = Players.new
+ end
+end
+
+class Players
+ def initialize
+ @players = []
+ end
+ def size
+ @players.size
+ end
+ def include? player
+ raise "player must be a string" unless player.is_a?(String)
+ @players.include? player
+ end
+end
+
+describe "A new team" do
+
+ before(:each) do
+ @team = Team.new
+ end
+
+ it "should have 3 players (failing example)" do
+ @team.should have(3).players
+ end
+
+ it "should include some player (failing example)" do
+ @team.players.should include("Some Player")
+ end
+
+ it "should include 5 (failing example)" do
+ @team.players.should include(5)
+ end
+
+ it "should have no players"
+
+end
diff --git a/vendor/gems/rspec/failing_examples/timeout_behaviour.rb b/vendor/gems/rspec/failing_examples/timeout_behaviour.rb
new file mode 100644
index 000000000..18221365f
--- /dev/null
+++ b/vendor/gems/rspec/failing_examples/timeout_behaviour.rb
@@ -0,0 +1,7 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+describe "Something really slow" do
+ it "should be failed by RSpec when it takes longer than --timeout" do
+ sleep(2)
+ end
+end
diff --git a/vendor/gems/rspec/lib/autotest/rspec.rb b/vendor/gems/rspec/lib/autotest/rspec.rb
index d4b77ea6b..9c97d2e0d 100644
--- a/vendor/gems/rspec/lib/autotest/rspec.rb
+++ b/vendor/gems/rspec/lib/autotest/rspec.rb
@@ -1,95 +1,74 @@
require 'autotest'
+Autotest.add_hook :initialize do |at|
+ at.clear_mappings
+ # watch out: Ruby bug (1.8.6):
+ # %r(/) != /\//
+ at.add_mapping(%r%^spec/.*\.rb$%) { |filename, _|
+ filename
+ }
+ at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m|
+ ["spec/#{m[1]}_spec.rb"]
+ }
+ at.add_mapping(%r%^spec/(spec_helper|shared/.*)\.rb$%) {
+ at.files_matching %r%^spec/.*_spec\.rb$%
+ }
+end
+
class RspecCommandError < StandardError; end
class Autotest::Rspec < Autotest
-
- def initialize(kernel=Kernel, separator=File::SEPARATOR, alt_separator=File::ALT_SEPARATOR) # :nodoc:
- super()
- @kernel, @separator, @alt_separator = kernel, separator, alt_separator
- @spec_command = spec_command
- # watch out: Ruby bug (1.8.6):
- # %r(/) != /\//
- # since Ruby compares the REGEXP source, not the resulting pattern
- @test_mappings = {
- %r%^spec/.*\.rb$% => kernel.proc { |filename, _|
- filename
- },
- %r%^lib/(.*)\.rb$% => kernel.proc { |_, m|
- ["spec/#{m[1]}_spec.rb"]
- },
- %r%^spec/(spec_helper|shared/.*)\.rb$% => kernel.proc {
- files_matching %r%^spec/.*_spec\.rb$%
- }
- }
- end
-
- def tests_for_file(filename)
- super.select { |f| @files.has_key? f }
- end
-
- alias :specs_for_file :tests_for_file
-
- def failed_results(results)
- results.scan(/^\d+\)\n(?:\e\[\d*m)?(?:.*?Error in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m)
- end
+ def initialize
+ super
- def handle_results(results)
- @files_to_test = consolidate_failures failed_results(results)
- unless @files_to_test.empty? then
- hook :red
- else
- hook :green
- end unless $TESTING
- @tainted = true unless @files_to_test.empty?
+ self.failed_results_re = /^\d+\)\n(?:\e\[\d*m)?(?:.*?Error in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m
+ self.completed_re = /\Z/ # FIX: some sort of summary line at the end?
end
def consolidate_failures(failed)
filters = Hash.new { |h,k| h[k] = [] }
failed.each do |spec, failed_trace|
- @files.keys.select{|f| f =~ /spec\//}.each do |f|
- if failed_trace =~ Regexp.new(f)
- filters[f] << spec
- break
- end
+ if f = test_files_for(failed).find { |f| failed_trace =~ Regexp.new(f) } then
+ filters[f] << spec
+ break
end
end
return filters
end
def make_test_cmd(files_to_test)
- return "#{ruby} -S #{@spec_command} #{add_options_if_present} #{files_to_test.keys.flatten.join(' ')}"
+ return "#{ruby} -S #{spec_command} #{add_options_if_present} #{files_to_test.keys.flatten.join(' ')}"
end
def add_options_if_present
File.exist?("spec/spec.opts") ? "-O spec/spec.opts " : ""
end
- # Finds the proper spec command to use. Precendence
- # is set in the lazily-evaluated method spec_commands. Alias + Override
- # that in ~/.autotest to provide a different spec command
- # then the default paths provided.
- def spec_command
- spec_commands.each do |command|
- if File.exists?(command)
- return @alt_separator ? (command.gsub @separator, @alt_separator) : command
- end
+ # Finds the proper spec command to use. Precendence is set in the
+ # lazily-evaluated method spec_commands. Alias + Override that in
+ # ~/.autotest to provide a different spec command then the default
+ # paths provided.
+ def spec_command(separator=File::ALT_SEPARATOR)
+ unless defined? @spec_command then
+ @spec_command = spec_commands.find { |cmd| File.exists? cmd }
+
+ raise RspecCommandError, "No spec command could be found!" unless @spec_command
+
+ @spec_command.gsub! File::SEPARATOR, separator if separator
end
-
- raise RspecCommandError, "No spec command could be found!"
+ @spec_command
end
-
+
# Autotest will look for spec commands in the following
# locations, in this order:
#
# * bin/spec
# * default spec bin/loader installed in Rubygems
def spec_commands
[
- File.join('bin', 'spec'),
+ File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'spec')),
File.join(Config::CONFIG['bindir'], 'spec')
]
end
-
end
diff --git a/vendor/gems/rspec/lib/spec.rb b/vendor/gems/rspec/lib/spec.rb
index 48c12595c..c143aa885 100644
--- a/vendor/gems/rspec/lib/spec.rb
+++ b/vendor/gems/rspec/lib/spec.rb
@@ -1,13 +1,30 @@
-require 'spec/extensions'
require 'spec/version'
require 'spec/matchers'
require 'spec/expectations'
-require 'spec/translator'
-require 'spec/dsl'
+require 'spec/example'
+require 'spec/extensions'
require 'spec/runner'
-class Object
- def metaclass
- class << self; self; end
- end
+if Object.const_defined?(:Test); \
+ require 'spec/interop/test'; \
end
+
+module Spec
+ class << self
+ def run?
+ @run || rspec_options.examples_run?
+ end
+
+ def run; \
+ return true if run?; \
+ result = rspec_options.run_examples; \
+ @run = true; \
+ result; \
+ end
+ attr_writer :run
+
+ def exit?; \
+ !Object.const_defined?(:Test) || Test::Unit.run?; \
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/lib/spec/dsl.rb b/vendor/gems/rspec/lib/spec/dsl.rb
deleted file mode 100644
index f960eb907..000000000
--- a/vendor/gems/rspec/lib/spec/dsl.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-require 'spec/dsl/description'
-require 'spec/dsl/errors'
-require 'spec/dsl/configuration'
-require 'spec/dsl/behaviour_callbacks'
-require 'spec/dsl/behaviour'
-require 'spec/dsl/behaviour_eval'
-require 'spec/dsl/composite_proc_builder'
-require 'spec/dsl/example'
-require 'spec/dsl/example_matcher'
-require 'spec/dsl/example_should_raise_handler'
-require 'spec/dsl/behaviour_factory'
diff --git a/vendor/gems/rspec/lib/spec/dsl/behaviour.rb b/vendor/gems/rspec/lib/spec/dsl/behaviour.rb
deleted file mode 100644
index 5158bb673..000000000
--- a/vendor/gems/rspec/lib/spec/dsl/behaviour.rb
+++ /dev/null
@@ -1,220 +0,0 @@
-module Spec
- module DSL
- class EvalModule < Module; end
- class Behaviour
- extend BehaviourCallbacks
-
- class << self
- def add_shared_behaviour(behaviour)
- return if behaviour.equal?(found_behaviour = find_shared_behaviour(behaviour.description))
- return if found_behaviour and File.expand_path(behaviour.description[:spec_path]) == File.expand_path(found_behaviour.description[:spec_path])
- raise ArgumentError.new("Shared Behaviour '#{behaviour.description}' already exists") if found_behaviour
- shared_behaviours << behaviour
- end
-
- def find_shared_behaviour(behaviour_description)
- shared_behaviours.find { |b| b.description == behaviour_description }
- end
-
- def shared_behaviours
- # TODO - this needs to be global, or at least accessible from
- # from subclasses of Behaviour in a centralized place. I'm not loving
- # this as a solution, but it works for now.
- $shared_behaviours ||= []
- end
- end
-
- def initialize(*args, &behaviour_block)
- init_description(*args)
- init_eval_module
- before_eval
- eval_behaviour(&behaviour_block)
- end
-
- private
-
- def init_description(*args)
- unless self.class == Behaviour
- args << {} unless Hash === args.last
- args.last[:behaviour_class] = self.class
- end
- @description = Description.new(*args)
- end
-
- def init_eval_module
- @eval_module = EvalModule.new
- @eval_module.extend BehaviourEval::ModuleMethods
- @eval_module.include BehaviourEval::InstanceMethods
- @eval_module.include described_type if described_type.class == Module
- @eval_module.behaviour = self
- @eval_module.description = @description
- end
-
- def eval_behaviour(&behaviour_block)
- @eval_module.class_eval(&behaviour_block)
- end
-
- protected
-
- def before_eval
- end
-
- public
-
- def run(reporter, dry_run=false, reverse=false, timeout=nil)
- raise "shared behaviours should never run" if shared?
- # TODO - change add_behaviour to add_description ??????
- reporter.add_behaviour(@description)
- prepare_execution_context_class
- before_all_errors = run_before_all(reporter, dry_run)
-
- exs = reverse ? examples.reverse : examples
- example_execution_context = nil
-
- if before_all_errors.empty?
- exs.each do |example|
- example_execution_context = execution_context(example)
- example_execution_context.copy_instance_variables_from(@before_and_after_all_context_instance) unless before_all_proc(behaviour_type).nil?
-
- befores = before_each_proc(behaviour_type) {|e| raise e}
- afters = after_each_proc(behaviour_type)
- example.run(reporter, befores, afters, dry_run, example_execution_context, timeout)
- end
- end
-
- @before_and_after_all_context_instance.copy_instance_variables_from(example_execution_context) unless after_all_proc(behaviour_type).nil?
- run_after_all(reporter, dry_run)
- end
-
- def number_of_examples
- examples.length
- end
-
- def matches?(specified_examples)
- matcher ||= ExampleMatcher.new(description)
-
- examples.each do |example|
- return true if example.matches?(matcher, specified_examples)
- end
- return false
- end
-
- def shared?
- @description[:shared]
- end
-
- def retain_examples_matching!(specified_examples)
- return if specified_examples.index(description)
- matcher = ExampleMatcher.new(description)
- examples.reject! do |example|
- !example.matches?(matcher, specified_examples)
- end
- end
-
- def methods
- my_methods = super
- my_methods |= @eval_module.methods
- my_methods
- end
-
- # Includes modules in the Behaviour (the describe block).
- def include(*args)
- @eval_module.include(*args)
- end
-
- def behaviour_type #:nodoc:
- @description[:behaviour_type]
- end
-
- # Sets the #number on each Example and returns the next number
- def set_sequence_numbers(number, reverse) #:nodoc:
- exs = reverse ? examples.reverse : examples
- exs.each do |example|
- example.number = number
- number += 1
- end
- number
- end
-
- protected
-
- # Messages that this class does not understand
- # are passed directly to the @eval_module.
- def method_missing(sym, *args, &block)
- @eval_module.send(sym, *args, &block)
- end
-
- def prepare_execution_context_class
- plugin_mock_framework
- weave_in_included_modules
- define_predicate_matchers #this is in behaviour_eval
- execution_context_class
- end
-
- def weave_in_included_modules
- mods = [@eval_module]
- mods << included_modules.dup
- mods << Spec::Runner.configuration.modules_for(behaviour_type)
- execution_context_class.class_eval do
- # WARNING - the following can be executed in the context of any
- # class, and should never pass more than one module to include
- # even though we redefine include in this class. This is NOT
- # tested anywhere, hence this comment.
- mods.flatten.each {|mod| include mod}
- end
- end
-
- def execution_context(example)
- execution_context_class.new(example)
- end
-
- def run_before_all(reporter, dry_run)
- errors = []
- unless dry_run
- begin
- @before_and_after_all_context_instance = execution_context(nil)
- @before_and_after_all_context_instance.instance_eval(&before_all_proc(behaviour_type))
- rescue Exception => e
- errors << e
- location = "before(:all)"
- # The easiest is to report this as an example failure. We don't have an Example
- # at this point, so we'll just create a placeholder.
- reporter.example_finished(Example.new(location), e, location) if reporter
- end
- end
- errors
- end
-
- def run_after_all(reporter, dry_run)
- unless dry_run
- begin
- @before_and_after_all_context_instance ||= execution_context(nil)
- @before_and_after_all_context_instance.instance_eval(&after_all_proc(behaviour_type))
- rescue Exception => e
- location = "after(:all)"
- reporter.example_finished(Example.new(location), e, location) if reporter
- end
- end
- end
-
- def plugin_mock_framework
- case mock_framework = Spec::Runner.configuration.mock_framework
- when Module
- include mock_framework
- else
- require Spec::Runner.configuration.mock_framework
- include Spec::Plugins::MockFramework
- end
- end
-
- def description
- @description.to_s
- end
-
- def described_type
- @description.described_type
- end
-
- end
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/dsl/behaviour_callbacks.rb b/vendor/gems/rspec/lib/spec/dsl/behaviour_callbacks.rb
deleted file mode 100644
index 8b69ad9e5..000000000
--- a/vendor/gems/rspec/lib/spec/dsl/behaviour_callbacks.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-module Spec
- module DSL
- # See http://rspec.rubyforge.org/documentation/before_and_after.html
- module BehaviourCallbacks
- def prepend_before(*args, &block)
- scope, options = scope_and_options(*args)
- add(scope, options, :before, :unshift, &block)
- end
- def append_before(*args, &block)
- scope, options = scope_and_options(*args)
- add(scope, options, :before, :<<, &block)
- end
- alias_method :before, :append_before
-
- def prepend_after(*args, &block)
- scope, options = scope_and_options(*args)
- add(scope, options, :after, :unshift, &block)
- end
- alias_method :after, :prepend_after
- def append_after(*args, &block)
- scope, options = scope_and_options(*args)
- add(scope, options, :after, :<<, &block)
- end
-
- def scope_and_options(*args)
- args, options = args_and_options(*args)
- scope = (args[0] || :each), options
- end
-
- def add(scope, options, where, how, &block)
- scope ||= :each
- options ||= {}
- behaviour_type = options[:behaviour_type]
- case scope
- when :each; self.__send__("#{where}_each_parts", behaviour_type).__send__(how, block)
- when :all; self.__send__("#{where}_all_parts", behaviour_type).__send__(how, block)
- end
- end
-
- def remove_after(scope, &block)
- after_each_parts.delete(block)
- end
-
- # Deprecated. Use before(:each)
- def setup(&block)
- before(:each, &block)
- end
-
- # Deprecated. Use after(:each)
- def teardown(&block)
- after(:each, &block)
- end
-
- def before_all_parts(behaviour_type=nil) # :nodoc:
- @before_all_parts ||= {}
- @before_all_parts[behaviour_type] ||= []
- end
-
- def after_all_parts(behaviour_type=nil) # :nodoc:
- @after_all_parts ||= {}
- @after_all_parts[behaviour_type] ||= []
- end
-
- def before_each_parts(behaviour_type=nil) # :nodoc:
- @before_each_parts ||= {}
- @before_each_parts[behaviour_type] ||= []
- end
-
- def after_each_parts(behaviour_type=nil) # :nodoc:
- @after_each_parts ||= {}
- @after_each_parts[behaviour_type] ||= []
- end
-
- def clear_before_and_after! # :nodoc:
- @before_all_parts = nil
- @after_all_parts = nil
- @before_each_parts = nil
- @after_each_parts = nil
- end
- end
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/dsl/behaviour_eval.rb b/vendor/gems/rspec/lib/spec/dsl/behaviour_eval.rb
deleted file mode 100644
index 9f7b8281e..000000000
--- a/vendor/gems/rspec/lib/spec/dsl/behaviour_eval.rb
+++ /dev/null
@@ -1,231 +0,0 @@
-module Spec
- module DSL
- module BehaviourEval
- module ModuleMethods
- include BehaviourCallbacks
-
- attr_writer :behaviour
- attr_accessor :description
-
- # RSpec runs every example in a new instance of Object, mixing in
- # the behaviour necessary to run examples. Because this behaviour gets
- # mixed in, it can get mixed in to an instance of any class at all.
- #
- # This is something that you would hardly ever use, but there is one
- # common use case for it - inheriting from Test::Unit::TestCase. RSpec's
- # Rails plugin uses this feature to provide access to all of the features
- # that are available for Test::Unit within RSpec examples.
- def inherit(klass)
- raise ArgumentError.new("Shared behaviours cannot inherit from classes") if @behaviour.shared?
- @behaviour_superclass = klass
- derive_execution_context_class_from_behaviour_superclass
- end
-
- # You can pass this one or many modules. Each module will subsequently
- # be included in the each object in which an example is run. Use this
- # to provide global helper methods to your examples.
- #
- # == Example
- #
- # module HelperMethods
- # def helper_method
- # ...
- # end
- # end
- #
- # describe Thing do
- # include HelperMethods
- # it "should do stuff" do
- # helper_method
- # end
- # end
- def include(*mods)
- mods.each do |mod|
- included_modules << mod
- mod.send :included, self
- end
- end
-
- # Use this to pull in examples from shared behaviours.
- # See Spec::Runner for information about shared behaviours.
- def it_should_behave_like(behaviour_description)
- behaviour = @behaviour.class.find_shared_behaviour(behaviour_description)
- if behaviour.nil?
- raise RuntimeError.new("Shared Behaviour '#{behaviour_description}' can not be found")
- end
- behaviour.copy_to(self)
- end
-
- def copy_to(eval_module) # :nodoc:
- examples.each { |e| eval_module.examples << e; }
- before_each_parts.each { |p| eval_module.before_each_parts << p }
- after_each_parts.each { |p| eval_module.after_each_parts << p }
- before_all_parts.each { |p| eval_module.before_all_parts << p }
- after_all_parts.each { |p| eval_module.after_all_parts << p }
- included_modules.each { |m| eval_module.included_modules << m }
- eval_module.included_modules << self
- end
-
- # :call-seq:
- # predicate_matchers[matcher_name] = method_on_object
- # predicate_matchers[matcher_name] = [method1_on_object, method2_on_object]
- #
- # Dynamically generates a custom matcher that will match
- # a predicate on your class. RSpec provides a couple of these
- # out of the box:
- #
- # exist (or state expectations)
- # File.should exist("path/to/file")
- #
- # an_instance_of (for mock argument constraints)
- # mock.should_receive(:message).with(an_instance_of(String))
- #
- # == Examples
- #
- # class Fish
- # def can_swim?
- # true
- # end
- # end
- #
- # describe Fish do
- # predicate_matchers[:swim] = :can_swim?
- # it "should swim" do
- # Fish.new.should swim
- # end
- # end
- def predicate_matchers
- @predicate_matchers ||= {:exist => :exist?, :an_instance_of => :is_a?}
- end
-
- def define_predicate_matchers(hash=nil) # :nodoc:
- if hash.nil?
- define_predicate_matchers(predicate_matchers)
- define_predicate_matchers(Spec::Runner.configuration.predicate_matchers)
- else
- hash.each_pair do |matcher_method, method_on_object|
- define_method matcher_method do |*args|
- eval("be_#{method_on_object.to_s.gsub('?','')}(*args)")
- end
- end
- end
- end
-
- # Creates an instance of Spec::DSL::Example and adds
- # it to a collection of examples of the current behaviour.
- def it(description=:__generate_description, opts={}, &block)
- examples << Example.new(description, opts, &block)
- end
-
- # Alias for it.
- def specify(description=:__generate_description, opts={}, &block)
- it(description, opts, &block)
- end
-
- def methods # :nodoc:
- my_methods = super
- my_methods |= behaviour_superclass.methods
- my_methods
- end
-
- protected
-
- def method_missing(method_name, *args)
- if behaviour_superclass.respond_to?(method_name)
- return execution_context_class.send(method_name, *args)
- end
- super
- end
-
- def before_each_proc(behaviour_type, &error_handler)
- parts = []
- parts.push(*Behaviour.before_each_parts(nil))
- parts.push(*Behaviour.before_each_parts(behaviour_type)) unless behaviour_type.nil?
- parts.push(*before_each_parts(nil))
- parts.push(*before_each_parts(behaviour_type)) unless behaviour_type.nil?
- CompositeProcBuilder.new(parts).proc(&error_handler)
- end
-
- def before_all_proc(behaviour_type, &error_handler)
- parts = []
- parts.push(*Behaviour.before_all_parts(nil))
- parts.push(*Behaviour.before_all_parts(behaviour_type)) unless behaviour_type.nil?
- parts.push(*before_all_parts(nil))
- parts.push(*before_all_parts(behaviour_type)) unless behaviour_type.nil?
- CompositeProcBuilder.new(parts).proc(&error_handler)
- end
-
- def after_all_proc(behaviour_type)
- parts = []
- parts.push(*after_all_parts(behaviour_type)) unless behaviour_type.nil?
- parts.push(*after_all_parts(nil))
- parts.push(*Behaviour.after_all_parts(behaviour_type)) unless behaviour_type.nil?
- parts.push(*Behaviour.after_all_parts(nil))
- CompositeProcBuilder.new(parts).proc
- end
-
- def after_each_proc(behaviour_type)
- parts = []
- parts.push(*after_each_parts(behaviour_type)) unless behaviour_type.nil?
- parts.push(*after_each_parts(nil))
- parts.push(*Behaviour.after_each_parts(behaviour_type)) unless behaviour_type.nil?
- parts.push(*Behaviour.after_each_parts(nil))
- CompositeProcBuilder.new(parts).proc
- end
-
- private
-
- def execution_context_class
- @execution_context_class ||= derive_execution_context_class_from_behaviour_superclass
- end
-
- def derive_execution_context_class_from_behaviour_superclass
- @execution_context_class = Class.new(behaviour_superclass)
- behaviour_superclass.spec_inherited(self) if behaviour_superclass.respond_to?(:spec_inherited)
- @execution_context_class
- end
-
- def behaviour_superclass
- @behaviour_superclass ||= Object
- end
-
- protected
- def included_modules
- @included_modules ||= [::Spec::Matchers]
- end
-
- def examples
- @examples ||= []
- end
- end
-
- module InstanceMethods
- def initialize(*args, &block) #:nodoc:
- # TODO - inheriting from TestUnit::TestCase fails without this
- # - let's figure out why and move this somewhere else
- end
-
- def violated(message="")
- raise Spec::Expectations::ExpectationNotMetError.new(message)
- end
-
- def inspect
- "[RSpec example]"
- end
-
- def pending(message)
- if block_given?
- begin
- yield
- rescue Exception => e
- raise Spec::DSL::ExamplePendingError.new(message)
- end
- raise Spec::DSL::PendingFixedError.new("Expected pending '#{message}' to fail. No Error was raised.")
- else
- raise Spec::DSL::ExamplePendingError.new(message)
- end
- end
- end
- end
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/dsl/behaviour_factory.rb b/vendor/gems/rspec/lib/spec/dsl/behaviour_factory.rb
deleted file mode 100644
index 44b60c641..000000000
--- a/vendor/gems/rspec/lib/spec/dsl/behaviour_factory.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-module Spec
- module DSL
- class BehaviourFactory
-
- class << self
-
- BEHAVIOUR_CLASSES = {:default => Spec::DSL::Behaviour}
-
- # Registers a behaviour class +klass+ with the symbol
- # +behaviour_type+. For example:
- #
- # Spec::DSL::BehaviourFactory.add_behaviour_class(:farm, Spec::Farm::DSL::FarmBehaviour)
- #
- # This will cause Kernel#describe from a file living in
- # spec/farm to create behaviour instances of type
- # Spec::Farm::DSL::FarmBehaviour.
- def add_behaviour_class(behaviour_type, klass)
- BEHAVIOUR_CLASSES[behaviour_type] = klass
- end
-
- def remove_behaviour_class(behaviour_type)
- BEHAVIOUR_CLASSES.delete(behaviour_type)
- end
-
- def create(*args, &block)
- opts = Hash === args.last ? args.last : {}
- if opts[:shared]
- behaviour_type = :default
- elsif opts[:behaviour_type]
- behaviour_type = opts[:behaviour_type]
- elsif opts[:spec_path] =~ /spec(\\|\/)(#{BEHAVIOUR_CLASSES.keys.join('|')})/
- behaviour_type = $2.to_sym
- else
- behaviour_type = :default
- end
- return BEHAVIOUR_CLASSES[behaviour_type].new(*args, &block)
- end
-
- end
- end
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/dsl/composite_proc_builder.rb b/vendor/gems/rspec/lib/spec/dsl/composite_proc_builder.rb
deleted file mode 100644
index 373f44953..000000000
--- a/vendor/gems/rspec/lib/spec/dsl/composite_proc_builder.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-module Spec
- module DSL
- class CompositeProcBuilder < Array
- def initialize(callbacks=[])
- push(*callbacks)
- end
-
- def proc(&error_handler)
- parts = self
- errors = []
- Proc.new do
- result = parts.collect do |part|
- begin
- if part.is_a?(UnboundMethod)
- part.bind(self).call
- else
- instance_eval(&part)
- end
- rescue Exception => e
- if error_handler
- error_handler.call(e)
- else
- errors << e
- end
- end
- end
- raise errors.first unless errors.empty?
- result
- end
- end
- end
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/dsl/description.rb b/vendor/gems/rspec/lib/spec/dsl/description.rb
deleted file mode 100644
index fe8c9b0c9..000000000
--- a/vendor/gems/rspec/lib/spec/dsl/description.rb
+++ /dev/null
@@ -1,76 +0,0 @@
-module Spec
- module DSL
- class Description
- module ClassMethods
- def generate_description(*args)
- description = args.shift.to_s
- unless args.empty?
- suffix = args.shift.to_s
- description << " " unless suffix =~ /^\s|\.|#/
- description << suffix
- end
- description
- end
- end
- extend ClassMethods
-
- attr_reader :description, :described_type
-
- def initialize(*args)
- args, @options = args_and_options(*args)
- init_behaviour_type(@options)
- init_spec_path(@options)
- init_described_type(args)
- init_description(*args)
- end
-
- def [](key)
- @options[key]
- end
-
- def []=(key, value)
- @options[key] = value
- end
-
- def to_s; @description; end
-
- def ==(value)
- case value
- when Description
- @description == value.description
- else
- @description == value
- end
- end
-
- private
- def init_behaviour_type(options)
- # NOTE - BE CAREFUL IF CHANGING THIS NEXT LINE:
- # this line is as it is to satisfy JRuby - the original version
- # read, simply: "if options[:behaviour_class]", which passed against ruby, but failed against jruby
- if options[:behaviour_class] && options[:behaviour_class].ancestors.include?(Behaviour)
- options[:behaviour_type] = parse_behaviour_type(@options[:behaviour_class])
- end
- end
-
- def init_spec_path(options)
- if options.has_key?(:spec_path)
- options[:spec_path] = File.expand_path(@options[:spec_path])
- end
- end
-
- def init_description(*args)
- @description = self.class.generate_description(*args)
- end
-
- def init_described_type(args)
- @described_type = args.first unless args.first.is_a?(String)
- end
-
- def parse_behaviour_type(behaviour_class)
- behaviour_class.to_s.split("::").reverse[0].gsub!('Behaviour', '').downcase.to_sym
- end
-
- end
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/dsl/example.rb b/vendor/gems/rspec/lib/spec/dsl/example.rb
deleted file mode 100644
index d04073f7e..000000000
--- a/vendor/gems/rspec/lib/spec/dsl/example.rb
+++ /dev/null
@@ -1,135 +0,0 @@
-require 'timeout'
-
-module Spec
- module DSL
- class Example
- # The global sequence number of this example
- attr_accessor :number
-
- def initialize(description, options={}, &example_block)
- @from = caller(0)[3]
- @options = options
- @example_block = example_block
- @description = description
- @description_generated_proc = lambda { |desc| @generated_description = desc }
- end
-
- def run(reporter, before_each_block, after_each_block, dry_run, execution_context, timeout=nil)
- @dry_run = dry_run
- reporter.example_started(self)
- return reporter.example_finished(self) if dry_run
-
- errors = []
- location = nil
- Timeout.timeout(timeout) do
- before_each_ok = before_example(execution_context, errors, &before_each_block)
- example_ok = run_example(execution_context, errors) if before_each_ok
- after_each_ok = after_example(execution_context, errors, &after_each_block)
- location = failure_location(before_each_ok, example_ok, after_each_ok)
- end
-
- ExampleShouldRaiseHandler.new(@from, @options).handle(errors)
- reporter.example_finished(self, errors.first, location, @example_block.nil?) if reporter
- end
-
- def matches?(matcher, specified_examples)
- matcher.example_desc = description
- matcher.matches?(specified_examples)
- end
-
- def description
- @description == :__generate_description ? generated_description : @description
- end
-
- def to_s
- description
- end
-
- private
-
- def generated_description
- return @generated_description if @generated_description
- if @dry_run
- "NO NAME (Because of --dry-run)"
- else
- if @failed
- "NO NAME (Because of Error raised in matcher)"
- else
- "NO NAME (Because there were no expectations)"
- end
- end
- end
-
- def before_example(execution_context, errors, &behaviour_before_block)
- setup_mocks(execution_context)
- Spec::Matchers.description_generated(@description_generated_proc)
-
- builder = CompositeProcBuilder.new
- before_proc = builder.proc(&append_errors(errors))
- execution_context.instance_eval(&before_proc)
-
- execution_context.instance_eval(&behaviour_before_block) if behaviour_before_block
- return errors.empty?
- rescue Exception => e
- @failed = true
- errors << e
- return false
- end
-
- def run_example(execution_context, errors)
- begin
- execution_context.instance_eval(&@example_block) if @example_block
- return true
- rescue Exception => e
- @failed = true
- errors << e
- return false
- end
- end
-
- def after_example(execution_context, errors, &behaviour_after_each)
- execution_context.instance_eval(&behaviour_after_each) if behaviour_after_each
-
- begin
- verify_mocks(execution_context)
- ensure
- teardown_mocks(execution_context)
- end
-
- Spec::Matchers.unregister_description_generated(@description_generated_proc)
-
- builder = CompositeProcBuilder.new
- after_proc = builder.proc(&append_errors(errors))
- execution_context.instance_eval(&after_proc)
-
- return errors.empty?
- rescue Exception => e
- @failed = true
- errors << e
- return false
- end
-
- def setup_mocks(execution_context)
- execution_context.setup_mocks_for_rspec if execution_context.respond_to?(:setup_mocks_for_rspec)
- end
-
- def verify_mocks(execution_context)
- execution_context.verify_mocks_for_rspec if execution_context.respond_to?(:verify_mocks_for_rspec)
- end
-
- def teardown_mocks(execution_context)
- execution_context.teardown_mocks_for_rspec if execution_context.respond_to?(:teardown_mocks_for_rspec)
- end
-
- def append_errors(errors)
- proc {|error| errors << error}
- end
-
- def failure_location(before_each_ok, example_ok, after_each_ok)
- return 'before(:each)' unless before_each_ok
- return description unless example_ok
- return 'after(:each)' unless after_each_ok
- end
- end
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/dsl/example_matcher.rb b/vendor/gems/rspec/lib/spec/dsl/example_matcher.rb
deleted file mode 100644
index 18cc47409..000000000
--- a/vendor/gems/rspec/lib/spec/dsl/example_matcher.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-module Spec
- module DSL
- class ExampleMatcher
-
- attr_writer :example_desc
- def initialize(behaviour_desc, example_desc=nil)
- @behaviour_desc = behaviour_desc
- @example_desc = example_desc
- end
-
- def matches?(specified_examples)
- specified_examples.each do |specified_example|
- return true if matches_literal_example?(specified_example) || matches_example_not_considering_modules?(specified_example)
- end
- false
- end
-
- private
- def matches_literal_example?(specified_example)
- specified_example =~ /(^#{context_regexp} #{example_regexp}$|^#{context_regexp}$|^#{example_regexp}$)/
- end
-
- def matches_example_not_considering_modules?(specified_example)
- specified_example =~ /(^#{context_regexp_not_considering_modules} #{example_regexp}$|^#{context_regexp_not_considering_modules}$|^#{example_regexp}$)/
- end
-
- def context_regexp
- Regexp.escape(@behaviour_desc)
- end
-
- def context_regexp_not_considering_modules
- Regexp.escape(@behaviour_desc.split('::').last)
- end
-
- def example_regexp
- Regexp.escape(@example_desc)
- end
- end
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/dsl/example_should_raise_handler.rb b/vendor/gems/rspec/lib/spec/dsl/example_should_raise_handler.rb
deleted file mode 100644
index 942327317..000000000
--- a/vendor/gems/rspec/lib/spec/dsl/example_should_raise_handler.rb
+++ /dev/null
@@ -1,74 +0,0 @@
-module Spec
- module DSL
- class ExampleShouldRaiseHandler
- def initialize(file_and_line_number, opts)
- @file_and_line_number = file_and_line_number
- @options = opts
- @expected_error_class = determine_error_class(opts)
- @expected_error_message = determine_error_message(opts)
- end
-
- def determine_error_class(opts)
- if candidate = opts[:should_raise]
- if candidate.is_a?(Class)
- return candidate
- elsif candidate.is_a?(Array)
- return candidate[0]
- else
- return Exception
- end
- end
- end
-
- def determine_error_message(opts)
- if candidate = opts[:should_raise]
- if candidate.is_a?(Array)
- return candidate[1]
- end
- end
- return nil
- end
-
- def build_message(exception=nil)
- if @expected_error_message.nil?
- message = "example block expected #{@expected_error_class.to_s}"
- else
- message = "example block expected #{@expected_error_class.new(@expected_error_message.to_s).inspect}"
- end
- message << " but raised #{exception.inspect}" if exception
- message << " but nothing was raised" unless exception
- message << "\n"
- message << @file_and_line_number
- end
-
- def error_matches?(error)
- return false unless error.kind_of?(@expected_error_class)
- unless @expected_error_message.nil?
- if @expected_error_message.is_a?(Regexp)
- return false unless error.message =~ @expected_error_message
- else
- return false unless error.message == @expected_error_message
- end
- end
- return true
- end
-
- def handle(errors)
- if @expected_error_class
- if errors.empty?
- errors << Spec::Expectations::ExpectationNotMetError.new(build_message)
- else
- error_to_remove = errors.detect do |error|
- error_matches?(error)
- end
- if error_to_remove.nil?
- errors.insert(0,Spec::Expectations::ExpectationNotMetError.new(build_message(errors[0])))
- else
- errors.delete(error_to_remove)
- end
- end
- end
- end
- end
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/example.rb b/vendor/gems/rspec/lib/spec/example.rb
new file mode 100644
index 000000000..39ff76b99
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/example.rb
@@ -0,0 +1,12 @@
+require 'timeout'
+require 'forwardable'
+require 'spec/example/pending'
+require 'spec/example/module_reopening_fix'
+require 'spec/example/example_group_methods'
+require 'spec/example/example_methods'
+require 'spec/example/example_group'
+require 'spec/example/shared_example_group'
+require 'spec/example/example_group_factory'
+require 'spec/example/errors'
+require 'spec/example/configuration'
+require 'spec/example/example_matcher'
diff --git a/vendor/gems/rspec/lib/spec/dsl/configuration.rb b/vendor/gems/rspec/lib/spec/example/configuration.rb
old mode 100644
new mode 100755
similarity index 59%
rename from vendor/gems/rspec/lib/spec/dsl/configuration.rb
rename to vendor/gems/rspec/lib/spec/example/configuration.rb
index 709574ded..674184727
--- a/vendor/gems/rspec/lib/spec/dsl/configuration.rb
+++ b/vendor/gems/rspec/lib/spec/example/configuration.rb
@@ -1,135 +1,144 @@
module Spec
- module DSL
+ module Example
class Configuration
-
# Chooses what mock framework to use. Example:
#
# Spec::Runner.configure do |config|
# config.mock_with :rspec, :mocha, :flexmock, or :rr
# end
#
# To use any other mock framework, you'll have to provide
# your own adapter. This is simply a module that responds to
# setup_mocks_for_rspec, verify_mocks_for_rspec and teardown_mocks_for_rspec.
# These are your hooks into the lifecycle of a given example. RSpec will
# call setup_mocks_for_rspec before running anything else in each Example.
# After executing the #after methods, RSpec will then call verify_mocks_for_rspec
# and teardown_mocks_for_rspec (this is guaranteed to run even if there are
# failures in verify_mocks_for_rspec).
#
# Once you've defined this module, you can pass that to mock_with:
#
# Spec::Runner.configure do |config|
# config.mock_with MyMockFrameworkAdapter
# end
#
def mock_with(mock_framework)
@mock_framework = case mock_framework
when Symbol
mock_framework_path(mock_framework.to_s)
else
mock_framework
end
end
def mock_framework # :nodoc:
@mock_framework ||= mock_framework_path("rspec")
end
- # Declares modules to be included in all behaviours (describe blocks).
+ # Declares modules to be included in all example groups (describe blocks).
#
# config.include(My::Bottle, My::Cup)
#
- # If you want to restrict the inclusion to a subset of all the behaviours then
+ # If you want to restrict the inclusion to a subset of all the example groups then
# specify this in a Hash as the last argument:
#
- # config.include(My::Pony, My::Horse, :behaviour_type => :farm)
+ # config.include(My::Pony, My::Horse, :type => :farm)
#
- # Only behaviours that have that type will get the modules included:
+ # Only example groups that have that type will get the modules included:
#
- # describe "Downtown", :behaviour_type => :city do
+ # describe "Downtown", :type => :city do
# # Will *not* get My::Pony and My::Horse included
# end
#
- # describe "Old Mac Donald", :behaviour_type => :farm do
+ # describe "Old Mac Donald", :type => :farm do
# # *Will* get My::Pony and My::Horse included
# end
#
def include(*args)
args << {} unless Hash === args.last
modules, options = args_and_options(*args)
- required_behaviour_type = options[:behaviour_type]
- required_behaviour_type = required_behaviour_type.to_sym unless required_behaviour_type.nil?
- @modules ||= {}
- @modules[required_behaviour_type] ||= []
- @modules[required_behaviour_type] += modules
- end
-
- def modules_for(required_behaviour_type) #:nodoc:
- @modules ||= {}
- modules = @modules[nil] || [] # general ones
- modules << @modules[required_behaviour_type.to_sym] unless required_behaviour_type.nil?
- modules.uniq.compact
- end
-
- # This is just for cleanup in RSpec's own examples
- def exclude(*modules) #:nodoc:
- @modules.each do |behaviour_type, mods|
- modules.each{|m| mods.delete(m)}
+ required_example_group = get_type_from_options(options)
+ required_example_group = required_example_group.to_sym if required_example_group
+ modules.each do |mod|
+ ExampleGroupFactory.get(required_example_group).send(:include, mod)
end
end
-
+
# Defines global predicate matchers. Example:
#
# config.predicate_matchers[:swim] = :can_swim?
#
# This makes it possible to say:
#
# person.should swim # passes if person.should_swim? returns true
#
def predicate_matchers
@predicate_matchers ||= {}
end
- # Prepends a global before block to all behaviours.
+ # Prepends a global before block to all example groups.
# See #append_before for filtering semantics.
def prepend_before(*args, &proc)
- Behaviour.prepend_before(*args, &proc)
+ scope, options = scope_and_options(*args)
+ example_group = ExampleGroupFactory.get(
+ get_type_from_options(options)
+ )
+ example_group.prepend_before(scope, &proc)
end
- # Appends a global before block to all behaviours.
+ # Appends a global before block to all example groups.
#
- # If you want to restrict the block to a subset of all the behaviours then
+ # If you want to restrict the block to a subset of all the example groups then
# specify this in a Hash as the last argument:
#
- # config.prepend_before(:all, :behaviour_type => :farm)
+ # config.prepend_before(:all, :type => :farm)
#
# or
#
- # config.prepend_before(:behaviour_type => :farm)
+ # config.prepend_before(:type => :farm)
#
def append_before(*args, &proc)
- Behaviour.append_before(*args, &proc)
+ scope, options = scope_and_options(*args)
+ example_group = ExampleGroupFactory.get(
+ get_type_from_options(options)
+ )
+ example_group.append_before(scope, &proc)
end
alias_method :before, :append_before
- # Prepends a global after block to all behaviours.
+ # Prepends a global after block to all example groups.
# See #append_before for filtering semantics.
def prepend_after(*args, &proc)
- Behaviour.prepend_after(*args, &proc)
+ scope, options = scope_and_options(*args)
+ example_group = ExampleGroupFactory.get(
+ get_type_from_options(options)
+ )
+ example_group.prepend_after(scope, &proc)
end
alias_method :after, :prepend_after
- # Appends a global after block to all behaviours.
+ # Appends a global after block to all example groups.
# See #append_before for filtering semantics.
def append_after(*args, &proc)
- Behaviour.append_after(*args, &proc)
+ scope, options = scope_and_options(*args)
+ example_group = ExampleGroupFactory.get(
+ get_type_from_options(options)
+ )
+ example_group.append_after(scope, &proc)
end
private
+
+ def scope_and_options(*args)
+ args, options = args_and_options(*args)
+ scope = (args[0] || :each), options
+ end
+
+ def get_type_from_options(options)
+ options[:type] || options[:behaviour_type]
+ end
def mock_framework_path(framework_name)
File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "plugins", "mock_frameworks", framework_name))
end
-
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/dsl/errors.rb b/vendor/gems/rspec/lib/spec/example/errors.rb
similarity index 55%
rename from vendor/gems/rspec/lib/spec/dsl/errors.rb
rename to vendor/gems/rspec/lib/spec/example/errors.rb
index ba7046a89..c6cb22453 100644
--- a/vendor/gems/rspec/lib/spec/dsl/errors.rb
+++ b/vendor/gems/rspec/lib/spec/example/errors.rb
@@ -1,9 +1,9 @@
module Spec
- module DSL
+ module Example
class ExamplePendingError < StandardError
end
- class PendingFixedError < StandardError
+ class PendingExampleFixedError < StandardError
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/example/example_group.rb b/vendor/gems/rspec/lib/spec/example/example_group.rb
new file mode 100644
index 000000000..d6e156f93
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/example/example_group.rb
@@ -0,0 +1,16 @@
+module Spec
+ module Example
+ # The superclass for all regular RSpec examples.
+ class ExampleGroup
+ extend Spec::Example::ExampleGroupMethods
+ include Spec::Example::ExampleMethods
+
+ def initialize(defined_description, &implementation)
+ @_defined_description = defined_description
+ @_implementation = implementation
+ end
+ end
+ end
+end
+
+Spec::ExampleGroup = Spec::Example::ExampleGroup
diff --git a/vendor/gems/rspec/lib/spec/example/example_group_factory.rb b/vendor/gems/rspec/lib/spec/example/example_group_factory.rb
new file mode 100755
index 000000000..0414a3b96
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/example/example_group_factory.rb
@@ -0,0 +1,62 @@
+module Spec
+ module Example
+ class ExampleGroupFactory
+ class << self
+ def reset
+ @example_group_types = nil
+ default(ExampleGroup)
+ end
+
+ # Registers an example group class +klass+ with the symbol
+ # +type+. For example:
+ #
+ # Spec::Example::ExampleGroupFactory.register(:farm, Spec::Farm::Example::FarmExampleGroup)
+ #
+ # This will cause Main#describe from a file living in
+ # spec/farm to create example group instances of type
+ # Spec::Farm::Example::FarmExampleGroup.
+ def register(id, example_group_class)
+ @example_group_types[id] = example_group_class
+ end
+
+ # Sets the default ExampleGroup class
+ def default(example_group_class)
+ old = @example_group_types
+ @example_group_types = Hash.new(example_group_class)
+ @example_group_types.merge(old) if old
+ end
+
+ def get(id=nil)
+ if @example_group_types.values.include?(id)
+ id
+ else
+ @example_group_types[id]
+ end
+ end
+
+ def create_example_group(*args, &block)
+ opts = Hash === args.last ? args.last : {}
+ if opts[:shared]
+ SharedExampleGroup.new(*args, &block)
+ else
+ superclass = determine_superclass(opts)
+ superclass.describe(*args, &block)
+ end
+ end
+
+ protected
+
+ def determine_superclass(opts)
+ id = if opts[:type]
+ opts[:type]
+ elsif opts[:spec_path] =~ /spec(\\|\/)(#{@example_group_types.keys.join('|')})/
+ $2 == '' ? nil : $2.to_sym
+ end
+ get(id)
+ end
+
+ end
+ self.reset
+ end
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/example/example_group_methods.rb b/vendor/gems/rspec/lib/spec/example/example_group_methods.rb
new file mode 100644
index 000000000..a348bc74b
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/example/example_group_methods.rb
@@ -0,0 +1,424 @@
+module Spec
+ module Example
+
+ module ExampleGroupMethods
+ class << self
+ def description_text(*args)
+ args.inject("") do |result, arg|
+ result << " " unless (result == "" || arg.to_s =~ /^(\s|\.|#)/)
+ result << arg.to_s
+ end
+ end
+ end
+
+ attr_reader :description_text, :description_args, :description_options, :spec_path, :registration_binding_block
+
+ def inherited(klass)
+ super
+ klass.register {}
+ Spec::Runner.register_at_exit_hook
+ end
+
+ # Makes the describe/it syntax available from a class. For example:
+ #
+ # class StackSpec < Spec::ExampleGroup
+ # describe Stack, "with no elements"
+ #
+ # before
+ # @stack = Stack.new
+ # end
+ #
+ # it "should raise on pop" do
+ # lambda{ @stack.pop }.should raise_error
+ # end
+ # end
+ #
+ def describe(*args, &example_group_block)
+ if example_group_block
+ self.subclass("Subclass") do
+ describe(*args)
+ module_eval(&example_group_block)
+ end
+ else
+ set_description(*args)
+ before_eval
+ self
+ end
+ end
+
+ # Use this to pull in examples from shared example groups.
+ # See Spec::Runner for information about shared example groups.
+ def it_should_behave_like(shared_example_group)
+ case shared_example_group
+ when SharedExampleGroup
+ include shared_example_group
+ else
+ example_group = SharedExampleGroup.find_shared_example_group(shared_example_group)
+ unless example_group
+ raise RuntimeError.new("Shared Example Group '#{shared_example_group}' can not be found")
+ end
+ include(example_group)
+ end
+ end
+
+ # :call-seq:
+ # predicate_matchers[matcher_name] = method_on_object
+ # predicate_matchers[matcher_name] = [method1_on_object, method2_on_object]
+ #
+ # Dynamically generates a custom matcher that will match
+ # a predicate on your class. RSpec provides a couple of these
+ # out of the box:
+ #
+ # exist (or state expectations)
+ # File.should exist("path/to/file")
+ #
+ # an_instance_of (for mock argument constraints)
+ # mock.should_receive(:message).with(an_instance_of(String))
+ #
+ # == Examples
+ #
+ # class Fish
+ # def can_swim?
+ # true
+ # end
+ # end
+ #
+ # describe Fish do
+ # predicate_matchers[:swim] = :can_swim?
+ # it "should swim" do
+ # Fish.new.should swim
+ # end
+ # end
+ def predicate_matchers
+ @predicate_matchers ||= {:an_instance_of => :is_a?}
+ end
+
+ # Creates an instance of Spec::Example::Example and adds
+ # it to a collection of examples of the current example group.
+ def it(description=nil, &implementation)
+ e = new(description, &implementation)
+ example_objects << e
+ e
+ end
+
+ alias_method :specify, :it
+
+ # Use this to temporarily disable an example.
+ def xit(description=nil, opts={}, &block)
+ Kernel.warn("Example disabled: #{description}")
+ end
+
+ def run
+ examples = examples_to_run
+ return true if examples.empty?
+ reporter.add_example_group(self)
+ return dry_run(examples) if dry_run?
+
+ plugin_mock_framework
+ define_methods_from_predicate_matchers
+
+ success, before_all_instance_variables = run_before_all
+ success, after_all_instance_variables = execute_examples(success, before_all_instance_variables, examples)
+ success = run_after_all(success, after_all_instance_variables)
+ end
+
+ def description
+ result = ExampleGroupMethods.description_text(*description_parts)
+ if result.nil? || result == ""
+ return to_s
+ else
+ result
+ end
+ end
+
+ def described_type
+ description_parts.find {|part| part.is_a?(Module)}
+ end
+
+ def description_parts #:nodoc:
+ parts = []
+ execute_in_class_hierarchy do |example_group|
+ parts << example_group.description_args
+ end
+ parts.flatten.compact
+ end
+
+ def set_description(*args)
+ args, options = args_and_options(*args)
+ @description_args = args
+ @description_options = options
+ @description_text = ExampleGroupMethods.description_text(*args)
+ @spec_path = File.expand_path(options[:spec_path]) if options[:spec_path]
+ if described_type.class == Module
+ include described_type
+ end
+ self
+ end
+
+ def examples #:nodoc:
+ examples = example_objects.dup
+ add_method_examples(examples)
+ rspec_options.reverse ? examples.reverse : examples
+ end
+
+ def number_of_examples #:nodoc:
+ examples.length
+ end
+
+ # Registers a block to be executed before each example.
+ # This method prepends +block+ to existing before blocks.
+ def prepend_before(*args, &block)
+ scope, options = scope_and_options(*args)
+ parts = before_parts_from_scope(scope)
+ parts.unshift(block)
+ end
+
+ # Registers a block to be executed before each example.
+ # This method appends +block+ to existing before blocks.
+ def append_before(*args, &block)
+ scope, options = scope_and_options(*args)
+ parts = before_parts_from_scope(scope)
+ parts << block
+ end
+ alias_method :before, :append_before
+
+ # Registers a block to be executed after each example.
+ # This method prepends +block+ to existing after blocks.
+ def prepend_after(*args, &block)
+ scope, options = scope_and_options(*args)
+ parts = after_parts_from_scope(scope)
+ parts.unshift(block)
+ end
+ alias_method :after, :prepend_after
+
+ # Registers a block to be executed after each example.
+ # This method appends +block+ to existing after blocks.
+ def append_after(*args, &block)
+ scope, options = scope_and_options(*args)
+ parts = after_parts_from_scope(scope)
+ parts << block
+ end
+
+ def remove_after(scope, &block)
+ after_each_parts.delete(block)
+ end
+
+ # Deprecated. Use before(:each)
+ def setup(&block)
+ before(:each, &block)
+ end
+
+ # Deprecated. Use after(:each)
+ def teardown(&block)
+ after(:each, &block)
+ end
+
+ def before_all_parts # :nodoc:
+ @before_all_parts ||= []
+ end
+
+ def after_all_parts # :nodoc:
+ @after_all_parts ||= []
+ end
+
+ def before_each_parts # :nodoc:
+ @before_each_parts ||= []
+ end
+
+ def after_each_parts # :nodoc:
+ @after_each_parts ||= []
+ end
+
+ # Only used from RSpec's own examples
+ def reset # :nodoc:
+ @before_all_parts = nil
+ @after_all_parts = nil
+ @before_each_parts = nil
+ @after_each_parts = nil
+ end
+
+ def register(®istration_binding_block)
+ @registration_binding_block = registration_binding_block
+ rspec_options.add_example_group self
+ end
+
+ def unregister #:nodoc:
+ rspec_options.remove_example_group self
+ end
+
+ def registration_backtrace
+ eval("caller", registration_binding_block.binding)
+ end
+
+ def run_before_each(example)
+ execute_in_class_hierarchy do |example_group|
+ example.eval_each_fail_fast(example_group.before_each_parts)
+ end
+ end
+
+ def run_after_each(example)
+ execute_in_class_hierarchy(:superclass_first) do |example_group|
+ example.eval_each_fail_slow(example_group.after_each_parts)
+ end
+ end
+
+ private
+ def dry_run(examples)
+ examples.each do |example|
+ rspec_options.reporter.example_started(example)
+ rspec_options.reporter.example_finished(example)
+ end
+ return true
+ end
+
+ def run_before_all
+ before_all = new("before(:all)")
+ begin
+ execute_in_class_hierarchy do |example_group|
+ before_all.eval_each_fail_fast(example_group.before_all_parts)
+ end
+ return [true, before_all.instance_variable_hash]
+ rescue Exception => e
+ reporter.failure(before_all, e)
+ return [false, before_all.instance_variable_hash]
+ end
+ end
+
+ def execute_examples(success, instance_variables, examples)
+ return [success, instance_variables] unless success
+
+ after_all_instance_variables = instance_variables
+ examples.each do |example_group_instance|
+ success &= example_group_instance.execute(rspec_options, instance_variables)
+ after_all_instance_variables = example_group_instance.instance_variable_hash
+ end
+ return [success, after_all_instance_variables]
+ end
+
+ def run_after_all(success, instance_variables)
+ after_all = new("after(:all)")
+ after_all.set_instance_variables_from_hash(instance_variables)
+ execute_in_class_hierarchy(:superclass_first) do |example_group|
+ after_all.eval_each_fail_slow(example_group.after_all_parts)
+ end
+ return success
+ rescue Exception => e
+ reporter.failure(after_all, e)
+ return false
+ end
+
+ def examples_to_run
+ all_examples = examples
+ return all_examples unless specified_examples?
+ all_examples.reject do |example|
+ matcher = ExampleMatcher.new(description.to_s, example.description)
+ !matcher.matches?(specified_examples)
+ end
+ end
+
+ def specified_examples?
+ specified_examples && !specified_examples.empty?
+ end
+
+ def specified_examples
+ rspec_options.examples
+ end
+
+ def reporter
+ rspec_options.reporter
+ end
+
+ def dry_run?
+ rspec_options.dry_run
+ end
+
+ def example_objects
+ @example_objects ||= []
+ end
+
+ def execute_in_class_hierarchy(superclass_last=false)
+ classes = []
+ current_class = self
+ while is_example_group?(current_class)
+ superclass_last ? classes << current_class : classes.unshift(current_class)
+ current_class = current_class.superclass
+ end
+ superclass_last ? classes << ExampleMethods : classes.unshift(ExampleMethods)
+
+ classes.each do |example_group|
+ yield example_group
+ end
+ end
+
+ def is_example_group?(klass)
+ Module === klass && klass.kind_of?(ExampleGroupMethods)
+ end
+
+ def plugin_mock_framework
+ case mock_framework = Spec::Runner.configuration.mock_framework
+ when Module
+ include mock_framework
+ else
+ require Spec::Runner.configuration.mock_framework
+ include Spec::Plugins::MockFramework
+ end
+ end
+
+ def define_methods_from_predicate_matchers # :nodoc:
+ all_predicate_matchers = predicate_matchers.merge(
+ Spec::Runner.configuration.predicate_matchers
+ )
+ all_predicate_matchers.each_pair do |matcher_method, method_on_object|
+ define_method matcher_method do |*args|
+ eval("be_#{method_on_object.to_s.gsub('?','')}(*args)")
+ end
+ end
+ end
+
+ def scope_and_options(*args)
+ args, options = args_and_options(*args)
+ scope = (args[0] || :each), options
+ end
+
+ def before_parts_from_scope(scope)
+ case scope
+ when :each; before_each_parts
+ when :all; before_all_parts
+ end
+ end
+
+ def after_parts_from_scope(scope)
+ case scope
+ when :each; after_each_parts
+ when :all; after_all_parts
+ end
+ end
+
+ def before_eval
+ end
+
+ def add_method_examples(examples)
+ instance_methods.sort.each do |method_name|
+ if example_method?(method_name)
+ examples << new(method_name) do
+ __send__(method_name)
+ end
+ end
+ end
+ end
+
+ def example_method?(method_name)
+ should_method?(method_name)
+ end
+
+ def should_method?(method_name)
+ !(method_name =~ /^should(_not)?$/) &&
+ method_name =~ /^should/ && (
+ instance_method(method_name).arity == 0 ||
+ instance_method(method_name).arity == -1
+ )
+ end
+ end
+
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/example/example_matcher.rb b/vendor/gems/rspec/lib/spec/example/example_matcher.rb
new file mode 100755
index 000000000..435eabf52
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/example/example_matcher.rb
@@ -0,0 +1,42 @@
+module Spec
+ module Example
+ class ExampleMatcher
+ def initialize(example_group_description, example_name)
+ @example_group_description = example_group_description
+ @example_name = example_name
+ end
+
+ def matches?(specified_examples)
+ specified_examples.each do |specified_example|
+ return true if matches_literal_example?(specified_example) || matches_example_not_considering_modules?(specified_example)
+ end
+ false
+ end
+
+ protected
+ def matches_literal_example?(specified_example)
+ specified_example =~ /(^#{example_group_regex} #{example_regexp}$|^#{example_group_regex}$|^#{example_group_with_before_all_regexp}$|^#{example_regexp}$)/
+ end
+
+ def matches_example_not_considering_modules?(specified_example)
+ specified_example =~ /(^#{example_group_regex_not_considering_modules} #{example_regexp}$|^#{example_group_regex_not_considering_modules}$|^#{example_regexp}$)/
+ end
+
+ def example_group_regex
+ Regexp.escape(@example_group_description)
+ end
+
+ def example_group_with_before_all_regexp
+ Regexp.escape("#{@example_group_description} before(:all)")
+ end
+
+ def example_group_regex_not_considering_modules
+ Regexp.escape(@example_group_description.split('::').last)
+ end
+
+ def example_regexp
+ Regexp.escape(@example_name)
+ end
+ end
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/example/example_methods.rb b/vendor/gems/rspec/lib/spec/example/example_methods.rb
new file mode 100644
index 000000000..babd31dfa
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/example/example_methods.rb
@@ -0,0 +1,106 @@
+module Spec
+ module Example
+ module ExampleMethods
+ extend ExampleGroupMethods
+ extend ModuleReopeningFix
+
+ PENDING_EXAMPLE_BLOCK = lambda {
+ raise Spec::Example::ExamplePendingError.new("Not Yet Implemented")
+ }
+
+ def execute(options, instance_variables)
+ options.reporter.example_started(self)
+ set_instance_variables_from_hash(instance_variables)
+
+ execution_error = nil
+ Timeout.timeout(options.timeout) do
+ begin
+ before_example
+ run_with_description_capturing
+ rescue Exception => e
+ execution_error ||= e
+ end
+ begin
+ after_example
+ rescue Exception => e
+ execution_error ||= e
+ end
+ end
+
+ options.reporter.example_finished(self, execution_error)
+ success = execution_error.nil? || ExamplePendingError === execution_error
+ end
+
+ def instance_variable_hash
+ instance_variables.inject({}) do |variable_hash, variable_name|
+ variable_hash[variable_name] = instance_variable_get(variable_name)
+ variable_hash
+ end
+ end
+
+ def violated(message="")
+ raise Spec::Expectations::ExpectationNotMetError.new(message)
+ end
+
+ def eval_each_fail_fast(procs) #:nodoc:
+ procs.each do |proc|
+ instance_eval(&proc)
+ end
+ end
+
+ def eval_each_fail_slow(procs) #:nodoc:
+ first_exception = nil
+ procs.each do |proc|
+ begin
+ instance_eval(&proc)
+ rescue Exception => e
+ first_exception ||= e
+ end
+ end
+ raise first_exception if first_exception
+ end
+
+ def description
+ @_defined_description || @_matcher_description || "NO NAME"
+ end
+
+ def set_instance_variables_from_hash(ivars)
+ ivars.each do |variable_name, value|
+ # Ruby 1.9 requires variable.to_s on the next line
+ unless ['@_implementation', '@_defined_description', '@_matcher_description', '@method_name'].include?(variable_name.to_s)
+ instance_variable_set variable_name, value
+ end
+ end
+ end
+
+ def run_with_description_capturing
+ begin
+ return instance_eval(&(@_implementation || PENDING_EXAMPLE_BLOCK))
+ ensure
+ @_matcher_description = Spec::Matchers.generated_description
+ Spec::Matchers.clear_generated_description
+ end
+ end
+
+ def implementation_backtrace
+ eval("caller", @_implementation)
+ end
+
+ protected
+ include Matchers
+ include Pending
+
+ def before_example
+ setup_mocks_for_rspec
+ self.class.run_before_each(self)
+ end
+
+ def after_example
+ self.class.run_after_each(self)
+ verify_mocks_for_rspec
+ ensure
+ teardown_mocks_for_rspec
+ end
+ end
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/example/module_reopening_fix.rb b/vendor/gems/rspec/lib/spec/example/module_reopening_fix.rb
new file mode 100644
index 000000000..dc01dd666
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/example/module_reopening_fix.rb
@@ -0,0 +1,21 @@
+module Spec
+ module Example
+ # This is a fix for ...Something in Ruby 1.8.6??... (Someone fill in here please - Aslak)
+ module ModuleReopeningFix
+ def child_modules
+ @child_modules ||= []
+ end
+
+ def included(mod)
+ child_modules << mod
+ end
+
+ def include(mod)
+ super
+ child_modules.each do |child_module|
+ child_module.__send__(:include, mod)
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/lib/spec/example/pending.rb b/vendor/gems/rspec/lib/spec/example/pending.rb
new file mode 100644
index 000000000..b1f27c866
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/example/pending.rb
@@ -0,0 +1,18 @@
+module Spec
+ module Example
+ module Pending
+ def pending(message = "TODO")
+ if block_given?
+ begin
+ yield
+ rescue Exception => e
+ raise Spec::Example::ExamplePendingError.new(message)
+ end
+ raise Spec::Example::PendingExampleFixedError.new("Expected pending '#{message}' to fail. No Error was raised.")
+ else
+ raise Spec::Example::ExamplePendingError.new(message)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/example/shared_example_group.rb b/vendor/gems/rspec/lib/spec/example/shared_example_group.rb
new file mode 100644
index 000000000..a6fd6211c
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/example/shared_example_group.rb
@@ -0,0 +1,58 @@
+module Spec
+ module Example
+ class SharedExampleGroup < Module
+ class << self
+ def add_shared_example_group(new_example_group)
+ guard_against_redefining_existing_example_group(new_example_group)
+ shared_example_groups << new_example_group
+ end
+
+ def find_shared_example_group(example_group_description)
+ shared_example_groups.find do |b|
+ b.description == example_group_description
+ end
+ end
+
+ def shared_example_groups
+ # TODO - this needs to be global, or at least accessible from
+ # from subclasses of Example in a centralized place. I'm not loving
+ # this as a solution, but it works for now.
+ $shared_example_groups ||= []
+ end
+
+ private
+ def guard_against_redefining_existing_example_group(new_example_group)
+ existing_example_group = find_shared_example_group(new_example_group.description)
+ return unless existing_example_group
+ return if new_example_group.equal?(existing_example_group)
+ return if spec_path(new_example_group) == spec_path(existing_example_group)
+ raise ArgumentError.new("Shared Example '#{existing_example_group.description}' already exists")
+ end
+
+ def spec_path(example_group)
+ File.expand_path(example_group.spec_path)
+ end
+ end
+ include ExampleGroupMethods
+ public :include
+
+ def initialize(*args, &example_group_block)
+ describe(*args)
+ @example_group_block = example_group_block
+ self.class.add_shared_example_group(self)
+ end
+
+ def included(mod) # :nodoc:
+ mod.module_eval(&@example_group_block)
+ end
+
+ def execute_in_class_hierarchy(superclass_last=false)
+ classes = [self]
+ superclass_last ? classes << ExampleMethods : classes.unshift(ExampleMethods)
+ classes.each do |example_group|
+ yield example_group
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/expectations/differs/default.rb b/vendor/gems/rspec/lib/spec/expectations/differs/default.rb
index 87e59b3a6..a5eb1bb89 100644
--- a/vendor/gems/rspec/lib/spec/expectations/differs/default.rb
+++ b/vendor/gems/rspec/lib/spec/expectations/differs/default.rb
@@ -1,61 +1,66 @@
begin
require 'rubygems'
require 'diff/lcs' #necessary due to loading bug on some machines - not sure why - DaC
require 'diff/lcs/hunk'
rescue LoadError ; raise "You must gem install diff-lcs to use diffing" ; end
require 'pp'
module Spec
module Expectations
module Differs
# TODO add some rdoc
class Default
- def initialize(format=:unified,context_lines=nil,colour=nil)
-
- context_lines ||= 3
- colour ||= false
-
- @format,@context_lines,@colour = format,context_lines,colour
+ def initialize(options)
+ @options = options
end
# This is snagged from diff/lcs/ldiff.rb (which is a commandline tool)
def diff_as_string(data_old, data_new)
data_old = data_old.split(/\n/).map! { |e| e.chomp }
data_new = data_new.split(/\n/).map! { |e| e.chomp }
output = ""
diffs = Diff::LCS.diff(data_old, data_new)
return output if diffs.empty?
oldhunk = hunk = nil
file_length_difference = 0
diffs.each do |piece|
begin
- hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, @context_lines,
+ hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, context_lines,
file_length_difference)
file_length_difference = hunk.file_length_difference
next unless oldhunk
# Hunks may overlap, which is why we need to be careful when our
# diff includes lines of context. Otherwise, we might print
# redundant lines.
- if (@context_lines > 0) and hunk.overlaps?(oldhunk)
+ if (context_lines > 0) and hunk.overlaps?(oldhunk)
hunk.unshift(oldhunk)
else
- output << oldhunk.diff(@format)
+ output << oldhunk.diff(format)
end
ensure
oldhunk = hunk
output << "\n"
end
end
#Handle the last remaining hunk
- output << oldhunk.diff(@format) << "\n"
+ output << oldhunk.diff(format) << "\n"
end
def diff_as_object(target,expected)
diff_as_string(PP.pp(target,""), PP.pp(expected,""))
end
+
+ protected
+ def format
+ @options.diff_format
+ end
+
+ def context_lines
+ @options.context_lines
+ end
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/expectations/errors.rb b/vendor/gems/rspec/lib/spec/expectations/errors.rb
index 03e81a064..1fabd105d 100644
--- a/vendor/gems/rspec/lib/spec/expectations/errors.rb
+++ b/vendor/gems/rspec/lib/spec/expectations/errors.rb
@@ -1,6 +1,12 @@
module Spec
module Expectations
- class ExpectationNotMetError < StandardError
+ # If Test::Unit is loaed, we'll use its error as baseclass, so that Test::Unit
+ # will report unmet RSpec expectations as failures rather than errors.
+ superclass = ['Test::Unit::AssertionFailedError', '::StandardError'].map do |c|
+ eval(c) rescue nil
+ end.compact.first
+
+ class ExpectationNotMetError < superclass
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/expectations/extensions/object.rb b/vendor/gems/rspec/lib/spec/expectations/extensions/object.rb
index f59af722e..a3925bbee 100644
--- a/vendor/gems/rspec/lib/spec/expectations/extensions/object.rb
+++ b/vendor/gems/rspec/lib/spec/expectations/extensions/object.rb
@@ -1,66 +1,71 @@
module Spec
module Expectations
# rspec adds #should and #should_not to every Object (and,
# implicitly, every Class).
module ObjectExpectations
-
# :call-seq:
# should(matcher)
# should == expected
# should === expected
# should =~ expected
#
# receiver.should(matcher)
# => Passes if matcher.matches?(receiver)
#
# receiver.should == expected #any value
# => Passes if (receiver == expected)
#
# receiver.should === expected #any value
# => Passes if (receiver === expected)
#
# receiver.should =~ regexp
# => Passes if (receiver =~ regexp)
#
# See Spec::Matchers for more information about matchers
#
# == Warning
#
# NOTE that this does NOT support receiver.should != expected.
# Instead, use receiver.should_not == expected
- def should(matcher=nil, &block)
- return ExpectationMatcherHandler.handle_matcher(self, matcher, &block) if matcher
- Spec::Matchers::PositiveOperatorMatcher.new(self)
+ def should(matcher = :default_parameter, &block)
+ if :default_parameter == matcher
+ Spec::Matchers::PositiveOperatorMatcher.new(self)
+ else
+ ExpectationMatcherHandler.handle_matcher(self, matcher, &block)
+ end
end
# :call-seq:
# should_not(matcher)
# should_not == expected
# should_not === expected
# should_not =~ expected
#
# receiver.should_not(matcher)
# => Passes unless matcher.matches?(receiver)
#
# receiver.should_not == expected
# => Passes unless (receiver == expected)
#
# receiver.should_not === expected
# => Passes unless (receiver === expected)
#
# receiver.should_not =~ regexp
# => Passes unless (receiver =~ regexp)
#
# See Spec::Matchers for more information about matchers
- def should_not(matcher=nil, &block)
- return NegativeExpectationMatcherHandler.handle_matcher(self, matcher, &block) if matcher
- Spec::Matchers::NegativeOperatorMatcher.new(self)
+ def should_not(matcher = :default_parameter, &block)
+ if :default_parameter == matcher
+ Spec::Matchers::NegativeOperatorMatcher.new(self)
+ else
+ NegativeExpectationMatcherHandler.handle_matcher(self, matcher, &block)
+ end
end
end
end
end
class Object
include Spec::Expectations::ObjectExpectations
end
diff --git a/vendor/gems/rspec/lib/spec/expectations/handler.rb b/vendor/gems/rspec/lib/spec/expectations/handler.rb
index 4caa321e4..e6dce0846 100644
--- a/vendor/gems/rspec/lib/spec/expectations/handler.rb
+++ b/vendor/gems/rspec/lib/spec/expectations/handler.rb
@@ -1,43 +1,52 @@
module Spec
module Expectations
+ class InvalidMatcherError < ArgumentError; end
module MatcherHandlerHelper
- def describe(matcher)
+ def describe_matcher(matcher)
matcher.respond_to?(:description) ? matcher.description : "[#{matcher.class.name} does not provide a description]"
end
end
- class ExpectationMatcherHandler
+ class ExpectationMatcherHandler
class << self
include MatcherHandlerHelper
def handle_matcher(actual, matcher, &block)
+ unless matcher.respond_to?(:matches?)
+ raise InvalidMatcherError, "Expected a matcher, got #{matcher.inspect}."
+ end
+
match = matcher.matches?(actual, &block)
- ::Spec::Matchers.generated_description = "should #{describe(matcher)}"
+ ::Spec::Matchers.generated_description = "should #{describe_matcher(matcher)}"
Spec::Expectations.fail_with(matcher.failure_message) unless match
end
end
end
class NegativeExpectationMatcherHandler
class << self
include MatcherHandlerHelper
def handle_matcher(actual, matcher, &block)
+ unless matcher.respond_to?(:matches?)
+ raise InvalidMatcherError, "Expected a matcher, got #{matcher.inspect}."
+ end
+
unless matcher.respond_to?(:negative_failure_message)
Spec::Expectations.fail_with(
<<-EOF
Matcher does not support should_not.
See Spec::Matchers for more information
about matchers.
EOF
)
end
match = matcher.matches?(actual, &block)
- ::Spec::Matchers.generated_description = "should not #{describe(matcher)}"
+ ::Spec::Matchers.generated_description = "should not #{describe_matcher(matcher)}"
Spec::Expectations.fail_with(matcher.negative_failure_message) if match
end
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/extensions.rb b/vendor/gems/rspec/lib/spec/extensions.rb
old mode 100644
new mode 100755
index 824f03bfb..9a313d0e7
--- a/vendor/gems/rspec/lib/spec/extensions.rb
+++ b/vendor/gems/rspec/lib/spec/extensions.rb
@@ -1 +1,3 @@
require 'spec/extensions/object'
+require 'spec/extensions/class'
+require 'spec/extensions/main'
diff --git a/vendor/gems/rspec/lib/spec/extensions/class.rb b/vendor/gems/rspec/lib/spec/extensions/class.rb
new file mode 100644
index 000000000..30730f87e
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/extensions/class.rb
@@ -0,0 +1,24 @@
+class Class
+ # Creates a new subclass of self, with a name "under" our own name.
+ # Example:
+ #
+ # x = Foo::Bar.subclass('Zap'){}
+ # x.name # => Foo::Bar::Zap_1
+ # x.superclass.name # => Foo::Bar
+ def subclass(base_name, &body)
+ klass = Class.new(self)
+ class_name = "#{base_name}_#{class_count!}"
+ instance_eval do
+ const_set(class_name, klass)
+ end
+ klass.instance_eval(&body)
+ klass
+ end
+
+ private
+ def class_count!
+ @class_count ||= 0
+ @class_count += 1
+ @class_count
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/lib/spec/extensions/main.rb b/vendor/gems/rspec/lib/spec/extensions/main.rb
new file mode 100644
index 000000000..281cbf879
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/extensions/main.rb
@@ -0,0 +1,102 @@
+module Spec
+ module Extensions
+ module Main
+ # Creates and returns a class that includes the ExampleGroupMethods
+ # module. Which ExampleGroup type is created depends on the directory of the file
+ # calling this method. For example, Spec::Rails will use different
+ # classes for specs living in spec/models,
+ # spec/helpers, spec/views and
+ # spec/controllers.
+ #
+ # It is also possible to override autodiscovery of the example group
+ # type with an options Hash as the last argument:
+ #
+ # describe "name", :type => :something_special do ...
+ #
+ # The reason for using different behaviour classes is to have different
+ # matcher methods available from within the describe block.
+ #
+ # See Spec::Example::ExampleFactory#register for details about how to
+ # register special implementations.
+ #
+ def describe(*args, &block)
+ raise ArgumentError if args.empty?
+ raise ArgumentError unless block
+ args << {} unless Hash === args.last
+ args.last[:spec_path] = caller(0)[1]
+ Spec::Example::ExampleGroupFactory.create_example_group(*args, &block)
+ end
+ alias :context :describe
+
+ # Creates an example group that can be shared by other example groups
+ #
+ # == Examples
+ #
+ # share_examples_for "All Editions" do
+ # it "all editions behaviour" ...
+ # end
+ #
+ # describe SmallEdition do
+ # it_should_behave_like "All Editions"
+ #
+ # it "should do small edition stuff" do
+ # ...
+ # end
+ # end
+ def share_examples_for(name, &block)
+ describe(name, :shared => true, &block)
+ end
+
+ alias :shared_examples_for :share_examples_for
+
+ # Creates a Shared Example Group and assigns it to a constant
+ #
+ # share_as :AllEditions do
+ # it "should do all editions stuff" ...
+ # end
+ #
+ # describe SmallEdition do
+ # it_should_behave_like AllEditions
+ #
+ # it "should do small edition stuff" do
+ # ...
+ # end
+ # end
+ #
+ # And, for those of you who prefer to use something more like Ruby, you
+ # can just include the module directly
+ #
+ # describe SmallEdition do
+ # include AllEditions
+ #
+ # it "should do small edition stuff" do
+ # ...
+ # end
+ # end
+ def share_as(name, &block)
+ begin
+ Object.const_set(name, share_examples_for(name, &block))
+ rescue NameError => e
+ raise NameError.new(e.message + "\nThe first argument to share_as must be a legal name for a constant\n")
+ end
+ end
+
+ private
+
+ def rspec_options
+ $rspec_options ||= begin; \
+ parser = ::Spec::Runner::OptionParser.new(STDERR, STDOUT); \
+ parser.order!(ARGV); \
+ $rspec_options = parser.options; \
+ end
+ $rspec_options
+ end
+
+ def init_rspec_options(options)
+ $rspec_options = options if $rspec_options.nil?
+ end
+ end
+ end
+end
+
+include Spec::Extensions::Main
\ No newline at end of file
diff --git a/vendor/gems/rspec/lib/spec/extensions/object.rb b/vendor/gems/rspec/lib/spec/extensions/object.rb
old mode 100644
new mode 100755
index 6218aa770..e9f6364e2
--- a/vendor/gems/rspec/lib/spec/extensions/object.rb
+++ b/vendor/gems/rspec/lib/spec/extensions/object.rb
@@ -1,6 +1,10 @@
class Object
def args_and_options(*args)
options = Hash === args.last ? args.pop : {}
return args, options
end
-end
+
+ def metaclass
+ class << self; self; end
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/interop/test.rb b/vendor/gems/rspec/lib/spec/interop/test.rb
new file mode 100644
index 000000000..afa16137b
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/interop/test.rb
@@ -0,0 +1,12 @@
+require 'test/unit'
+require 'test/unit/testresult'
+
+require 'spec/interop/test/unit/testcase'
+require 'spec/interop/test/unit/testsuite_adapter'
+require 'spec/interop/test/unit/autorunner'
+require 'spec/interop/test/unit/testresult'
+require 'spec/interop/test/unit/ui/console/testrunner'
+
+Spec::Example::ExampleGroupFactory.default(Test::Unit::TestCase)
+
+Test::Unit.run = true
diff --git a/vendor/gems/rspec/lib/spec/interop/test/unit/autorunner.rb b/vendor/gems/rspec/lib/spec/interop/test/unit/autorunner.rb
new file mode 100644
index 000000000..3944e6995
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/interop/test/unit/autorunner.rb
@@ -0,0 +1,6 @@
+class Test::Unit::AutoRunner
+ remove_method :process_args
+ def process_args(argv)
+ true
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/interop/test/unit/testcase.rb b/vendor/gems/rspec/lib/spec/interop/test/unit/testcase.rb
new file mode 100644
index 000000000..b32a820c1
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/interop/test/unit/testcase.rb
@@ -0,0 +1,61 @@
+require 'test/unit/testcase'
+
+module Test
+ module Unit
+ # This extension of the standard Test::Unit::TestCase makes RSpec
+ # available from within, so that you can do things like:
+ #
+ # require 'test/unit'
+ # require 'spec'
+ #
+ # class MyTest < Test::Unit::TestCase
+ # it "should work with Test::Unit assertions" do
+ # assert_equal 4, 2+1
+ # end
+ #
+ # def test_should_work_with_rspec_expectations
+ # (3+1).should == 5
+ # end
+ # end
+ #
+ # See also Spec::Example::ExampleGroup
+ class TestCase
+ extend Spec::Example::ExampleGroupMethods
+ include Spec::Example::ExampleMethods
+
+ before(:each) {setup}
+ after(:each) {teardown}
+
+ class << self
+ def suite
+ Test::Unit::TestSuiteAdapter.new(self)
+ end
+
+ def example_method?(method_name)
+ should_method?(method_name) || test_method?(method_name)
+ end
+
+ def test_method?(method_name)
+ method_name =~ /^test[_A-Z]./ && (
+ instance_method(method_name).arity == 0 ||
+ instance_method(method_name).arity == -1
+ )
+ end
+ end
+
+ def initialize(defined_description, &implementation)
+ @_defined_description = defined_description
+ @_implementation = implementation
+
+ @_result = ::Test::Unit::TestResult.new
+ # @method_name is important to set here because it "complies" with Test::Unit's interface.
+ # Some Test::Unit extensions depend on @method_name being present.
+ @method_name = @_defined_description
+ end
+
+ def run(ignore_this_argument=nil)
+ super()
+ end
+ end
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/interop/test/unit/testresult.rb b/vendor/gems/rspec/lib/spec/interop/test/unit/testresult.rb
new file mode 100644
index 000000000..1386dc728
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/interop/test/unit/testresult.rb
@@ -0,0 +1,6 @@
+class Test::Unit::TestResult
+ alias_method :tu_passed?, :passed?
+ def passed?
+ return tu_passed? & ::Spec.run
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/lib/spec/interop/test/unit/testsuite_adapter.rb b/vendor/gems/rspec/lib/spec/interop/test/unit/testsuite_adapter.rb
new file mode 100644
index 000000000..7c0ed092d
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/interop/test/unit/testsuite_adapter.rb
@@ -0,0 +1,34 @@
+module Test
+ module Unit
+ class TestSuiteAdapter < TestSuite
+ attr_reader :example_group, :examples
+ alias_method :tests, :examples
+ def initialize(example_group)
+ @example_group = example_group
+ @examples = example_group.examples
+ end
+
+ def name
+ example_group.description
+ end
+
+ def run(*args)
+ return true unless args.empty?
+ example_group.run
+ end
+
+ def size
+ example_group.number_of_examples
+ end
+
+ def delete(example)
+ examples.delete example
+ end
+
+ def empty?
+ examples.empty?
+ end
+ end
+ end
+end
+
diff --git a/vendor/gems/rspec/lib/spec/interop/test/unit/ui/console/testrunner.rb b/vendor/gems/rspec/lib/spec/interop/test/unit/ui/console/testrunner.rb
new file mode 100644
index 000000000..8e9995e02
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/interop/test/unit/ui/console/testrunner.rb
@@ -0,0 +1,61 @@
+require 'test/unit/ui/console/testrunner'
+
+module Test
+ module Unit
+ module UI
+ module Console
+ class TestRunner
+
+ alias_method :started_without_rspec, :started
+ def started_with_rspec(result)
+ @result = result
+ @need_to_output_started = true
+ end
+ alias_method :started, :started_with_rspec
+
+ alias_method :test_started_without_rspec, :test_started
+ def test_started_with_rspec(name)
+ if @need_to_output_started
+ if @rspec_io
+ @rspec_io.rewind
+ output(@rspec_io.read)
+ end
+ output("Started")
+ @need_to_output_started = false
+ end
+ test_started_without_rspec(name)
+ end
+ alias_method :test_started, :test_started_with_rspec
+
+ alias_method :test_finished_without_rspec, :test_finished
+ def test_finished_with_rspec(name)
+ test_finished_without_rspec(name)
+ @ran_test = true
+ end
+ alias_method :test_finished, :test_finished_with_rspec
+
+ alias_method :finished_without_rspec, :finished
+ def finished_with_rspec(elapsed_time)
+ @ran_test ||= false
+ if @ran_test
+ finished_without_rspec(elapsed_time)
+ end
+ end
+ alias_method :finished, :finished_with_rspec
+
+ alias_method :setup_mediator_without_rspec, :setup_mediator
+ def setup_mediator_with_rspec
+ orig_io = @io
+ @io = StringIO.new
+ setup_mediator_without_rspec
+ ensure
+ @rspec_io = @io
+ @io = orig_io
+ end
+ alias_method :setup_mediator, :setup_mediator_with_rspec
+
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/matchers.rb b/vendor/gems/rspec/lib/spec/matchers.rb
index fd208d628..afae5ae5f 100644
--- a/vendor/gems/rspec/lib/spec/matchers.rb
+++ b/vendor/gems/rspec/lib/spec/matchers.rb
@@ -1,166 +1,156 @@
+require 'spec/matchers/simple_matcher'
require 'spec/matchers/be'
require 'spec/matchers/be_close'
require 'spec/matchers/change'
require 'spec/matchers/eql'
require 'spec/matchers/equal'
+require 'spec/matchers/exist'
require 'spec/matchers/has'
require 'spec/matchers/have'
require 'spec/matchers/include'
require 'spec/matchers/match'
require 'spec/matchers/raise_error'
require 'spec/matchers/respond_to'
require 'spec/matchers/satisfy'
require 'spec/matchers/throw_symbol'
require 'spec/matchers/operator_matcher'
module Spec
# RSpec ships with a number of useful Expression Matchers. An Expression Matcher
# is any object that responds to the following methods:
#
# matches?(actual)
# failure_message
# negative_failure_message #optional
# description #optional
#
# See Spec::Expectations to learn how to use these as Expectation Matchers.
# See Spec::Mocks to learn how to use them as Mock Argument Constraints.
#
# == Predicates
#
# In addition to those Expression Matchers that are defined explicitly, RSpec will
# create custom Matchers on the fly for any arbitrary predicate, giving your specs
# a much more natural language feel.
#
# A Ruby predicate is a method that ends with a "?" and returns true or false.
# Common examples are +empty?+, +nil?+, and +instance_of?+.
#
# All you need to do is write +should be_+ followed by the predicate without
# the question mark, and RSpec will figure it out from there. For example:
#
# [].should be_empty => [].empty? #passes
# [].should_not be_empty => [].empty? #fails
#
# In addtion to prefixing the predicate matchers with "be_", you can also use "be_a_"
# and "be_an_", making your specs read much more naturally:
#
# "a string".should be_an_instance_of(String) =>"a string".instance_of?(String) #passes
#
# 3.should be_a_kind_of(Fixnum) => 3.kind_of?(Numeric) #passes
# 3.should be_a_kind_of(Numeric) => 3.kind_of?(Numeric) #passes
# 3.should be_an_instance_of(Fixnum) => 3.instance_of?(Fixnum) #passes
# 3.should_not be_instance_of(Numeric) => 3.instance_of?(Numeric) #fails
#
# RSpec will also create custom matchers for predicates like +has_key?+. To
# use this feature, just state that the object should have_key(:key) and RSpec will
# call has_key?(:key) on the target. For example:
#
# {:a => "A"}.should have_key(:a) => {:a => "A"}.has_key?(:a) #passes
# {:a => "A"}.should have_key(:b) => {:a => "A"}.has_key?(:b) #fails
#
# You can use this feature to invoke any predicate that begins with "has_", whether it is
# part of the Ruby libraries (like +Hash#has_key?+) or a method you wrote on your own class.
#
# == Custom Expectation Matchers
#
# When you find that none of the stock Expectation Matchers provide a natural
# feeling expectation, you can very easily write your own.
#
# For example, imagine that you are writing a game in which players can
# be in various zones on a virtual board. To specify that bob should
# be in zone 4, you could say:
#
# bob.current_zone.should eql(Zone.new("4"))
#
# But you might find it more expressive to say:
#
# bob.should be_in_zone("4")
#
# and/or
#
# bob.should_not be_in_zone("3")
#
# To do this, you would need to write a class like this:
#
# class BeInZone
# def initialize(expected)
# @expected = expected
# end
# def matches?(target)
# @target = target
# @target.current_zone.eql?(Zone.new(@expected))
# end
# def failure_message
# "expected #{@target.inspect} to be in Zone #{@expected}"
# end
# def negative_failure_message
# "expected #{@target.inspect} not to be in Zone #{@expected}"
# end
# end
#
# ... and a method like this:
#
# def be_in_zone(expected)
# BeInZone.new(expected)
# end
#
# And then expose the method to your specs. This is normally done
# by including the method and the class in a module, which is then
# included in your spec:
#
# module CustomGameMatchers
# class BeInZone
# ...
# end
#
# def be_in_zone(expected)
# ...
# end
# end
#
# describe "Player behaviour" do
# include CustomGameMatchers
# ...
# end
#
# or you can include in globally in a spec_helper.rb file required
# from your spec file(s):
#
# Spec::Runner.configure do |config|
# config.include(CustomGameMatchers)
# end
#
module Matchers
module ModuleMethods
- def description_generated(callback)
- description_generated_callbacks << callback
- end
-
- def unregister_description_generated(callback)
- description_generated_callbacks.delete(callback)
- end
-
- def generated_description=(name)
- description_generated_callbacks.each do |callback|
- callback.call(name)
- end
- end
+ attr_accessor :generated_description
- private
- def description_generated_callbacks
- @description_generated_callbacks ||= []
+ def clear_generated_description
+ self.generated_description = nil
end
end
+
extend ModuleMethods
-
+
def method_missing(sym, *args, &block) # :nodoc:
return Matchers::Be.new(sym, *args) if sym.starts_with?("be_")
return Matchers::Has.new(sym, *args) if sym.starts_with?("have_")
super
end
class MatcherError < StandardError
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/matchers/be.rb b/vendor/gems/rspec/lib/spec/matchers/be.rb
index 0eb1629a6..2b25b11f4 100644
--- a/vendor/gems/rspec/lib/spec/matchers/be.rb
+++ b/vendor/gems/rspec/lib/spec/matchers/be.rb
@@ -1,206 +1,224 @@
module Spec
module Matchers
class Be #:nodoc:
def initialize(*args)
- @expected = parse_expected(args.shift)
+ if args.empty?
+ @expected = :satisfy_if
+ else
+ @expected = parse_expected(args.shift)
+ end
@args = args
@comparison = ""
end
def matches?(actual)
@actual = actual
- return true if match_or_compare unless handling_predicate?
if handling_predicate?
begin
return @result = actual.__send__(predicate, *@args)
rescue => predicate_error
# This clause should be empty, but rcov will not report it as covered
# unless something (anything) is executed within the clause
rcov_error_report = "http://eigenclass.org/hiki.rb?rcov-0.8.0"
end
# This supports should_exist > target.exists? in the old world.
# We should consider deprecating that ability as in the new world
# you can't write "should exist" unless you have your own custom matcher.
begin
return @result = actual.__send__(present_tense_predicate, *@args)
rescue
raise predicate_error
end
+ else
+ return match_or_compare
end
- return false
end
def failure_message
return "expected #{@comparison}#{expected}, got #{@actual.inspect}" unless handling_predicate?
return "expected #{predicate}#{args_to_s} to return true, got #{@result.inspect}"
end
def negative_failure_message
return "expected not #{expected}, got #{@actual.inspect}" unless handling_predicate?
return "expected #{predicate}#{args_to_s} to return false, got #{@result.inspect}"
end
def expected
+ return "if to be satisfied" if @expected == :satisfy_if
return true if @expected == :true
return false if @expected == :false
return "nil" if @expected == :nil
return @expected.inspect
end
def match_or_compare
+ return @actual ? true : false if @expected == :satisfy_if
return @actual == true if @expected == :true
return @actual == false if @expected == :false
return @actual.nil? if @expected == :nil
return @actual < @expected if @less_than
return @actual <= @expected if @less_than_or_equal
return @actual >= @expected if @greater_than_or_equal
return @actual > @expected if @greater_than
return @actual == @expected if @double_equal
return @actual === @expected if @triple_equal
return @actual.equal?(@expected)
end
def ==(expected)
+ @prefix = "be "
@double_equal = true
@comparison = "== "
@expected = expected
self
end
def ===(expected)
+ @prefix = "be "
@triple_equal = true
@comparison = "=== "
@expected = expected
self
end
def <(expected)
+ @prefix = "be "
@less_than = true
@comparison = "< "
@expected = expected
self
end
def <=(expected)
+ @prefix = "be "
@less_than_or_equal = true
@comparison = "<= "
@expected = expected
self
end
def >=(expected)
+ @prefix = "be "
@greater_than_or_equal = true
@comparison = ">= "
@expected = expected
self
end
def >(expected)
+ @prefix = "be "
@greater_than = true
@comparison = "> "
@expected = expected
self
end
def description
"#{prefix_to_sentence}#{comparison}#{expected_to_sentence}#{args_to_sentence}"
end
private
def parse_expected(expected)
if Symbol === expected
@handling_predicate = true
- ["be_an_","be_a_","be_"].each do |@prefix|
- return "#{expected.to_s.sub(@prefix,"")}".to_sym if expected.starts_with?(@prefix)
+ ["be_an_","be_a_","be_"].each do |prefix|
+ if expected.starts_with?(prefix)
+ @prefix = prefix
+ return "#{expected.to_s.sub(@prefix,"")}".to_sym
+ end
end
end
- @prefix = "be "
+ @prefix = ""
return expected
end
def handling_predicate?
return false if [:true, :false, :nil].include?(@expected)
return @handling_predicate
end
def predicate
"#{@expected.to_s}?".to_sym
end
def present_tense_predicate
"#{@expected.to_s}s?".to_sym
end
def args_to_s
return "" if @args.empty?
inspected_args = @args.collect{|a| a.inspect}
return "(#{inspected_args.join(', ')})"
end
def comparison
@comparison
end
def expected_to_sentence
split_words(@expected)
end
def prefix_to_sentence
split_words(@prefix)
end
def split_words(sym)
sym.to_s.gsub(/_/,' ')
end
def args_to_sentence
case @args.length
when 0
""
when 1
" #{@args[0]}"
else
" #{@args[0...-1].join(', ')} and #{@args[-1]}"
end
end
end
# :call-seq:
+ # should be
# should be_true
# should be_false
# should be_nil
# should be_arbitrary_predicate(*args)
# should_not be_nil
# should_not be_arbitrary_predicate(*args)
#
# Given true, false, or nil, will pass if actual is
- # true, false or nil (respectively).
+ # true, false or nil (respectively). Given no args means
+ # the caller should satisfy an if condition (to be or not to be).
#
# Predicates are any Ruby method that ends in a "?" and returns true or false.
# Given be_ followed by arbitrary_predicate (without the "?"), RSpec will match
# convert that into a query against the target object.
#
# The arbitrary_predicate feature will handle any predicate
# prefixed with "be_an_" (e.g. be_an_instance_of), "be_a_" (e.g. be_a_kind_of)
# or "be_" (e.g. be_empty), letting you choose the prefix that best suits the predicate.
#
# == Examples
#
+ # target.should be
# target.should be_true
# target.should be_false
# target.should be_nil
# target.should_not be_nil
#
# collection.should be_empty #passes if target.empty?
# "this string".should be_an_intance_of(String)
#
# target.should_not be_empty #passes unless target.empty?
# target.should_not be_old_enough(16) #passes unless target.old_enough?(16)
def be(*args)
Matchers::Be.new(*args)
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/matchers/change.rb b/vendor/gems/rspec/lib/spec/matchers/change.rb
index 41a718aca..784e516ed 100644
--- a/vendor/gems/rspec/lib/spec/matchers/change.rb
+++ b/vendor/gems/rspec/lib/spec/matchers/change.rb
@@ -1,120 +1,144 @@
module Spec
module Matchers
#Based on patch from Wilson Bilkovich
class Change #:nodoc:
def initialize(receiver=nil, message=nil, &block)
@receiver = receiver
@message = message
@block = block
end
def matches?(target, &block)
if block
raise MatcherError.new(<<-EOF
block passed to should or should_not change must use {} instead of do/end
EOF
)
end
@target = target
execute_change
return false if @from && (@from != @before)
return false if @to && (@to != @after)
return (@before + @amount == @after) if @amount
+ return ((@after - @before) >= @minimum) if @minimum
+ return ((@after - @before) <= @maximum) if @maximum
return @before != @after
end
def execute_change
@before = @block.nil? ? @receiver.send(@message) : @block.call
@target.call
@after = @block.nil? ? @receiver.send(@message) : @block.call
end
def failure_message
if @to
"#{result} should have been changed to #{@to.inspect}, but is now #{@after.inspect}"
elsif @from
"#{result} should have initially been #{@from.inspect}, but was #{@before.inspect}"
elsif @amount
"#{result} should have been changed by #{@amount.inspect}, but was changed by #{actual_delta.inspect}"
+ elsif @minimum
+ "#{result} should have been changed by at least #{@minimum.inspect}, but was changed by #{actual_delta.inspect}"
+ elsif @maximum
+ "#{result} should have been changed by at most #{@maximum.inspect}, but was changed by #{actual_delta.inspect}"
else
"#{result} should have changed, but is still #{@before.inspect}"
end
end
def result
@message || "result"
end
def actual_delta
@after - @before
end
def negative_failure_message
"#{result} should not have changed, but did change from #{@before.inspect} to #{@after.inspect}"
end
def by(amount)
@amount = amount
self
end
+ def by_at_least(minimum)
+ @minimum = minimum
+ self
+ end
+
+ def by_at_most(maximum)
+ @maximum = maximum
+ self
+ end
+
def to(to)
@to = to
self
end
def from (from)
@from = from
self
end
end
# :call-seq:
# should change(receiver, message, &block)
# should change(receiver, message, &block).by(value)
# should change(receiver, message, &block).from(old).to(new)
# should_not change(receiver, message, &block)
#
# Allows you to specify that a Proc will cause some value to change.
#
# == Examples
#
# lambda {
# team.add_player(player)
# }.should change(roster, :count)
#
# lambda {
# team.add_player(player)
# }.should change(roster, :count).by(1)
#
+ # lambda {
+ # team.add_player(player)
+ # }.should change(roster, :count).by_at_least(1)
+ #
+ # lambda {
+ # team.add_player(player)
+ # }.should change(roster, :count).by_at_most(1)
+ #
# string = "string"
# lambda {
# string.reverse
# }.should change { string }.from("string").to("gnirts")
#
# lambda {
# person.happy_birthday
# }.should change(person, :birthday).from(32).to(33)
#
# lambda {
# employee.develop_great_new_social_networking_app
# }.should change(employee, :title).from("Mail Clerk").to("CEO")
#
# Evaluates +receiver.message+ or +block+ before and
# after it evaluates the c object (generated by the lambdas in the examples above).
#
# Then compares the values before and after the +receiver.message+ and
# evaluates the difference compared to the expected difference.
#
# == Warning
# +should_not+ +change+ only supports the form with no subsequent calls to
- # +be+, +to+ or +from+.
+ # +by+, +by_at_least+, +by_at_most+, +to+ or +from+.
#
# blocks passed to +should+ +change+ and +should_not+ +change+
# must use the {} form (do/end is not supported)
def change(target=nil, message=nil, &block)
Matchers::Change.new(target, message, &block)
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/matchers/exist.rb b/vendor/gems/rspec/lib/spec/matchers/exist.rb
new file mode 100644
index 000000000..a5a911132
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/matchers/exist.rb
@@ -0,0 +1,17 @@
+module Spec
+ module Matchers
+ class Exist
+ def matches? actual
+ @actual = actual
+ @actual.exist?
+ end
+ def failure_message
+ "expected #{@actual.inspect} to exist, but it doesn't."
+ end
+ def negative_failure_message
+ "expected #{@actual.inspect} to not exist, but it does."
+ end
+ end
+ def exist; Exist.new; end
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/matchers/have.rb b/vendor/gems/rspec/lib/spec/matchers/have.rb
index f28b86ad3..47454e3be 100644
--- a/vendor/gems/rspec/lib/spec/matchers/have.rb
+++ b/vendor/gems/rspec/lib/spec/matchers/have.rb
@@ -1,142 +1,145 @@
module Spec
module Matchers
class Have #:nodoc:
def initialize(expected, relativity=:exactly)
@expected = (expected == :no ? 0 : expected)
@relativity = relativity
end
def relativities
@relativities ||= {
:exactly => "",
:at_least => "at least ",
:at_most => "at most "
}
end
def method_missing(sym, *args, &block)
@collection_name = sym
+ @plural_collection_name = Inflector.pluralize(sym.to_s) if Object.const_defined?(:Inflector)
@args = args
@block = block
self
end
def matches?(collection_owner)
if collection_owner.respond_to?(@collection_name)
collection = collection_owner.send(@collection_name, *@args, &@block)
+ elsif (@plural_collection_name && collection_owner.respond_to?(@plural_collection_name))
+ collection = collection_owner.send(@plural_collection_name, *@args, &@block)
elsif (collection_owner.respond_to?(:length) || collection_owner.respond_to?(:size))
collection = collection_owner
else
collection_owner.send(@collection_name, *@args, &@block)
end
@actual = collection.size if collection.respond_to?(:size)
@actual = collection.length if collection.respond_to?(:length)
raise not_a_collection if @actual.nil?
return @actual >= @expected if @relativity == :at_least
return @actual <= @expected if @relativity == :at_most
return @actual == @expected
end
def not_a_collection
"expected #{@collection_name} to be a collection but it does not respond to #length or #size"
end
def failure_message
"expected #{relative_expectation} #{@collection_name}, got #{@actual}"
end
def negative_failure_message
if @relativity == :exactly
return "expected target not to have #{@expected} #{@collection_name}, got #{@actual}"
elsif @relativity == :at_most
return <<-EOF
Isn't life confusing enough?
Instead of having to figure out the meaning of this:
should_not have_at_most(#{@expected}).#{@collection_name}
We recommend that you use this instead:
should have_at_least(#{@expected + 1}).#{@collection_name}
EOF
elsif @relativity == :at_least
return <<-EOF
Isn't life confusing enough?
Instead of having to figure out the meaning of this:
should_not have_at_least(#{@expected}).#{@collection_name}
We recommend that you use this instead:
should have_at_most(#{@expected - 1}).#{@collection_name}
EOF
end
end
def description
"have #{relative_expectation} #{@collection_name}"
end
private
def relative_expectation
"#{relativities[@relativity]}#{@expected}"
end
end
# :call-seq:
# should have(number).named_collection__or__sugar
# should_not have(number).named_collection__or__sugar
#
# Passes if receiver is a collection with the submitted
# number of items OR if the receiver OWNS a collection
# with the submitted number of items.
#
# If the receiver OWNS the collection, you must use the name
# of the collection. So if a Team instance has a
# collection named #players, you must use that name
# to set the expectation.
#
# If the receiver IS the collection, you can use any name
# you like for named_collection. We'd recommend using
# either "elements", "members", or "items" as these are all
# standard ways of describing the things IN a collection.
#
# This also works for Strings, letting you set an expectation
# about its length
#
# == Examples
#
# # Passes if team.players.size == 11
# team.should have(11).players
#
# # Passes if [1,2,3].length == 3
# [1,2,3].should have(3).items #"items" is pure sugar
#
# # Passes if "this string".length == 11
# "this string".should have(11).characters #"characters" is pure sugar
def have(n)
Matchers::Have.new(n)
end
alias :have_exactly :have
# :call-seq:
# should have_at_least(number).items
#
# Exactly like have() with >=.
#
# == Warning
#
# +should_not+ +have_at_least+ is not supported
def have_at_least(n)
Matchers::Have.new(n, :at_least)
end
# :call-seq:
# should have_at_most(number).items
#
# Exactly like have() with <=.
#
# == Warning
#
# +should_not+ +have_at_most+ is not supported
def have_at_most(n)
Matchers::Have.new(n, :at_most)
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/matchers/operator_matcher.rb b/vendor/gems/rspec/lib/spec/matchers/operator_matcher.rb
old mode 100644
new mode 100755
index 2d47ea85a..dd23a0994
--- a/vendor/gems/rspec/lib/spec/matchers/operator_matcher.rb
+++ b/vendor/gems/rspec/lib/spec/matchers/operator_matcher.rb
@@ -1,72 +1,73 @@
module Spec
module Matchers
class BaseOperatorMatcher
+ attr_reader :generated_description
def initialize(target)
@target = target
end
def ==(expected)
@expected = expected
__delegate_method_missing_to_target("==", expected)
end
def ===(expected)
@expected = expected
__delegate_method_missing_to_target("===", expected)
end
def =~(expected)
@expected = expected
__delegate_method_missing_to_target("=~", expected)
end
def >(expected)
@expected = expected
__delegate_method_missing_to_target(">", expected)
end
def >=(expected)
@expected = expected
__delegate_method_missing_to_target(">=", expected)
end
def <(expected)
@expected = expected
__delegate_method_missing_to_target("<", expected)
end
def <=(expected)
@expected = expected
__delegate_method_missing_to_target("<=", expected)
end
def fail_with_message(message)
Spec::Expectations.fail_with(message, @expected, @target)
end
end
class PositiveOperatorMatcher < BaseOperatorMatcher #:nodoc:
def __delegate_method_missing_to_target(operator, expected)
::Spec::Matchers.generated_description = "should #{operator} #{expected.inspect}"
return if @target.send(operator, expected)
return fail_with_message("expected: #{expected.inspect},\n got: #{@target.inspect} (using #{operator})") if ['==','===', '=~'].include?(operator)
return fail_with_message("expected: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{@target.inspect}")
end
end
class NegativeOperatorMatcher < BaseOperatorMatcher #:nodoc:
def __delegate_method_missing_to_target(operator, expected)
::Spec::Matchers.generated_description = "should not #{operator} #{expected.inspect}"
return unless @target.send(operator, expected)
return fail_with_message("expected not: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{@target.inspect}")
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/matchers/raise_error.rb b/vendor/gems/rspec/lib/spec/matchers/raise_error.rb
index b45dcf65c..65eb4ddda 100644
--- a/vendor/gems/rspec/lib/spec/matchers/raise_error.rb
+++ b/vendor/gems/rspec/lib/spec/matchers/raise_error.rb
@@ -1,105 +1,109 @@
module Spec
module Matchers
class RaiseError #:nodoc:
def initialize(error_or_message=Exception, message=nil)
if String === error_or_message
@expected_error = Exception
@expected_message = error_or_message
else
@expected_error = error_or_message
@expected_message = message
end
end
def matches?(proc)
@raised_expected_error = false
@raised_other = false
begin
proc.call
rescue @expected_error => @actual_error
if @expected_message.nil?
@raised_expected_error = true
else
- case @expected_message
- when Regexp
- if @expected_message =~ @actual_error.message
- @raised_expected_error = true
- else
- @raised_other = true
- end
- else
- if @expected_message == @actual_error.message
- @raised_expected_error = true
- else
- @raised_other = true
- end
- end
+ verify_message
end
- rescue => @actual_error
+ rescue Exception => @actual_error
@raised_other = true
ensure
return @raised_expected_error
end
end
+
+ def verify_message
+ case @expected_message
+ when Regexp
+ if @expected_message =~ @actual_error.message
+ @raised_expected_error = true
+ else
+ @raised_other = true
+ end
+ else
+ if @expected_message == @actual_error.message
+ @raised_expected_error = true
+ else
+ @raised_other = true
+ end
+ end
+ end
def failure_message
return "expected #{expected_error}#{actual_error}" if @raised_other || !@raised_expected_error
end
def negative_failure_message
"expected no #{expected_error}#{actual_error}"
end
def description
"raise #{expected_error}"
end
private
def expected_error
case @expected_message
when nil
@expected_error
when Regexp
"#{@expected_error} with message matching #{@expected_message.inspect}"
else
"#{@expected_error} with #{@expected_message.inspect}"
end
end
def actual_error
@actual_error.nil? ? " but nothing was raised" : ", got #{@actual_error.inspect}"
end
end
# :call-seq:
# should raise_error()
# should raise_error(NamedError)
# should raise_error(NamedError, String)
# should raise_error(NamedError, Regexp)
# should_not raise_error()
# should_not raise_error(NamedError)
# should_not raise_error(NamedError, String)
# should_not raise_error(NamedError, Regexp)
#
# With no args, matches if any error is raised.
# With a named error, matches only if that specific error is raised.
# With a named error and messsage specified as a String, matches only if both match.
# With a named error and messsage specified as a Regexp, matches only if both match.
#
# == Examples
#
# lambda { do_something_risky }.should raise_error
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError)
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, "that was too risky")
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, /oo ri/)
#
# lambda { do_something_risky }.should_not raise_error
# lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError)
# lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, "that was too risky")
# lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, /oo ri/)
def raise_error(error=Exception, message=nil)
Matchers::RaiseError.new(error, message)
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/matchers/simple_matcher.rb b/vendor/gems/rspec/lib/spec/matchers/simple_matcher.rb
new file mode 100644
index 000000000..ac547d06a
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/matchers/simple_matcher.rb
@@ -0,0 +1,29 @@
+module Spec
+ module Matchers
+ class SimpleMatcher
+ attr_reader :description
+
+ def initialize(description, &match_block)
+ @description = description
+ @match_block = match_block
+ end
+
+ def matches?(actual)
+ @actual = actual
+ return @match_block.call(@actual)
+ end
+
+ def failure_message()
+ return %[expected #{@description.inspect} but got #{@actual.inspect}]
+ end
+
+ def negative_failure_message()
+ return %[expected not to get #{@description.inspect}, but got #{@actual.inspect}]
+ end
+ end
+
+ def simple_matcher(message, &match_block)
+ SimpleMatcher.new(message, &match_block)
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/lib/spec/matchers/throw_symbol.rb b/vendor/gems/rspec/lib/spec/matchers/throw_symbol.rb
index 6d047bc39..c74d84436 100644
--- a/vendor/gems/rspec/lib/spec/matchers/throw_symbol.rb
+++ b/vendor/gems/rspec/lib/spec/matchers/throw_symbol.rb
@@ -1,72 +1,74 @@
module Spec
module Matchers
class ThrowSymbol #:nodoc:
def initialize(expected=nil)
@expected = expected
+ @actual = nil
end
def matches?(proc)
begin
proc.call
rescue NameError => e
+ raise e unless e.message =~ /uncaught throw/
@actual = e.name.to_sym
ensure
if @expected.nil?
return @actual.nil? ? false : true
else
return @actual == @expected
end
end
end
def failure_message
if @actual
"expected #{expected}, got #{@actual.inspect}"
else
"expected #{expected} but nothing was thrown"
end
end
def negative_failure_message
if @expected
"expected #{expected} not to be thrown"
else
"expected no Symbol, got :#{@actual}"
end
end
def description
"throw #{expected}"
end
private
def expected
@expected.nil? ? "a Symbol" : @expected.inspect
end
end
# :call-seq:
# should throw_symbol()
# should throw_symbol(:sym)
# should_not throw_symbol()
# should_not throw_symbol(:sym)
#
# Given a Symbol argument, matches if a proc throws the specified Symbol.
#
# Given no argument, matches if a proc throws any Symbol.
#
# == Examples
#
# lambda { do_something_risky }.should throw_symbol
# lambda { do_something_risky }.should throw_symbol(:that_was_risky)
#
# lambda { do_something_risky }.should_not throw_symbol
# lambda { do_something_risky }.should_not throw_symbol(:that_was_risky)
def throw_symbol(sym=nil)
Matchers::ThrowSymbol.new(sym)
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/mocks.rb b/vendor/gems/rspec/lib/spec/mocks.rb
index 66cbafb3c..9f9cd215b 100644
--- a/vendor/gems/rspec/lib/spec/mocks.rb
+++ b/vendor/gems/rspec/lib/spec/mocks.rb
@@ -1,208 +1,211 @@
require 'spec/mocks/methods'
require 'spec/mocks/argument_constraint_matchers'
require 'spec/mocks/spec_methods'
require 'spec/mocks/proxy'
require 'spec/mocks/mock'
require 'spec/mocks/argument_expectation'
require 'spec/mocks/message_expectation'
require 'spec/mocks/order_group'
require 'spec/mocks/errors'
require 'spec/mocks/error_generator'
require 'spec/mocks/extensions/object'
require 'spec/mocks/space'
module Spec
# == Mocks and Stubs
#
# RSpec will create Mock Objects and Stubs for you at runtime, or attach stub/mock behaviour
# to any of your real objects (Partial Mock/Stub). Because the underlying implementation
# for mocks and stubs is the same, you can intermingle mock and stub
# behaviour in either dynamically generated mocks or your pre-existing classes.
# There is a semantic difference in how they are created, however,
# which can help clarify the role it is playing within a given spec.
#
# == Mock Objects
#
# Mocks are objects that allow you to set and verify expectations that they will
# receive specific messages during run time. They are very useful for specifying how the subject of
# the spec interacts with its collaborators. This approach is widely known as "interaction
# testing".
#
# Mocks are also very powerful as a design tool. As you are
# driving the implementation of a given class, Mocks provide an anonymous
# collaborator that can change in behaviour as quickly as you can write an expectation in your
# spec. This flexibility allows you to design the interface of a collaborator that often
# does not yet exist. As the shape of the class being specified becomes more clear, so do the
# requirements for its collaborators - often leading to the discovery of new types that are
# needed in your system.
#
# Read Endo-Testing[http://www.mockobjects.com/files/endotesting.pdf] for a much
# more in depth description of this process.
#
# == Stubs
#
# Stubs are objects that allow you to set "stub" responses to
# messages. As Martin Fowler points out on his site,
# mocks_arent_stubs[http://www.martinfowler.com/articles/mocksArentStubs.html].
# Paraphrasing Fowler's paraphrasing
# of Gerard Meszaros: Stubs provide canned responses to messages they might receive in a test, while
# mocks allow you to specify and, subsquently, verify that certain messages should be received during
# the execution of a test.
#
# == Partial Mocks/Stubs
#
# RSpec also supports partial mocking/stubbing, allowing you to add stub/mock behaviour
# to instances of your existing classes. This is generally
# something to be avoided, because changes to the class can have ripple effects on
# seemingly unrelated specs. When specs fail due to these ripple effects, the fact
# that some methods are being mocked can make it difficult to understand why a
# failure is occurring.
#
# That said, partials do allow you to expect and
# verify interactions with class methods such as +#find+ and +#create+
# on Ruby on Rails model classes.
#
# == Further Reading
#
# There are many different viewpoints about the meaning of mocks and stubs. If you are interested
# in learning more, here is some recommended reading:
#
# * Mock Objects: http://www.mockobjects.com/
# * Endo-Testing: http://www.mockobjects.com/files/endotesting.pdf
# * Mock Roles, Not Objects: http://www.mockobjects.com/files/mockrolesnotobjects.pdf
# * Test Double Patterns: http://xunitpatterns.com/Test%20Double%20Patterns.html
# * Mocks aren't stubs: http://www.martinfowler.com/articles/mocksArentStubs.html
#
# == Creating a Mock
#
# You can create a mock in any specification (or setup) using:
#
# mock(name, options={})
#
# The optional +options+ argument is a +Hash+. Currently the only supported
# option is +:null_object+. Setting this to true instructs the mock to ignore
# any messages it hasn’t been told to expect – and quietly return itself. For example:
#
# mock("person", :null_object => true)
#
# == Creating a Stub
#
# You can create a stub in any specification (or setup) using:
#
# stub(name, stub_methods_and_values_hash)
#
# For example, if you wanted to create an object that always returns
# "More?!?!?!" to "please_sir_may_i_have_some_more" you would do this:
#
# stub("Mr Sykes", :please_sir_may_i_have_some_more => "More?!?!?!")
#
# == Creating a Partial Mock
#
# You don't really "create" a partial mock, you simply add method stubs and/or
# mock expectations to existing classes and objects:
#
# Factory.should_receive(:find).with(id).and_return(value)
# obj.stub!(:to_i).and_return(3)
# etc ...
#
# == Expecting Messages
#
# my_mock.should_receive(:sym)
# my_mock.should_not_receive(:sym)
#
# == Expecting Arguments
#
# my_mock.should_receive(:sym).with(*args)
# my_mock.should_not_receive(:sym).with(*args)
#
# == Argument Constraints using Expression Matchers
#
# Arguments that are passed to #with are compared with actual arguments received
# using == by default. In cases in which you want to specify things about the arguments
# rather than the arguments themselves, you can use any of the Expression Matchers.
# They don't all make syntactic sense (they were primarily designed for use with
# Spec::Expectations), but you are free to create your own custom Spec::Matchers.
#
# Spec::Mocks does provide one additional Matcher method named #ducktype.
#
# In addition, Spec::Mocks adds some keyword Symbols that you can use to
# specify certain kinds of arguments:
#
# my_mock.should_receive(:sym).with(no_args())
# my_mock.should_receive(:sym).with(any_args())
# my_mock.should_receive(:sym).with(1, an_instance_of(Numeric), "b") #2nd argument can any type of Numeric
# my_mock.should_receive(:sym).with(1, boolean(), "b") #2nd argument can true or false
# my_mock.should_receive(:sym).with(1, /abc/, "b") #2nd argument can be any String matching the submitted Regexp
# my_mock.should_receive(:sym).with(1, anything(), "b") #2nd argument can be anything at all
# my_mock.should_receive(:sym).with(1, ducktype(:abs, :div), "b")
# #2nd argument can be object that responds to #abs and #div
#
# == Receive Counts
#
# my_mock.should_receive(:sym).once
# my_mock.should_receive(:sym).twice
# my_mock.should_receive(:sym).exactly(n).times
# my_mock.should_receive(:sym).at_least(:once)
# my_mock.should_receive(:sym).at_least(:twice)
# my_mock.should_receive(:sym).at_least(n).times
# my_mock.should_receive(:sym).at_most(:once)
# my_mock.should_receive(:sym).at_most(:twice)
# my_mock.should_receive(:sym).at_most(n).times
# my_mock.should_receive(:sym).any_number_of_times
#
# == Ordering
#
# my_mock.should_receive(:sym).ordered
# my_mock.should_receive(:other_sym).ordered
# #This will fail if the messages are received out of order
#
# == Setting Reponses
#
# Whether you are setting a mock expectation or a simple stub, you can tell the
# object precisely how to respond:
#
# my_mock.should_receive(:sym).and_return(value)
# my_mock.should_receive(:sym).exactly(3).times.and_return(value1, value2, value3)
# # returns value1 the first time, value2 the second, etc
# my_mock.should_receive(:sym).and_return { ... } #returns value returned by the block
# my_mock.should_receive(:sym).and_raise(error)
# #error can be an instantiated object or a class
# #if it is a class, it must be instantiable with no args
# my_mock.should_receive(:sym).and_throw(:sym)
- # my_mock.should_receive(:sym).and_yield([array,of,values,to,yield])
+ # my_mock.should_receive(:sym).and_yield(values,to,yield)
+ # my_mock.should_receive(:sym).and_yield(values,to,yield).and_yield(some,other,values,this,time)
+ # # for methods that yield to a block multiple times
#
# Any of these responses can be applied to a stub as well, but stubs do
# not support any qualifiers about the message received (i.e. you can't specify arguments
# or receive counts):
#
# my_mock.stub!(:sym).and_return(value)
# my_mock.stub!(:sym).and_return(value1, value2, value3)
# my_mock.stub!(:sym).and_raise(error)
# my_mock.stub!(:sym).and_throw(:sym)
- # my_mock.stub!(:sym).and_yield([array,of,values,to,yield])
+ # my_mock.stub!(:sym).and_yield(values,to,yield)
+ # my_mock.stub!(:sym).and_yield(values,to,yield).and_yield(some,other,values,this,time)
#
# == Arbitrary Handling
#
# Once in a while you'll find that the available expectations don't solve the
# particular problem you are trying to solve. Imagine that you expect the message
# to come with an Array argument that has a specific length, but you don't care
# what is in it. You could do this:
#
# my_mock.should_receive(:sym) do |arg|
# arg.should be_an_istance_of(Array)
# arg.length.should == 7
# end
#
# Note that this would fail if the number of arguments received was different from
# the number of block arguments (in this case 1).
#
# == Combining Expectation Details
#
# Combining the message name with specific arguments, receive counts and responses
# you can get quite a bit of detail in your expectations:
#
# my_mock.should_receive(:<<).with("illegal value").once.and_raise(ArgumentError)
module Mocks
end
end
diff --git a/vendor/gems/rspec/lib/spec/mocks/argument_expectation.rb b/vendor/gems/rspec/lib/spec/mocks/argument_expectation.rb
index 5da069b87..34a1d4d03 100644
--- a/vendor/gems/rspec/lib/spec/mocks/argument_expectation.rb
+++ b/vendor/gems/rspec/lib/spec/mocks/argument_expectation.rb
@@ -1,183 +1,183 @@
module Spec
module Mocks
class MatcherConstraint
def initialize(matcher)
@matcher = matcher
end
def matches?(value)
@matcher.matches?(value)
end
end
class LiteralArgConstraint
def initialize(literal)
@literal_value = literal
end
def matches?(value)
@literal_value == value
end
end
class RegexpArgConstraint
def initialize(regexp)
@regexp = regexp
end
def matches?(value)
return value =~ @regexp unless value.is_a?(Regexp)
value == @regexp
end
end
class AnyArgConstraint
def initialize(ignore)
end
def ==(other)
true
end
# TODO - need this?
def matches?(value)
true
end
end
class AnyArgsConstraint
def description
"any args"
end
end
class NoArgsConstraint
def description
"no args"
end
def ==(args)
args == []
end
end
class NumericArgConstraint
def initialize(ignore)
end
def matches?(value)
value.is_a?(Numeric)
end
end
class BooleanArgConstraint
def initialize(ignore)
end
def ==(value)
matches?(value)
end
def matches?(value)
return true if value.is_a?(TrueClass)
return true if value.is_a?(FalseClass)
false
end
end
class StringArgConstraint
def initialize(ignore)
end
def matches?(value)
value.is_a?(String)
end
end
class DuckTypeArgConstraint
def initialize(*methods_to_respond_to)
@methods_to_respond_to = methods_to_respond_to
end
def matches?(value)
@methods_to_respond_to.all? { |sym| value.respond_to?(sym) }
end
def description
"duck_type"
end
end
class ArgumentExpectation
attr_reader :args
@@constraint_classes = Hash.new { |hash, key| LiteralArgConstraint}
@@constraint_classes[:anything] = AnyArgConstraint
@@constraint_classes[:numeric] = NumericArgConstraint
@@constraint_classes[:boolean] = BooleanArgConstraint
@@constraint_classes[:string] = StringArgConstraint
def initialize(args)
@args = args
if [:any_args] == args
@expected_params = nil
warn_deprecated(:any_args.inspect, "any_args()")
elsif args.length == 1 && args[0].is_a?(AnyArgsConstraint) then @expected_params = nil
elsif [:no_args] == args
@expected_params = []
warn_deprecated(:no_args.inspect, "no_args()")
elsif args.length == 1 && args[0].is_a?(NoArgsConstraint) then @expected_params = []
else @expected_params = process_arg_constraints(args)
end
end
def process_arg_constraints(constraints)
constraints.collect do |constraint|
convert_constraint(constraint)
end
end
def warn_deprecated(deprecated_method, instead)
- STDERR.puts "The #{deprecated_method} constraint is deprecated. Use #{instead} instead."
+ Kernel.warn "The #{deprecated_method} constraint is deprecated. Use #{instead} instead."
end
def convert_constraint(constraint)
if [:anything, :numeric, :boolean, :string].include?(constraint)
case constraint
when :anything
instead = "anything()"
when :boolean
instead = "boolean()"
when :numeric
instead = "an_instance_of(Numeric)"
when :string
instead = "an_instance_of(String)"
end
warn_deprecated(constraint.inspect, instead)
return @@constraint_classes[constraint].new(constraint)
end
return MatcherConstraint.new(constraint) if is_matcher?(constraint)
return RegexpArgConstraint.new(constraint) if constraint.is_a?(Regexp)
return LiteralArgConstraint.new(constraint)
end
def is_matcher?(obj)
return obj.respond_to?(:matches?) && obj.respond_to?(:description)
end
def check_args(args)
return true if @expected_params.nil?
return true if @expected_params == args
return constraints_match?(args)
end
def constraints_match?(args)
return false if args.length != @expected_params.length
@expected_params.each_index { |i| return false unless @expected_params[i].matches?(args[i]) }
return true
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/mocks/message_expectation.rb b/vendor/gems/rspec/lib/spec/mocks/message_expectation.rb
index 74ade3c58..6bd2f1c32 100644
--- a/vendor/gems/rspec/lib/spec/mocks/message_expectation.rb
+++ b/vendor/gems/rspec/lib/spec/mocks/message_expectation.rb
@@ -1,242 +1,267 @@
module Spec
module Mocks
class BaseExpectation
attr_reader :sym
def initialize(error_generator, expectation_ordering, expected_from, sym, method_block, expected_received_count=1, opts={})
@error_generator = error_generator
@error_generator.opts = opts
@expected_from = expected_from
@sym = sym
@method_block = method_block
- @return_block = lambda {}
- @received_count = 0
+ @return_block = nil
+ @actual_received_count = 0
@expected_received_count = expected_received_count
@args_expectation = ArgumentExpectation.new([AnyArgsConstraint.new])
@consecutive = false
@exception_to_raise = nil
@symbol_to_throw = nil
@order_group = expectation_ordering
@at_least = nil
@at_most = nil
- @args_to_yield = nil
+ @args_to_yield = []
end
def expected_args
@args_expectation.args
end
def and_return(*values, &return_block)
Kernel::raise AmbiguousReturnError unless @method_block.nil?
- if values.size == 0
- value = nil
- elsif values.size == 1
- value = values[0]
+ case values.size
+ when 0 then value = nil
+ when 1 then value = values[0]
else
value = values
@consecutive = true
- @expected_received_count = values.size if @expected_received_count != :any &&
+ @expected_received_count = values.size if !ignoring_args? &&
@expected_received_count < values.size
end
@return_block = block_given? ? return_block : lambda { value }
+ # Ruby 1.9 - see where this is used below
+ @ignore_args = !block_given?
end
# :call-seq:
# and_raise()
# and_raise(Exception) #any exception class
# and_raise(exception) #any exception object
#
# == Warning
#
# When you pass an exception class, the MessageExpectation will
# raise an instance of it, creating it with +new+. If the exception
# class initializer requires any parameters, you must pass in an
# instance and not the class.
def and_raise(exception=Exception)
@exception_to_raise = exception
end
def and_throw(symbol)
@symbol_to_throw = symbol
end
def and_yield(*args)
- @args_to_yield = args
+ @args_to_yield << args
+ self
end
def matches(sym, args)
@sym == sym and @args_expectation.check_args(args)
end
def invoke(args, block)
@order_group.handle_order_constraint self
begin
- if @exception_to_raise.class == Class
- @exception_instance_to_raise = @exception_to_raise.new
- else
- @exception_instance_to_raise = @exception_to_raise
- end
Kernel::raise @exception_to_raise unless @exception_to_raise.nil?
Kernel::throw @symbol_to_throw unless @symbol_to_throw.nil?
-
+
if !@method_block.nil?
- return invoke_method_block(args)
- elsif !@args_to_yield.nil?
- return invoke_with_yield(block)
- elsif @consecutive
- return invoke_consecutive_return_block(args, block)
+ default_return_val = invoke_method_block(args)
+ elsif @args_to_yield.size > 0
+ default_return_val = invoke_with_yield(block)
else
+ default_return_val = nil
+ end
+
+ if @consecutive
+ return invoke_consecutive_return_block(args, block)
+ elsif @return_block
return invoke_return_block(args, block)
+ else
+ return default_return_val
end
ensure
- @received_count += 1
+ @actual_received_count += 1
end
end
protected
def invoke_method_block(args)
begin
@method_block.call(*args)
rescue => detail
@error_generator.raise_block_failed_error @sym, detail.message
end
end
def invoke_with_yield(block)
if block.nil?
@error_generator.raise_missing_block_error @args_to_yield
end
- if block.arity > -1 && @args_to_yield.length != block.arity
- @error_generator.raise_wrong_arity_error @args_to_yield, block.arity
+ @args_to_yield.each do |args_to_yield_this_time|
+ if block.arity > -1 && args_to_yield_this_time.length != block.arity
+ @error_generator.raise_wrong_arity_error args_to_yield_this_time, block.arity
+ end
+ block.call(*args_to_yield_this_time)
end
- block.call(*@args_to_yield)
end
def invoke_consecutive_return_block(args, block)
args << block unless block.nil?
value = @return_block.call(*args)
- index = [@received_count, value.size-1].min
+ index = [@actual_received_count, value.size-1].min
value[index]
end
def invoke_return_block(args, block)
args << block unless block.nil?
- value = @return_block.call(*args)
-
- value
+ # Ruby 1.9 - when we set @return_block to return values
+ # regardless of arguments, any arguments will result in
+ # a "wrong number of arguments" error
+ if @ignore_args
+ @return_block.call()
+ else
+ @return_block.call(*args)
+ end
end
end
class MessageExpectation < BaseExpectation
def matches_name_but_not_args(sym, args)
@sym == sym and not @args_expectation.check_args(args)
end
def verify_messages_received
- return if @expected_received_count == :any
- return if (@at_least) && (@received_count >= @expected_received_count)
- return if (@at_most) && (@received_count <= @expected_received_count)
- return if @expected_received_count == @received_count
+ return if ignoring_args? || matches_exact_count? ||
+ matches_at_least_count? || matches_at_most_count?
- begin
- @error_generator.raise_expectation_error(@sym, @expected_received_count, @received_count, *@args_expectation.args)
- rescue => error
- error.backtrace.insert(0, @expected_from)
- Kernel::raise error
- end
+ generate_error
+ rescue Spec::Mocks::MockExpectationError => error
+ error.backtrace.insert(0, @expected_from)
+ Kernel::raise error
+ end
+
+ def ignoring_args?
+ @expected_received_count == :any
+ end
+
+ def matches_at_least_count?
+ @at_least && @actual_received_count >= @expected_received_count
+ end
+
+ def matches_at_most_count?
+ @at_most && @actual_received_count <= @expected_received_count
+ end
+
+ def matches_exact_count?
+ @expected_received_count == @actual_received_count
+ end
+
+ def generate_error
+ @error_generator.raise_expectation_error(@sym, @expected_received_count, @actual_received_count, *@args_expectation.args)
end
def with(*args, &block)
@method_block = block if block
@args_expectation = ArgumentExpectation.new(args)
self
end
def exactly(n)
set_expected_received_count :exactly, n
self
end
def at_least(n)
set_expected_received_count :at_least, n
self
end
def at_most(n)
set_expected_received_count :at_most, n
self
end
def times(&block)
@method_block = block if block
self
end
def any_number_of_times(&block)
@method_block = block if block
@expected_received_count = :any
self
end
def never
@expected_received_count = 0
self
end
def once(&block)
@method_block = block if block
@expected_received_count = 1
self
end
def twice(&block)
@method_block = block if block
@expected_received_count = 2
self
end
def ordered(&block)
@method_block = block if block
@order_group.register(self)
@ordered = true
self
end
def negative_expectation_for?(sym)
return false
end
protected
def set_expected_received_count(relativity, n)
@at_least = (relativity == :at_least)
@at_most = (relativity == :at_most)
- @expected_received_count = 1 if n == :once
- @expected_received_count = 2 if n == :twice
- @expected_received_count = n if n.kind_of? Numeric
+ @expected_received_count = case n
+ when Numeric
+ n
+ when :once
+ 1
+ when :twice
+ 2
+ end
end
end
class NegativeMessageExpectation < MessageExpectation
def initialize(message, expectation_ordering, expected_from, sym, method_block)
super(message, expectation_ordering, expected_from, sym, method_block, 0)
end
def negative_expectation_for?(sym)
return @sym == sym
end
end
- class MethodStub < BaseExpectation
- def initialize(message, expectation_ordering, expected_from, sym, method_block)
- super(message, expectation_ordering, expected_from, sym, method_block, 0)
- @expected_received_count = :any
- end
- end
end
end
diff --git a/vendor/gems/rspec/lib/spec/mocks/methods.rb b/vendor/gems/rspec/lib/spec/mocks/methods.rb
index 3d898cf31..d9fa324d3 100644
--- a/vendor/gems/rspec/lib/spec/mocks/methods.rb
+++ b/vendor/gems/rspec/lib/spec/mocks/methods.rb
@@ -1,39 +1,39 @@
module Spec
module Mocks
module Methods
def should_receive(sym, opts={}, &block)
__mock_proxy.add_message_expectation(opts[:expected_from] || caller(1)[0], sym.to_sym, opts, &block)
end
def should_not_receive(sym, &block)
__mock_proxy.add_negative_message_expectation(caller(1)[0], sym.to_sym, &block)
end
- def stub!(sym)
- __mock_proxy.add_stub(caller(1)[0], sym.to_sym)
+ def stub!(sym, opts={})
+ __mock_proxy.add_stub(caller(1)[0], sym.to_sym, opts)
end
def received_message?(sym, *args, &block) #:nodoc:
__mock_proxy.received_message?(sym.to_sym, *args, &block)
end
def rspec_verify #:nodoc:
__mock_proxy.verify
end
def rspec_reset #:nodoc:
__mock_proxy.reset
end
private
def __mock_proxy
if Mock === self
@mock_proxy ||= Proxy.new(self, @name, @options)
else
@mock_proxy ||= Proxy.new(self, self.class.name)
end
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/mocks/mock.rb b/vendor/gems/rspec/lib/spec/mocks/mock.rb
index aa380e0af..f029b1b8f 100644
--- a/vendor/gems/rspec/lib/spec/mocks/mock.rb
+++ b/vendor/gems/rspec/lib/spec/mocks/mock.rb
@@ -1,29 +1,50 @@
module Spec
module Mocks
class Mock
include Methods
# Creates a new mock with a +name+ (that will be used in error messages only)
# == Options:
# * :null_object - if true, the mock object acts as a forgiving null object allowing any message to be sent to it.
- def initialize(name, options={})
+ def initialize(name, stubs_and_options={})
@name = name
- @options = options
+ @options = parse_options(stubs_and_options)
+ assign_stubs(stubs_and_options)
+ end
+
+ # This allows for comparing the mock to other objects that proxy
+ # such as ActiveRecords belongs_to proxy objects
+ # By making the other object run the comparison, we're sure the call gets delegated to the proxy target
+ # This is an unfortunate side effect from ActiveRecord, but this should be safe unless the RHS redefines == in a nonsensical manner
+ def ==(other)
+ other == __mock_proxy
end
def method_missing(sym, *args, &block)
__mock_proxy.instance_eval {@messages_received << [sym, args, block]}
begin
return self if __mock_proxy.null_object?
super(sym, *args, &block)
- rescue NoMethodError
+ rescue NameError
__mock_proxy.raise_unexpected_message_error sym, *args
end
end
def inspect
"#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>"
end
+
+ private
+
+ def parse_options(options)
+ options.has_key?(:null_object) ? {:null_object => options.delete(:null_object)} : {}
+ end
+
+ def assign_stubs(stubs)
+ stubs.each_pair do |message, response|
+ stub!(message).and_return(response)
+ end
+ end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/mocks/proxy.rb b/vendor/gems/rspec/lib/spec/mocks/proxy.rb
index 6c79d1068..03db3b113 100644
--- a/vendor/gems/rspec/lib/spec/mocks/proxy.rb
+++ b/vendor/gems/rspec/lib/spec/mocks/proxy.rb
@@ -1,167 +1,170 @@
module Spec
module Mocks
class Proxy
DEFAULT_OPTIONS = {
:null_object => false,
}
def initialize(target, name, options={})
@target = target
@name = name
@error_generator = ErrorGenerator.new target, name
@expectation_ordering = OrderGroup.new @error_generator
@expectations = []
@messages_received = []
@stubs = []
@proxied_methods = []
@options = options ? DEFAULT_OPTIONS.dup.merge(options) : DEFAULT_OPTIONS
end
def null_object?
@options[:null_object]
end
def add_message_expectation(expected_from, sym, opts={}, &block)
- __add sym, block
+ __add sym
@expectations << MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts)
@expectations.last
end
def add_negative_message_expectation(expected_from, sym, &block)
- __add sym, block
+ __add sym
@expectations << NegativeMessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
@expectations.last
end
- def add_stub(expected_from, sym)
- __add sym, nil
- @stubs.unshift MethodStub.new(@error_generator, @expectation_ordering, expected_from, sym, nil)
+ def add_stub(expected_from, sym, opts={})
+ __add sym
+ @stubs.unshift MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, nil, :any, opts)
@stubs.first
end
def verify #:nodoc:
- begin
- verify_expectations
- ensure
- reset
- end
+ verify_expectations
+ ensure
+ reset
end
def reset
clear_expectations
clear_stubs
reset_proxied_methods
clear_proxied_methods
end
def received_message?(sym, *args, &block)
- return true if @messages_received.find {|array| array == [sym, args, block]}
- return false
+ @messages_received.any? {|array| array == [sym, args, block]}
end
def has_negative_expectation?(sym)
@expectations.detect {|expectation| expectation.negative_expectation_for?(sym)}
end
def message_received(sym, *args, &block)
if expectation = find_matching_expectation(sym, *args)
expectation.invoke(args, block)
- elsif stub = find_matching_method_stub(sym)
+ elsif stub = find_matching_method_stub(sym, *args)
stub.invoke([], block)
elsif expectation = find_almost_matching_expectation(sym, *args)
raise_unexpected_message_args_error(expectation, *args) unless has_negative_expectation?(sym) unless null_object?
else
@target.send :method_missing, sym, *args, &block
end
end
def raise_unexpected_message_args_error(expectation, *args)
@error_generator.raise_unexpected_message_args_error expectation, *args
end
def raise_unexpected_message_error(sym, *args)
@error_generator.raise_unexpected_message_error sym, *args
end
private
- def __add(sym, block)
+ def __add(sym)
$rspec_mocks.add(@target) unless $rspec_mocks.nil?
define_expected_method(sym)
end
def define_expected_method(sym)
- if target_responds_to?(sym) && !@proxied_methods.include?(sym)
- metaclass.__send__(:alias_method, munge(sym), sym) if metaclass.instance_methods.include?(sym.to_s)
+ if target_responds_to?(sym) && !metaclass.method_defined?(munge(sym))
+ munged_sym = munge(sym)
+ metaclass.instance_eval do
+ alias_method munged_sym, sym if method_defined?(sym.to_s)
+ end
@proxied_methods << sym
end
metaclass_eval(<<-EOF, __FILE__, __LINE__)
def #{sym}(*args, &block)
__mock_proxy.message_received :#{sym}, *args, &block
end
EOF
end
def target_responds_to?(sym)
return @target.send(munge(:respond_to?),sym) if @already_proxied_respond_to
return @already_proxied_respond_to = true if sym == :respond_to?
return @target.respond_to?(sym)
end
def munge(sym)
"proxied_by_rspec__#{sym.to_s}".to_sym
end
def clear_expectations
@expectations.clear
end
def clear_stubs
@stubs.clear
end
def clear_proxied_methods
@proxied_methods.clear
end
def metaclass_eval(str, filename, lineno)
metaclass.class_eval(str, filename, lineno)
end
def metaclass
(class << @target; self; end)
end
def verify_expectations
@expectations.each do |expectation|
expectation.verify_messages_received
end
end
def reset_proxied_methods
@proxied_methods.each do |sym|
- if metaclass.instance_methods.include?(munge(sym).to_s)
- metaclass.__send__(:alias_method, sym, munge(sym))
- metaclass.__send__(:undef_method, munge(sym))
- else
- metaclass.__send__(:undef_method, sym)
+ munged_sym = munge(sym)
+ metaclass.instance_eval do
+ if method_defined?(munged_sym.to_s)
+ alias_method sym, munged_sym
+ undef_method munged_sym
+ else
+ undef_method sym
+ end
end
end
end
def find_matching_expectation(sym, *args)
@expectations.find {|expectation| expectation.matches(sym, args)}
end
def find_almost_matching_expectation(sym, *args)
@expectations.find {|expectation| expectation.matches_name_but_not_args(sym, args)}
end
- def find_matching_method_stub(sym)
- @stubs.find {|stub| stub.matches(sym, [])}
+ def find_matching_method_stub(sym, *args)
+ @stubs.find {|stub| stub.matches(sym, args)}
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/mocks/space.rb b/vendor/gems/rspec/lib/spec/mocks/space.rb
index e04bc5ccb..3e13224c7 100644
--- a/vendor/gems/rspec/lib/spec/mocks/space.rb
+++ b/vendor/gems/rspec/lib/spec/mocks/space.rb
@@ -1,28 +1,28 @@
module Spec
module Mocks
class Space
def add(obj)
- mocks << obj unless mocks.include?(obj)
+ mocks << obj unless mocks.detect {|m| m.equal? obj}
end
def verify_all
mocks.each do |mock|
mock.rspec_verify
end
end
def reset_all
mocks.each do |mock|
mock.rspec_reset
end
mocks.clear
end
private
def mocks
@mocks ||= []
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/mocks/spec_methods.rb b/vendor/gems/rspec/lib/spec/mocks/spec_methods.rb
index fd67fd210..d92a4cedd 100644
--- a/vendor/gems/rspec/lib/spec/mocks/spec_methods.rb
+++ b/vendor/gems/rspec/lib/spec/mocks/spec_methods.rb
@@ -1,30 +1,38 @@
module Spec
module Mocks
- module SpecMethods
+ module ExampleMethods
include Spec::Mocks::ArgumentConstraintMatchers
# Shortcut for creating an instance of Spec::Mocks::Mock.
- def mock(name, options={})
- Spec::Mocks::Mock.new(name, options)
- end
-
- # Shortcut for creating an instance of Spec::Mocks::Mock with
- # predefined method stubs.
+ #
+ # +name+ is used for failure reporting, so you should use the
+ # role that the mock is playing in the example.
+ #
+ # +stubs_and_options+ lets you assign options and stub values
+ # at the same time. The only option available is :null_object.
+ # Anything else is treated as a stub value.
#
# == Examples
#
- # stub_thing = stub("thing", :a => "A")
+ # stub_thing = mock("thing", :a => "A")
# stub_thing.a == "A" => true
#
# stub_person = stub("thing", :name => "Joe", :email => "joe@domain.com")
# stub_person.name => "Joe"
# stub_person.email => "joe@domain.com"
- def stub(name, stubs={})
- object_stub = mock(name)
- stubs.each { |key, value| object_stub.stub!(key).and_return(value) }
- object_stub
+ def mock(name, stubs_and_options={})
+ Spec::Mocks::Mock.new(name, stubs_and_options)
end
+ alias :stub :mock
+
+ # Shortcut for creating a mock object that will return itself in response
+ # to any message it receives that it hasn't been explicitly instructed
+ # to respond to.
+ def stub_everything(name = 'stub')
+ mock(name, :null_object => true)
+ end
+
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/rake/spectask.rb b/vendor/gems/rspec/lib/spec/rake/spectask.rb
index f8c6809a9..781c151a4 100644
--- a/vendor/gems/rspec/lib/spec/rake/spectask.rb
+++ b/vendor/gems/rspec/lib/spec/rake/spectask.rb
@@ -1,217 +1,235 @@
#!/usr/bin/env ruby
# Define a task library for running RSpec contexts.
require 'rake'
require 'rake/tasklib'
module Spec
module Rake
- # A Rake task that runs a set of RSpec contexts.
+ # A Rake task that runs a set of specs.
#
# Example:
#
# Spec::Rake::SpecTask.new do |t|
# t.warning = true
# t.rcov = true
# end
#
# This will create a task that can be run with:
#
# rake spec
#
# If rake is invoked with a "SPEC=filename" command line option,
# then the list of spec files will be overridden to include only the
# filename specified on the command line. This provides an easy way
# to run just one spec.
#
# If rake is invoked with a "SPEC_OPTS=options" command line option,
# then the given options will override the value of the +spec_opts+
# attribute.
#
# If rake is invoked with a "RCOV_OPTS=options" command line option,
# then the given options will override the value of the +rcov_opts+
# attribute.
#
# Examples:
#
# rake spec # run specs normally
# rake spec SPEC=just_one_file.rb # run just one spec file.
# rake spec SPEC_OPTS="--diff" # enable diffing
# rake spec RCOV_OPTS="--aggregate myfile.txt" # see rcov --help for details
#
# Each attribute of this task may be a proc. This allows for lazy evaluation,
# which is sometimes handy if you want to defer the evaluation of an attribute value
# until the task is run (as opposed to when it is defined).
+ #
+ # This task can also be used to run existing Test::Unit tests and get RSpec
+ # output, for example like this:
+ #
+ # require 'rubygems'
+ # require 'spec/rake/spectask'
+ # Spec::Rake::SpecTask.new do |t|
+ # t.ruby_opts = ['-rtest/unit']
+ # t.spec_files = FileList['test/**/*_test.rb']
+ # end
+ #
class SpecTask < ::Rake::TaskLib
class << self
def attr_accessor(*names)
super(*names)
names.each do |name|
module_eval "def #{name}() evaluate(@#{name}) end" # Allows use of procs
end
end
end
# Name of spec task. (default is :spec)
attr_accessor :name
# Array of directories to be added to $LOAD_PATH before running the
# specs. Defaults to ['']
attr_accessor :libs
# If true, requests that the specs be run with the warning flag set.
# E.g. warning=true implies "ruby -w" used to run the specs. Defaults to false.
attr_accessor :warning
# Glob pattern to match spec files. (default is 'spec/**/*_spec.rb')
# Setting the SPEC environment variable overrides this.
attr_accessor :pattern
# Array of commandline options to pass to RSpec. Defaults to [].
# Setting the SPEC_OPTS environment variable overrides this.
attr_accessor :spec_opts
# Whether or not to use RCov (default is false)
# See http://eigenclass.org/hiki.rb?rcov
attr_accessor :rcov
# Array of commandline options to pass to RCov. Defaults to ['--exclude', 'lib\/spec,bin\/spec'].
# Ignored if rcov=false
# Setting the RCOV_OPTS environment variable overrides this.
attr_accessor :rcov_opts
# Directory where the RCov report is written. Defaults to "coverage"
# Ignored if rcov=false
attr_accessor :rcov_dir
# Array of commandline options to pass to ruby. Defaults to [].
attr_accessor :ruby_opts
# Whether or not to fail Rake when an error occurs (typically when specs fail).
# Defaults to true.
attr_accessor :fail_on_error
# A message to print to stderr when there are failures.
attr_accessor :failure_message
# Where RSpec's output is written. Defaults to STDOUT.
# DEPRECATED. Use --format FORMAT:WHERE in spec_opts.
attr_accessor :out
# Explicitly define the list of spec files to be included in a
# spec. +spec_files+ is expected to be an array of file names (a
# FileList is acceptable). If both +pattern+ and +spec_files+ are
# used, then the list of spec files is the union of the two.
# Setting the SPEC environment variable overrides this.
attr_accessor :spec_files
+
+ # Use verbose output. If this is set to true, the task will print
+ # the executed spec command to stdout. Defaults to false.
+ attr_accessor :verbose
# Defines a new task, using the name +name+.
def initialize(name=:spec)
@name = name
@libs = [File.expand_path(File.dirname(__FILE__) + '/../../../lib')]
@pattern = nil
@spec_files = nil
@spec_opts = []
@warning = false
@ruby_opts = []
@fail_on_error = true
@rcov = false
@rcov_opts = ['--exclude', 'lib\/spec,bin\/spec,config\/boot.rb']
@rcov_dir = "coverage"
yield self if block_given?
@pattern = 'spec/**/*_spec.rb' if pattern.nil? && spec_files.nil?
define
end
def define # :nodoc:
spec_script = File.expand_path(File.dirname(__FILE__) + '/../../../bin/spec')
lib_path = libs.join(File::PATH_SEPARATOR)
actual_name = Hash === name ? name.keys.first : name
unless ::Rake.application.last_comment
desc "Run specs" + (rcov ? " using RCov" : "")
end
task name do
RakeFileUtils.verbose(verbose) do
unless spec_file_list.empty?
# ruby [ruby_opts] -Ilib -S rcov [rcov_opts] bin/spec -- examples [spec_opts]
# or
# ruby [ruby_opts] -Ilib bin/spec examples [spec_opts]
cmd = "ruby "
rb_opts = ruby_opts.clone
rb_opts << "-I\"#{lib_path}\""
rb_opts << "-S rcov" if rcov
rb_opts << "-w" if warning
cmd << rb_opts.join(" ")
cmd << " "
cmd << rcov_option_list
cmd << %[ -o "#{rcov_dir}" ] if rcov
- cmd << %Q|"#{spec_script}"|
+ #cmd << %Q|"#{spec_script}"|
cmd << " "
cmd << "-- " if rcov
cmd << spec_file_list.collect { |fn| %["#{fn}"] }.join(' ')
cmd << " "
cmd << spec_option_list
if out
cmd << " "
cmd << %Q| > "#{out}"|
STDERR.puts "The Spec::Rake::SpecTask#out attribute is DEPRECATED and will be removed in a future version. Use --format FORMAT:WHERE instead."
end
+ if verbose
+ puts cmd
+ end
unless system(cmd)
STDERR.puts failure_message if failure_message
raise("Command #{cmd} failed") if fail_on_error
end
end
end
end
if rcov
desc "Remove rcov products for #{actual_name}"
task paste("clobber_", actual_name) do
rm_r rcov_dir rescue nil
end
clobber_task = paste("clobber_", actual_name)
task :clobber => [clobber_task]
task actual_name => clobber_task
end
self
end
def rcov_option_list # :nodoc:
return "" unless rcov
ENV['RCOV_OPTS'] || rcov_opts.join(" ") || ""
end
def spec_option_list # :nodoc:
STDERR.puts "RSPECOPTS is DEPRECATED and will be removed in a future version. Use SPEC_OPTS instead." if ENV['RSPECOPTS']
ENV['SPEC_OPTS'] || ENV['RSPECOPTS'] || spec_opts.join(" ") || ""
end
def evaluate(o) # :nodoc:
case o
when Proc then o.call
else o
end
end
def spec_file_list # :nodoc:
if ENV['SPEC']
FileList[ ENV['SPEC'] ]
else
result = []
result += spec_files.to_a if spec_files
result += FileList[ pattern ].to_a if pattern
FileList[result]
end
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/rake/verify_rcov.rb b/vendor/gems/rspec/lib/spec/rake/verify_rcov.rb
index 9715744e9..3328f9e9a 100644
--- a/vendor/gems/rspec/lib/spec/rake/verify_rcov.rb
+++ b/vendor/gems/rspec/lib/spec/rake/verify_rcov.rb
@@ -1,52 +1,52 @@
module RCov
# A task that can verify that the RCov coverage doesn't
# drop below a certain threshold. It should be run after
# running Spec::Rake::SpecTask.
class VerifyTask < Rake::TaskLib
# Name of the task. Defaults to :verify_rcov
attr_accessor :name
# Path to the index.html file generated by RCov, which
# is the file containing the total coverage.
# Defaults to 'coverage/index.html'
attr_accessor :index_html
# Whether or not to output details. Defaults to true.
attr_accessor :verbose
# The threshold value (in percent) for coverage. If the
# actual coverage is not equal to this value, the task will raise an
# exception.
attr_accessor :threshold
# Require the threshold value be met exactly. This is the default.
attr_accessor :require_exact_threshold
def initialize(name=:verify_rcov)
@name = name
@index_html = 'coverage/index.html'
@verbose = true
@require_exact_threshold = true
yield self if block_given?
raise "Threshold must be set" if @threshold.nil?
define
end
def define
desc "Verify that rcov coverage is at least #{threshold}%"
task @name do
total_coverage = nil
File.open(index_html).each_line do |line|
- if line =~ /(\d+\.\d+)%<\/tt> <\/td>/
+ if line =~ /(\d+\.\d+)%<\/tt>/
total_coverage = eval($1)
break
end
end
puts "Coverage: #{total_coverage}% (threshold: #{threshold}%)" if verbose
raise "Coverage must be at least #{threshold}% but was #{total_coverage}%" if total_coverage < threshold
raise "Coverage has increased above the threshold of #{threshold}% to #{total_coverage}%. You should update your threshold value." if (total_coverage > threshold) and require_exact_threshold
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/runner.rb b/vendor/gems/rspec/lib/spec/runner.rb
index 9d801adc3..97ef95bd2 100644
--- a/vendor/gems/rspec/lib/spec/runner.rb
+++ b/vendor/gems/rspec/lib/spec/runner.rb
@@ -1,165 +1,202 @@
-require 'spec/runner/formatter'
-require 'spec/runner/behaviour_runner'
require 'spec/runner/options'
require 'spec/runner/option_parser'
+require 'spec/runner/example_group_runner'
require 'spec/runner/command_line'
require 'spec/runner/drb_command_line'
require 'spec/runner/backtrace_tweaker'
require 'spec/runner/reporter'
-require 'spec/runner/extensions/object'
-require 'spec/runner/extensions/kernel'
require 'spec/runner/spec_parser'
+require 'spec/runner/class_and_arguments_parser'
module Spec
- # == Behaviours and Examples
+ # == ExampleGroups and Examples
#
- # Rather than expressing examples in classes, RSpec uses a custom domain specific language to
- # describe Behaviours and Examples of those behaviours.
+ # Rather than expressing examples in classes, RSpec uses a custom DSLL (DSL light) to
+ # describe groups of examples.
#
- # A Behaviour is the equivalent of a fixture in xUnit-speak. It is a metaphor for the context
+ # A ExampleGroup is the equivalent of a fixture in xUnit-speak. It is a metaphor for the context
# in which you will run your executable example - a set of known objects in a known starting state.
# We begin be describing
#
# describe Account do
#
# before do
# @account = Account.new
# end
#
# it "should have a balance of $0" do
# @account.balance.should == Money.new(0, :dollars)
# end
#
# end
#
- # We use the before block to set up the Behaviour (given), and then the #it method to
+ # We use the before block to set up the Example (given), and then the #it method to
# hold the example code that expresses the event (when) and the expected outcome (then).
#
# == Helper Methods
#
# A primary goal of RSpec is to keep the examples clear. We therefore prefer
# less indirection than you might see in xUnit examples and in well factored, DRY production code. We feel
# that duplication is OK if removing it makes it harder to understand an example without
# having to look elsewhere to understand its context.
#
# That said, RSpec does support some level of encapsulating common code in helper
# methods that can exist within a context or within an included module.
#
# == Setup and Teardown
#
- # You can use before and after within a Behaviour. Both methods take an optional
+ # You can use before and after within a Example. Both methods take an optional
# scope argument so you can run the block before :each example or before :all examples
#
# describe "..." do
# before :all do
# ...
# end
#
# before :each do
# ...
# end
#
# it "should do something" do
# ...
# end
#
# it "should do something else" do
# ...
# end
#
# after :each do
# ...
# end
#
# after :all do
# ...
# end
#
# end
#
# The before :each block will run before each of the examples, once for each example. Likewise,
# the after :each block will run after each of the examples.
#
# It is also possible to specify a before :all and after :all
# block that will run only once for each behaviour, respectively before the first before :each
# and after the last after :each. The use of these is generally discouraged, because it
# introduces dependencies between the examples. Still, it might prove useful for very expensive operations
# if you know what you are doing.
#
# == Local helper methods
#
# You can include local helper methods by simply expressing them within a context:
#
# describe "..." do
#
# it "..." do
# helper_method
# end
#
# def helper_method
# ...
# end
#
# end
#
# == Included helper methods
#
# You can include helper methods in multiple contexts by expressing them within
# a module, and then including that module in your context:
#
# module AccountExampleHelperMethods
# def helper_method
# ...
# end
# end
#
# describe "A new account" do
# include AccountExampleHelperMethods
# before do
# @account = Account.new
# end
#
# it "should have a balance of $0" do
# helper_method
# @account.balance.should eql(Money.new(0, :dollars))
# end
# end
#
- # == Shared behaviour
+ # == Shared Example Groups
#
- # You can define a shared behaviour, that may be used on other behaviours
+ # You can define a shared Example Group, that may be used on other groups
#
- # describe "All Editions", :shared => true do
+ # share_examples_for "All Editions" do
# it "all editions behaviour" ...
# end
#
# describe SmallEdition do
# it_should_behave_like "All Editions"
#
# it "should do small edition stuff" do
# ...
# end
# end
+ #
+ # You can also assign the shared group to a module and include that
+ #
+ # share_as :AllEditions do
+ # it "should do all editions stuff" ...
+ # end
+ #
+ # describe SmallEdition do
+ # it_should_behave_like AllEditions
+ #
+ # it "should do small edition stuff" do
+ # ...
+ # end
+ # end
+ #
+ # And, for those of you who prefer to use something more like Ruby, you
+ # can just include the module directly
+ #
+ # describe SmallEdition do
+ # include AllEditions
+ #
+ # it "should do small edition stuff" do
+ # ...
+ # end
+ # end
module Runner
class << self
def configuration # :nodoc:
- @configuration ||= Spec::DSL::Configuration.new
+ @configuration ||= Spec::Example::Configuration.new
end
# Use this to configure various configurable aspects of
# RSpec:
#
# Spec::Runner.configure do |configuration|
# # Configure RSpec here
# end
#
# The yielded configuration object is a
- # Spec::DSL::Configuration instance. See its RDoc
+ # Spec::Example::Configuration instance. See its RDoc
# for details about what you can do with it.
#
def configure
- yield configuration if @configuration.nil?
+ yield configuration
end
+
+ def register_at_exit_hook # :nodoc:
+ $spec_runner_at_exit_hook_registered ||= nil
+ unless $spec_runner_at_exit_hook_registered
+ at_exit do
+ unless $! || Spec.run?; \
+ success = Spec.run; \
+ exit success if Spec.exit?; \
+ end
+ end
+ $spec_runner_at_exit_hook_registered = true
+ end
+ end
+
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/runner/backtrace_tweaker.rb b/vendor/gems/rspec/lib/spec/runner/backtrace_tweaker.rb
index aacc2c8b8..5fd2fb99f 100644
--- a/vendor/gems/rspec/lib/spec/runner/backtrace_tweaker.rb
+++ b/vendor/gems/rspec/lib/spec/runner/backtrace_tweaker.rb
@@ -1,57 +1,57 @@
module Spec
module Runner
class BacktraceTweaker
def clean_up_double_slashes(line)
line.gsub!('//','/')
end
end
class NoisyBacktraceTweaker < BacktraceTweaker
- def tweak_backtrace(error, spec_name)
+ def tweak_backtrace(error)
return if error.backtrace.nil?
error.backtrace.each do |line|
clean_up_double_slashes(line)
end
end
end
# Tweaks raised Exceptions to mask noisy (unneeded) parts of the backtrace
class QuietBacktraceTweaker < BacktraceTweaker
unless defined?(IGNORE_PATTERNS)
root_dir = File.expand_path(File.join(__FILE__, '..', '..', '..', '..'))
- spec_files = Dir["#{root_dir}/lib/spec/*"].map do |path|
+ spec_files = Dir["#{root_dir}/lib/*"].map do |path|
subpath = path[root_dir.length..-1]
/#{subpath}/
end
IGNORE_PATTERNS = spec_files + [
/\/lib\/ruby\//,
/bin\/spec:/,
/bin\/rcov:/,
/lib\/rspec_on_rails/,
/vendor\/rails/,
# TextMate's Ruby and RSpec plugins
/Ruby\.tmbundle\/Support\/tmruby.rb:/,
/RSpec\.tmbundle\/Support\/lib/,
/temp_textmate\./,
/mock_frameworks\/rspec/,
/spec_server/
]
end
- def tweak_backtrace(error, spec_name)
+ def tweak_backtrace(error)
return if error.backtrace.nil?
error.backtrace.collect! do |line|
clean_up_double_slashes(line)
IGNORE_PATTERNS.each do |ignore|
if line =~ ignore
line = nil
break
end
end
line
end
error.backtrace.compact!
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/runner/behaviour_runner.rb b/vendor/gems/rspec/lib/spec/runner/behaviour_runner.rb
deleted file mode 100644
index 1ac891f3c..000000000
--- a/vendor/gems/rspec/lib/spec/runner/behaviour_runner.rb
+++ /dev/null
@@ -1,123 +0,0 @@
-module Spec
- module Runner
- class BehaviourRunner
-
- def initialize(options, arg=nil)
- @behaviours = []
- @options = options
- end
-
- def add_behaviour(behaviour)
- if !specified_examples.nil? && !specified_examples.empty?
- behaviour.retain_examples_matching!(specified_examples)
- end
- @behaviours << behaviour if behaviour.number_of_examples != 0 && !behaviour.shared?
- end
-
- # Runs all behaviours and returns the number of failures.
- def run(paths, exit_when_done)
- prepare!(paths)
- begin
- run_behaviours
- rescue Interrupt
- ensure
- report_end
- end
- failure_count = report_dump
-
- heckle if(failure_count == 0 && !@options.heckle_runner.nil?)
-
- if(exit_when_done)
- exit_code = (failure_count == 0) ? 0 : 1
- exit(exit_code)
- end
- failure_count
- end
-
- def report_end
- @options.reporter.end
- end
-
- def report_dump
- @options.reporter.dump
- end
-
- def prepare!(paths)
- unless paths.nil? # It's nil when running single specs with ruby
- paths = find_paths(paths)
- sorted_paths = sort_paths(paths)
- load_specs(sorted_paths) # This will populate @behaviours via callbacks to add_behaviour
- end
- @options.reporter.start(number_of_examples)
- @behaviours.reverse! if @options.reverse
- set_sequence_numbers
- end
-
- def run_behaviours
- @behaviours.each do |behaviour|
- behaviour.run(@options.reporter, @options.dry_run, @options.reverse, @options.timeout)
- end
- end
-
- def number_of_examples
- @behaviours.inject(0) {|sum, behaviour| sum + behaviour.number_of_examples}
- end
-
- FILE_SORTERS = {
- 'mtime' => lambda {|file_a, file_b| File.mtime(file_b) <=> File.mtime(file_a)}
- }
-
- def sorter(paths)
- FILE_SORTERS[@options.loadby]
- end
-
- def sort_paths(paths)
- sorter = sorter(paths)
- paths = paths.sort(&sorter) unless sorter.nil?
- paths
- end
-
- private
-
- # Sets the #number on each Example
- def set_sequence_numbers
- number = 0
- @behaviours.each do |behaviour|
- number = behaviour.set_sequence_numbers(number, @options.reverse)
- end
- end
-
- def find_paths(paths)
- result = []
- paths.each do |path|
- if File.directory?(path)
- result += Dir["#{path}/**/*.rb"]
- elsif File.file?(path)
- result << path
- else
- raise "File or directory not found: #{path}"
- end
- end
- result
- end
-
- def load_specs(paths)
- paths.each do |path|
- load path
- end
- end
-
- def specified_examples
- @options.examples
- end
-
- def heckle
- heckle_runner = @options.heckle_runner
- @options.heckle_runner = nil
- behaviour_runner = self.class.new(@options)
- behaviour_runner.instance_variable_set(:@behaviours, @behaviours)
- heckle_runner.heckle_with(behaviour_runner)
- end
- end
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/runner/class_and_arguments_parser.rb b/vendor/gems/rspec/lib/spec/runner/class_and_arguments_parser.rb
new file mode 100644
index 000000000..65dc4519c
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/runner/class_and_arguments_parser.rb
@@ -0,0 +1,16 @@
+module Spec
+ module Runner
+ class ClassAndArgumentsParser
+ class << self
+ def parse(s)
+ if s =~ /([a-zA-Z_]+(?:::[a-zA-Z_]+)*):?(.*)/
+ arg = $2 == "" ? nil : $2
+ [$1, arg]
+ else
+ raise "Couldn't parse #{s.inspect}"
+ end
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/lib/spec/runner/command_line.rb b/vendor/gems/rspec/lib/spec/runner/command_line.rb
index 0d70337e1..9849c4853 100644
--- a/vendor/gems/rspec/lib/spec/runner/command_line.rb
+++ b/vendor/gems/rspec/lib/spec/runner/command_line.rb
@@ -1,22 +1,28 @@
require 'spec/runner/option_parser'
module Spec
module Runner
# Facade to run specs without having to fork a new ruby process (using `spec ...`)
class CommandLine
- # Runs specs. +argv+ is the commandline args as per the spec commandline API, +err+
- # and +out+ are the streams output will be written to. +exit+ tells whether or
- # not a system exit should be called after the specs are run and
- # +warn_if_no_files+ tells whether or not a warning (the help message)
- # should be printed to +err+ in case no files are specified.
- def self.run(argv, err, out, exit=true, warn_if_no_files=true)
- old_behaviour_runner = defined?($behaviour_runner) ? $behaviour_runner : nil
- $behaviour_runner = OptionParser.new.create_behaviour_runner(argv, err, out, warn_if_no_files)
- return if $behaviour_runner.nil? # This is the case if we use --drb
-
- $behaviour_runner.run(argv, exit)
- $behaviour_runner = old_behaviour_runner
+ class << self
+ # Runs specs. +argv+ is the commandline args as per the spec commandline API, +err+
+ # and +out+ are the streams output will be written to.
+ def run(instance_rspec_options)
+ # NOTE - this call to init_rspec_options is not spec'd, but neither is any of this
+ # swapping of $rspec_options. That is all here to enable rspec to run against itself
+ # and maintain coverage in a single process. Therefore, DO NOT mess with this stuff
+ # unless you know what you are doing!
+ init_rspec_options(instance_rspec_options)
+ orig_rspec_options = rspec_options
+ begin
+ $rspec_options = instance_rspec_options
+ return $rspec_options.run_examples
+ ensure
+ ::Spec.run = true
+ $rspec_options = orig_rspec_options
+ end
+ end
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/runner/drb_command_line.rb b/vendor/gems/rspec/lib/spec/runner/drb_command_line.rb
index 7e745fb71..6c340cfea 100644
--- a/vendor/gems/rspec/lib/spec/runner/drb_command_line.rb
+++ b/vendor/gems/rspec/lib/spec/runner/drb_command_line.rb
@@ -1,21 +1,20 @@
require "drb/drb"
module Spec
module Runner
# Facade to run specs by connecting to a DRB server
class DrbCommandLine
# Runs specs on a DRB server. Note that this API is similar to that of
# CommandLine - making it possible for clients to use both interchangeably.
- def self.run(argv, stderr, stdout, exit=true, warn_if_no_files=true)
+ def self.run(options)
begin
DRb.start_service
spec_server = DRbObject.new_with_uri("druby://localhost:8989")
- spec_server.run(argv, stderr, stdout)
- rescue DRb::DRbConnError
- stderr.puts "No server is running"
- exit 1 if exit
+ spec_server.run(options.argv, options.error_stream, options.output_stream)
+ rescue DRb::DRbConnError => e
+ options.error_stream.puts "No server is running"
end
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/runner/example_group_runner.rb b/vendor/gems/rspec/lib/spec/runner/example_group_runner.rb
new file mode 100644
index 000000000..7275c6a88
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/runner/example_group_runner.rb
@@ -0,0 +1,59 @@
+module Spec
+ module Runner
+ class ExampleGroupRunner
+ def initialize(options)
+ @options = options
+ end
+
+ def load_files(files)
+ # It's important that loading files (or choosing not to) stays the
+ # responsibility of the ExampleGroupRunner. Some implementations (like)
+ # the one using DRb may choose *not* to load files, but instead tell
+ # someone else to do it over the wire.
+ files.each do |file|
+ load file
+ end
+ end
+
+ def run
+ prepare
+ success = true
+ example_groups.each do |example_group|
+ success = success & example_group.run
+ end
+ return success
+ ensure
+ finish
+ end
+
+ protected
+ def prepare
+ reporter.start(number_of_examples)
+ example_groups.reverse! if reverse
+ end
+
+ def finish
+ reporter.end
+ reporter.dump
+ end
+
+ def reporter
+ @options.reporter
+ end
+
+ def reverse
+ @options.reverse
+ end
+
+ def example_groups
+ @options.example_groups
+ end
+
+ def number_of_examples
+ @options.number_of_examples
+ end
+ end
+ # TODO: BT - Deprecate BehaviourRunner?
+ BehaviourRunner = ExampleGroupRunner
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/rspec/lib/spec/runner/extensions/kernel.rb b/vendor/gems/rspec/lib/spec/runner/extensions/kernel.rb
deleted file mode 100644
index 75f2c335e..000000000
--- a/vendor/gems/rspec/lib/spec/runner/extensions/kernel.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-module Kernel
- # Creates and registers an instance of a Spec::DSL::Behaviour (or a subclass).
- # The instantiated behaviour class depends on the directory of the file
- # calling this method. For example, Spec::Rails will use different
- # classes for specs living in spec/models, spec/helpers,
- # spec/views and spec/controllers.
- #
- # It is also possible to override autodiscovery of the behaviour class
- # with an options Hash as the last argument:
- #
- # describe "name", :behaviour_type => :something_special do ...
- #
- # The reason for using different behaviour classes is to have
- # different matcher methods available from within the describe
- # block.
- #
- # See Spec::DSL::BehaviourFactory#add_behaviour_class for details about
- # how to register special Spec::DSL::Behaviour implementations.
- #
- def describe(*args, &block)
- raise ArgumentError if args.empty?
- args << {} unless Hash === args.last
- args.last[:spec_path] = caller(0)[1]
- register_behaviour(Spec::DSL::BehaviourFactory.create(*args, &block))
- end
- alias :context :describe
-
- def respond_to(*names)
- Spec::Matchers::RespondTo.new(*names)
- end
-
-private
-
- def register_behaviour(behaviour)
- if behaviour.shared?
- Spec::DSL::Behaviour.add_shared_behaviour(behaviour)
- else
- behaviour_runner.add_behaviour(behaviour)
- end
- end
-
- def behaviour_runner
- # TODO: Figure out a better way to get this considered "covered" and keep this statement on multiple lines
- unless $behaviour_runner; \
- $behaviour_runner = ::Spec::Runner::OptionParser.new.create_behaviour_runner(ARGV.dup, STDERR, STDOUT, false); \
- at_exit { $behaviour_runner.run(nil, false) }; \
- end
- $behaviour_runner
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/runner/extensions/object.rb b/vendor/gems/rspec/lib/spec/runner/extensions/object.rb
deleted file mode 100644
index 49745352f..000000000
--- a/vendor/gems/rspec/lib/spec/runner/extensions/object.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# The following copyright applies to Object#copy_instance_variables_from,
-# which we borrowed from active_support.
-#
-# Copyright (c) 2004 David Heinemeier Hansson
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-class Object
- # From active_support
- def copy_instance_variables_from(object, exclude = []) # :nodoc:
- exclude += object.protected_instance_variables if object.respond_to? :protected_instance_variables
-
- instance_variables = object.instance_variables - exclude.map { |name| name.to_s }
- instance_variables.each { |name| instance_variable_set(name, object.instance_variable_get(name)) }
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/runner/formatter.rb b/vendor/gems/rspec/lib/spec/runner/formatter.rb
deleted file mode 100644
index 17512d958..000000000
--- a/vendor/gems/rspec/lib/spec/runner/formatter.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-require 'spec/runner/formatter/base_formatter'
-require 'spec/runner/formatter/base_text_formatter'
-require 'spec/runner/formatter/progress_bar_formatter'
-require 'spec/runner/formatter/rdoc_formatter'
-require 'spec/runner/formatter/specdoc_formatter'
-require 'spec/runner/formatter/html_formatter'
-require 'spec/runner/formatter/failing_examples_formatter'
-require 'spec/runner/formatter/failing_behaviours_formatter'
-require 'spec/runner/formatter/snippet_extractor'
diff --git a/vendor/gems/rspec/lib/spec/runner/formatter/base_formatter.rb b/vendor/gems/rspec/lib/spec/runner/formatter/base_formatter.rb
index 7cc43ef0e..c8647cf50 100644
--- a/vendor/gems/rspec/lib/spec/runner/formatter/base_formatter.rb
+++ b/vendor/gems/rspec/lib/spec/runner/formatter/base_formatter.rb
@@ -1,76 +1,78 @@
module Spec
module Runner
module Formatter
# Baseclass for formatters that implements all required methods as no-ops.
class BaseFormatter
- def initialize(where)
+ attr_accessor :example_group, :options, :where
+ def initialize(options, where)
+ @options = options
@where = where
end
# This method is invoked before any examples are run, right after
# they have all been collected. This can be useful for special
# formatters that need to provide progress on feedback (graphical ones)
#
# This method will only be invoked once, and the next one to be invoked
- # is #add_behaviour
+ # is #add_example_group
def start(example_count)
end
- # This method is invoked at the beginning of the execution of each behaviour.
- # +name+ is the name of the behaviour and +first+ is true if it is the
- # first behaviour - otherwise it's false.
+ # This method is invoked at the beginning of the execution of each example_group.
+ # +name+ is the name of the example_group and +first+ is true if it is the
+ # first example_group - otherwise it's false.
#
# The next method to be invoked after this is #example_failed or #example_finished
- def add_behaviour(name)
+ def add_example_group(example_group)
+ @example_group = example_group
end
# This method is invoked when an +example+ starts.
def example_started(example)
end
# This method is invoked when an +example+ passes.
def example_passed(example)
end
# This method is invoked when an +example+ fails, i.e. an exception occurred
# inside it (such as a failed should or other exception). +counter+ is the
# sequence number of the failure (starting at 1) and +failure+ is the associated
# Failure object.
def example_failed(example, counter, failure)
end
# This method is invoked when an example is not yet implemented (i.e. has not
# been provided a block), or when an ExamplePendingError is raised.
- # +name+ is the name of the example.
# +message+ is the message from the ExamplePendingError, if it exists, or the
# default value of "Not Yet Implemented"
- def example_pending(behaviour_name, example_name, message)
+ def example_pending(example_group_description, example, message)
end
# This method is invoked after all of the examples have executed. The next method
# to be invoked after this one is #dump_failure (once for each failed example),
def start_dump
end
# Dumps detailed information about an example failure.
# This method is invoked for each failed example after all examples have run. +counter+ is the sequence number
# of the associated example. +failure+ is a Failure object, which contains detailed
# information about the failure.
def dump_failure(counter, failure)
end
# This method is invoked after the dumping of examples and failures.
def dump_summary(duration, example_count, failure_count, pending_count)
end
# This gets invoked after the summary if option is set to do so.
def dump_pending
end
# This method is invoked at the very end. Allows the formatter to clean up, like closing open streams.
def close
end
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/runner/formatter/base_text_formatter.rb b/vendor/gems/rspec/lib/spec/runner/formatter/base_text_formatter.rb
index c3cf01b76..859b2641d 100644
--- a/vendor/gems/rspec/lib/spec/runner/formatter/base_text_formatter.rb
+++ b/vendor/gems/rspec/lib/spec/runner/formatter/base_text_formatter.rb
@@ -1,130 +1,130 @@
+require 'spec/runner/formatter/base_formatter'
+
module Spec
module Runner
module Formatter
# Baseclass for text-based formatters. Can in fact be used for
# non-text based ones too - just ignore the +output+ constructor
# argument.
class BaseTextFormatter < BaseFormatter
- attr_writer :dry_run
-
+ attr_reader :output, :pending_examples
# Creates a new instance that will write to +where+. If +where+ is a
# String, output will be written to the File with that name, otherwise
# +where+ is exected to be an IO (or an object that responds to #puts and #write).
- def initialize(where)
- super(where)
+ def initialize(options, where)
+ super
if where.is_a?(String)
@output = File.open(where, 'w')
elsif where == STDOUT
@output = Kernel
def @output.flush
STDOUT.flush
end
else
@output = where
end
- @colour = false
- @dry_run = false
- @snippet_extractor = SnippetExtractor.new
@pending_examples = []
end
- def example_pending(behaviour_name, example_name, message)
- @pending_examples << ["#{behaviour_name} #{example_name}", message]
+ def example_pending(example_group_description, example, message)
+ @pending_examples << ["#{example_group_description} #{example.description}", message]
end
- def colour=(colour)
- @colour = colour
- begin ; require 'Win32/Console/ANSI' if @colour && PLATFORM =~ /win32/ ; rescue LoadError ; raise "You must gem install win32console to use colour on Windows" ; end
- end
-
def dump_failure(counter, failure)
@output.puts
@output.puts "#{counter.to_s})"
@output.puts colourise("#{failure.header}\n#{failure.exception.message}", failure)
@output.puts format_backtrace(failure.exception.backtrace)
@output.flush
end
def colourise(s, failure)
if(failure.expectation_not_met?)
red(s)
elsif(failure.pending_fixed?)
blue(s)
else
magenta(s)
end
end
def dump_summary(duration, example_count, failure_count, pending_count)
- return if @dry_run
+ return if dry_run?
@output.puts
@output.puts "Finished in #{duration} seconds"
@output.puts
summary = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
summary << ", #{pending_count} pending" if pending_count > 0
if failure_count == 0
if pending_count > 0
@output.puts yellow(summary)
else
@output.puts green(summary)
end
else
@output.puts red(summary)
end
@output.flush
- dump_pending
end
def dump_pending
unless @pending_examples.empty?
@output.puts
@output.puts "Pending:"
@pending_examples.each do |pending_example|
@output.puts "#{pending_example[0]} (#{pending_example[1]})"
end
end
@output.flush
end
def close
if IO === @output
@output.close
end
end
def format_backtrace(backtrace)
return "" if backtrace.nil?
backtrace.map { |line| backtrace_line(line) }.join("\n")
end
protected
-
+
+ def colour?
+ @options.colour ? true : false
+ end
+
+ def dry_run?
+ @options.dry_run ? true : false
+ end
+
def backtrace_line(line)
line.sub(/\A([^:]+:\d+)$/, '\\1:')
end
def colour(text, colour_code)
- return text unless @colour && output_to_tty?
+ return text unless colour? && output_to_tty?
"#{colour_code}#{text}\e[0m"
end
def output_to_tty?
begin
@output == Kernel || @output.tty?
rescue NoMethodError
false
end
end
def green(text); colour(text, "\e[32m"); end
def red(text); colour(text, "\e[31m"); end
def magenta(text); colour(text, "\e[35m"); end
def yellow(text); colour(text, "\e[33m"); end
def blue(text); colour(text, "\e[34m"); end
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/runner/formatter/failing_behaviours_formatter.rb b/vendor/gems/rspec/lib/spec/runner/formatter/failing_behaviours_formatter.rb
deleted file mode 100644
index 2b3940fd3..000000000
--- a/vendor/gems/rspec/lib/spec/runner/formatter/failing_behaviours_formatter.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-module Spec
- module Runner
- module Formatter
- class FailingBehavioursFormatter < BaseTextFormatter
- def add_behaviour(behaviour_name)
- if behaviour_name =~ /(.*) \(druby.*\)$/
- @behaviour_name = $1
- else
- @behaviour_name = behaviour_name
- end
- end
-
- def example_failed(example, counter, failure)
- unless @behaviour_name.nil?
- @output.puts @behaviour_name
- @behaviour_name = nil
- @output.flush
- end
- end
-
- def dump_failure(counter, failure)
- end
-
- def dump_summary(duration, example_count, failure_count, pending_count)
- end
- end
- end
- end
-end
diff --git a/vendor/gems/rspec/lib/spec/runner/formatter/failing_example_groups_formatter.rb b/vendor/gems/rspec/lib/spec/runner/formatter/failing_example_groups_formatter.rb
new file mode 100644
index 000000000..5a4607983
--- /dev/null
+++ b/vendor/gems/rspec/lib/spec/runner/formatter/failing_example_groups_formatter.rb
@@ -0,0 +1,31 @@
+require 'spec/runner/formatter/base_text_formatter'
+
+module Spec
+ module Runner
+ module Formatter
+ class FailingExampleGroupsFormatter < BaseTextFormatter
+ def add_example_group(example_group)
+ super
+ @example_group_description_parts = example_group.description_parts
+ end
+
+ def example_failed(example, counter, failure)
+ if @example_group_description_parts
+ description_parts = @example_group_description_parts.collect do |description|
+ description =~ /(.*) \(druby.*\)$/ ? $1 : description
+ end
+ @output.puts ::Spec::Example::ExampleGroupMethods.description_text(*description_parts)
+ @output.flush
+ @example_group_description_parts = nil
+ end
+ end
+
+ def dump_failure(counter, failure)
+ end
+
+ def dump_summary(duration, example_count, failure_count, pending_count)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/rspec/lib/spec/runner/formatter/failing_examples_formatter.rb b/vendor/gems/rspec/lib/spec/runner/formatter/failing_examples_formatter.rb
index 9728deaf0..e3a271c8b 100644
--- a/vendor/gems/rspec/lib/spec/runner/formatter/failing_examples_formatter.rb
+++ b/vendor/gems/rspec/lib/spec/runner/formatter/failing_examples_formatter.rb
@@ -1,22 +1,20 @@
+require 'spec/runner/formatter/base_text_formatter'
+
module Spec
module Runner
module Formatter
class FailingExamplesFormatter < BaseTextFormatter
- def add_behaviour(behaviour_name)
- @behaviour_name = behaviour_name
- end
-
def example_failed(example, counter, failure)
- @output.puts "#{@behaviour_name} #{example.description}"
+ @output.puts "#{example_group.description} #{example.description}"
@output.flush
end
def dump_failure(counter, failure)
end
def dump_summary(duration, example_count, failure_count, pending_count)
end
end
end
end
end
diff --git a/vendor/gems/rspec/lib/spec/runner/formatter/html_formatter.rb b/vendor/gems/rspec/lib/spec/runner/formatter/html_formatter.rb
index d9c422e55..ad153c8dc 100644
--- a/vendor/gems/rspec/lib/spec/runner/formatter/html_formatter.rb
+++ b/vendor/gems/rspec/lib/spec/runner/formatter/html_formatter.rb
@@ -1,323 +1,333 @@
require 'erb'
+require 'spec/runner/formatter/base_text_formatter'
module Spec
module Runner
module Formatter
class HtmlFormatter < BaseTextFormatter
include ERB::Util # for the #h method
- def initialize(output)
+ def initialize(options, output)
super
- @current_behaviour_number = 0
+ @current_example_group_number = 0
@current_example_number = 0
end
- # The number of the currently running behaviour
- def current_behaviour_number
- @current_behaviour_number
+ # The number of the currently running example_group
+ def current_example_group_number
+ @current_example_group_number
end
# The number of the currently running example (a global counter)
def current_example_number
@current_example_number
end
def start(example_count)
@example_count = example_count
@output.puts html_header
@output.puts report_header
@output.flush
end
- def add_behaviour(name)
- @behaviour_red = false
- @behaviour_red = false
- @current_behaviour_number += 1
- unless current_behaviour_number == 1
+ def add_example_group(example_group)
+ super
+ @example_group_red = false
+ @example_group_red = false
+ @current_example_group_number += 1
+ unless current_example_group_number == 1
@output.puts " "
@output.puts ""
end
- @output.puts "
"
+ @output.puts "
"
@output.puts "
"
- @output.puts "
#{h(name)}
"
+ @output.puts "
#{h(example_group.description)}
"
@output.flush
end
def start_dump
@output.puts "
"
@output.puts "
"
@output.flush
end
def example_started(example)
- @current_example_number = example.number
+ @current_example_number += 1
end
def example_passed(example)
move_progress
@output.puts "
"
@output.flush
end
# Override this method if you wish to output extra HTML for a failed spec. For example, you
# could output links to images or other files produced during the specs.
#
def extra_failure_content(failure)
+ require 'spec/runner/formatter/snippet_extractor'
+ @snippet_extractor ||= SnippetExtractor.new
"
#{@snippet_extractor.snippet(failure.exception)}
"
end
def move_progress
- percent_done = @example_count == 0 ? 100.0 : ((current_example_number + 1).to_f / @example_count.to_f * 1000).to_i / 10.0
@output.puts " "
@output.flush
end
+ def percent_done
+ result = 100.0
+ if @example_count != 0
+ result = ((current_example_number).to_f / @example_count.to_f * 1000).to_i / 10.0
+ end
+ result
+ end
+
def dump_failure(counter, failure)
end
def dump_summary(duration, example_count, failure_count, pending_count)
- if @dry_run
+ if dry_run?
totals = "This was a dry-run"
else
totals = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
totals << ", #{pending_count} pending" if pending_count > 0
end
@output.puts ""
@output.puts ""
@output.puts "