2017-11-16 01:39:07 +00:00
|
|
|
defmodule GlickoTest do
|
2020-01-19 13:58:40 +00:00
|
|
|
use ExUnit.Case
|
|
|
|
|
|
|
|
alias Glicko.{
|
|
|
|
Player,
|
|
|
|
Result
|
|
|
|
}
|
|
|
|
|
|
|
|
doctest Glicko
|
|
|
|
|
|
|
|
@player [rating: 1500, rating_deviation: 200] |> Player.new_v1() |> Player.to_v2()
|
|
|
|
|
|
|
|
@results [
|
|
|
|
Result.new(Player.new_v1(rating: 1400, rating_deviation: 30), :win),
|
|
|
|
Result.new(Player.new_v1(rating: 1550, rating_deviation: 100), :loss),
|
|
|
|
Result.new(Player.new_v1(rating: 1700, rating_deviation: 300), :loss)
|
|
|
|
]
|
|
|
|
|
|
|
|
@valid_player_rating_after_results 1464.06 |> Player.scale_rating_to(:v2)
|
|
|
|
@valid_player_rating_deviation_after_results 151.52 |> Player.scale_rating_deviation_to(:v2)
|
|
|
|
@valid_player_volatility_after_results 0.05999
|
|
|
|
|
|
|
|
@valid_player_rating_deviation_after_no_results 200.2714
|
|
|
|
|> Player.scale_rating_deviation_to(:v2)
|
|
|
|
|
|
|
|
describe "new rating" do
|
|
|
|
test "with results" do
|
|
|
|
player = Glicko.new_rating(@player, @results, system_constant: 0.5)
|
|
|
|
|
|
|
|
assert_in_delta Player.rating(player), @valid_player_rating_after_results, 1.0e-4
|
|
|
|
|
|
|
|
assert_in_delta Player.rating_deviation(player),
|
|
|
|
@valid_player_rating_deviation_after_results,
|
|
|
|
1.0e-4
|
|
|
|
|
|
|
|
assert_in_delta Player.volatility(player), @valid_player_volatility_after_results, 1.0e-5
|
|
|
|
end
|
|
|
|
|
|
|
|
test "no results" do
|
|
|
|
player = Glicko.new_rating(@player, [])
|
|
|
|
|
|
|
|
assert_in_delta Player.rating_deviation(player),
|
|
|
|
@valid_player_rating_deviation_after_no_results,
|
|
|
|
1.0e-4
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "win probability" do
|
|
|
|
test "with same ratings" do
|
|
|
|
assert Glicko.win_probability(Player.new_v1(), Player.new_v1()) == 0.5
|
|
|
|
end
|
|
|
|
|
|
|
|
test "with better opponent" do
|
|
|
|
assert Glicko.win_probability(Player.new_v1(rating: 1500), Player.new_v1(rating: 1600)) <
|
|
|
|
0.5
|
|
|
|
end
|
|
|
|
|
|
|
|
test "with better player" do
|
|
|
|
assert Glicko.win_probability(Player.new_v1(rating: 1600), Player.new_v1(rating: 1500)) >
|
|
|
|
0.5
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "draw probability" do
|
|
|
|
test "with same ratings" do
|
|
|
|
assert Glicko.draw_probability(Player.new_v1(), Player.new_v1()) == 1
|
|
|
|
end
|
|
|
|
|
|
|
|
test "with better opponent" do
|
|
|
|
assert Glicko.draw_probability(Player.new_v1(rating: 1500), Player.new_v1(rating: 1600)) < 1
|
|
|
|
end
|
|
|
|
|
|
|
|
test "with better player" do
|
|
|
|
assert Glicko.draw_probability(Player.new_v1(rating: 1600), Player.new_v1(rating: 1500)) < 1
|
|
|
|
end
|
|
|
|
end
|
2017-11-16 01:39:07 +00:00
|
|
|
end
|