require File.expand_path(File.dirname(__FILE__) + '/neo') class AboutExceptions < Neo::Koan class MySpecialError < RuntimeError end def test_exceptions_inherit_from_Exception assert_equal __, MySpecialError.ancestors[1] assert_equal __, MySpecialError.ancestors[2] assert_equal __, MySpecialError.ancestors[3] assert_equal __, MySpecialError.ancestors[4] end def test_rescue_clause result = nil begin fail "Oops" rescue StandardError => ex result = :exception_handled end assert_equal __, result assert_equal __, ex.is_a?(StandardError), "Should be a Standard Error" assert_equal __, ex.is_a?(RuntimeError), "Should be a Runtime Error" assert RuntimeError.ancestors.include?(StandardError), "RuntimeError is a subclass of StandardError" assert_equal __, ex.message end def test_raising_a_particular_error result = nil begin # 'raise' and 'fail' are synonyms raise MySpecialError, "My Message" rescue MySpecialError => ex result = :exception_handled end assert_equal __, result assert_equal __, ex.message end def test_ensure_clause result = nil begin fail "Oops" rescue StandardError # no code here ensure result = :always_run end assert_equal __, result end # Sometimes, we must know about the unknown def test_asserting_an_error_is_raised # A do-end is a block, a topic to explore more later assert_raise(___) do raise MySpecialError.new("New instances can be raised directly.") end end end