go_games_collection/senet_bot_test.go

84 lines
2.4 KiB
Go

package main
import (
"math/rand"
"testing"
)
func TestSenetRollSticksDistribution(t *testing.T) {
rnd := rand.New(rand.NewSource(1))
counts := map[int]int{}
for i := 0; i < 10000; i++ {
counts[senetRollSticks(rnd)]++
}
maxVal, maxCount := 0, 0
for v, c := range counts {
if c > maxCount {
maxVal, maxCount = v, c
}
}
if maxVal != 2 {
t.Errorf("ожидалось, что значение 2 выпадает чаще всего, получено распределение %v", counts)
}
if counts[4] == 0 || counts[5] == 0 {
t.Errorf("значения 4 и 5 должны выпадать хоть иногда, получено %v", counts)
}
}
func playSenetFullGame(t *testing.T, g *SenetGameState, botA, botB SenetBot, rnd *rand.Rand, maxTurns int) {
t.Helper()
for turn := 0; turn < maxTurns && g.Result == nil; turn++ {
var bot SenetBot
if g.CurrentPlayer == SenetPlayerA {
bot = botA
} else {
bot = botB
}
if err := bot.PlayFullTurn(g, rnd); err != nil {
t.Fatalf("ход %d: неожиданная ошибка бота: %v", turn, err)
}
}
if g.Result == nil {
t.Fatalf("партия не завершилась за %d ходов — похоже на зависание", maxTurns)
}
}
func TestSenetBotFullGamesEasyVsEasy(t *testing.T) {
rnd := rand.New(rand.NewSource(1))
for i := 0; i < 10; i++ {
g := NewSenetGame(SenetPlayerA)
bot := SenetBot{Difficulty: SenetDifficultyEasy}
playSenetFullGame(t, g, bot, bot, rnd, 3000)
}
}
func TestSenetBotFullGamesMediumVsMedium(t *testing.T) {
rnd := rand.New(rand.NewSource(1))
for i := 0; i < 10; i++ {
g := NewSenetGame(SenetPlayerA)
bot := SenetBot{Difficulty: SenetDifficultyMedium}
playSenetFullGame(t, g, bot, bot, rnd, 3000)
}
}
func TestSenetBotFullGamesHardVsHard(t *testing.T) {
rnd := rand.New(rand.NewSource(1))
for i := 0; i < 5; i++ {
g := NewSenetGame(SenetPlayerA)
bot := SenetBot{Difficulty: SenetDifficultyHard}
playSenetFullGame(t, g, bot, bot, rnd, 3000)
}
}
func TestSenetBotFullGamesMixedDifficulties(t *testing.T) {
rnd := rand.New(rand.NewSource(1))
combos := []struct{ a, b SenetDifficulty }{
{SenetDifficultyEasy, SenetDifficultyMedium},
{SenetDifficultyMedium, SenetDifficultyHard},
{SenetDifficultyEasy, SenetDifficultyHard},
}
for _, c := range combos {
g := NewSenetGame(SenetPlayerA)
playSenetFullGame(t, g, SenetBot{Difficulty: c.a}, SenetBot{Difficulty: c.b}, rnd, 3000)
}
}