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("обе шашки должны были быть взяты") } }