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
Drag mouse to navigate.
Navigation
- Left/Right Mouse drag: Changes camera heading.
- Up/Sown Mouse drag: Changes camera pitch.
- Scroll wheel: Changes camera field of view.
- I-Key: Displays Info panel with canvas size, image size and FPS.
17.Aug.2010, Martin Wengenmayer