github.com/gorgonia/agogo@v0.1.1/game/komi/komi_test.go (about)

     1  package komi
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/gorgonia/agogo/game"
     8  )
     9  
    10  var applyTests = []struct {
    11  	m, n       int
    12  	board      []game.Colour
    13  	move       game.PlayerMove
    14  	board2     []game.Colour // nil if invalid
    15  	taken      int
    16  	whiteScore float32
    17  	blackScore float32
    18  	willErr    bool
    19  }{
    20  	// placing on an empty
    21  	{
    22  		m: 3, n: 3,
    23  		board: []game.Colour{
    24  			None, None, None,
    25  			None, None, None,
    26  			None, None, None,
    27  		},
    28  		move: game.PlayerMove{game.Player(Black), game.Single(4)}, // {1, 1}
    29  		board2: []game.Colour{
    30  			None, None, None,
    31  			None, Black, None,
    32  			None, None, None,
    33  		},
    34  		taken:      0,
    35  		blackScore: 0, // TODO: CHECK
    36  		willErr:    false,
    37  	},
    38  
    39  	// basic capture
    40  	// · O ·
    41  	// O X O
    42  	// · · ·
    43  	//
    44  	// becomes:
    45  	//
    46  	// · O ·
    47  	// O · O
    48  	// · O ·
    49  	{
    50  		m: 3, n: 3,
    51  		board: []game.Colour{
    52  			None, White, None,
    53  			White, Black, White,
    54  			None, None, None,
    55  		},
    56  		move: game.PlayerMove{game.Player(White), game.Single(7)}, // {2, 1}
    57  		board2: []game.Colour{
    58  			None, White, None,
    59  			White, None, White,
    60  			None, White, None,
    61  		},
    62  		taken:      1,
    63  		whiteScore: 1, // TODO: CHECK
    64  		willErr:    false,
    65  	},
    66  
    67  	// group capture
    68  	// Note the extra column on the right is because we use sqrt to determine board size
    69  	// · O · ·
    70  	// O X O ·
    71  	// O X O ·
    72  	// · · · ·
    73  	//
    74  	// becomes:
    75  	//
    76  	// · O · ·
    77  	// O · O ·
    78  	// O · O ·
    79  	// · O · ·
    80  	{
    81  		m: 4, n: 4,
    82  		board: []game.Colour{
    83  			None, White, None, None,
    84  			White, Black, White, None,
    85  			White, Black, White, None,
    86  			None, None, None, None,
    87  		},
    88  		move: game.PlayerMove{game.Player(White), game.Single(13)}, // {3, 1}
    89  		board2: []game.Colour{
    90  			None, White, None, None,
    91  			White, None, White, None,
    92  			White, None, White, None,
    93  			None, White, None, None,
    94  		},
    95  		taken:      2,
    96  		whiteScore: 2, // TODO: CHECK
    97  		willErr:    false,
    98  	},
    99  
   100  	// edge case (literally AT THE EDGE)
   101  	// · · · ·
   102  	// · · · ·
   103  	// · X X ·
   104  	// X O O ·
   105  	//
   106  	// becomes:
   107  	//
   108  	// · · · ·
   109  	// · · · ·
   110  	// · X X ·
   111  	// X · · X
   112  	{
   113  		m: 4, n: 4,
   114  		board: []game.Colour{
   115  			None, None, None, None,
   116  			None, None, None, None,
   117  			None, Black, Black, None,
   118  			Black, White, White, None,
   119  		},
   120  		move: game.PlayerMove{game.Player(Black), game.Single(15)}, // {3, 3}
   121  		board2: []game.Colour{
   122  			None, None, None, None,
   123  			None, None, None, None,
   124  			None, Black, Black, None,
   125  			Black, None, None, Black,
   126  		},
   127  		taken:      2,
   128  		blackScore: 2, // TODO: CHECK -  this should just be 2 unless my understanding of Go (the game) is wrong
   129  		willErr:    false,
   130  	},
   131  
   132  	// Suicide
   133  	// · X ·
   134  	// X · X
   135  	// · X ·
   136  	//
   137  	// Disallowed:
   138  	// · X ·
   139  	// X O X
   140  	// · X ·
   141  	{
   142  		m: 3, n: 3,
   143  		board: []game.Colour{
   144  			None, White, None,
   145  			White, None, White,
   146  			None, White, None,
   147  		},
   148  		move:    game.PlayerMove{game.Player(Black), game.Single(4)}, // {1, 1}
   149  		board2:  nil,
   150  		taken:   0,
   151  		willErr: true,
   152  	},
   153  
   154  	// impossible move
   155  	{
   156  		m: 3, n: 3,
   157  		board: []game.Colour{
   158  			None, None, None,
   159  			None, None, None,
   160  			None, None, None,
   161  		},
   162  		move:    game.PlayerMove{game.Player(Black), game.Single(15)}, // {3, 3}
   163  		board2:  nil,
   164  		taken:   0,
   165  		willErr: true,
   166  	},
   167  
   168  	// impossible colour
   169  	{
   170  		m: 3, n: 3,
   171  		board: []game.Colour{
   172  			None, None, None,
   173  			None, None, None,
   174  			None, None, None,
   175  		},
   176  		move:    game.PlayerMove{game.Player(None), game.Single(15)}, // {3, 3}
   177  		board2:  nil,
   178  		taken:   0,
   179  		willErr: true,
   180  	},
   181  }
   182  
   183  func TestBoard_apply(t *testing.T) {
   184  	for testID, at := range applyTests {
   185  		board := New(at.m, at.n, 3)
   186  		data := board.board
   187  		copy(data, at.board)
   188  
   189  		board.Apply(at.move)
   190  		taken := board.taken
   191  		err := board.err
   192  
   193  		switch {
   194  		case at.willErr && err == nil:
   195  			t.Errorf("Expected an error for \n%s", board)
   196  			continue
   197  		case at.willErr && err != nil:
   198  			// expected an error
   199  			continue
   200  		case !at.willErr && err != nil:
   201  			t.Errorf("err %v", err)
   202  			continue
   203  		}
   204  
   205  		if taken != at.taken {
   206  			t.Errorf("Test %d: Expected %d to be taken. Got %d instead", testID, at.taken, taken)
   207  		}
   208  
   209  		for i, v := range data {
   210  			if v != at.board2[i] {
   211  				t.Errorf("Board failure:\n%s", board)
   212  			}
   213  		}
   214  
   215  		whiteScore := board.Score(WhiteP)
   216  		blackScore := board.Score(BlackP)
   217  		if whiteScore != at.whiteScore {
   218  			t.Errorf("Expected White Score %v. Got %v. Board\n%s", at.whiteScore, whiteScore, board)
   219  		}
   220  		if blackScore != at.blackScore {
   221  			t.Errorf("Expected Black Score %v. Got %v. Board\n%s", at.blackScore, blackScore, board)
   222  		}
   223  	}
   224  }
   225  
   226  func TestCloneEq(t *testing.T) {
   227  	board := New(3, 3, 3)
   228  	if !board.Eq(board) {
   229  		t.Fatal("Failed basic equality")
   230  	}
   231  	// clone a clean board for later
   232  	board3 := board.Clone()
   233  	board.Apply(game.PlayerMove{game.Player(Black), game.Single(2)})
   234  	board.Apply(game.PlayerMove{game.Player(White), game.Single(4)})
   235  
   236  	board2 := board.Clone()
   237  	if board2 == board {
   238  		t.Errorf("Cloning should not yield the same address")
   239  	}
   240  	if &board.board[0] == &board2.(*Game).board[0] {
   241  		t.Errorf("Cloning should not yield the same underlying backing")
   242  	}
   243  	if !board.Eq(board2) {
   244  		t.Fatal("Cloning failed")
   245  	}
   246  
   247  	board.Reset()
   248  	if !board.Eq(board3) {
   249  		t.Fatalf("Reset board should be the same as newBoard\n%s\n%s", board, board3)
   250  	}
   251  }
   252  
   253  func TestBoard_Format(t *testing.T) {
   254  	g := New(7, 7, 3)
   255  	it := game.MakeIterator(g.board, g.m, g.n)
   256  	it[1][1] = White
   257  	it[3][3] = Black
   258  	it[1][5] = White
   259  	it[5][5] = Black
   260  	s := fmt.Sprintf("%s", g)
   261  	t.Logf("\n%v", s)
   262  }
   263  
   264  func TestKomi_Ended(t *testing.T) {
   265  	//
   266  	// ⎢ O X X · X ⎥
   267  	// ⎢ · X X X X ⎥
   268  	// ⎢ X X · O X ⎥
   269  	// ⎢ X · O · O ⎥
   270  	// ⎢ · O · X · ⎥
   271  
   272  	m, n := 5, 5
   273  	board := []game.Colour{
   274  		White, Black, Black, None, Black,
   275  		None, Black, Black, Black, Black,
   276  		Black, Black, None, White, Black,
   277  		Black, None, White, None, White,
   278  		None, White, None, Black, None,
   279  	}
   280  	g := New(m, n, 3)
   281  	g.nextToMove = WhiteP
   282  	data := g.board
   283  	copy(data, board)
   284  
   285  	ended, _ := g.Ended()
   286  	if !ended {
   287  		t.Error("Game is supposed to have ended")
   288  	}
   289  
   290  }
   291  
   292  func TestCheck(t *testing.T) {
   293  	// ⎢ X · X · X X O ⎥
   294  	// ⎢ · · O X X O · ⎥
   295  	// ⎢ O O · X X O O ⎥
   296  	// ...
   297  
   298  	m, n := 3, 7
   299  	board := []game.Colour{
   300  		Black, None, Black, None, Black, Black, White,
   301  		None, None, White, Black, Black, White, None,
   302  		White, White, None, Black, Black, White, White,
   303  	}
   304  	g := New(m, n, 3)
   305  	g.nextToMove = WhiteP
   306  	data := g.board
   307  	copy(data, board)
   308  
   309  	if g.Check(game.PlayerMove{Player: WhiteP, Single: game.Single(3)}) {
   310  		t.Error("Expect to not be able to put a stone there")
   311  	}
   312  
   313  }