require File.expand_path(File.dirname(__FILE__) + '/edgecase')
class AboutMessagePassing < EdgeCase::Koan
-
+
class MessageCatcher
def caught?
true
end
end
-
+
def test_methods_can_be_called_directly
mc = MessageCatcher.new
-
- assert mc.caught?
+
+ assert mc.caught?
end
-
+
def test_methods_can_be_invoked_by_sending_the_message
mc = MessageCatcher.new
-
+
assert mc.send(:caught?)
end
-
+
def test_methods_can_be_invoked_more_dynamically
mc = MessageCatcher.new
-
+
assert mc.send("caught?")
assert mc.send("caught" + __ ) # What do you need to add to the first string?
assert mc.send("CAUGHT?".____ ) # What would you need to do to the string?
def test_classes_can_be_asked_if_they_know_how_to_respond
mc = MessageCatcher.new
-
+
assert_equal __, mc.respond_to?(:caught?)
assert_equal __, mc.respond_to?(:does_not_exist)
end
-
+
# ------------------------------------------------------------------
class MessageCatcher
args
end
end
-
+
def test_sending_a_message_with_arguments
mc = MessageCatcher.new
-
+
assert_equal __, mc.add_a_payload
assert_equal __, mc.send(:add_a_payload)
#
# If the method :method_missing causes the NoMethodError, then
# what would happen if we redefine method_missing?
+ #
+ # NOTE:
+ #
+ # In Ruby 1.8 the method_missing method is public and can be
+ # called as shown above. However, in Ruby 1.9 the method_missing
+ # method is private. We explicitly made it public in the testing
+ # framework so this example works in both versions of Ruby. Just
+ # keep in mind you can't call method_missing like that in Ruby
+ # 1.9. normally.
+ #
+ # Thanks. We now return you to your regularly schedule Ruby
+ # Koans.
end
# ------------------------------------------------------------------
self.send(method)
end
end
+
+ in_ruby_version("1.9") do
+ public :method_missing
+ end
end
module EdgeCase
class Sensei
attr_reader :failure, :failed_test
- AssertionError = Test::Unit::AssertionFailedError
+ in_ruby_version("1.8") do
+ AssertionError = Test::Unit::AssertionFailedError
+ end
+
+ in_ruby_version("1.9") do
+ if defined?(MiniTest)
+ AssertionError = MiniTest::Assertion
+ else
+ AssertionError = Test::Unit::AssertionFailedError
+ end
+ end
def initialize
@pass_count = 0
test.setup
begin
test.send(method)
- rescue StandardError => ex
+ rescue StandardError, EdgeCase::Sensei::AssertionError => ex
test.failed(ex)
ensure
begin
test.teardown
- rescue StandardError => ex
+ rescue StandardError, EdgeCase::Sensei::AssertionError => ex
test.failed(ex) if test.passed?
end
end