package main import ( "strings" "testing" "unicode/utf8" ) func TestWfWrapSplitsLongText(t *testing.T) { longText := "Это довольно длинный текст, который заведомо не поместится в одну строку узкого терминала и должен быть перенесён на несколько строк." // termWidth=50 -> реальная ширина переноса 50-4=46 (выше минимума // в 40, так что запасной вариант 60 тут не сработает) wrapped := wfWrap(longText, 50) lines := strings.Split(strings.TrimRight(wrapped, "\n"), "\n") if len(lines) < 2 { t.Fatalf("ожидался перенос минимум на 2 строки, получена 1: %q", wrapped) } for _, line := range lines { if n := utf8.RuneCountInString(line); n > 46 { t.Errorf("строка длиннее заданной ширины 46 рун: %q (рун: %d)", line, n) } } } func TestWfWrapShortTextStaysOnOneLine(t *testing.T) { short := "Короткая фраза." wrapped := wfWrap(short, 80) lines := strings.Split(strings.TrimRight(wrapped, " \n"), "\n") if len(lines) != 1 { t.Errorf("короткий текст не должен переноситься, получено %d строк: %q", len(lines), wrapped) } } func TestWfWrapUsesFallbackWidthWhenTermWidthUnset(t *testing.T) { longText := strings.Repeat("слово ", 30) wrapped := wfWrap(longText, 0) lines := strings.Split(strings.TrimRight(wrapped, " \n"), "\n") if len(lines) < 2 { t.Errorf("даже с запасной шириной длинный текст должен был перенестись, получено: %q", wrapped) } } func TestWayfarerQuestOfferAccept(t *testing.T) { withTempConfigDir(t) m := NewWayfarerModel() m.pendingQuestKey = WayfarerQuestDefs[0].Key m.view = wfViewQuestOffer next, _ := m.Update(key("1")) m = next.(WayfarerModel) if m.view != wfViewQuestStep { t.Fatalf("после принятия задания должен был открыться экран его шага, получено view=%v", m.view) } if m.ship.ActiveQuest == nil || m.ship.ActiveQuest.Key != WayfarerQuestDefs[0].Key { t.Fatalf("задание должно было стать активным") } if m.pendingQuestKey != "" { t.Errorf("pendingQuestKey должен был очиститься после принятия") } } func TestWayfarerQuestOfferDecline(t *testing.T) { withTempConfigDir(t) m := NewWayfarerModel() m.pendingQuestKey = WayfarerQuestDefs[0].Key m.view = wfViewQuestOffer next, _ := m.Update(key("2")) m = next.(WayfarerModel) if m.view != wfViewHub { t.Fatalf("после отказа должен был открыться хаб, получено view=%v", m.view) } if m.ship.ActiveQuest != nil { t.Errorf("задание не должно было стать активным после отказа") } if m.pendingQuestKey != "" { t.Errorf("pendingQuestKey должен был очиститься после отказа") } } func TestWfWrapClampsExcessiveWidth(t *testing.T) { text := "текст" wrapped := wfWrap(text, 500) firstLine := strings.Split(wrapped, "\n")[0] // при очень широком терминале перенос всё равно не должен // растягиваться дальше 100 колонок (проверяем по длине padding'а, // которым lipgloss дополняет строку до ширины стиля) if n := utf8.RuneCountInString(firstLine); n > 100 { t.Errorf("ширина не должна была превышать 100 колонок даже на широком терминале, получено %d", n) } }