Updated README.rdoc again
[feedcatcher.git] / vendor / rails / activesupport / lib / active_support / testing / setup_and_teardown.rb
1 require 'active_support/callbacks'
2
3 module ActiveSupport
4 module Testing
5 module SetupAndTeardown
6 def self.included(base)
7 base.class_eval do
8 include ActiveSupport::Callbacks
9 define_callbacks :setup, :teardown
10
11 if defined?(MiniTest::Assertions) && TestCase < MiniTest::Assertions
12 include ForMiniTest
13 else
14 include ForClassicTestUnit
15 end
16 end
17 end
18
19 module ForMiniTest
20 def run(runner)
21 result = '.'
22 begin
23 run_callbacks :setup
24 result = super
25 rescue Exception => e
26 result = runner.puke(self.class, self.name, e)
27 ensure
28 begin
29 run_callbacks :teardown, :enumerator => :reverse_each
30 rescue Exception => e
31 result = runner.puke(self.class, self.name, e)
32 end
33 end
34 result
35 end
36 end
37
38 module ForClassicTestUnit
39 # For compatibility with Ruby < 1.8.6
40 PASSTHROUGH_EXCEPTIONS = Test::Unit::TestCase::PASSTHROUGH_EXCEPTIONS rescue [NoMemoryError, SignalException, Interrupt, SystemExit]
41
42 # This redefinition is unfortunate but test/unit shows us no alternative.
43 # Doubly unfortunate: hax to support Mocha's hax.
44 def run(result)
45 return if @method_name.to_s == "default_test"
46
47 if using_mocha = respond_to?(:mocha_verify)
48 assertion_counter_klass = if defined?(Mocha::TestCaseAdapter::AssertionCounter)
49 Mocha::TestCaseAdapter::AssertionCounter
50 else
51 Mocha::Integration::TestUnit::AssertionCounter
52 end
53 assertion_counter = assertion_counter_klass.new(result)
54 end
55
56 yield(Test::Unit::TestCase::STARTED, name)
57 @_result = result
58 begin
59 begin
60 run_callbacks :setup
61 setup
62 __send__(@method_name)
63 mocha_verify(assertion_counter) if using_mocha
64 rescue Mocha::ExpectationError => e
65 add_failure(e.message, e.backtrace)
66 rescue Test::Unit::AssertionFailedError => e
67 add_failure(e.message, e.backtrace)
68 rescue Exception => e
69 raise if PASSTHROUGH_EXCEPTIONS.include?(e.class)
70 add_error(e)
71 ensure
72 begin
73 teardown
74 run_callbacks :teardown, :enumerator => :reverse_each
75 rescue Test::Unit::AssertionFailedError => e
76 add_failure(e.message, e.backtrace)
77 rescue Exception => e
78 raise if PASSTHROUGH_EXCEPTIONS.include?(e.class)
79 add_error(e)
80 end
81 end
82 ensure
83 mocha_teardown if using_mocha
84 end
85 result.add_run
86 yield(Test::Unit::TestCase::FINISHED, name)
87 end
88 end
89 end
90 end
91 end