91 lines
3.7 KiB
Go
91 lines
3.7 KiB
Go
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)
|
||
}
|
||
}
|