lib/context/lifecycle.rb in jeremymcanally-context-0.0.3 vs lib/context/lifecycle.rb in jeremymcanally-context-0.0.5
- old
+ new
@@ -1,24 +1,71 @@
class Test::Unit::TestCase
- # TODO: Chained lifecycle methods
class << self
+ attr_accessor :before_each_callbacks, :before_all_callbacks, :after_each_callbacks, :after_all_callbacks
+
# Add logic to run before the tests (i.e., a +setup+ method)
#
# before do
# @user = User.first
# end
#
- def before(&block)
- define_method(:setup, &block)
+ def before(period = :each, &block)
+ send("before_#{period}_callbacks") << block
end
# Add logic to run after the tests (i.e., a +teardown+ method)
#
# after do
# User.delete_all
# end
#
- def after(&block)
- define_method(:teardown, &block)
+ def after(period = :each, &block)
+ send("after_#{period}_callbacks") << block
+ end
+
+ def gather_callbacks(callback_type, period)
+ callbacks = superclass.respond_to?(:gather_callbacks) ? superclass.gather_callbacks(callback_type, period) : []
+ callbacks.push(*send("#{callback_type}_#{period}_callbacks"))
+ end
+ end
+
+ self.before_all_callbacks = []
+ self.before_each_callbacks = []
+ self.after_each_callbacks = []
+ self.after_all_callbacks = []
+
+ def self.inherited(child)
+ super
+ child.before_all_callbacks = []
+ child.before_each_callbacks = []
+ child.after_each_callbacks = []
+ child.after_all_callbacks = []
+
+ child.class_eval do
+ def setup
+ run_each_callbacks :before
+ end
+
+ def teardown
+ run_each_callbacks :after
+ end
+ end
+ end
+
+ def run_each_callbacks(callback_type)
+ self.class.gather_callbacks(callback_type, :each).each { |c| instance_eval(&c) }
+ end
+
+ def run_all_callbacks(callback_type)
+ previous_ivars = instance_variables
+ self.class.gather_callbacks(callback_type, :all).each { |c| instance_eval(&c) }
+ (instance_variables - previous_ivars).inject({}) do |hash, ivar|
+ hash.update ivar => instance_variable_get(ivar)
+ end
+ end
+
+ def set_values_from_callbacks(values)
+ values.each do |name, value|
+ instance_variable_set name, value
end
end
end
\ No newline at end of file