14 Commits

Author SHA1 Message Date
Jim Weirich
db3bbdcf45 Better test name in the java interop koan 2010-12-23 15:04:16 -05:00
Jim Weirich
1a0d82a402 Added .rbc to clean list. 2010-12-23 12:28:39 -05:00
Jim Weirich
c8b4c3e6c5 [5458710] Added koans about to_str 2010-12-23 12:28:24 -05:00
Jim Weirich
204cd44ea9 [5462710] Fixed equality koan on symbols. 2010-12-23 12:08:03 -05:00
Jim Weirich
325ad5bce3 Result summary now in order of running. 2010-12-23 11:54:41 -05:00
Jim Weirich
b733076165 Added .rbc to ignore list 2010-12-23 11:48:40 -05:00
Jim Weirich
5e9083e754 Remove dbgs from Rakefile 2010-12-23 11:48:15 -05:00
Jim Weirich
ab59dc4791 Merge branch 'more_jruby' into m
* more_jruby:
  [5553333] Updated java interop on to_java method.
  Added cruise task
  java coercion
2010-12-23 11:46:29 -05:00
Jim Weirich
ccfa664b48 [5553333] Updated java interop on to_java method. 2010-12-23 11:45:46 -05:00
Jim Weirich
9b9eb640f8 Added cruise task 2010-12-23 11:29:39 -05:00
Jim Weirich
297cfde6a3 [7439987] Changed symbol inclusion test to use strings. 2010-12-23 10:16:34 -05:00
Jim Weirich
3dab146b8d Added --/++ markers around the dice class. 2010-12-23 09:26:55 -05:00
Marc Peabody
0b9727f299 fix mistake in about_symbols.rb 2010-12-14 09:12:49 -05:00
Marc Peabody
e26666280c java coercion 2010-10-02 10:11:18 -04:00
12 changed files with 219 additions and 18 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
dist dist
.project_env.rc .project_env.rc
.path_progress .path_progress
*.rbc

View File

@@ -15,6 +15,7 @@ today = Time.now.strftime("%Y-%m-%d")
TAR_FILE = "#{DIST_DIR}/rubykoans-#{today}.tgz" TAR_FILE = "#{DIST_DIR}/rubykoans-#{today}.tgz"
ZIP_FILE = "#{DIST_DIR}/rubykoans-#{today}.zip" ZIP_FILE = "#{DIST_DIR}/rubykoans-#{today}.zip"
CLEAN.include("**/*.rbc")
CLOBBER.include(DIST_DIR) CLOBBER.include(DIST_DIR)
module Koans module Koans
@@ -57,6 +58,27 @@ module Koans
end end
end end
module RubyImpls
# Calculate the list of relevant Ruby implementations.
def self.find_ruby_impls
rubys = `rvm list`.gsub(/=>/,'').split(/\n/).sort
expected.map { |impl|
last = rubys.grep(Regexp.new(Regexp.quote(impl))).last
last ? last.split.first : nil
}.compact
end
# Return a (cached) list of relevant Ruby implementations.
def self.list
@list ||= find_ruby_impls
end
# List of expected ruby implementations.
def self.expected
%w(ruby-1.8.6 ruby-1.8.7 ruby-1.9.2 jruby ree)
end
end
task :default => :walk_the_path task :default => :walk_the_path
task :walk_the_path do task :walk_the_path do
@@ -107,3 +129,38 @@ SRC_FILES.each do |koan_src|
Koans.make_koan_file koan_src, t.name Koans.make_koan_file koan_src, t.name
end end
end end
task :run do
puts 'koans'
Dir.chdir("src") do
puts "in #{Dir.pwd}"
sh "ruby path_to_enlightenment.rb"
end
end
desc "Pre-checkin tests (=> run_all)"
task :cruise => :run_all
desc "Run the completed koans againts a list of relevant Ruby Implementations"
task :run_all do
results = []
RubyImpls.list.each do |impl|
puts "=" * 40
puts "On Ruby #{impl}"
sh "rvm #{impl} rake run"
results << [impl, "RAN"]
puts
end
puts "=" * 40
puts "Summary:"
puts
results.each do |impl, res|
puts "#{impl} => RAN"
end
puts
RubyImpls.expected.each do |requested_impl|
impl_pattern = Regexp.new(Regexp.quote(requested_impl))
puts "No Results for #{requested_impl}" unless results.detect { |x| x.first =~ impl_pattern }
end
end

View File

@@ -1,11 +1,10 @@
require File.expand_path(File.dirname(__FILE__) + '/edgecase') require File.expand_path(File.dirname(__FILE__) + '/edgecase')
class DiceSet # Implement a DiceSet Class here:
attr_reader :values #
def roll(n) # class DiceSet
@values = (1..n).map { rand(6) + 1 } # code ...
end # end
end
class AboutDiceProject < EdgeCase::Koan class AboutDiceProject < EdgeCase::Koan
def test_can_create_a_dice_set def test_can_create_a_dice_set

View File

@@ -95,6 +95,19 @@ class AboutJavaInterop < EdgeCase::Koan
assert_equal __, java_array.toString.is_a?(java.lang.String) assert_equal __, java_array.toString.is_a?(java.lang.String)
end end
def test_some_ruby_objects_can_be_coerced_to_java
assert_equal __, "ruby string".to_java.class
assert_equal __, 1.to_java.class
assert_equal __, 9.32.to_java.class
assert_equal __, false.to_java.class
end
def test_some_ruby_objects_are_not_coerced_to_what_you_might_expect
assert_equal __, [].to_java.class == Java::JavaUtil::ArrayList
assert_equal __, {}.to_java.class == Java::JavaUtil::HashMap
assert_equal __, Object.new.to_java.class == Java::JavaLang::Object
end
def test_java_collections_are_enumerable def test_java_collections_are_enumerable
java_array = java.util.ArrayList.new java_array = java.util.ArrayList.new
java_array << "one" << "two" << "three" java_array << "one" << "two" << "three"

View File

@@ -11,8 +11,8 @@ class AboutSymbols < EdgeCase::Koan
symbol2 = :a_symbol symbol2 = :a_symbol
symbol3 = :something_else symbol3 = :something_else
assert symbol1 == __ assert_equal __, symbol1 == symbol2
assert symbol1 != __ assert_equal __, symbol1 == symbol3
end end
def test_identical_symbols_are_a_single_internal_object def test_identical_symbols_are_a_single_internal_object
@@ -24,14 +24,14 @@ class AboutSymbols < EdgeCase::Koan
end end
def test_method_names_become_symbols def test_method_names_become_symbols
all_symbols = Symbol.all_symbols symbols_as_strings = Symbol.all_symbols.map { |x| x.to_s }
assert_equal __, all_symbols.include?(:test_method_names_become_symbols) assert_equal __, symbols_as_strings.include?("test_method_names_become_symbols")
end end
# THINK ABOUT IT: # THINK ABOUT IT:
# #
# Why do we capture the list of symbols before we check for the # Why do we convert the list of symbols to strings and then compare
# method name? # against the string value rather than against symbols?
in_ruby_version("mri") do in_ruby_version("mri") do
RubyConstant = "What is the sound of one hand clapping?" RubyConstant = "What is the sound of one hand clapping?"

54
koans/about_to_str.rb Normal file
View File

@@ -0,0 +1,54 @@
require File.expand_path(File.dirname(__FILE__) + '/edgecase')
class AboutToStr < EdgeCase::Koan
class CanNotBeTreatedAsString
def to_s
"non-string-like"
end
end
def test_to_s_returns_a_string_representation
not_like_a_string = CanNotBeTreatedAsString.new
assert_equal __, not_like_a_string.to_s
end
def test_normally_objects_cannot_be_used_where_strings_are_expected
assert_raise(___) do
File.exist?(CanNotBeTreatedAsString.new)
end
end
# ------------------------------------------------------------------
class CanBeTreatedAsString
def to_s
"string-like"
end
def to_str
to_s
end
end
def test_to_str_also_returns_a_string_representation
like_a_string = CanBeTreatedAsString.new
assert_equal __, like_a_string.to_str
end
def test_to_str_allows_objects_to_be_treated_as_strings
assert_equal __, File.exist?(CanBeTreatedAsString.new)
end
# ------------------------------------------------------------------
def acts_like_a_string?(string)
string = string.to_str if string.respond_to?(:to_str)
string.is_a?(String)
end
def test_user_defined_code_can_check_for_to_str
assert_equal __, acts_like_a_string?(CanNotBeTreatedAsString.new)
assert_equal __, acts_like_a_string?(CanBeTreatedAsString.new)
end
end

View File

@@ -31,6 +31,7 @@ require 'about_scope'
require 'about_class_methods' require 'about_class_methods'
require 'about_message_passing' require 'about_message_passing'
require 'about_proxy_object_project' require 'about_proxy_object_project'
require 'about_to_str'
in_ruby_version("jruby") do in_ruby_version("jruby") do
require 'about_java_interop' require 'about_java_interop'
end end

View File

@@ -1,5 +1,12 @@
require File.expand_path(File.dirname(__FILE__) + '/edgecase') require File.expand_path(File.dirname(__FILE__) + '/edgecase')
# Implement a DiceSet Class here:
#
# class DiceSet
# code ...
# end
#--
class DiceSet class DiceSet
attr_reader :values attr_reader :values
def roll(n) def roll(n)
@@ -7,6 +14,7 @@ class DiceSet
end end
end end
#++
class AboutDiceProject < EdgeCase::Koan class AboutDiceProject < EdgeCase::Koan
def test_can_create_a_dice_set def test_can_create_a_dice_set
dice = DiceSet.new dice = DiceSet.new

View File

@@ -95,6 +95,19 @@ class AboutJavaInterop < EdgeCase::Koan
assert_equal __(false), java_array.toString.is_a?(java.lang.String) assert_equal __(false), java_array.toString.is_a?(java.lang.String)
end end
def test_some_ruby_objects_can_be_coerced_to_java
assert_equal __(Java::JavaLang::String), "ruby string".to_java.class
assert_equal __(Java::JavaLang::Long), 1.to_java.class
assert_equal __(Java::JavaLang::Double), 9.32.to_java.class
assert_equal __(Java::JavaLang::Boolean), false.to_java.class
end
def test_some_ruby_objects_are_not_coerced_to_what_you_might_expect
assert_equal __(false), [].to_java.class == Java::JavaUtil::ArrayList
assert_equal __(false), {}.to_java.class == Java::JavaUtil::HashMap
assert_equal __(false), Object.new.to_java.class == Java::JavaLang::Object
end
def test_java_collections_are_enumerable def test_java_collections_are_enumerable
java_array = java.util.ArrayList.new java_array = java.util.ArrayList.new
java_array << "one" << "two" << "three" java_array << "one" << "two" << "three"

View File

@@ -11,8 +11,8 @@ class AboutSymbols < EdgeCase::Koan
symbol2 = :a_symbol symbol2 = :a_symbol
symbol3 = :something_else symbol3 = :something_else
assert symbol1 == __(symbol2) assert_equal __(true), symbol1 == symbol2
assert symbol1 != __(symbol3) assert_equal __(false), symbol1 == symbol3
end end
def test_identical_symbols_are_a_single_internal_object def test_identical_symbols_are_a_single_internal_object
@@ -24,14 +24,14 @@ class AboutSymbols < EdgeCase::Koan
end end
def test_method_names_become_symbols def test_method_names_become_symbols
all_symbols = Symbol.all_symbols symbols_as_strings = Symbol.all_symbols.map { |x| x.to_s }
assert_equal __(true), all_symbols.include?(:test_method_names_become_symbols) assert_equal __(true), symbols_as_strings.include?("test_method_names_become_symbols")
end end
# THINK ABOUT IT: # THINK ABOUT IT:
# #
# Why do we capture the list of symbols before we check for the # Why do we convert the list of symbols to strings and then compare
# method name? # against the string value rather than against symbols?
in_ruby_version("mri") do in_ruby_version("mri") do
RubyConstant = "What is the sound of one hand clapping?" RubyConstant = "What is the sound of one hand clapping?"

54
src/about_to_str.rb Normal file
View File

@@ -0,0 +1,54 @@
require File.expand_path(File.dirname(__FILE__) + '/edgecase')
class AboutToStr < EdgeCase::Koan
class CanNotBeTreatedAsString
def to_s
"non-string-like"
end
end
def test_to_s_returns_a_string_representation
not_like_a_string = CanNotBeTreatedAsString.new
assert_equal __("non-string-like"), not_like_a_string.to_s
end
def test_normally_objects_cannot_be_used_where_strings_are_expected
assert_raise(___(TypeError)) do
File.exist?(CanNotBeTreatedAsString.new)
end
end
# ------------------------------------------------------------------
class CanBeTreatedAsString
def to_s
"string-like"
end
def to_str
to_s
end
end
def test_to_str_also_returns_a_string_representation
like_a_string = CanBeTreatedAsString.new
assert_equal __("string-like"), like_a_string.to_str
end
def test_to_str_allows_objects_to_be_treated_as_strings
assert_equal __(false), File.exist?(CanBeTreatedAsString.new)
end
# ------------------------------------------------------------------
def acts_like_a_string?(string)
string = string.to_str if string.respond_to?(:to_str)
string.is_a?(String)
end
def test_user_defined_code_can_check_for_to_str
assert_equal __(false), acts_like_a_string?(CanNotBeTreatedAsString.new)
assert_equal __(true), acts_like_a_string?(CanBeTreatedAsString.new)
end
end

View File

@@ -31,6 +31,7 @@ require 'about_scope'
require 'about_class_methods' require 'about_class_methods'
require 'about_message_passing' require 'about_message_passing'
require 'about_proxy_object_project' require 'about_proxy_object_project'
require 'about_to_str'
in_ruby_version("jruby") do in_ruby_version("jruby") do
require 'about_java_interop' require 'about_java_interop'
end end