麻雀スクリプトのテストコード


rubyで麻雀の待ちを出力 - うんたらかんたら日記
privateメソッドのテスト - うんたらかんたら日記

テストコード

書いてみた。

#spec/majang_spec.rb
require File.expand_path(File.dirname(__FILE__) + '/../majang.rb')

describe Majang do
  before do
    @m = Majang.new
  end

  describe "待ち無し1112224788899" do
    before { @m.mati("1112224788899") }
    subject { @m.tenpai}
    it { should have(:no).item }
  end
  describe "1112224588899" do
    before { @m.mati("1112224588899") }
    subject { @m.tenpai}
    it { should have(1).item }
    it { should == ["(111)(222)(888)(99)[45]"] }
  end
  describe "1112223335559" do
    before { @m.mati("1112223335559") }
    subject { @m.tenpai}
    it { should have(2).items }
    it { should include("(111)(222)(333)(555)[9]") }
    it { should include("(123)(123)(123)(555)[9]") }
  end
  describe "1223344888999" do
    before { @m.mati("1223344888999") }
    subject { @m.tenpai}
    it { should have(3).items }
    it { should include("(123)(234)(888)(999)[4]") }
    it { should include("(123)(44)(888)(999)[23]") }
    it { should include("(234)(234)(888)(999)[1]") }
  end
  describe "1112345678999" do
    before { @m.mati("1112345678999") }
    subject { @m.tenpai}
    it { should have(11).items }
    it { should include("(111)(234)(567)(99)[89]") }
    it { should include("(111)(234)(678)(999)[5]") }
    it { should include("(111)(234)(789)(99)[56]") }
    it { should include("(111)(234)(567)(999)[8]") }
    it { should include("(111)(345)(678)(999)[2]") }
    it { should include("(111)(456)(789)(99)[23]") }
    it { should include("(11)(123)(456)(789)[99]") }
    it { should include("(123)(456)(789)(99)[11]") }
    it { should include("(123)(456)(789)(99)[11]") }
    it { should include("(11)(123)(678)(999)[45]") }
    it { should include("(11)(345)(678)(999)[12]") }
  end


  # private methods
  describe ":format_tenpai" do
    context '["123", "456"],["78"]' do
      it { @m.send(:format_tenapi, ["123","456"], ["78"]).should == "(123)(456)[78]" }
    end
  end

  describe ":all_same?" do
    context "要素が0個の場合" do
      it { be_all_same?([]) }
    end
    context "素が1個の場合" do
      it { be_all_same?(["1"]) }
    end
    context "全ての要素が同じ場合" do
      it { be_all_same?(["1", "1", "1"]) }
    end
    context "異なる要素が存在する場合" do
      it { not be_all_same?(["1", "2", "1"]) }
    end
  end

  describe ":tenpai?" do
    before do
      #tenpai?の中で呼んでいるappend_tenpaiで<<がエラーとなるため、stubを作成
      @m.stub!(:append_tenpai)
    end
    #単騎待ちは考慮しない
    context '両面待ちの場合["1", "1", "2", "3"]' do
      it { be_tenpai?(["1", "1", "2", "3"]) }
    end
    context 'カンチャン待ちの場合["1", "1", "4", "6"]' do
      it { be_tenpai?(["1", "1", "4", "6"]) }
    end
    context 'ペンチャン待ちの場合["1", "1", "8", "9"]' do
      it { be_tenpai?(["1", "1", "8", "9"]) }
    end
    context 'シャンポン待ちの場合["1", "1", "2", "2"]' do
      it { be_tenpai?(["1", "1", "2", "2"]) }
    end
    context '待ちなし場合["1", "1", "2", "5"]' do
      it { not be_tenpai?(["1", "1", "2", "5"]) }
    end
  end

  describe ":mati?" do
    context '要素が差が0の場合["1", "1"]' do
      it { be_mati?(["1", "1"]) }
    end
    context '要素が差が1の場合["1", "2"]' do
      it { be_mati?(["1", "2"]) }
    end
    context '要素が差が2の場合["1", "3"]' do
      it { be_mati?(["1", "3"]) }
    end
    context '要素が差が3の場合["1", "4"]' do
      it { not be_mati?(["1", "4"]) }
    end
  end

  describe ":candidates" do
    context '順子が存在しない場合["1","1","2"]' do
      it { do_candidates(["1","1","2"]).should == [] }
    end
    context '刻子が存在する場合["1","1","1","2"]' do
      it { do_candidates(["1","1","1","2"]).should == ["111"] }
    end
    context '刻子と順子が存在する場合["1","1","1","2","2","2","3","3","3"]' do
      it { do_candidates(["1","1","1","2","2","2","3","3","3"]).should == ["111","222","333","123"].sort }
    end
  end

  private
  def all_same?(arg)
    @m.send(:all_same?, arg)
  end
  def tenpai?(arg)
    @m.send(:tenpai?, arg, [])
  end
  def mati?(arg)
    @m.send(:mati?, arg)
  end
  def do_candidates(arg)
    @m.send(:candidates, arg)
  end
end

describe Array do
  context "重複要素を引いた場合" do
    it "1つのみ削除されること" do
      ["1", "1", "2"].minus(["1"]).should == ["1","2"]
    end
  end
  context "複数要素を引いた場合" do
    it "正しく引き算されること" do
      ["1", "1", "2","3"].minus(["1","2"]).should == ["1","3"]
    end
  end
  context "引き算対象のデータが無い場合" do
    it "selfが返却されること" do
      ["1", "2", "3"].minus(["4"]).should == ["1","2","3"]
    end
  end
end

もう少し何かすればきれいになるような気がするが。

gist: 764900 - GitHub