【テストプログラム3】
完成形
(janken2.rb)
# 判定部分のみをクラスに。 PLAYER_INPUT_TO_INTEGER = {'g'=> 1 ,'c' => 2 ,'p' => 3 } MACHINE_INTEGER_TO_INPUT = { 0 => "g" , 1 => "c", 2 => "p"} MACHINE_LIST_JANKEN = ["g","c","p"] GCP_TO_JAPANESE = {'g'=>'グー','c' => 'チョキ','p'=>'パー'} puts "input g or p or c" print "you:" player_gcp = gets.chomp machine_gcp = MACHINE_LIST_JANKEN[rand(3)] class Judge def judgement(player_gcp,machine_gcp) # p @player_gcp player_123 = PLAYER_INPUT_TO_INTEGER[player_gcp] machine_012 = MACHINE_INTEGER_TO_INPUT.invert[machine_gcp] result = (player_123 - machine_012 +3)% 3 case result when 0 return "勝ち" when 1 return "あいこ" when 2 return "負け" end end end judge = Judge.new puts "あなたは#{GCP_TO_JAPANESE[player_gcp]}、私は#{GCP_TO_JAPANESE[machine_gcp]}、" unless judge.judgement(player_gcp,machine_gcp)=="あいこ" print "あなたの" end puts "#{judge.judgement(player_gcp,machine_gcp)}です。"
(test_janken2.rb)
require 'test/unit' require_relative 'janken2' class TC_janken < Test::Unit::TestCase def setup @judge = Judge.new end # def teardown # end def test_janken1 assert_equal("勝ち",@judge.judgement("g","c")) assert_equal("あいこ",@judge.judgement("g","g")) assert_equal("負け",@judge.judgement("g","p")) assert_equal("勝ち",@judge.judgement("c","p")) assert_equal("あいこ",@judge.judgement("c","c")) assert_equal("負け",@judge.judgement("c","g")) assert_equal("勝ち",@judge.judgement("p","g")) assert_equal("あいこ",@judge.judgement("p","p")) assert_equal("負け",@judge.judgement("p","c")) end end
Finished in 0.00094 seconds. ------------------------------------------------------------------------------------------------- 1 tests, 9 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications 100% passed ------------------------------------------------------------------------------------------------- 1063.83 tests/s, 9574.47 assertions/s
エラーfailureなし。
やったこと
メソッドの数だけテストが必要になるから、共通機能は1つのメソッドにまとめた。 具体的にはg/c/p から数字に変換するメソッドを判定のクラスに組み込んだ。 その際に、machineとplayerのじゃんけんの出し手の処理処理が異なったっため、一致させた。
クラスに変数を渡そうとして試行錯誤していたが、クラス直下にメソッドを作成し、そのメソッドに引数を渡すものとした。
直接testを行う部分の記述は複雑な処理を書かずに人間に見てわかりやすいものとした。
クラス内のメソッドで参照するハッシュは定数CONSTとした。
判定部分のクラスと出力は分離した。 クラスの戻り値を受け取って出力するものとした。
謎のend_of_inputエラー。classがcalssになってた。