87 lines
2.6 KiB
Go
87 lines
2.6 KiB
Go
package main
|
||
|
||
import "testing"
|
||
|
||
func TestPickBotNameAvoidsUsedWhenPossible(t *testing.T) {
|
||
used := map[string]bool{}
|
||
for _, n := range botNamePool[:len(botNamePool)-1] { // все, кроме одного
|
||
used[n] = true
|
||
}
|
||
name := pickBotName(used)
|
||
if used[name] {
|
||
t.Errorf("ожидалось единственное свободное имя из пула, получено уже занятое: %q", name)
|
||
}
|
||
}
|
||
|
||
func TestPickBotNameFallsBackWhenPoolExhausted(t *testing.T) {
|
||
used := map[string]bool{}
|
||
for _, n := range botNamePool {
|
||
used[n] = true
|
||
}
|
||
name := pickBotName(used) // пул исчерпан — допустим повтор
|
||
found := false
|
||
for _, n := range botNamePool {
|
||
if n == name {
|
||
found = true
|
||
break
|
||
}
|
||
}
|
||
if !found {
|
||
t.Errorf("даже при исчерпанном пуле имя должно быть из botNamePool, получено %q", name)
|
||
}
|
||
}
|
||
|
||
func TestNewBotRosterDistinctNames(t *testing.T) {
|
||
names, strategies := newBotRoster(3)
|
||
if len(names) != 3 || len(strategies) != 3 {
|
||
t.Fatalf("ожидалось 3 имени и 3 стратегии, получено %d и %d", len(names), len(strategies))
|
||
}
|
||
seen := map[string]bool{}
|
||
for _, n := range names {
|
||
if seen[n] {
|
||
t.Errorf("имена ботов не должны повторяться при наличии свободных: %v", names)
|
||
}
|
||
seen[n] = true
|
||
}
|
||
}
|
||
|
||
func TestNewModelAssignsNamesFromPool(t *testing.T) {
|
||
m := NewModel()
|
||
pool := map[string]bool{}
|
||
for _, n := range botNamePool {
|
||
pool[n] = true
|
||
}
|
||
for i, p := range m.game.Players {
|
||
if i == m.humanIdx {
|
||
continue
|
||
}
|
||
if !pool[p.Name] {
|
||
t.Errorf("имя бота на месте %d (%q) должно быть из пула botNamePool", i, p.Name)
|
||
}
|
||
}
|
||
}
|
||
|
||
func TestBankruptcyMessageDoesNotRevealLevel(t *testing.T) {
|
||
m := NewModel()
|
||
m.game.Players[1].Balance = 0
|
||
msg := m.checkBankruptcies()
|
||
if msg == "" {
|
||
t.Fatalf("ожидалось сообщение о банкротстве")
|
||
}
|
||
for _, lvl := range botLevels {
|
||
if strings_Contains(msg, lvl.Suffix) {
|
||
t.Errorf("сообщение о банкротстве не должно упоминать уровень сложности (%q найдено в %q)", lvl.Suffix, msg)
|
||
}
|
||
}
|
||
}
|
||
|
||
// strings_Contains — маленький локальный хелпер, чтобы не тянуть
|
||
// лишний импорт "strings" только ради одной проверки в тесте.
|
||
func strings_Contains(s, substr string) bool {
|
||
for i := 0; i+len(substr) <= len(s); i++ {
|
||
if s[i:i+len(substr)] == substr {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|