require 'spec_helper'

describe MashTournamentBuilder do
  let(ENV['MOCK'].nil? ? :subject : :real_subject) do
    MashTournamentBuilder.new(
      MashTournament.make(:requester => Requester.make),
      MashTournament, MashTournamentRound, Map, Mash
    )
  end

  let(ENV['MOCK'].nil? ? :mock_subject : :subject) do
    @tournament = mock(Object)
    @tournament_model = mock(Object)
    @round_model = mock(Object)
    @map_model = mock(Object)
    @mash_model = mock(Object)

    MashTournamentBuilder.new(
      @tournament, @tournament_model,
      @round_model, @map_model, @mash_model
    )
  end

  before(:all) do
    subject.map_model.destroy_all
    40.times do
      subject.map_model.make.save
    end
  end

  context 'creating rounds' do
    it 'should reject invalid numbers of contenders' do
      [11, 24, 40].each do |n|
        expect do
          subject.create_rounds_for_contenders(n)
        end.to raise_error
      end
    end

    [[8, 3], [16, 4], [32, 5]].each do |n_contenders,n_rounds|
      context "for #{n_contenders} total contenders" do
        it "should create #{n_rounds} rounds" do
          subject.create_rounds_for_contenders(n_contenders)
          subject.tournament.total_rounds.should == n_rounds
        end
      end
    end
  end

  context 'filling in rounds' do
    before(:each) do
      subject.tournament.id.should_not be_nil
      subject.create_rounds_for_contenders(8)
    end

    it 'should fill in every map for every mash in a given round' do
      subject.fill_in_next_round
      subject.tournament.round(1).mashes.each do |mash|
        mash.map_a.should_not be_nil
        mash.map_b.should_not be_nil
      end
    end
  end
end
