Clean up about_koans and add another example
authorMatt Yoho <mby@mattyoho.com>
Tue, 21 Sep 2010 19:29:21 +0000 (15:29 -0400)
committerMatt Yoho <mby@mattyoho.com>
Tue, 21 Sep 2010 20:04:58 +0000 (16:04 -0400)
koans/about_symbols.rb
src/about_symbols.rb

index 6e45f16..2aad194 100644 (file)
@@ -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
index 1b01168..cf1b8b0 100644 (file)
@@ -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