go_games_collection/checkers_bot_test.go
2026-07-04 13:51:04 +03:00

65 lines
2.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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