X-Git-Url: http://git.sourceforge.jp/view?p=shogi-server%2Fshogi-server.git;a=blobdiff_plain;f=test%2FTC_floodgate.rb;h=31a2b17e6cc8a662f485d2f94a60db447748f1f3;hp=69cf8e7d0e3f56ad3f888060c048587dcd6e3b11;hb=893e6e974a00a76cab6a22bcfb45ef8bd0d1e05f;hpb=91e020063da8134f90a8a88c35f70d077330a216 diff --git a/test/TC_floodgate.rb b/test/TC_floodgate.rb index 69cf8e7..31a2b17 100644 --- a/test/TC_floodgate.rb +++ b/test/TC_floodgate.rb @@ -1,20 +1,39 @@ +$:.unshift File.join(File.dirname(__FILE__), "..") require 'test/unit' -load '../shogi-server/shogi-server' -require '../shogi-server/pairing' +require 'shogi_server' +require 'shogi_server/player' +require 'shogi_server/pairing' +require 'shogi_server/league/floodgate' + +$topdir = File.expand_path File.dirname(__FILE__) class MockLogger def debug(str) + #puts str end def info(str) - # puts str + #puts str end def warn(str) + puts str end def error(str) + puts str end end $logger = MockLogger.new +def log_message(msg) + $logger.info(msg) +end + +def log_warning(msg) + $logger.warn(msg) +end + +def log_error(msg) + $logger.error(msg) +end class TestFloodgate < Test::Unit::TestCase def setup @@ -33,9 +52,9 @@ class TestFloodgate < Test::Unit::TestCase end -class TestPairing < Test::Unit::TestCase +class TestDeleteMostPlayingPlayer < Test::Unit::TestCase def setup - @pairing= ShogiServer::Pairing.new + @pairing= ShogiServer::DeleteMostPlayingPlayer.new @a = ShogiServer::BasicPlayer.new @a.win = 1 @a.loss = 2 @@ -50,147 +69,154 @@ class TestPairing < Test::Unit::TestCase @c.rate = 1000 end - def test_delete_most_playing_player + def test_match players = [@a, @b, @c] - @pairing.delete_most_playing_player(players) + @pairing.match(players) assert_equal([@a,@b], players) end +end + +class TestMakeEven < Test::Unit::TestCase + def setup + srand(10) + @pairing= ShogiServer::MakeEven.new + @a = ShogiServer::BasicPlayer.new + @a.name = "a" + @a.win = 1 + @a.loss = 2 + @a.rate = 0 + @b = ShogiServer::BasicPlayer.new + @b.name = "b" + @b.win = 10 + @b.loss = 20 + @b.rate = 1500 + @c = ShogiServer::BasicPlayer.new + @c.name = "c" + @c.win = 100 + @c.loss = 200 + @c.rate = 1000 + end + + def test_match_even + players = [@a, @b] + @pairing.match(players) + assert_equal([@a,@b], players) + end - def test_delete_least_rate_player + def test_match_odd players = [@a, @b, @c] - @pairing.delete_least_rate_player(players) - assert_equal([@b,@c], players) + @pairing.match(players) + assert_equal([@a, @b], players) end end -class TestRandomPairing < Test::Unit::TestCase +class TestLeastRatePlayer < Test::Unit::TestCase def setup - @pairing= ShogiServer::RandomPairing.new - $called = 0 - def @pairing.start_game(p1,p2) - $called += 1 - end + @pairing= ShogiServer::DeleteLeastRatePlayer.new @a = ShogiServer::BasicPlayer.new @a.win = 1 @a.loss = 2 + @a.rate = 0 @b = ShogiServer::BasicPlayer.new @b.win = 10 @b.loss = 20 + @b.rate = 1500 @c = ShogiServer::BasicPlayer.new @c.win = 100 @c.loss = 200 + @c.rate = 1000 end - def test_random_match_1 - players = [@a] + def test_match + players = [@a, @b, @c] @pairing.match(players) - assert_equal(0, $called) + assert_equal([@b,@c], players) end +end - def test_random_match_2 - players = [@a,@b] - @pairing.match(players) - assert_equal(1, $called) +class TestRandomize < Test::Unit::TestCase + def setup + srand(10) # makes the random number generator determistic + @pairing = ShogiServer::Randomize.new + @a = ShogiServer::BasicPlayer.new + @a.name = "a" + @a.win = 1 + @a.loss = 2 + @b = ShogiServer::BasicPlayer.new + @b.name = "b" + @b.win = 10 + @b.loss = 20 + @c = ShogiServer::BasicPlayer.new + @c.name = "c" + @c.win = 100 + @c.loss = 200 end - - def test_random_match_3 + + def test_match players = [@a, @b, @c] @pairing.match(players) - assert_equal(1, $called) + assert_equal([@b,@a,@c], players) end end -class TestSwissPairing < Test::Unit::TestCase +class TestSortByRate < Test::Unit::TestCase def setup - @pairing= ShogiServer::SwissPairing.new - $pairs = [] - def @pairing.start_game(p1,p2) - $pairs << [p1,p2] - end + @pairing = ShogiServer::SortByRate.new @a = ShogiServer::BasicPlayer.new @a.name = "a" @a.win = 1 @a.loss = 2 - @a.rate = 0 - @a.last_game_win = false + @a.rate = 1500 @b = ShogiServer::BasicPlayer.new @b.name = "b" @b.win = 10 @b.loss = 20 - @b.rate = 1500 - @b.last_game_win = true + @b.rate = 2000 @c = ShogiServer::BasicPlayer.new @c.name = "c" @c.win = 100 @c.loss = 200 - @c.rate = 1000 - @c.last_game_win = true - @d = ShogiServer::BasicPlayer.new - @d.name = "d" - @d.win = 1000 - @d.loss = 2000 - @d.rate = 1800 - @d.last_game_win = true + @c.rate = 700 end - def sort(players) - return players.sort{|a,b| a.name <=> b.name} + def test_match + players = [@a, @b, @c] + @pairing.match(players) + assert_equal([@c,@a,@b], players) end +end - def test_include_newbie - assert(@pairing.include_newbie?([@a])) - assert(!@pairing.include_newbie?([@b])) - assert(@pairing.include_newbie?([@b,@a])) - assert(!@pairing.include_newbie?([@b,@c])) +class TestSortByRateWithRandomness < Test::Unit::TestCase + def setup + srand(10) # makes the random number generator determistic + @pairing = ShogiServer::SortByRateWithRandomness.new(1200, 2400) + @a = ShogiServer::BasicPlayer.new + @a.name = "a" + @a.win = 1 + @a.loss = 2 + @a.rate = 1500 + @b = ShogiServer::BasicPlayer.new + @b.name = "b" + @b.win = 10 + @b.loss = 20 + @b.rate = 2000 + @c = ShogiServer::BasicPlayer.new + @c.name = "c" + @c.win = 100 + @c.loss = 200 + @c.rate = 700 end - def test_match_1 - @pairing.match([@a]) - assert_equal(0, $pairs.size) - end - - def test_match_2 - @pairing.match([@b]) - assert_equal(0, $pairs.size) - end - - def test_match_3 - @pairing.match([@a,@b]) - assert_equal(1, $pairs.size) - assert_equal(sort([@a,@b]), sort($pairs.first)) - end - - def test_match_4 - @pairing.match([@c,@b]) - assert_equal(1, $pairs.size) - assert_equal(sort([@b,@c]), sort($pairs.first)) - end - - def test_match_5 - @pairing.match([@c,@b,@a]) - assert_equal(1, $pairs.size) - assert_equal(sort([@b,@c]), sort($pairs.first)) - end - - def test_match_6 - @pairing.match([@c,@b,@a,@d]) - assert_equal(2, $pairs.size) - assert_equal(sort([@b,@d]), sort($pairs.first)) - assert_equal(sort([@a,@c]), sort($pairs.last)) + def test_match + players = [@a, @b, @c] + @pairing.match(players) + assert_equal([@c,@b,@a], players) end end class TestExcludeSacrifice < Test::Unit::TestCase - class Dummy - attr_reader :players - def match(players) - @players = players - end - end - def setup - @dummy = Dummy.new - @obj = ShogiServer::ExcludeSacrifice.new(@dummy) + @obj = ShogiServer::ExcludeSacrificeGps500.new @a = ShogiServer::BasicPlayer.new @a.player_id = "a" @a.name = "a" @@ -200,7 +226,7 @@ class TestExcludeSacrifice < Test::Unit::TestCase @a.last_game_win = false @b = ShogiServer::BasicPlayer.new @b.player_id = "gps500+e293220e3f8a3e59f79f6b0efffaa931" - @b.name = "b" + @b.name = "gps500" @b.win = 10 @b.loss = 20 @b.rate = 1500 @@ -215,28 +241,179 @@ class TestExcludeSacrifice < Test::Unit::TestCase end def test_match_1 - @obj.match([@a]) - assert_equal(1, @dummy.players.size) + players = [@a] + @obj.match(players) + assert_equal([@a], players) end def test_match_2 - @obj.match([@b]) - assert_equal(0, @dummy.players.size) + players = [@b] + @obj.match(players) + assert_equal([], players) end def test_match_3 - @obj.match([@a, @b]) - assert_equal(2, @dummy.players.size) + players = [@a, @b] + @obj.match(players) + assert_equal([@a,@b], players) end def test_match_4 - @obj.match([@a, @b, @c]) - assert_equal(2, @dummy.players.size) + players = [@a, @b, @c] + @obj.match(players) + assert_equal([@a, @c], players) end def test_match_5 - @obj.match([@a, @c]) - assert_equal(2, @dummy.players.size) + players = [@a, @c] + @obj.match(players) + assert_equal([@a,@c], players) end end +class TestSwissPairing < Test::Unit::TestCase + def setup + srand(10) + @a = ShogiServer::BasicPlayer.new + @a.player_id = "a" + @a.rate = 0 + @a.game_name = "floodgate-900-0" + @b = ShogiServer::BasicPlayer.new + @b.player_id = "b" + @b.rate = 1000 + @b.game_name = "floodgate-900-0" + @c = ShogiServer::BasicPlayer.new + @c.player_id = "c" + @c.rate = 1500 + @c.game_name = "floodgate-900-0" + @d = ShogiServer::BasicPlayer.new + @d.player_id = "d" + @d.rate = 2000 + @d.game_name = "floodgate-900-0" + + @players = [@a, @b, @c, @d] + + @file = Pathname.new(File.join(File.dirname(__FILE__), "floodgate_history_900_0.yaml")) + @history = ShogiServer::League::Floodgate::History.factory @file + + @swiss = ShogiServer::Swiss.new + end + + def teardown + @file.delete if @file.exist? + end + + def test_none + players = [] + @swiss.match players + assert(players.empty?) + end + + def test_all_win + ShogiServer::League::Floodgate::History.class_eval do + def last_win?(player_id) + true + end + end + @swiss.match @players + assert_equal([@d, @c, @b, @a], @players) + end + + def test_all_lose + ShogiServer::League::Floodgate::History.class_eval do + def last_win?(player_id) + false + end + end + @swiss.match @players + assert_equal([@d, @c, @b, @a], @players) + end + + def test_one_win + ShogiServer::League::Floodgate::History.class_eval do + def last_win?(player_id) + if player_id == "a" + true + else + false + end + end + end + @swiss.match @players + assert_equal([@a, @d, @c, @b], @players) + end + + def test_two_win + ShogiServer::League::Floodgate::History.class_eval do + def last_win?(player_id) + if player_id == "a" || player_id == "d" + true + else + false + end + end + end + @swiss.match @players + assert_equal([@d, @a, @c, @b], @players) + end +end + +class TestFloodgateHistory < Test::Unit::TestCase + def setup + @file = Pathname.new(File.join(File.dirname(__FILE__), "floodgate_history.yaml")) + @history = ShogiServer::League::Floodgate::History.new @file + end + + def teardown + @file.delete if @file.exist? + end + + def test_new + file = Pathname.new(File.join(File.dirname(__FILE__), "hoge.yaml")) + history = ShogiServer::League::Floodgate::History.new file + history.save + assert file.exist? + file.delete if file.exist? + end + + def test_update + dummy = nil + def @history.make_record(game_result) + {:game_id => "wdoor+floodgate-900-0-hoge-foo-1", + :black => "hoge", :white => "foo", + :winner => "foo", :loser => "hoge"} + end + @history.update(dummy) + + def @history.make_record(game_result) + {:game_id => "wdoor+floodgate-900-0-hoge-foo-2", + :black => "hoge", :white => "foo", + :winner => "hoge", :loser => "foo"} + end + @history.update(dummy) + + def @history.make_record(game_result) + {:game_id => "wdoor+floodgate-900-0-hoge-foo-3", + :black => "hoge", :white => "foo", + :winner => nil, :loser => nil} + end + @history.update(dummy) + + @history.load + assert_equal 3, @history.records.size + assert_equal "wdoor+floodgate-900-0-hoge-foo-1", @history.records[0][:game_id] + assert_equal "wdoor+floodgate-900-0-hoge-foo-2", @history.records[1][:game_id] + assert_equal "wdoor+floodgate-900-0-hoge-foo-3", @history.records[2][:game_id] + assert_equal "hoge", @history.records[1][:black] + assert_equal "foo", @history.records[1][:white] + assert_equal "hoge", @history.records[1][:winner] + assert_equal "foo", @history.records[1][:loser] + + assert @history.last_win? "hoge" + assert !@history.last_win?("foo") + assert !@history.last_lose?("hoge") + assert @history.last_lose?("foo") + end +end + +