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