Updated for JRuby
authorJim Weirich <jim.weirich@gmail.com>
Mon, 27 Sep 2010 14:44:58 +0000 (10:44 -0400)
committerJim Weirich <jim.weirich@gmail.com>
Mon, 27 Sep 2010 14:44:58 +0000 (10:44 -0400)
src/about_methods.rb
src/about_symbols.rb
src/edgecase.rb

index 3b6ad57..42a06cf 100644 (file)
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/edgecase')
 def my_global_method(a,b)
   a + b
 end
-  
+
 class AboutMethods < EdgeCase::Koan
 
   def test_calling_global_methods
@@ -36,19 +36,19 @@ class AboutMethods < EdgeCase::Koan
     # Rewrite the eval string to continue.
     #
   end
-  
+
   # NOTE: wrong number of argument is not a SYNTAX error, but a
   # runtime error.
   def test_calling_global_methods_with_wrong_number_of_arguments
     exception = assert_raise(___(ArgumentError)) do
       my_global_method
     end
-    assert_match(/#{__("wrong number of arguments")}/, exception.message)
+    assert_match(/#{__("wrong (number|#) of arguments")}/, exception.message)
 
     exception = assert_raise(___(ArgumentError)) do
       my_global_method(1,2,3)
     end
-    assert_match(/#{__("wrong number of arguments")}/, exception.message)
+    assert_match(/#{__("wrong (number|#) of arguments")}/, exception.message)
   end
 
   # ------------------------------------------------------------------
@@ -142,7 +142,7 @@ class AboutMethods < EdgeCase::Koan
       "tail"
     end
   end
-  
+
   def test_calling_methods_in_other_objects_require_explicit_receiver
     rover = Dog.new
     assert_equal __("Fido"), rover.name
index 17dfa81..e265df8 100644 (file)
@@ -25,15 +25,21 @@ class AboutSymbols < EdgeCase::Koan
 
   def test_method_names_become_symbols
     all_symbols = Symbol.all_symbols
-
-    assert_equal __(true), all_symbols.include?(:test_method_names_are_symbols)
+    assert_equal __(true), all_symbols.include?(:test_method_names_become_symbols)
   end
 
-  RubyConstant = "What is the sound of one hand clapping?"
-  def test_constants_become_symbols
-    all_symbols = Symbol.all_symbols
+  # THINK ABOUT IT:
+  #
+  # Why do we capture the list of symbols before we check for the
+  # method name?
 
-    assert_equal true, all_symbols.include?(__(:RubyConstant))
+  in_ruby_version("mri") do
+    RubyConstant = "What is the sound of one hand clapping?"
+    def test_constants_become_symbols
+      all_symbols = Symbol.all_symbols
+
+      assert_equal __(true), all_symbols.include?(__(:RubyConstant))
+    end
   end
 
   def test_symbols_can_be_made_from_strings
@@ -47,6 +53,13 @@ class AboutSymbols < EdgeCase::Koan
     assert_equal symbol, __("cats and dogs").to_sym
   end
 
+  def test_symbols_with_spaces_can_be_built
+    value = "and"
+    symbol = :"cats #{value} dogs"
+
+    assert_equal symbol, __("cats and dogs").to_sym
+  end
+
   def test_to_s_is_called_on_interpolated_symbols
     symbol = :cats
     string = "It is raining #{symbol} and dogs."
@@ -65,13 +78,23 @@ class AboutSymbols < EdgeCase::Koan
     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
   end
+
+  def test_symbols_can_be_dynamically_created
+    assert_equal __(:catsdogs), ("cats" + "dogs").to_sym
+  end
+
+  # THINK ABOUT IT:
+  #
+  # Why is it not a good idea to dynamically create a lot of symbols?
 end
index 96617f9..1a5b882 100644 (file)
@@ -6,8 +6,14 @@ require 'test/unit/assertions'
 class FillMeInError < StandardError
 end
 
-def in_ruby_version(version)
-  yield if RUBY_VERSION =~ /^#{version}/
+def ruby_version?(version)
+  RUBY_VERSION =~ /^#{version}/ ||
+    (version == 'jruby' && defined?(JRUBY_VERSION)) ||
+    (version == 'mri' && ! defined?(JRUBY_VERSION))
+end
+
+def in_ruby_version(*versions)
+  yield if versions.any? { |v| ruby_version?(v) }
 end
 
 def __(value="FILL ME IN", value19=:mu)
@@ -162,7 +168,7 @@ module EdgeCase
       print Color.green('.'*happy_steps)
       if failed?
         print Color.red('X')
-        print Color.blue('_'*(bar_width-1-happy_steps))
+        print Color.cyan('_'*(bar_width-1-happy_steps))
       end
       print Color.green(']')
       print " #{pass_count}/#{total_tests}"
@@ -211,13 +217,13 @@ ENDTEXT
     def encourage
       puts
       puts "The Master says:"
-      puts Color.blue("  You have not yet reached enlightenment.")
+      puts Color.cyan("  You have not yet reached enlightenment.")
       if ((recents = progress.last(5)) && recents.size == 5 && recents.uniq.size == 1)
-        puts Color.blue("  I sense frustration. Do not be afraid to ask for help.")
+        puts Color.cyan("  I sense frustration. Do not be afraid to ask for help.")
       elsif progress.last(2).size == 2 && progress.last(2).uniq.size == 1
-        puts Color.blue("  Do not lose hope.")
+        puts Color.cyan("  Do not lose hope.")
       elsif progress.last.to_i > 0
-        puts Color.blue("  You are progressing. Excellent. #{progress.last} completed.")
+        puts Color.cyan("  You are progressing. Excellent. #{progress.last} completed.")
       end
     end
 
@@ -242,12 +248,13 @@ ENDTEXT
           first_line = false
           Color.red(t)
         else
-          Color.blue(t)
+          Color.cyan(t)
         end
       }
     end
 
     def indent(text)
+      text = text.split(/\n/) if text.is_a?(String)
       text.collect{|t| "  #{t}"}
     end