--- /dev/null
+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
+
+ 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
\ No newline at end of file