diff --git a/koans/about_symbols.rb b/koans/about_symbols.rb index 6e45f16..2aad194 100644 --- a/koans/about_symbols.rb +++ b/koans/about_symbols.rb @@ -6,24 +6,18 @@ class AboutSymbols < EdgeCase::Koan assert_equal __, symbol.is_a?(Symbol) end - def test_symbols_are_not_strings - symbol = :ruby - assert_equal __, symbol.is_a?(String) - assert_equal __, symbol.eql?("ruby") - end - - def test_symbols_have_unique_identity - symbol1 = :identity - symbol2 = :identity + def test_symbols_can_be_compared + symbol1 = :a_symbol + symbol2 = :a_symbol symbol3 = :something_else assert symbol1 == __ assert symbol1 != __ end - def test_identical_symbols_are_represented_by_a_single_internal_object - symbol1 = :identity - symbol2 = :identity + def test_identical_symbols_are_a_single_internal_object + symbol1 = :a_symbol + symbol2 = :a_symbol assert symbol1.equal?(__) assert_equal __, symbol2.object_id @@ -35,7 +29,7 @@ class AboutSymbols < EdgeCase::Koan assert_equal __, all_symbols.include?(:test_method_names_are_symbols) end - RubyConstant = "This string is assigned to a constant." + RubyConstant = "What is the sound of one hand clapping?" def test_constants_become_symbols all_symbols = Symbol.all_symbols @@ -53,14 +47,29 @@ class AboutSymbols < EdgeCase::Koan assert_equal symbol, __.to_sym end - def test_interpolated_symbols_become_strings + def test_to_s_is_called_on_interpolated_symbols symbol = :cats string = "It is raining #{symbol} and dogs." assert_equal __, string end + def test_symbols_are_not_strings + symbol = :ruby + assert_equal __, symbol.is_a?(String) + assert_equal __, symbol.eql?("ruby") + end + + def test_symbols_do_not_have_string_methods + symbol = :not_a_string + assert_equal __, symbol.respond_to?(:each_char) + assert_equal __, symbol.respond_to?(:reverse) + end + # It's important to realize that symbols are not "immutable + # strings", though they are immutable. None of the + # interesting string operations are available on symbols. def test_symbols_cannot_be_concatenated + # Exceptions will be pondered further father down the path assert_raise(__) do :cats + :dogs end diff --git a/src/about_symbols.rb b/src/about_symbols.rb index 1b01168..cf1b8b0 100644 --- a/src/about_symbols.rb +++ b/src/about_symbols.rb @@ -6,24 +6,18 @@ class AboutSymbols < EdgeCase::Koan assert_equal __(true), symbol.is_a?(Symbol) end - def test_symbols_are_not_strings - symbol = :ruby - assert_equal __(false), symbol.is_a?(String) - assert_equal __(false), symbol.eql?("ruby") - end - - def test_symbols_have_unique_identity - symbol1 = :identity - symbol2 = :identity + def test_symbols_can_be_compared + symbol1 = :a_symbol + symbol2 = :a_symbol symbol3 = :something_else assert symbol1 == __(symbol2) - assert symbol1 != __(symbol2) + assert symbol1 != __(symbol3) end - def test_identical_symbols_are_represented_by_a_single_internal_object - symbol1 = :identity - symbol2 = :identity + def test_identical_symbols_are_a_single_internal_object + symbol1 = :a_symbol + symbol2 = :a_symbol assert symbol1.equal?(__(symbol2)) assert_equal __(symbol1.object_id), symbol2.object_id @@ -35,7 +29,7 @@ class AboutSymbols < EdgeCase::Koan assert_equal __(true), all_symbols.include?(:test_method_names_are_symbols) end - RubyConstant = "This string is assigned to a constant." + RubyConstant = "What is the sound of one hand clapping?" def test_constants_become_symbols all_symbols = Symbol.all_symbols @@ -53,14 +47,29 @@ class AboutSymbols < EdgeCase::Koan assert_equal symbol, __("cats and dogs").to_sym end - def test_interpolated_symbols_become_strings + def test_to_s_is_called_on_interpolated_symbols symbol = :cats string = "It is raining #{symbol} and dogs." assert_equal __('It is raining cats and dogs.'), string end + def test_symbols_are_not_strings + symbol = :ruby + assert_equal __(false), symbol.is_a?(String) + assert_equal __(false), symbol.eql?("ruby") + end + + def test_symbols_do_not_have_string_methods + symbol = :not_a_string + assert_equal __(false), symbol.respond_to?(:each_char) + assert_equal __(false), symbol.respond_to?(:reverse) + end + # It's important to realize that symbols are not "immutable + # strings", though they are immutable. None of the + # interesting string operations are available on symbols. def test_symbols_cannot_be_concatenated + # Exceptions will be pondered further father down the path assert_raise(__(NoMethodError)) do :cats + :dogs end