spec/elo_spec.rb in elo-0.0.2.alpha vs spec/elo_spec.rb in elo-0.0.3.alpha

- old
+ new

@@ -1,7 +1,148 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper') describe "Elo" do - it "fails" do - fail "hey buddy, you should probably rename this file and start specing for real" + + after do + Elo.instance_eval { @config = nil } end + + it "should work as advertised" do + + bob = Elo::Player.new + jane = Elo::Player.new(:rating => 1500) + + game1 = bob.wins_from(jane) + game2 = bob.loses_from(jane) + game3 = bob.plays_draw(jane) + + game4 = bob.versus(jane) + game4.winner = jane + + game5 = bob.versus(jane) + game5.loser = jane + + game6 = bob.versus(jane) + game6.draw + + game7 = bob.versus(jane) + game7.result = 1 + + bob.rating.should == 1084 + jane.rating.should == 1409 + bob.should_not be_pro + bob.should be_starter + bob.games_played.should == 7 + bob.games.should == [ game1, game2, game3, game4, game5, game6, game7 ] + + Elo::Player.all.should == [ bob, jane ] + Elo::Game.all.should == [ game1, game2, game3, game4, game5, game6, game7 ] + + end + + describe "Configuration" do + + it "default_rating" do + Elo.config.default_rating.should == 1000 + Elo::Player.new.rating.should == 1000 + + Elo.config.default_rating = 1337 + + Elo.config.default_rating.should == 1337 + Elo::Player.new.rating.should == 1337 + end + + it "starter_boundry" do + Elo.config.starter_boundry.should == 30 + Elo::Player.new(:games_played => 20).should be_starter + + Elo.config.starter_boundry = 15 + + Elo.config.starter_boundry.should == 15 + Elo::Player.new(:games_played => 20).should_not be_starter + end + + it "default_k_factor and FIDE settings" do + Elo.config.use_FIDE_settings.should == true + Elo.config.default_k_factor.should == 15 + + Elo.config.default_k_factor = 20 + Elo.config.use_FIDE_settings = false + + Elo.config.default_k_factor.should == 20 + Elo.config.use_FIDE_settings.should == false + Elo::Player.new.k_factor.should == 20 + end + + it "pro_rating_boundry" do + Elo.config.pro_rating_boundry.should == 2400 + + Elo.config.pro_rating_boundry = 1337 + + Elo.config.pro_rating_boundry.should == 1337 + Elo::Player.new(:rating => 1337).should be_pro_rating + end + + end + + describe "according to FIDE" do + + it "starter" do + player = Elo::Player.new + player.k_factor.should == 25 + player.should be_starter + player.should_not be_pro + player.should_not be_pro_rating + end + + it "normal" do + player = Elo::Player.new(:rating => 2399, :games_played => 30) + player.k_factor.should == 15 + player.should_not be_starter + player.should_not be_pro + player.should_not be_pro_rating + end + + it "pro rating" do + player = Elo::Player.new(:rating => 2400) + player.k_factor.should == 10 + player.should be_starter + player.should be_pro_rating + player.should_not be_pro + end + + it "historically a pro" do + player = Elo::Player.new(:rating => 2399, :pro => true) + player.k_factor.should == 10 + player.should be_starter + player.should_not be_pro_rating + player.should be_pro + end + end + + describe "examples for calculating rating correctly" do + + # examples from http://chesselo.com/ + + before do + @a = Elo::Player.new(:rating => 2000, :k_factor => 10) + @b = Elo::Player.new(:rating => 1900, :k_factor => 10) + end + + it "winning" do + @a.wins_from(@b) + @a.rating.should == 2003 + end + + it "losing" do + @a.loses_from(@b) + @a.rating.should == 1993 + end + + it "draw" do + @a.plays_draw(@b) + @a.rating.should == 1998 + end + + end + end