package recognize import "testing" func TestSeasonSummary(t *testing.T) { // ep — эпизодный файл с заданным (или nil) сезоном. ep := func(season *int) PlanFile { return PlanFile{Role: RoleEpisode, Season: season} } n := func(v int) *int { return &v } cases := []struct { name string files []PlanFile want string }{ {"пусто", nil, ""}, {"один сезон", []PlanFile{ep(n(2)), ep(n(2))}, "Сезон 2"}, {"диапазон", []PlanFile{ep(n(1)), ep(n(2)), ep(n(3))}, "Сезоны 1–3"}, {"разрыв", []PlanFile{ep(n(1)), ep(n(3)), ep(n(4))}, "Сезоны 1, 3–4"}, {"несортированный вход", []PlanFile{ep(n(3)), ep(n(1)), ep(n(2))}, "Сезоны 1–3"}, {"только спецвыпуски (nil)", []PlanFile{ep(nil)}, "Спецвыпуски"}, {"только спецвыпуски (0)", []PlanFile{ep(n(0))}, "Спецвыпуски"}, {"сезоны и спецвыпуски", []PlanFile{ep(n(1)), ep(n(2)), ep(nil)}, "Сезоны 1–2, спецвыпуски"}, {"один сезон и спецвыпуски", []PlanFile{ep(n(1)), ep(nil)}, "Сезон 1, спецвыпуски"}, } for _, c := range cases { t.Run(c.name, func(t *testing.T) { got := SeasonSummary(Plan{Files: c.files}) if got != c.want { t.Errorf("SeasonSummary = %q, want %q", got, c.want) } }) } } // Не-эпизодные файлы (main/subtitle/…) не влияют на сводку сезонов. func TestSeasonSummary_IgnoresNonEpisodes(t *testing.T) { s := 2 plan := Plan{Files: []PlanFile{ {Role: RoleEpisode, Season: &s}, {Role: RoleMain}, {Role: RoleSubtitle}, {Role: RoleIgnore}, }} if got := SeasonSummary(plan); got != "Сезон 2" { t.Errorf("SeasonSummary = %q, want «Сезон 2»", got) } }