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 }