package main import "testing" // TestThousandBotFullMatches прогоняет много полных матчей (до // 1000 очков) силами ThousandBot, проверяя отсутствие паник, // зависаний и потери/дублирования карт. func TestThousandBotFullMatches(t *testing.T) { bot := ThousandBot{} for match := 0; match < 20; match++ { names := newThousandBotNames(3) g := NewThousandGame(names, -1) const maxHands = 500 hand := 0 for ; hand < maxHands; hand++ { const maxSteps = 2000 steps := 0 for ; steps < maxSteps && g.Phase != ThousandPhaseHandOver; steps++ { if err := bot.PlayFullTurn(g); err != nil { t.Fatalf("матч %d, раздача %d, шаг %d: ошибка бота (фаза %v): %v", match, hand, steps, g.Phase, err) } } if steps >= maxSteps { t.Fatalf("матч %d, раздача %d: раздача не завершилась за %d шагов (фаза %v)", match, hand, maxSteps, g.Phase) } if g.Result == nil { t.Fatalf("матч %d, раздача %d: раздача завершилась без результата", match, hand) } seen := map[Card]bool{} total := 0 for _, p := range g.Players { for _, c := range p.Hand { if seen[c] { t.Fatalf("матч %d, раздача %d: карта %v встретилась дважды", match, hand, c) } seen[c] = true total++ } } if total != 0 { t.Fatalf("матч %d, раздача %d: после завершения раздачи на руках не должно остаться карт, получено %d", match, hand, total) } if g.Result.MatchOver { break } g.NextHand() } if hand >= maxHands { t.Fatalf("матч %d: не завершился за %d раздач (возможное зависание)", match, maxHands) } } }