84 lines
2.4 KiB
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)
|
|
}
|
|
}
|