50 lines
1.5 KiB
Go
50 lines
1.5 KiB
Go
package game
|
|
|
|
import "testing"
|
|
|
|
// TestRandomBattlesTerminate throws thousands of random decks (drawn from
|
|
// every tier's real cards, plus apples, bees, and perks) at the battle
|
|
// resolver, checking it always terminates with a sane event log and a
|
|
// consistent winner. This is the safety net for effect interactions no
|
|
// hand-written scenario covers.
|
|
func TestRandomBattlesTerminate(t *testing.T) {
|
|
names := []string{}
|
|
for _, tier := range petTiers {
|
|
for _, tmpl := range tier {
|
|
names = append(names, tmpl.Name)
|
|
}
|
|
}
|
|
foods := []string{"Honey", "Garlic", "Pineapple", "Chili", "Melon"}
|
|
|
|
for i := range 3000 {
|
|
g, _, _ := testGame(t)
|
|
buildDeck := func() []Card {
|
|
deck := make([]Card, 0, 10)
|
|
for range 1 + randInt(6) {
|
|
switch randInt(5) {
|
|
case 0:
|
|
deck = append(deck, g.newApple())
|
|
case 1:
|
|
deck = append(deck, g.realFood(t, foods[randInt(len(foods))]))
|
|
case 2:
|
|
deck = append(deck, g.newBee())
|
|
default:
|
|
deck = append(deck, g.realPet(t, names[randInt(len(names))]))
|
|
}
|
|
}
|
|
return deck
|
|
}
|
|
g.Round = 1 + randInt(MaxRounds)
|
|
res := forceBattle(t, g, buildDeck(), buildDeck())
|
|
if len(res.Events) > 2000 {
|
|
t.Fatalf("battle %d produced a runaway event log (%d events)", i, len(res.Events))
|
|
}
|
|
if res.WinnerSeat < -1 || res.WinnerSeat > 1 {
|
|
t.Fatalf("battle %d: bogus winner %d", i, res.WinnerSeat)
|
|
}
|
|
if res.WinnerSeat >= 0 && res.Trophies < 1 {
|
|
t.Fatalf("battle %d: winner without trophies", i)
|
|
}
|
|
}
|
|
}
|