86 lines
1.6 KiB
Ruby
86 lines
1.6 KiB
Ruby
|
require File.expand_path(File.dirname(__FILE__) + '/neo')
|
||
|
|
||
|
class AboutInheritance < Neo::Koan
|
||
|
class Dog
|
||
|
attr_reader :name
|
||
|
|
||
|
def initialize(name)
|
||
|
@name = name
|
||
|
end
|
||
|
|
||
|
def bark
|
||
|
"WOOF"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Chihuahua < Dog
|
||
|
def wag
|
||
|
:happy
|
||
|
end
|
||
|
|
||
|
def bark
|
||
|
"yip"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_subclasses_have_the_parent_as_an_ancestor
|
||
|
assert_equal __, Chihuahua.ancestors.include?(Dog)
|
||
|
end
|
||
|
|
||
|
def test_all_classes_ultimately_inherit_from_object
|
||
|
assert_equal __, Chihuahua.ancestors.include?(Object)
|
||
|
end
|
||
|
|
||
|
def test_subclasses_inherit_behavior_from_parent_class
|
||
|
chico = Chihuahua.new("Chico")
|
||
|
assert_equal __, chico.name
|
||
|
end
|
||
|
|
||
|
def test_subclasses_add_new_behavior
|
||
|
chico = Chihuahua.new("Chico")
|
||
|
assert_equal __, chico.wag
|
||
|
|
||
|
assert_raise(___) do
|
||
|
fido = Dog.new("Fido")
|
||
|
fido.wag
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_subclasses_can_modify_existing_behavior
|
||
|
chico = Chihuahua.new("Chico")
|
||
|
assert_equal __, chico.bark
|
||
|
|
||
|
fido = Dog.new("Fido")
|
||
|
assert_equal __, fido.bark
|
||
|
end
|
||
|
|
||
|
# ------------------------------------------------------------------
|
||
|
|
||
|
class BullDog < Dog
|
||
|
def bark
|
||
|
super + ", GROWL"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_subclasses_can_invoke_parent_behavior_via_super
|
||
|
ralph = BullDog.new("Ralph")
|
||
|
assert_equal __, ralph.bark
|
||
|
end
|
||
|
|
||
|
# ------------------------------------------------------------------
|
||
|
|
||
|
class GreatDane < Dog
|
||
|
def growl
|
||
|
super.bark + ", GROWL"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_super_does_not_work_cross_method
|
||
|
george = GreatDane.new("George")
|
||
|
assert_raise(___) do
|
||
|
george.growl
|
||
|
end
|
||
|
end
|
||
|
|
||
|
end
|