Report abuse


			
require 'rubygems'
require 'spec'

$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__),'../lib')))
require 'pairs'

describe Pair do
  before do
    @pair = Pair.new('David', 'Helen')
  end
  it 'should define == operator' do
    (@pair == Pair.new('David', 'Helen')).should be_true
    (@pair == Pair.new('Helen', 'David')).should be_true
  end
  it 'should include player David' do
    @pair.include?('David').should be_true
  end
  it 'should include player Helen' do
    @pair.include?('Helen').should be_true
  end
end

describe Scheme do
  before do
    @players = ['David', 'Helen', 'Vicky', 'Joseph']
    @pairs = [
              Pair.new('David', 'Helen', 0),
              Pair.new('David', 'Vicky', 1),
              Pair.new('David', 'Joseph', 8),
              Pair.new('Helen', 'Vicky', 2),
              Pair.new('Helen', 'Joseph', 5),
              Pair.new('Vicky', 'Joseph', 4),
             ]
    @scheme = Scheme.new(@players, @pairs)
  end
  it 'should generate pairing starting from given pair' do
    @scheme.pair_off(Pair.new('David', 'Helen')).pairings.should == [
                                                                     Pair.new('David','Helen'),
                                                                     Pair.new('Joseph', 'Vicky')
                                                                    ]
    @scheme.pair_off(Pair.new('David', 'Vicky')).pairings.should == [
                                                                     Pair.new('David','Vicky'),
                                                                     Pair.new('Joseph', 'Helen')
                                                                    ]
  end
  it 'should calculate its score' do
    @scheme.pair_off(Pair.new('David', 'Helen')).score.should == 4
    @scheme.pair_off(Pair.new('David', 'Vicky')).score.should == 5
  end
  it 'should compare with other scheme' do
    @scheme.pair_off(Pair.new('David', 'Helen')).should < Scheme.new(@players, @pairs).pair_off(Pair.new('David', 'Vicky'))
  end
  describe ' when an odd number of players is given' do
    before do
      @players = ['David', 'Helen', 'Vicky', 'Joseph', 'Gail']
      @pairs = [
                Pair.new('David', 'Helen', 0),
                Pair.new('David', 'Vicky', 1),
                Pair.new('David', 'Joseph', 8),
                Pair.new('David', 'Gail', 9),
                Pair.new('Helen', 'Vicky', 2),
                Pair.new('Helen', 'Joseph', 5),
                Pair.new('Helen', 'Gail', 6),
                Pair.new('Vicky', 'Joseph', 4),
                Pair.new('Vicky', 'Gail', 8),
                Pair.new('Joseph', 'Gail', 4),
               ]
      @scheme = Scheme.new(@players, @pairs)
    end
    it 'should left out one player' do
      @scheme.pair_off(Pair.new('David', 'Helen')).left_out.should == ['Gail']      
    end
  end
end

describe SchemeGenerator do
  before do
    @preferences = { 
      'David' => ['Helen', 'Vicky', 'Joseph'],
      'Helen' => ['David', 'Vicky', 'Joseph'],
      'Joseph' => ['Vicky', 'Helen', 'David'],
      'Vicky' => ['Joseph', 'Helen', 'David']
    }    
    @scheme_generator = SchemeGenerator.new(@preferences)
  end
  it 'should collect players' do
    @scheme_generator.players.should == ['Helen', 'Vicky', 'Joseph', 'David']
  end
  it 'should generate all possible pairs' do
    @scheme_generator.pairs.should == [
                             Pair.new('David', 'Helen'),
                             Pair.new('David', 'Vicky'),
                             Pair.new('David', 'Joseph'),
                             Pair.new('Joseph', 'Helen'),
                             Pair.new('Joseph', 'Vicky'),
                             Pair.new('Vicky', 'Helen'),
                            ]
  end
  it 'should calculate score for a given pair' do
    @scheme_generator.pair_score('David', 'Helen').should == 0
  end
  it 'should generate two schemes' do
    @scheme_generator.pair_off.size.should == 2
  end
  it 'should find scheme with optimal pairing (minimum score)' do
    @scheme_generator.pair_off.min.pairings.should == [Pair.new('David', 'Helen'), Pair.new('Joseph', 'Vicky')]
  end
end