package main import ( "testing" "time" ) func TestCorpseStarchModelRequisitionViaKey(t *testing.T) { withTempConfigDir(t) m := NewCorpseStarchModel() next, _ := m.Update(key("1")) m = next.(CorpseStarchModel) if m.game.Starch != 1 { t.Fatalf("ожидался запас 1 после нажатия [1], получено %v", m.game.Starch) } } func TestCorpseStarchModelActionsExpandAsUnlocked(t *testing.T) { withTempConfigDir(t) m := NewCorpseStarchModel() if len(m.buildActions(time.Now())) != 1 { t.Fatalf("в начале должно быть только 1 действие (реквизиция)") } m.game.TotalEarned = corpseStarchUnlockServitors if len(m.buildActions(time.Now())) != 2 { t.Fatalf("после открытия сервиторов должно быть 2 действия") } m.game.TotalEarned = corpseStarchUnlockMissions actions := m.buildActions(time.Now()) if len(actions) != 8 { t.Fatalf("ожидалось 8 действий при полностью открытых (кроме 3 тира) разделах, получено %d", len(actions)) } } func TestCorpseStarchModelBuyServitorViaKey(t *testing.T) { withTempConfigDir(t) m := NewCorpseStarchModel() m.game.TotalEarned = corpseStarchUnlockServitors m.game.Starch = 100 next, _ := m.Update(key("2")) m = next.(CorpseStarchModel) if m.game.ServitorCounts[0] != 1 { t.Fatalf("ожидалась покупка сервочерпа, получено count=%d", m.game.ServitorCounts[0]) } } func TestCorpseStarchModelTickAccruesIncome(t *testing.T) { withTempConfigDir(t) m := NewCorpseStarchModel() m.game.ServitorCounts[0] = 10 past := m.game.LastTick.Add(2 * time.Second) next, _ := m.Update(corpseStarchTickMsg{At: past}) m = next.(CorpseStarchModel) if m.game.Starch != 10 { t.Errorf("ожидался запас 10 после тика на 2 секунды при 5/сек, получено %v", m.game.Starch) } } func TestCorpseStarchModelQReturnsToMenu(t *testing.T) { withTempConfigDir(t) m := NewCorpseStarchModel() next, _ := m.Update(key("q")) m = next.(CorpseStarchModel) if !m.backToMenu { t.Fatalf("ожидался флаг backToMenu после 'q'") } if m.quitting { t.Fatalf("'q' не должен закрывать всё приложение") } } func TestCorpseStarchModelMissionFlowViaKeys(t *testing.T) { withTempConfigDir(t) m := NewCorpseStarchModel() m.game.TotalEarned = corpseStarchUnlockMissions m.game.Starch = 0 actions := m.buildActions(time.Now()) missionActionIdx := -1 for i, a := range actions { if a.Label == Tf("corpsestarch.action.start_mission", T("corpsestarch.mission.vermin"), formatDuration(corpseStarchMissionDefs[0].Duration)) { missionActionIdx = i break } } if missionActionIdx == -1 { t.Fatalf("не нашли действие запуска первой миссии среди %d действий", len(actions)) } next, _ := m.Update(key(string(rune('1' + missionActionIdx)))) m = next.(CorpseStarchModel) if m.game.ActiveMission == nil { t.Fatalf("миссия должна была начаться") } finished := m.game.ActiveMission.StartedAt.Add(corpseStarchMissionDefs[0].Duration + time.Second) if m.game.MissionRemaining(finished) != 0 { t.Fatalf("миссия должна была завершиться к этому моменту") } collectActions := m.buildActions(finished) collectIdx := -1 for i, a := range collectActions { if a.Label == T("corpsestarch.action.collect_mission") { collectIdx = i break } } if collectIdx == -1 { t.Fatalf("не нашли действие сбора награды") } collectActions[collectIdx].Handle(&m, finished) if m.game.ActiveMission != nil { t.Errorf("миссия должна была завершиться после сбора награды") } if m.game.MissionsDone != 1 { t.Errorf("счётчик завершённых миссий должен был увеличиться") } }