DIR : /home/kozerus/public_html/dgs/scripts/tests/GameSettingsTest.php

/home/kozerus/public_html/dgs/scripts/tests

<?php
/*
Dragon Go Server
Copyright (C) 2001-  Erik Ouchterlony, Rod Ival, Jens-Uwe Gaspar

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/* Author: Jens-Uwe Gaspar */

require_once 'DgsUnitTest.php';
require_once 'include/rating.php';
require_once 'include/game_functions.php';


/**
 * Test class for helpers to handle game-settings.
 * Generated by PHPUnit_Util_Skeleton on 2009-12-06 at 10:55:49.
 */
class GameSettingsTest extends DgsUnitTest {

   private static $CHK_FMT_HK = 'H%s:K%s:%s:N%s'; // check sprintf-formtat for handicap & komi

   /** Tests adjust_komi(). */
   public function test_adjust_komi() {
      // new_komi = adjust_komi( $komi, $adj_komi, $jigo_mode )

      $this->assertEquals( 6.5, GameSettings::adjust_komi( 6.5, 0, JIGOMODE_KEEP_KOMI ));
      $this->assertEquals( 10, GameSettings::adjust_komi( 6.5, +3.5, JIGOMODE_KEEP_KOMI ));
      $this->assertEquals( 3, GameSettings::adjust_komi( 6.5, -3.5, JIGOMODE_KEEP_KOMI ));
      $this->assertEquals( -7, GameSettings::adjust_komi( 6.5, -13.5, JIGOMODE_KEEP_KOMI ));

      // max-komi-range
      $this->assertEquals( MAX_KOMI_RANGE, GameSettings::adjust_komi( 6, MAX_KOMI_RANGE, JIGOMODE_KEEP_KOMI ));
      $this->assertEquals( -MAX_KOMI_RANGE, GameSettings::adjust_komi( -6, -MAX_KOMI_RANGE, JIGOMODE_KEEP_KOMI ));

      // jigo-modes (allow-jigo)
      $this->assertEquals( 16, GameSettings::adjust_komi( 6.5, 10, JIGOMODE_ALLOW_JIGO ));
      $this->assertEquals( -3, GameSettings::adjust_komi( -6.5, 3, JIGOMODE_ALLOW_JIGO ));
      $this->assertEquals( -9, GameSettings::adjust_komi( -6.5, -3, JIGOMODE_ALLOW_JIGO ));
      $this->assertEquals( 16, GameSettings::adjust_komi( 6, 10, JIGOMODE_ALLOW_JIGO ));

      // jigo-modes (deny-jigo)
      $this->assertEquals( 16.5, GameSettings::adjust_komi( 6, 10, JIGOMODE_NO_JIGO ));
      $this->assertEquals( -3.5, GameSettings::adjust_komi( -6, 3, JIGOMODE_NO_JIGO ));
      $this->assertEquals( -9.5, GameSettings::adjust_komi( -6, -3, JIGOMODE_NO_JIGO ));
      $this->assertEquals( 16.5, GameSettings::adjust_komi( 6.5, 10, JIGOMODE_NO_JIGO ));
   }

   /** Tests adjust_handicap(). */
   public function test_adjust_handicap() {
      // new_handicap = adjust_handicap( $size, $handicap, $adj_handicap, $min_handicap, $max_handicap )
      $s = 19; $dmh = 9; // size + default-max-handi

      $this->assertEquals( 0, GameSettings::adjust_handicap( $s, 0, 0,  0, MAX_HANDICAP ));
      $this->assertEquals( 0, GameSettings::adjust_handicap( $s, -1, 0,  0, MAX_HANDICAP ));
      $this->assertEquals( MAX_HANDICAP, GameSettings::adjust_handicap( $s, MAX_HANDICAP+10, 0,  0, MAX_HANDICAP ));
      $this->assertEquals( $dmh, GameSettings::adjust_handicap( $s, MAX_HANDICAP+10, 0,  0, DEFAULT_MAX_HANDICAP ));

      // valid limits
      $this->assertEquals( MAX_HANDICAP, GameSettings::adjust_handicap( $s, MAX_HANDICAP+10, 0,  0, MAX_HANDICAP ));
      $this->assertEquals( MAX_HANDICAP, GameSettings::adjust_handicap( $s, MAX_HANDICAP, 10,  0, MAX_HANDICAP ));
      $this->assertEquals( 0, GameSettings::adjust_handicap( $s, -30, 5, -10, 70 ));
      $this->assertEquals( MAX_HANDICAP, GameSettings::adjust_handicap( $s, 30, 5, -10, 70 ));
      $this->assertEquals( 10, GameSettings::adjust_handicap( $s, -30, 40, -10, 70 ));
      $this->assertEquals( MAX_HANDICAP, GameSettings::adjust_handicap( $s, MAX_HANDICAP+2, 0, MAX_HANDICAP+1, MAX_HANDICAP ));
      $this->assertEquals( $dmh, GameSettings::adjust_handicap( $s, MAX_HANDICAP+2, 0, MAX_HANDICAP+1, DEFAULT_MAX_HANDICAP ));
      $this->assertEquals( $dmh, GameSettings::adjust_handicap( $s, MAX_HANDICAP+2, 0, MAX_HANDICAP+1, -7 ));

      // swapped limits
      $this->assertEquals( 5, GameSettings::adjust_handicap( $s, 2, 3, 9, 4 ));
      $this->assertEquals( 7, GameSettings::adjust_handicap( $s, 2, 3, 9, 7 ));
      $this->assertEquals( 4, GameSettings::adjust_handicap( $s, 10, 2, 4, 2 ));
      $this->assertEquals( $dmh, GameSettings::adjust_handicap( $s, 10, 2, 11, DEFAULT_MAX_HANDICAP ));

      // add + min/max
      $this->assertEquals( 9, GameSettings::adjust_handicap( $s, 2, 3, 9, 11 ));
      $this->assertEquals( 4, GameSettings::adjust_handicap( $s, 2, 3, 1, 4 ));
      $this->assertEquals( 0, GameSettings::adjust_handicap( $s, 0, -2, 0, MAX_HANDICAP ));
      $this->assertEquals( 3, GameSettings::adjust_handicap( $s, 0, -2, 3, MAX_HANDICAP ));
      $this->assertEquals( 2, GameSettings::adjust_handicap( $s, 0, -2, 2, 9 ));
      $this->assertEquals( 9, GameSettings::adjust_handicap( $s, 5, 7, 2, 9 ));
   }

   /** Tests suggest_proper(). */
   public function test_suggest_proper() {
      //$gs = new GameSettings( $size, $ruleset, $adj_handicap, $min_handicap, $max_handicap, $adj_komi, $jigomode )
      $gs19jap_no_adj = new GameSettings( 19, RULESET_JAPANESE,  0, 0, DEFAULT_MAX_HANDICAP,  0, JIGOMODE_KEEP_KOMI );

      // my-rat, opp-rat, gs,  expected: handicap, komi, iamblack, nigiri
      $this->check_suggest_prop( "5k", "5k", $gs19jap_no_adj,  0, 6.5, NULL, true );
      $this->check_suggest_prop( "5k", "7k", $gs19jap_no_adj,  3, 6.5, false, false );
      $this->check_suggest_prop( "8k", "4k", $gs19jap_no_adj,  5, 6.5, true, false );
      $this->check_suggest_prop( "8k", "4k", $gs19jap_no_adj,  5, 6.5, true, false );

      $this->check_suggest_prop( "5k", "5k",
         new GameSettings( 19, RULESET_CHINESE,  0, 0, DEFAULT_MAX_HANDICAP,  0, JIGOMODE_KEEP_KOMI ),
         0, 7.5, NULL, true );

      $this->check_suggest_prop( "15k", "4k",
         new GameSettings( 9, RULESET_JAPANESE,  0, 0, DEFAULT_MAX_HANDICAP,  0, JIGOMODE_KEEP_KOMI ),
         2, -0.5, true, false );
      $this->check_suggest_prop( "15k", "4k",
         new GameSettings( 13, RULESET_JAPANESE,  0, 0, DEFAULT_MAX_HANDICAP,  0, JIGOMODE_KEEP_KOMI ),
         4, 2.5, true, false );
      $this->check_suggest_prop( "15k", "4k",
         new GameSettings( 13, RULESET_JAPANESE,  0, 0, 3,  0, JIGOMODE_KEEP_KOMI ),
         3, 2.5, true, false );

      $this->check_suggest_prop( "3k (+20%)", "3k (-20%)",
         new GameSettings( 19, RULESET_JAPANESE,  0, 0, 5,  0, JIGOMODE_KEEP_KOMI ),
         0, 1.5, false, false );
      $this->check_suggest_prop( "3k (+20%)", "3k (-20%)",
         new GameSettings( 19, RULESET_JAPANESE,  1, 0, 5,  0, JIGOMODE_KEEP_KOMI ),
         2, 1.5, false, false );
      $this->check_suggest_prop( "3k (+20%)", "3k (-20%)",
         new GameSettings( 19, RULESET_JAPANESE,  2, 0, 5,  -4, JIGOMODE_KEEP_KOMI ),
         3, -2.5, false, false );
      $this->check_suggest_prop( "3k (-25%)", "3k (+25%)",
         new GameSettings( 19, RULESET_JAPANESE,  2, 0, 5,  0, JIGOMODE_KEEP_KOMI ),
         3, 0, true, false );
      $this->check_suggest_prop( "3k (+5%)", "3k (+25%)",
         new GameSettings( 19, RULESET_JAPANESE,  1, 0, 5,  0, JIGOMODE_KEEP_KOMI ),
         2, 4, true, false );
      $this->check_suggest_prop( "3k", "3k",
         new GameSettings( 19, RULESET_JAPANESE,  1, 0, 5,  0.5, JIGOMODE_ALLOW_JIGO ),
         2, 7, null, true );

      // adjustments --------------

      $gs19jap_adj = new GameSettings( 19, RULESET_JAPANESE,  -4, 0, DEFAULT_MAX_HANDICAP,  20, JIGOMODE_KEEP_KOMI );
      $this->check_suggest_prop( "10k", "4k", $gs19jap_adj,  3, 26.5, true, false );
      $this->check_suggest_prop( "6k", "4k", $gs19jap_adj,  0, 26.5, true, false );

      $gs19jap_adj = new GameSettings( 19, RULESET_JAPANESE,  3, 0, DEFAULT_MAX_HANDICAP,  -10, JIGOMODE_ALLOW_JIGO );
      $this->check_suggest_prop( "10k", "4k", $gs19jap_adj,  9, -3, true, false );
      $this->check_suggest_prop( "6k", "4k", $gs19jap_adj,  6, -3, true, false );
      $this->check_suggest_prop( "1d", "4d", $gs19jap_adj,  7, -3, true, false );
      $this->check_suggest_prop( "1d", "4d (-25%)", $gs19jap_adj,  6, -13, true, false );

      $this->check_suggest_prop( "5k", "6k",
         new GameSettings( 19, RULESET_JAPANESE,  2, 0, MAX_HANDICAP,  0, JIGOMODE_KEEP_KOMI ),
         4, 6.5, false, false );

      // jigomode
      $this->check_suggest_prop( "1d", "4d",
         new GameSettings( 19, RULESET_CHINESE,  0, 2, 7,  3.5, JIGOMODE_KEEP_KOMI ),
         4, 11, true, false );
      $this->check_suggest_prop( "1d", "4d",
         new GameSettings( 19, RULESET_CHINESE,  0, 2, 7,  -3, JIGOMODE_ALLOW_JIGO ),
         4, 4, true, false );
      $this->check_suggest_prop( "1d", "4d",
         new GameSettings( 19, RULESET_CHINESE,  0, 2, 7,  1.5, JIGOMODE_NO_JIGO ),
         4, 9.5, true, false );

      // min-handicap
      $this->check_suggest_prop( "1d", "1d (+20%)",
         new GameSettings( 19, RULESET_CHINESE,  0, 2, 7,  0, JIGOMODE_KEEP_KOMI ),
         2, 5, true, false );
   }//test_suggest_proper

   /** Tests suggest_conventional(). */
   public function test_suggest_conventional() {
      //$gs = new GameSettings( $size, $ruleset, $adj_handicap, $min_handicap, $max_handicap, $adj_komi, $jigomode )
      $gs19jap_no_adj = new GameSettings( 19, RULESET_JAPANESE,  0, 0, DEFAULT_MAX_HANDICAP,  0, JIGOMODE_KEEP_KOMI );

      // my-rat, opp-rat, gs,  expected: handicap, komi, iamblack, nigiri
      $this->check_suggest_conv( "5k", "5k", $gs19jap_no_adj,  0, 6.5, NULL, true );
      $this->check_suggest_conv( "5k", "7k", $gs19jap_no_adj,  2, 0.5, false, false );
      $this->check_suggest_conv( "8k", "4k", $gs19jap_no_adj,  4, 0.5, true, false );
      $this->check_suggest_conv( "8k", "4k", $gs19jap_no_adj,  4, 0.5, true, false );

      $this->check_suggest_conv( "5k", "5k",
         new GameSettings( 19, RULESET_CHINESE,  0, 0, DEFAULT_MAX_HANDICAP,  0, JIGOMODE_KEEP_KOMI ),
         0, 7.5, NULL, true );

      $this->check_suggest_conv( "15k", "4k",
         new GameSettings( 9, RULESET_JAPANESE,  0, 0, DEFAULT_MAX_HANDICAP,  0, JIGOMODE_KEEP_KOMI ),
         2, 0.5, true, false );
      $this->check_suggest_conv( "15k", "4k",
         new GameSettings( 13, RULESET_JAPANESE,  0, 0, DEFAULT_MAX_HANDICAP,  0, JIGOMODE_KEEP_KOMI ),
         4, 0.5, true, false );
      $this->check_suggest_conv( "15k", "4k",
         new GameSettings( 13, RULESET_JAPANESE,  0, 0, 3,  0, JIGOMODE_KEEP_KOMI ),
         3, 0.5, true, false );

      // adjustments --------------

      $gs19jap_adj = new GameSettings( 19, RULESET_JAPANESE,  -4, 0, DEFAULT_MAX_HANDICAP,  20, JIGOMODE_KEEP_KOMI );
      $this->check_suggest_conv( "10k", "4k", $gs19jap_adj,  2, 20.5, true, false );
      $this->check_suggest_conv( "6k", "4k", $gs19jap_adj,  0, 26.5, NULL, true );

      $gs19jap_adj = new GameSettings( 19, RULESET_JAPANESE,  3, 0, DEFAULT_MAX_HANDICAP,  -10, JIGOMODE_ALLOW_JIGO );
      $this->check_suggest_conv( "10k", "4k", $gs19jap_adj,  9, -9, true, false );
      $this->check_suggest_conv( "6k", "4k", $gs19jap_adj,  5, -9, true, false );
      $this->check_suggest_conv( "1d", "4d", $gs19jap_adj,  6, -9, true, false );

      $this->check_suggest_conv( "9k", "6k",
         new GameSettings( 19, RULESET_JAPANESE,  -3, 0, MAX_HANDICAP,  0, JIGOMODE_KEEP_KOMI ),
         0, 6.5, null, true );
      $this->check_suggest_conv( "5k", "6k",
         new GameSettings( 19, RULESET_JAPANESE,  2, 0, MAX_HANDICAP,  0, JIGOMODE_KEEP_KOMI ),
         3, 0.5, false, false );

      // jigomode
      $this->check_suggest_conv( "1d", "4d",
         new GameSettings( 19, RULESET_CHINESE,  0, 2, 7,  3.5, JIGOMODE_KEEP_KOMI ),
         3, 4, true, false );
      $this->check_suggest_conv( "1d", "4d",
         new GameSettings( 19, RULESET_CHINESE,  0, 2, 7,  -3, JIGOMODE_ALLOW_JIGO ),
         3, -2, true, false );
      $this->check_suggest_conv( "1d", "4d",
         new GameSettings( 19, RULESET_CHINESE,  0, 2, 7,  1.5, JIGOMODE_NO_JIGO ),
         3, 2.5, true, false );

      // min-handicap
      $this->check_suggest_conv( "1d", "1d (+20%)",
         new GameSettings( 19, RULESET_CHINESE,  0, 2, 7,  0, JIGOMODE_KEEP_KOMI ),
         2, 0.5, true, false );
   }//test_suggest_conventional


   // $chk_iamblack : null = don't check
   private function check_suggest_prop( $my_rating, $opp_rating, GameSettings $game_settings, $chk_handi, $chk_komi, $chk_iamblack, $chk_nigiri )
   {
      if ( is_string($my_rating) )
         $my_rating = read_rating($my_rating);
      if ( is_string($opp_rating) )
         $opp_rating = read_rating($opp_rating);

      list( $handi, $komi, $iamblack, $is_nigiri ) = $game_settings->suggest_proper( $my_rating, $opp_rating );
      $expected_str = sprintf( self::$CHK_FMT_HK, $chk_handi, $chk_komi,
         (is_null($chk_iamblack) ? '-' : ($chk_iamblack ? 'B':'W')), ($chk_nigiri ? 1:0) );
      $real_str = sprintf( self::$CHK_FMT_HK, $handi, $komi,
         ($is_nigiri ? '-' : ($iamblack ? 'B':'W')), ($is_nigiri ? 1:0) );
      $this->assertEquals( $expected_str, $real_str );
   }

   // $chk_iamblack : null = don't check
   private function check_suggest_conv( $my_rating, $opp_rating, GameSettings $game_settings, $chk_handi, $chk_komi, $chk_iamblack, $chk_nigiri )
   {
      if ( is_string($my_rating) )
         $my_rating = read_rating($my_rating);
      if ( is_string($opp_rating) )
         $opp_rating = read_rating($opp_rating);

      list( $handi, $komi, $iamblack, $is_nigiri ) = $game_settings->suggest_conventional( $my_rating, $opp_rating );
      $expected_str = sprintf( self::$CHK_FMT_HK, $chk_handi, $chk_komi,
         (is_null($chk_iamblack) ? '-' : ($chk_iamblack ? 'B':'W')), ($chk_nigiri ? 1:0) );
      $real_str = sprintf( self::$CHK_FMT_HK, $handi, $komi,
         ($is_nigiri ? '-' : ($iamblack ? 'B':'W')), ($is_nigiri ? 1:0) );
      $this->assertEquals( $expected_str, $real_str );
   }

}

?>
//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer