go_games_collection/wayfarer_tui_test.go

91 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}
}