88 lines
2.0 KiB
Ruby
88 lines
2.0 KiB
Ruby
|
require File.expand_path(File.dirname(__FILE__) + '/neo')
|
||
|
|
||
|
C = "top level"
|
||
|
|
||
|
class AboutConstants < Neo::Koan
|
||
|
|
||
|
C = "nested"
|
||
|
|
||
|
def test_nested_constants_may_also_be_referenced_with_relative_paths
|
||
|
assert_equal __, C
|
||
|
end
|
||
|
|
||
|
def test_top_level_constants_are_referenced_by_double_colons
|
||
|
assert_equal __, ::C
|
||
|
end
|
||
|
|
||
|
def test_nested_constants_are_referenced_by_their_complete_path
|
||
|
assert_equal __, AboutConstants::C
|
||
|
assert_equal __, ::AboutConstants::C
|
||
|
end
|
||
|
|
||
|
# ------------------------------------------------------------------
|
||
|
|
||
|
class Animal
|
||
|
LEGS = 4
|
||
|
def legs_in_animal
|
||
|
LEGS
|
||
|
end
|
||
|
|
||
|
class NestedAnimal
|
||
|
def legs_in_nested_animal
|
||
|
LEGS
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_nested_classes_inherit_constants_from_enclosing_classes
|
||
|
assert_equal __, Animal::NestedAnimal.new.legs_in_nested_animal
|
||
|
end
|
||
|
|
||
|
# ------------------------------------------------------------------
|
||
|
|
||
|
class Reptile < Animal
|
||
|
def legs_in_reptile
|
||
|
LEGS
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_subclasses_inherit_constants_from_parent_classes
|
||
|
assert_equal __, Reptile.new.legs_in_reptile
|
||
|
end
|
||
|
|
||
|
# ------------------------------------------------------------------
|
||
|
|
||
|
class MyAnimals
|
||
|
LEGS = 2
|
||
|
|
||
|
class Bird < Animal
|
||
|
def legs_in_bird
|
||
|
LEGS
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_who_wins_with_both_nested_and_inherited_constants
|
||
|
assert_equal __, MyAnimals::Bird.new.legs_in_bird
|
||
|
end
|
||
|
|
||
|
# QUESTION: Which has precedence: The constant in the lexical scope,
|
||
|
# or the constant from the inheritance hierarchy?
|
||
|
|
||
|
# ------------------------------------------------------------------
|
||
|
|
||
|
class MyAnimals::Oyster < Animal
|
||
|
def legs_in_oyster
|
||
|
LEGS
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_who_wins_with_explicit_scoping_on_class_definition
|
||
|
assert_equal __, MyAnimals::Oyster.new.legs_in_oyster
|
||
|
end
|
||
|
|
||
|
# QUESTION: Now which has precedence: The constant in the lexical
|
||
|
# scope, or the constant from the inheritance hierarchy? Why is it
|
||
|
# different than the previous answer?
|
||
|
end
|