65 lines
2.4 KiB
Go
65 lines
2.4 KiB
Go
package main
|
||
|
||
import "testing"
|
||
|
||
// TestCheckersBotFullGames прогоняет несколько полных партий бота
|
||
// против самого себя (небольшая глубина поиска — ради скорости
|
||
// теста), проверяя отсутствие паник, зависаний и что итог всегда
|
||
// корректен (победа одной из сторон либо ничья по лимиту ходов).
|
||
func TestCheckersBotFullGames(t *testing.T) {
|
||
bot := CheckersBot{Depth: 3}
|
||
|
||
for game := 0; game < 5; game++ {
|
||
g := NewCheckersGame()
|
||
|
||
const maxSteps = 400
|
||
steps := 0
|
||
for ; steps < maxSteps && g.Result == nil; steps++ {
|
||
if err := bot.PlayFullTurn(g); err != nil {
|
||
t.Fatalf("игра %d, шаг %d: ошибка бота: %v", game, steps, err)
|
||
}
|
||
}
|
||
if steps >= maxSteps {
|
||
t.Fatalf("игра %d: партия не завершилась за %d шагов (возможное зависание)", game, maxSteps)
|
||
}
|
||
if g.Result == nil {
|
||
t.Fatalf("игра %d: партия завершилась без результата", game)
|
||
}
|
||
|
||
count := 0
|
||
for r := 0; r < 8; r++ {
|
||
for c := 0; c < 8; c++ {
|
||
if g.Board[r][c] != nil {
|
||
count++
|
||
}
|
||
}
|
||
}
|
||
if count > 24 {
|
||
t.Fatalf("игра %d: на доске оказалось %d шашек — больше, чем было изначально", game, count)
|
||
}
|
||
}
|
||
}
|
||
|
||
func TestCheckersBotHandlesMultiJumpChains(t *testing.T) {
|
||
bot := CheckersBot{Depth: 2}
|
||
g := &CheckersGameState{Turn: CheckersWhite}
|
||
g.Board[6][1] = &CheckersPiece{Color: CheckersWhite}
|
||
g.Board[5][2] = &CheckersPiece{Color: CheckersBlack}
|
||
g.Board[3][4] = &CheckersPiece{Color: CheckersBlack}
|
||
|
||
if err := bot.PlayFullTurn(g); err != nil {
|
||
t.Fatalf("неожиданная ошибка первого шага: %v", err)
|
||
}
|
||
if g.Turn != CheckersWhite {
|
||
t.Fatalf("после первого взятия серии ход не должен был перейти сопернику")
|
||
}
|
||
if err := bot.PlayFullTurn(g); err != nil {
|
||
t.Fatalf("неожиданная ошибка второго шага серии: %v", err)
|
||
}
|
||
if g.Turn != CheckersBlack {
|
||
t.Fatalf("после завершения серии взятий ход должен был перейти чёрным")
|
||
}
|
||
if g.Board[5][2] != nil || g.Board[3][4] != nil {
|
||
t.Errorf("обе шашки должны были быть взяты")
|
||
}
|
||
}
|