Спеца 12.10: интерфейс + Nil + TaskTitle в internal/ui/task_list_panel.go, Fyne-реализация в internal/ui/desktop/task_list_panel.go. Состояние выбора живёт в окне; выбранная строка подсвечивается (Select/Unselect).
40 lines
1.4 KiB
Go
40 lines
1.4 KiB
Go
package ui
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/kamelion/ratatoskr-go/internal/storage"
|
|
)
|
|
|
|
// TaskTitle — строка в списке задач (спец 12.10), pure-функция без Fyne.
|
|
func TestTaskTitle(t *testing.T) {
|
|
empty := storage.Task{Status: storage.StatusReady}
|
|
got := TaskTitle(empty)
|
|
if !strings.Contains(got, "(без названия)") {
|
|
t.Errorf("пустое название: got %q, want «(без названия)»", got)
|
|
}
|
|
if !strings.Contains(got, string(storage.StatusReady)) {
|
|
t.Errorf("строка должна содержать статус, got %q", got)
|
|
}
|
|
|
|
named := storage.Task{Title: "Тест", Status: storage.StatusRunning}
|
|
got = TaskTitle(named)
|
|
if !strings.Contains(got, "Тест") {
|
|
t.Errorf("название не попало в строку: %q", got)
|
|
}
|
|
if !strings.Contains(got, string(storage.StatusRunning)) {
|
|
t.Errorf("статус не попал в строку: %q", got)
|
|
}
|
|
}
|
|
|
|
// NilTaskListPanel — no-op контракт (спец 12.8): безопасно для headless/тестов.
|
|
func TestNilTaskListPanelNoop(t *testing.T) {
|
|
p := NewNilTaskListPanel()
|
|
p.SetTasks([]storage.Task{{ID: 1}})
|
|
p.Select(1)
|
|
|
|
var got []int64
|
|
p.OnSelect(func(id int64) { got = append(got, id) })
|
|
// Nil не вызывает колбэки — нет виджета, но вызовы безопасны.
|
|
} |