5 Commits

Author SHA1 Message Date
Jim Weirich
d3ce64a768 Updatd exception koan to be clearer about StandardError VS RuntimeError 2010-11-29 09:02:22 -05:00
Luke Pearce
9291f534c6 Fixed exceptions typo 2010-11-29 13:24:40 +00:00
Jim Weirich
71f670ac1d Disabled colored output on windows. 2010-10-21 07:05:06 -04:00
Jim Weirich
1864c9c346 Updated koans for about_symbols fix 2010-10-21 07:04:54 -04:00
Jim Weirich
cfd5b6bbe1 Fixed test_symbols_with_spaces_can_be_built method name collision. 2010-10-21 07:02:10 -04:00
10 changed files with 72 additions and 323 deletions

View File

@@ -22,8 +22,8 @@ class AboutExceptions < EdgeCase::Koan
assert_equal __, result
assert ex.is_a?(___), "Failure message."
assert ex.is_a?(___), "Failure message."
assert_equal __, ex.is_a?(StandardError), "Should be a Standard Error"
assert_equal __, ex.is_a?(RuntimeError), "Should be a Runtime Error"
assert RuntimeError.ancestors.include?(StandardError),
"RuntimeError is a subclass of StandardError"

View File

@@ -1,118 +0,0 @@
require File.expand_path(File.dirname(__FILE__) + '/edgecase')
class Sensei
def observe(step)
# Step Protocol: step.passed? | step.failure | step.koan_file | step.name
# WRITE THIS CODE
end
def pass_count
# WRITE THIS CODE
end
def failed?
# WRITE THIS CODE
end
def instruct
# WRITE THIS CODE
end
end
def student_passes_test
assert true # DO NOT CHANGE YOUR STUDENT'S ANSWER
end
def student_fails_test
assert false # DO NOT CHANGE YOUR STUDENT'S ANSWER
end
class AboutSensei < EdgeCase::Koan
def test_sensei_comments_about_expanded_awareness
you = Sensei.new
student_step = EdgeCase::Koan.new(:student_passes_test, self)
student_meditation = student_step.meditate
observation = you.observe(student_meditation)
assert_equal "AboutSensei#student_passes_test has expanded your awareness.", observation
end
def test_sensei_comments_about_damaged_karma
you = Sensei.new
student_step = EdgeCase::Koan.new(:student_fails_test, self)
student_meditation = student_step.meditate
observation = you.observe(student_meditation)
assert_equal "AboutSensei#student_fails_test has damaged your karma.", observation
end
def test_sensei_counts_passed_steps
you = Sensei.new
student_steps = [EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_fails_test, self)]
student_steps.each do |step|
you.observe step.meditate
end
assert_equal 4, you.pass_count
end
def test_sensei_reports_failed_true
you = Sensei.new
student_steps = [EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_fails_test, self)]
student_steps.each do |step|
you.observe step
end
assert you.failed?
end
def test_sensei_reports_failed_true
you = Sensei.new
student_steps = [EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self)]
student_steps.each do |step|
you.observe step
end
assert ! you.failed?
end
def test_sensei_shows_beginning_progress
you = Sensei.new
student_steps = [EdgeCase::Koan.new(:student_fails_test, self),
EdgeCase::Koan.new(:student_fails_test, self),
EdgeCase::Koan.new(:student_fails_test, self),
EdgeCase::Koan.new(:student_fails_test, self),
EdgeCase::Koan.new(:student_fails_test, self)]
student_steps.each do |step|
you.observe step.meditate
end
instructions = you.instruct
assert_match "You have not yet reached enlightenment", instructions
assert_match "You have passed 0 steps", instructions
end
def test_sensei_shows_partial_progress
you = Sensei.new
student_steps = [EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_fails_test, self),
EdgeCase::Koan.new(:student_fails_test, self)]
student_steps.each do |step|
you.observe step.meditate
end
instructions = you.instruct
assert_match "You have not yet reached enlightenment", instructions
assert_match "You have passed 3 steps", instructions
end
def test_sensei_congratulates_student
you = Sensei.new
# run all of Ruby Koans with you as the sensei
EdgeCase::ThePath.new(you).walk
instructions = you.instruct
assert_match "The student has become the master", instructions
end
end

View File

@@ -53,7 +53,7 @@ class AboutSymbols < EdgeCase::Koan
assert_equal symbol, __.to_sym
end
def test_symbols_with_spaces_can_be_built
def test_symbols_with_interpolation_can_be_built
value = "and"
symbol = :"cats #{value} dogs"

View File

@@ -93,16 +93,29 @@ module EdgeCase
end
def colorize(string, color_value)
if ENV['NO_COLOR']
string
else
if use_colors?
color(color_value) + string + color(COLORS[:clear])
else
string
end
end
def color(color_value)
"\e[#{color_value}m"
end
def use_colors?
return false if ENV['NO_COLOR']
if ENV['ANSI_COLOR'].nil?
! using_windows?
else
ENV['ANSI_COLOR'] =~ /^(t|y)/i
end
end
def using_windows?
File::ALT_SEPARATOR
end
end
class Sensei
@@ -124,10 +137,7 @@ module EdgeCase
@pass_count = 0
@failure = nil
@failed_test = nil
end
def observations
@observations ||= []
@observations = []
end
PROGRESS_FILE_NAME = '.path_progress'
@@ -157,13 +167,13 @@ module EdgeCase
if step.passed?
@pass_count += 1
if @pass_count > progress.last.to_i
observations << Color.green("#{step.koan_file}##{step.name} has expanded your awareness.")
@observations << Color.green("#{step.koan_file}##{step.name} has expanded your awareness.")
end
else
@failed_test = step
@failure = step.failure
add_progress(@pass_count)
observations << Color.red("#{step.koan_file}##{step.name} has damaged your karma.")
@observations << Color.red("#{step.koan_file}##{step.name} has damaged your karma.")
throw :edgecase_exit
end
end
@@ -178,7 +188,7 @@ module EdgeCase
def instruct
if failed?
observations.each{|c| puts c }
@observations.each{|c| puts c }
encourage
guide_through_error
a_zenlike_statement
@@ -206,23 +216,22 @@ module EdgeCase
end
def end_screen
screen = if EdgeCase.simple_output
end_message
if EdgeCase.simple_output
boring_end_screen
else
artistic_end_screen
end
puts screen
end
def end_message
"The student has become the master"
def boring_end_screen
puts "Mountains are again merely mountains"
end
def artistic_end_screen
"JRuby 1.9.x Koans"
ruby_version = "(in #{'J' if defined?(JRUBY_VERSION)}Ruby #{defined?(JRUBY_VERSION) ? JRUBY_VERSION : RUBY_VERSION})"
ruby_version = ruby_version.side_padding(54)
return <<-ENDTEXT
completed = <<-ENDTEXT
,, , ,,
: ::::, :::,
, ,,: :::::::::::::,, :::: : ,
@@ -233,7 +242,7 @@ module EdgeCase
,: , ,:,,: :::::::::::::
::,: ,,:::, ,::::::::::::,
,:::, :,,::: ::::::::::::,
,::: :::::::,#{ end_message.side_padding 48 },::::::::::::
,::: :::::::, Mountains are again merely mountains ,::::::::::::
:::,,,:::::: ::::::::::::
,:::::::::::, ::::::::::::,
:::::::::::, ,::::::::::::
@@ -257,6 +266,7 @@ module EdgeCase
,:::: , ,,
,,,
ENDTEXT
puts completed
end
def encourage
@@ -433,26 +443,21 @@ ENDTEXT
end
class ThePath
def initialize(sensei=nil)
@sensei = sensei || Sensei.new
end
def walk
sensei = EdgeCase::Sensei.new
each_step do |step|
@sensei.observe(step.meditate)
sensei.observe(step.meditate)
end
@sensei.instruct
sensei.instruct
end
def each_step
catch(:edgecase_exit) {
step_count = 0
EdgeCase::Koan.subclasses.each_with_index do |koan,koan_index|
if @sensei.instance_of?(EdgeCase::Sensei) || (koan.to_s != "AboutSensei")
koan.testmethods.each do |method_name|
step = koan.new(method_name, koan.to_s, koan_index+1, step_count+=1)
yield step
end
koan.testmethods.each do |method_name|
step = koan.new(method_name, koan.to_s, koan_index+1, step_count+=1)
yield step
end
end
}

View File

@@ -35,4 +35,3 @@ in_ruby_version("jruby") do
require 'about_java_interop'
end
require 'about_extra_credit'
require 'about_sensei'

View File

@@ -22,8 +22,8 @@ class AboutExceptions < EdgeCase::Koan
assert_equal __(:exception_handled), result
assert ex.is_a?(___(StandardError)), "Failure message."
assert ex.is_a?(___(RuntimeError)), "Failure message."
assert_equal __(true), ex.is_a?(StandardError), "Should be a Standard Error"
assert_equal __(true), ex.is_a?(RuntimeError), "Should be a Runtime Error"
assert RuntimeError.ancestors.include?(StandardError), # __
"RuntimeError is a subclass of StandardError"

View File

@@ -1,141 +0,0 @@
require File.expand_path(File.dirname(__FILE__) + '/edgecase')
class Sensei
def observe(step)
# Step Protocol: step.passed? | step.failure | step.koan_file | step.name
# WRITE THIS CODE
#--
@pass_count ||= 0
if step.passed?
@pass_count += 1
"#{step.koan_file.class.to_s}##{step.name} has expanded your awareness."
else
@failure = step.failure
"#{step.koan_file.class.to_s}##{step.name} has damaged your karma."
end
#++
end
def pass_count
# WRITE THIS CODE
#--
@pass_count
#++
end
def failed?
# WRITE THIS CODE
#--
! @failure.nil?
#++
end
def instruct
# WRITE THIS CODE
#--
if failed?
"You have not yet reached enlightenment. You have passed #{pass_count} steps."
else
"The student has become the master"
end
#++
end
end
def student_passes_test
assert true # DO NOT CHANGE YOUR STUDENT'S ANSWER
end
def student_fails_test
assert false # DO NOT CHANGE YOUR STUDENT'S ANSWER
end
class AboutSensei < EdgeCase::Koan
def test_sensei_comments_about_expanded_awareness
you = Sensei.new
student_step = EdgeCase::Koan.new(:student_passes_test, self)
student_meditation = student_step.meditate
observation = you.observe(student_meditation)
assert_equal "AboutSensei#student_passes_test has expanded your awareness.", observation
end
def test_sensei_comments_about_damaged_karma
you = Sensei.new
student_step = EdgeCase::Koan.new(:student_fails_test, self)
student_meditation = student_step.meditate
observation = you.observe(student_meditation)
assert_equal "AboutSensei#student_fails_test has damaged your karma.", observation
end
def test_sensei_counts_passed_steps
you = Sensei.new
student_steps = [EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_fails_test, self)]
student_steps.each do |step|
you.observe step.meditate
end
assert_equal 4, you.pass_count
end
def test_sensei_reports_failed_true
you = Sensei.new
student_steps = [EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_fails_test, self)]
student_steps.each do |step|
you.observe step
end
assert you.failed?
end
def test_sensei_reports_failed_true
you = Sensei.new
student_steps = [EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self)]
student_steps.each do |step|
you.observe step
end
assert ! you.failed?
end
def test_sensei_shows_beginning_progress
you = Sensei.new
student_steps = [EdgeCase::Koan.new(:student_fails_test, self),
EdgeCase::Koan.new(:student_fails_test, self),
EdgeCase::Koan.new(:student_fails_test, self),
EdgeCase::Koan.new(:student_fails_test, self),
EdgeCase::Koan.new(:student_fails_test, self)]
student_steps.each do |step|
you.observe step.meditate
end
instructions = you.instruct
assert_match "You have not yet reached enlightenment", instructions
assert_match "You have passed 0 steps", instructions
end
def test_sensei_shows_partial_progress
you = Sensei.new
student_steps = [EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_passes_test, self),
EdgeCase::Koan.new(:student_fails_test, self),
EdgeCase::Koan.new(:student_fails_test, self)]
student_steps.each do |step|
you.observe step.meditate
end
instructions = you.instruct
assert_match "You have not yet reached enlightenment", instructions
assert_match "You have passed 3 steps", instructions
end
def test_sensei_congratulates_student
you = Sensei.new
# run all of Ruby Koans with you as the sensei
EdgeCase::ThePath.new(you).walk
instructions = you.instruct
assert_match "The student has become the master", instructions
end
end

View File

@@ -53,7 +53,7 @@ class AboutSymbols < EdgeCase::Koan
assert_equal symbol, __("cats and dogs").to_sym
end
def test_symbols_with_spaces_can_be_built
def test_symbols_with_interpolation_can_be_built
value = "and"
symbol = :"cats #{value} dogs"

View File

@@ -93,16 +93,29 @@ module EdgeCase
end
def colorize(string, color_value)
if ENV['NO_COLOR']
string
else
if use_colors?
color(color_value) + string + color(COLORS[:clear])
else
string
end
end
def color(color_value)
"\e[#{color_value}m"
end
def use_colors?
return false if ENV['NO_COLOR']
if ENV['ANSI_COLOR'].nil?
! using_windows?
else
ENV['ANSI_COLOR'] =~ /^(t|y)/i
end
end
def using_windows?
File::ALT_SEPARATOR
end
end
class Sensei
@@ -124,10 +137,7 @@ module EdgeCase
@pass_count = 0
@failure = nil
@failed_test = nil
end
def observations
@observations ||= []
@observations = []
end
PROGRESS_FILE_NAME = '.path_progress'
@@ -157,13 +167,13 @@ module EdgeCase
if step.passed?
@pass_count += 1
if @pass_count > progress.last.to_i
observations << Color.green("#{step.koan_file}##{step.name} has expanded your awareness.")
@observations << Color.green("#{step.koan_file}##{step.name} has expanded your awareness.")
end
else
@failed_test = step
@failure = step.failure
add_progress(@pass_count)
observations << Color.red("#{step.koan_file}##{step.name} has damaged your karma.")
@observations << Color.red("#{step.koan_file}##{step.name} has damaged your karma.")
throw :edgecase_exit
end
end
@@ -178,7 +188,7 @@ module EdgeCase
def instruct
if failed?
observations.each{|c| puts c }
@observations.each{|c| puts c }
encourage
guide_through_error
a_zenlike_statement
@@ -206,23 +216,22 @@ module EdgeCase
end
def end_screen
screen = if EdgeCase.simple_output
end_message
if EdgeCase.simple_output
boring_end_screen
else
artistic_end_screen
end
puts screen
end
def end_message
"The student has become the master"
def boring_end_screen
puts "Mountains are again merely mountains"
end
def artistic_end_screen
"JRuby 1.9.x Koans"
ruby_version = "(in #{'J' if defined?(JRUBY_VERSION)}Ruby #{defined?(JRUBY_VERSION) ? JRUBY_VERSION : RUBY_VERSION})"
ruby_version = ruby_version.side_padding(54)
return <<-ENDTEXT
completed = <<-ENDTEXT
,, , ,,
: ::::, :::,
, ,,: :::::::::::::,, :::: : ,
@@ -233,7 +242,7 @@ module EdgeCase
,: , ,:,,: :::::::::::::
::,: ,,:::, ,::::::::::::,
,:::, :,,::: ::::::::::::,
,::: :::::::,#{ end_message.side_padding 48 },::::::::::::
,::: :::::::, Mountains are again merely mountains ,::::::::::::
:::,,,:::::: ::::::::::::
,:::::::::::, ::::::::::::,
:::::::::::, ,::::::::::::
@@ -257,6 +266,7 @@ module EdgeCase
,:::: , ,,
,,,
ENDTEXT
puts completed
end
def encourage
@@ -433,26 +443,21 @@ ENDTEXT
end
class ThePath
def initialize(sensei=nil)
@sensei = sensei || Sensei.new
end
def walk
sensei = EdgeCase::Sensei.new
each_step do |step|
@sensei.observe(step.meditate)
sensei.observe(step.meditate)
end
@sensei.instruct
sensei.instruct
end
def each_step
catch(:edgecase_exit) {
step_count = 0
EdgeCase::Koan.subclasses.each_with_index do |koan,koan_index|
if @sensei.instance_of?(EdgeCase::Sensei) || (koan.to_s != "AboutSensei")
koan.testmethods.each do |method_name|
step = koan.new(method_name, koan.to_s, koan_index+1, step_count+=1)
yield step
end
koan.testmethods.each do |method_name|
step = koan.new(method_name, koan.to_s, koan_index+1, step_count+=1)
yield step
end
end
}

View File

@@ -35,4 +35,3 @@ in_ruby_version("jruby") do
require 'about_java_interop'
end
require 'about_extra_credit'
require 'about_sensei'