package main import "testing" // TestChessBotFullGames прогоняет несколько полных партий бота // против самого себя (небольшая глубина поиска — ради скорости // теста), проверяя отсутствие паник, зависаний и что итог всегда // корректен (мат, пат либо иная ничья). func TestChessBotFullGames(t *testing.T) { bot := ChessBot{Depth: 2} for game := 0; game < 5; game++ { g := NewChessGame() const maxSteps = 600 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) } whiteKings, blackKings := 0, 0 for r := 0; r < 8; r++ { for c := 0; c < 8; c++ { if p := g.Board[r][c]; p != nil && p.Type == ChessKing { if p.Color == ChessWhite { whiteKings++ } else { blackKings++ } } } } if whiteKings != 1 || blackKings != 1 { t.Fatalf("игра %d: на доске должно быть ровно по одному королю каждого цвета, получено white=%d black=%d", game, whiteKings, blackKings) } } } func TestChessBotHandlesCastlingAndPromotion(t *testing.T) { bot := ChessBot{Depth: 1} g := &ChessGameState{Turn: ChessWhite} g.Board[7][4] = &ChessPiece{Color: ChessWhite, Type: ChessKing} g.Board[7][7] = &ChessPiece{Color: ChessWhite, Type: ChessRook} g.Board[0][4] = &ChessPiece{Color: ChessBlack, Type: ChessKing} g.Board[1][0] = &ChessPiece{Color: ChessWhite, Type: ChessPawn} for i := 0; i < 10 && g.Result == nil; i++ { if err := bot.PlayFullTurn(g); err != nil { t.Fatalf("шаг %d: неожиданная ошибка: %v", i, err) } } }