From 584b26e532a41ff28e22a5e6b05b2f01d585090a Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Mon, 27 Sep 2010 10:44:58 -0400 Subject: [PATCH] Updated for JRuby --- src/about_methods.rb | 10 +++++----- src/about_symbols.rb | 35 +++++++++++++++++++++++++++++------ src/edgecase.rb | 23 +++++++++++++++-------- 3 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/about_methods.rb b/src/about_methods.rb index 3b6ad57..42a06cf 100644 --- a/src/about_methods.rb +++ b/src/about_methods.rb @@ -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 diff --git a/src/about_symbols.rb b/src/about_symbols.rb index 17dfa81..e265df8 100644 --- a/src/about_symbols.rb +++ b/src/about_symbols.rb @@ -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 diff --git a/src/edgecase.rb b/src/edgecase.rb index 96617f9..1a5b882 100644 --- a/src/edgecase.rb +++ b/src/edgecase.rb @@ -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