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