• R/O
  • HTTP
  • SSH
  • HTTPS

shogi-server:

shogi-server source


File Info

Rev. b4af8394df436d7b273c27d245465efe3f1e51ed
Size 17,896 bytes
Time 2020-12-06 18:37:55
Author Daigo Moriwaki
Log Message

[shogi-server] Bump up the revision to 20201206

Content

$:.unshift File.join(File.dirname(__FILE__), "..")
require 'test/unit'
require 'shogi_server'
require 'shogi_server/league.rb'
require 'shogi_server/player'
require 'shogi_server/pairing'
require 'test/mock_log_message'

def same_pair?(a, b)
  unless a.size == 2 && b.size == 2
    return false
  end

  return true if [a.first, a.last] == b || [a.last, a.first] == b
end

class TestPairing < Test::Unit::TestCase  
  def setup
    @pairing= ShogiServer::Pairing.new
    $pairs = []
    def @pairing.start_game(p1,p2)
      $pairs << [p1,p2]
    end
    @a = ShogiServer::BasicPlayer.new
    @a.name = "a"
    @a.win  = 1
    @a.loss = 2
    @a.rate = 0
    @a.last_game_win = false
    @b = ShogiServer::BasicPlayer.new
    @b.name = "b"
    @b.win  = 10
    @b.loss = 20
    @b.rate = 1500
    @b.last_game_win = true
    @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
  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]))
  end
end

class TestStartGame < Test::Unit::TestCase
  def setup
    @pairing= ShogiServer::StartGame.new
    $called = 0
    def @pairing.start_game(p1,p2)
      $called += 1
    end
    @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
    @d = ShogiServer::BasicPlayer.new
    @d.name = "d"
    @d.win  = 1000
    @d.loss = 2000
    @d.rate = 2000
  end

  def test_match_two_players
    players = [@a,@b]
    @pairing.match(players)
    assert_equal(1, $called)
  end

  def test_match_one_player
    players = [@a]
    @pairing.match(players)
    assert_equal(0, $called)
  end

  def test_match_zero_player
    players = []
    @pairing.match(players)
    assert_equal(0, $called)
  end

  def test_match_three_players
    players = [@a,@b,@c]
    @pairing.match(players)
    assert_equal(1, $called)
  end

  def test_match_four_players
    players = [@a,@b,@c,@d]
    @pairing.match(players)
    assert_equal(2, $called)
  end
end

class TestStartGameWithoutHumans < Test::Unit::TestCase
  def setup
    @pairing= ShogiServer::StartGameWithoutHumans.new
    $paired = []
    $called = 0
    def @pairing.start_game(p1,p2)
      $called += 1
      $paired << [p1,p2]
    end
    @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
    @d = ShogiServer::BasicPlayer.new
    @d.name = "d"
    @d.win  = 1000
    @d.loss = 2000
    @d.rate = 2000
    @e = ShogiServer::BasicPlayer.new
    @e.name = "e"
    @e.win  = 3000
    @e.loss = 3000
    @e.rate = 3000
    @f = ShogiServer::BasicPlayer.new
    @f.name = "f"
    @f.win  = 4000
    @f.loss = 4000
    @f.rate = 4000
    @g = ShogiServer::BasicPlayer.new
    @g.name = "g"
    @g.win  = 5000
    @g.loss = 5000
    @g.rate = 5000
    @h = ShogiServer::BasicPlayer.new
    @h.name = "h"
    @h.win  = 6000
    @h.loss = 6000
    @h.rate = 6000
  end

  def test_match_one_player
    players = [@a]
    @pairing.match(players)
    assert_equal(0, $called)
  end

  def test_match_one_player_human
    @a.name += "_human"
    players = [@a]
    @pairing.match(players)
    assert_equal(0, $called)
  end

  def test_match_two_players
    players = [@a,@b]
    @pairing.match(players)
    assert_equal(1, $called)
  end

  def test_match_two_players_humans
    @a.name += "_human"
    @b.name += "_human"
    players = [@a,@b]
    @pairing.match(players)
    assert_equal(1, $called)
  end

  def test_match_zero_player
    players = []
    @pairing.match(players)
    assert_equal(0, $called)
  end

  def test_match_three_players
    players = [@a,@b,@c]
    @pairing.match(players)
    assert_equal(1, $called)
  end

  def test_match_three_players_a_human
    @a.name += "_human"
    players = [@a,@b,@c]
    @pairing.match(players)
    assert_equal(1, $called)
    assert_equal(1, players.size)
    assert_equal(@c, players[0])
  end

  def test_match_three_players_b_human
    @b.name += "_human"
    players = [@a,@b,@c]
    @pairing.match(players)
    assert_equal(1, $called)
    assert_equal(1, players.size)
    assert_equal(@c, players[0])
  end

  def test_match_three_players_c_human
    @c.name += "_human"
    players = [@a,@b,@c]
    @pairing.match(players)
    assert_equal(1, $called)
    assert_equal(1, players.size)
    assert_equal(@c, players[0])
  end

  def test_match_three_players_ab_human
    @a.name += "_human"
    @b.name += "_human"
    players = [@a,@b,@c]
    @pairing.match(players)
    assert_equal(1, $called)
    assert_equal(1, players.size)
    assert_equal(@b, players[0])
  end

  def test_match_three_players_bc_human
    @b.name += "_human"
    @c.name += "_human"
    players = [@a,@b,@c]
    @pairing.match(players)
    assert_equal(1, $called)
    assert_equal(1, players.size)
    assert_equal(@c, players[0])
  end

  def test_match_four_players
    players = [@a,@b,@c,@d]
    @pairing.match(players)
    assert_equal(2, $called)
  end

  def test_match_four_players_ab_human
    @a.name += "_human"
    @b.name += "_human"
    players = [@a,@b,@c,@d]
    @pairing.match(players)
    assert_equal(2, $paired.size)
    assert(same_pair?([@a,@c], $paired[0]))
    assert(same_pair?([@b,@d], $paired[1]))
  end

  def test_match_four_players_bc_human
    @b.name += "_human"
    @c.name += "_human"
    players = [@a,@b,@c,@d]
    @pairing.match(players)
    assert_equal(2, $paired.size)
    assert(same_pair?([@a,@b], $paired[0]))
    assert(same_pair?([@c,@d], $paired[1]))
  end

  def test_match_four_players_abc_human
    @a.name += "_human"
    @b.name += "_human"
    @c.name += "_human"
    players = [@a,@b,@c,@d]
    @pairing.match(players)
    assert_equal(2, $paired.size)
    assert(same_pair?([@a,@d], $paired[0]))
    assert(same_pair?([@b,@c], $paired[1]))
  end

  def test_match_four_players_bcd_human
    @b.name += "_human"
    @c.name += "_human"
    @d.name += "_human"
    players = [@a,@b,@c,@d]
    @pairing.match(players)
    assert_equal(2, $paired.size)
    assert(same_pair?([@a,@c], $paired[0]))
    assert(same_pair?([@b,@d], $paired[1]))
  end

  def test_match_four_players_abcd_human
    @a.name += "_human"
    @b.name += "_human"
    @c.name += "_human"
    @d.name += "_human"
    players = [@a,@b,@c,@d]
    @pairing.match(players)
    assert_equal(2, $paired.size)
    assert(same_pair?([@a,@b], $paired[0]))
    assert(same_pair?([@c,@d], $paired[1]))
  end

  def test_match_eight_players_efgh_human
    @e.name += "_human"
    @f.name += "_human"
    @g.name += "_human"
    @h.name += "_human"
    players = [@a,@b,@c,@d,@e,@f,@g,@h]
    @pairing.match(players)
    assert_equal(4, $paired.size)
    assert(same_pair?([@e,@c], $paired[0]))
    assert(same_pair?([@d,@g], $paired[1]))
    assert(same_pair?([@a,@f], $paired[2]))
    assert(same_pair?([@b,@h], $paired[3]))
  end
end

class TestLeastDiff < Test::Unit::TestCase

  class MockLeague
    def initialize
      @players = []
    end

    def add(player)
      @players << player
    end

    def find(name)
      @players.find do |p|
        p.name == name
      end
    end
  end

  def setup
    $league = MockLeague.new

    @pairing= ShogiServer::LeastDiff.new
    $paired = []
    $called = 0
    def @pairing.start_game(p1,p2)
      $called += 1
      $paired << [p1,p2]
    end

    @file = Pathname.new(File.join(File.dirname(__FILE__), "floodgate_history.yaml"))
    @history = ShogiServer::League::Floodgate::History.new @file

    @a = ShogiServer::BasicPlayer.new
    @a.player_id = "a"
    @a.name = "a"
    @a.win  = 1
    @a.loss = 2
    @a.rate = 500
    @b = ShogiServer::BasicPlayer.new
    @b.player_id = "b"
    @b.name = "b"
    @b.win  = 10
    @b.loss = 20
    @b.rate = 800
    @c = ShogiServer::BasicPlayer.new
    @c.player_id = "c"
    @c.name = "c"
    @c.win  = 100
    @c.loss = 200
    @c.rate = 1000
    @d = ShogiServer::BasicPlayer.new
    @d.player_id = "d"
    @d.name = "d"
    @d.win  = 1000
    @d.loss = 2000
    @d.rate = 1500
    @e = ShogiServer::BasicPlayer.new
    @e.player_id = "e"
    @e.name = "e"
    @e.win  = 3000
    @e.loss = 3000
    @e.rate = 2000
    @f = ShogiServer::BasicPlayer.new
    @f.player_id = "f"
    @f.name = "f"
    @f.win  = 4000
    @f.loss = 4000
    @f.rate = 2150
    @g = ShogiServer::BasicPlayer.new
    @g.player_id = "g"
    @g.name = "g"
    @g.win  = 5000
    @g.loss = 5000
    @g.rate = 2500
    @h = ShogiServer::BasicPlayer.new
    @h.player_id = "h"
    @h.name = "h"
    @h.win  = 6000
    @h.loss = 6000
    @h.rate = 3000
    @x = ShogiServer::BasicPlayer.new
    @x.player_id = "x"
    @x.name = "x"

    @abcdefg1 = ShogiServer::BasicPlayer.new
    @abcdefg1.player_id = "abcdefg1"
    @abcdefg1.name = "abcdefg1"
    @abcdefg1.rate = 2100
    @abcdefg2 = ShogiServer::BasicPlayer.new
    @abcdefg2.player_id = "abcdefg2"
    @abcdefg2.name = "abcdefg2"
    @abcdefg2.rate = 2200
    @abcdxyz = ShogiServer::BasicPlayer.new
    @abcdxyz.player_id = "abcdxyz"
    @abcdxyz.name = "abcdxyz"
    @abcdxyz.rate = 2300

    @unrated = ShogiServer::BasicPlayer.new
    @unrated.player_id = "unrated"
    @unrated.name = "unrated"
    @unrated.estimated_rate = 450

    $league.add(@a)
    $league.add(@b)
    $league.add(@c)
    $league.add(@d)
    $league.add(@e)
    $league.add(@f)
    $league.add(@g)
    $league.add(@h)
    $league.add(@x)
    $league.add(@abcdefg1)
    $league.add(@abcdefg2)
    $league.add(@abcdxyz)
  end

  def teardown
    @file.delete if @file.exist?
  end

  def assert_pairs(x_array, y_array)
    if (x_array.size != y_array.size)
      assert_equal(x_array.size, y_array.size)
      return
    end
    i = 0

    if (x_array.size == 1)
      assert_equal(x_array[0].name, y_array[0].name)
      return
    end

    ret = true
    while i < x_array.size
      if i == x_array.size-1
        assert_equal(x_array[i].name, y_array[i].name)
        break
      end
      px1 = x_array[i]
      px2 = x_array[i+1]
      py1 = y_array[i]
      py2 = y_array[i+1]

      if ! ((px1.name == py1.name && px2.name == py2.name) ||
            (px1.name == py2.name && px2.name == py1.name))
        ret = false
      end
      i += 2
    end

    assert(ret)
  end

  def test_match_one_player
    players = [@a]
    assert_equal(0, @pairing.calculate_diff_with_penalty(players,nil))
    r = @pairing.match(players)
    assert_pairs([@a], r)
  end

  def test_match_two_players
    players = [@a,@b]
    assert_equal(@b.rate-@a.rate, @pairing.calculate_diff_with_penalty([@a,@b],nil))
    assert_equal(@b.rate-@a.rate, @pairing.calculate_diff_with_penalty([@b,@a],nil))
    r = @pairing.match(players)
    assert_pairs([@a,@b], r)
  end

  def test_match_three_players
    players = [@h,@a,@b]
    assert_equal(300,  @pairing.calculate_diff_with_penalty([@a,@b,@h],nil))
    assert_equal(2200, @pairing.calculate_diff_with_penalty([@b,@h,@a],nil))
    r = @pairing.match(players)
    assert_pairs([@a,@b,@h], r)
    assert_pairs([@a,@b,@h], players)
  end

  def test_match_many_players
    players = [@a,@b,@h,@a,@b,@h,@a,@b,@h,@a,@b,@h,@a,@b,@h,@a,@b,@h,@a,@b,@h,@a,@b,@h,@a,@b,@h,@a,@b,@h]
    r = @pairing.match(players)
    assert true
  end

  def test_calculate_diff_with_penalty
    players = [@a,@b]
    assert_equal(@b.rate-@a.rate, @pairing.calculate_diff_with_penalty(players,nil))

    dummy = nil
    def @history.make_record(game_result)
      {:game_id => "wdoor+floodgate-900-0-a-b-1", 
       :black => "b",  :white => "a",
       :winner => "a", :loser => "b"}
    end
    @history.update(dummy)
    assert_equal(@b.rate-@a.rate+400, @pairing.calculate_diff_with_penalty(players, @history))
  end

  def test_calculate_diff_with_penalty2
    players = [@a,@b,@g,@h]
    assert_equal(@b.rate-@a.rate+@h.rate-@g.rate, @pairing.calculate_diff_with_penalty(players,nil))
  end

  def test_calculate_diff_with_penalty2_1
    players = [@a,@b,@g,@h]
    assert_equal(@b.rate-@a.rate+@h.rate-@g.rate, @pairing.calculate_diff_with_penalty(players,nil))
    dummy = nil
    def @history.make_record(game_result)
      {:game_id => "wdoor+floodgate-900-0-a-b-1", 
       :black => "b",  :white => "a",
       :winner => "a", :loser => "b"}
    end
    @history.update(dummy)
    assert_equal(@b.rate-@a.rate+400+@h.rate-@g.rate, @pairing.calculate_diff_with_penalty(players, @history))
  end

  def test_calculate_diff_with_penalty2_2
    players = [@a,@b,@g,@h]
    assert_equal(@b.rate-@a.rate+@h.rate-@g.rate, @pairing.calculate_diff_with_penalty(players,nil))
    dummy = nil
    def @history.make_record(game_result)
      {:game_id => "wdoor+floodgate-900-0-a-b-1", 
       :black => "g",  :white => "h",
       :winner => "h", :loser => "g"}
    end
    @history.update(dummy)
    assert_equal(@b.rate-@a.rate+400+@h.rate-@g.rate, @pairing.calculate_diff_with_penalty(players, @history))
    #assert_equal(@b.rate-@a.rate+400+@h.rate-@g.rate+400, @pairing.calculate_diff_with_penalty(players, [@b,@a,@h,@g]))
  end

  def test_calculate_diff_with_penalty2_3
    players = [@a,@b,@g,@h]
    assert_equal(@b.rate-@a.rate+@h.rate-@g.rate, @pairing.calculate_diff_with_penalty(players,nil))
    dummy = nil
    def @history.make_record(game_result)
      {:game_id => "wdoor+floodgate-900-0-a-b-1", 
       :black => "g",  :white => "h",
       :winner => "h", :loser => "g"}
    end
    @history.update(dummy)
    def @history.make_record(game_result)
      {:game_id => "wdoor+floodgate-900-0-a-b-1", 
       :black => "b",  :white => "a",
       :winner => "a", :loser => "b"}
    end
    @history.update(dummy)
    assert_equal(@b.rate-@a.rate+400+@h.rate-@g.rate+400, @pairing.calculate_diff_with_penalty(players, @history))
  end

  def test_calculate_diff_with_kin_4_players
    players = [@abcdefg1, @abcdxyz]
    assert_equal(@abcdxyz.rate - @abcdefg1.rate + 400, @pairing.calculate_diff_with_penalty(players,nil))
  end

  def test_calculate_diff_with_kin_7_players
    players = [@abcdefg1, @abcdefg2]
    assert_equal(@abcdefg2.rate - @abcdefg1.rate + 800, @pairing.calculate_diff_with_penalty(players,nil))
  end

  def test_calculate_diff_with_unrated_player
    players = [@unrated, @a]
    dummy = nil
    def @history.make_record(game_result)
      {:game_id => "wdoor+floodgate-900-0-a-unrated-1",
       :black => "a",  :white => "unrated",
       :winner => "unrated", :loser => "a"}
    end
    @history.update(dummy)
    assert_equal(4000 + 400 + (@a.rate - @unrated.estimated_rate).abs,
		@pairing.calculate_diff_with_penalty(players,@history))
  end

  def test_calculate_diff_with_unrated_player_2
    players = [@a, @unrated]
    dummy = nil
    def @history.make_record(game_result)
      {:game_id => "wdoor+floodgate-900-0-a-unrated-1",
       :black => "a",  :white => "unrated",
       :winner => "unrated", :loser => "a"}
    end
    @history.update(dummy)
    assert_equal(4000 + 400 + (@a.rate - @unrated.estimated_rate).abs,
		@pairing.calculate_diff_with_penalty(players,@history))
  end

  def test_get_player_rate_0
    assert_equal(2150, @pairing.get_player_rate(@x, @history))

    @x.estimated_rate = 0
    dummy = nil
    def @history.make_record(game_result)
      {:game_id => "wdoor+floodgate-900-0-x-a-1", 
       :black => "x",  :white => "a",
       :winner => "x", :loser => "a"}
    end
    @history.update(dummy)
    assert_equal(@a.rate+200, @pairing.get_player_rate(@x, @history))

    @x.estimated_rate = 0
    def @history.make_record(game_result)
      {:game_id => "wdoor+floodgate-900-0-x-b-1", 
       :black => "x",  :white => "b",
       :winner => "b", :loser => "x"}
    end
    @history.update(dummy)

    assert_equal(@b.rate-200, @pairing.get_player_rate(@x, @history))
  end

  def test_total_posibilities
    assert_equal 1, @pairing.total_posibilities(2)
    assert_equal 1, @pairing.total_posibilities(3)
    assert_equal 3, @pairing.total_posibilities(4)
    assert_equal 945, @pairing.total_posibilities(10)
  end
end

class TestExcludeUnratedPlayers < Test::Unit::TestCase
  def setup
    @pairing= ShogiServer::ExcludeUnratedPlayers.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
    @d = ShogiServer::BasicPlayer.new
    @d.name = "d"
    @d.win  = 1000
    @d.loss = 2000
    @d.rate = 2000
  end

  def test_match_without_any_players
    players = []
    @pairing.match(players)
    assert_equal([], players)
  end

  def test_match_without_unrated_player_1
    players = [@b, @c, @d]
    @pairing.match(players)
    assert_equal([@b, @c, @d], players)
  end

  def test_match_without_unrated_player_2
    players = [@b]
    @pairing.match(players)
    assert_equal([@b], players)
  end

  def test_match_with_unrated_player_1
    players = [@a, @b, @c, @d]
    @pairing.match(players)
    assert_equal([@b, @c, @d], players)
  end

  def test_match_with_unrated_player_2
    players = [@a]
    @pairing.match(players)
    assert_equal([], players)
  end
end
Show on old repository browser