From d27004c70da4cf38fa82104b95bdc7b440d3863b Mon Sep 17 00:00:00 2001 From: Marc Peabody Date: Sun, 3 Oct 2010 13:32:44 -0400 Subject: [PATCH] about_sensei finale for closure to koans exercises --- koans/about_sensei.rb | 118 +++++++++++++++++++++++++++ koans/edgecase.rb | 42 ++++++---- koans/path_to_enlightenment.rb | 1 + src/about_sensei.rb | 141 +++++++++++++++++++++++++++++++++ src/edgecase.rb | 42 ++++++---- src/path_to_enlightenment.rb | 1 + 6 files changed, 311 insertions(+), 34 deletions(-) create mode 100644 koans/about_sensei.rb create mode 100644 src/about_sensei.rb diff --git a/koans/about_sensei.rb b/koans/about_sensei.rb new file mode 100644 index 0000000..0424f65 --- /dev/null +++ b/koans/about_sensei.rb @@ -0,0 +1,118 @@ +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 diff --git a/koans/edgecase.rb b/koans/edgecase.rb index 658da2e..95d9a5f 100644 --- a/koans/edgecase.rb +++ b/koans/edgecase.rb @@ -124,7 +124,10 @@ module EdgeCase @pass_count = 0 @failure = nil @failed_test = nil - @observations = [] + end + + def observations + @observations ||= [] end PROGRESS_FILE_NAME = '.path_progress' @@ -154,13 +157,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 @@ -175,7 +178,7 @@ module EdgeCase def instruct if failed? - @observations.each{|c| puts c } + observations.each{|c| puts c } encourage guide_through_error a_zenlike_statement @@ -203,22 +206,23 @@ module EdgeCase end def end_screen - if EdgeCase.simple_output - boring_end_screen + screen = if EdgeCase.simple_output + end_message else artistic_end_screen end + puts screen end - def boring_end_screen - puts "Mountains are again merely mountains" + def end_message + "The student has become the master" 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) - completed = <<-ENDTEXT + return <<-ENDTEXT ,, , ,, : ::::, :::, , ,,: :::::::::::::,, :::: : , @@ -229,7 +233,7 @@ module EdgeCase ,: , ,:,,: ::::::::::::: ::,: ,,:::, ,::::::::::::, ,:::, :,,::: ::::::::::::, - ,::: :::::::, Mountains are again merely mountains ,:::::::::::: + ,::: :::::::,#{ end_message.side_padding 48 },:::::::::::: :::,,,:::::: :::::::::::: ,:::::::::::, ::::::::::::, :::::::::::, ,:::::::::::: @@ -253,7 +257,6 @@ module EdgeCase ,:::: , ,, ,,, ENDTEXT - puts completed end def encourage @@ -430,21 +433,26 @@ 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| - koan.testmethods.each do |method_name| - step = koan.new(method_name, koan.to_s, koan_index+1, step_count+=1) - yield step + 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 end end } diff --git a/koans/path_to_enlightenment.rb b/koans/path_to_enlightenment.rb index 641559a..f751368 100644 --- a/koans/path_to_enlightenment.rb +++ b/koans/path_to_enlightenment.rb @@ -35,3 +35,4 @@ in_ruby_version("jruby") do require 'about_java_interop' end require 'about_extra_credit' +require 'about_sensei' diff --git a/src/about_sensei.rb b/src/about_sensei.rb new file mode 100644 index 0000000..a7f7ba0 --- /dev/null +++ b/src/about_sensei.rb @@ -0,0 +1,141 @@ +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 diff --git a/src/edgecase.rb b/src/edgecase.rb index 658da2e..95d9a5f 100644 --- a/src/edgecase.rb +++ b/src/edgecase.rb @@ -124,7 +124,10 @@ module EdgeCase @pass_count = 0 @failure = nil @failed_test = nil - @observations = [] + end + + def observations + @observations ||= [] end PROGRESS_FILE_NAME = '.path_progress' @@ -154,13 +157,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 @@ -175,7 +178,7 @@ module EdgeCase def instruct if failed? - @observations.each{|c| puts c } + observations.each{|c| puts c } encourage guide_through_error a_zenlike_statement @@ -203,22 +206,23 @@ module EdgeCase end def end_screen - if EdgeCase.simple_output - boring_end_screen + screen = if EdgeCase.simple_output + end_message else artistic_end_screen end + puts screen end - def boring_end_screen - puts "Mountains are again merely mountains" + def end_message + "The student has become the master" 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) - completed = <<-ENDTEXT + return <<-ENDTEXT ,, , ,, : ::::, :::, , ,,: :::::::::::::,, :::: : , @@ -229,7 +233,7 @@ module EdgeCase ,: , ,:,,: ::::::::::::: ::,: ,,:::, ,::::::::::::, ,:::, :,,::: ::::::::::::, - ,::: :::::::, Mountains are again merely mountains ,:::::::::::: + ,::: :::::::,#{ end_message.side_padding 48 },:::::::::::: :::,,,:::::: :::::::::::: ,:::::::::::, ::::::::::::, :::::::::::, ,:::::::::::: @@ -253,7 +257,6 @@ module EdgeCase ,:::: , ,, ,,, ENDTEXT - puts completed end def encourage @@ -430,21 +433,26 @@ 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| - koan.testmethods.each do |method_name| - step = koan.new(method_name, koan.to_s, koan_index+1, step_count+=1) - yield step + 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 end end } diff --git a/src/path_to_enlightenment.rb b/src/path_to_enlightenment.rb index 641559a..f751368 100644 --- a/src/path_to_enlightenment.rb +++ b/src/path_to_enlightenment.rb @@ -35,3 +35,4 @@ in_ruby_version("jruby") do require 'about_java_interop' end require 'about_extra_credit' +require 'about_sensei'