61 lines
2.1 KiB
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)
|
|
}
|
|
}
|
|
}
|