go_games_collection/chess_bot_test.go

61 lines
2.1 KiB
Go

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)
}
}
}