// Jump-to-user keyboard navigation is interactive viewport state; headless daemon E2E has no PTY to drive shift+up/down. package tui import ( "strings" "testing" "albedo/cli/internal/daemon" "github.com/charmbracelet/x/ansi" ) func plainRows(lines []string) []string { var rows []string for _, row := range lines { plain := []rune(strings.TrimRight(ansi.Strip(row), " ")) rows = append(rows, string(plain[min(railWidth, len(plain)):])) } return rows } func TestJumpToYouLandsOnYourMessages(t *testing.T) { m := newTestChatModel(t, &daemon.Session{ID: "s"}) m.SetSize(100, 20) for i := range int64(4) { m.appendSettledEntry(HistoryEntry{Kind: EntryUser, Speaker: "You", Text: "question", Timestamp: 1 + i}) m.appendSettledEntry(HistoryEntry{Kind: EntryAssistant, Speaker: "albedo", Text: strings.Repeat("line\n", 15), Timestamp: 1 + i}) } m.refreshViewportContent() var landed []string for range 3 { m.jumpToYou(true) landed = append(landed, plainRows(strings.Split(m.Viewport.View(), "\n")[:1])[0]) } for _, top := range landed { if top != "you" { t.Fatalf("jump should put your message at the top, got %q", landed) } } for range 4 { m.jumpToYou(false) } if !m.Follow { t.Fatal("jumping forward past your newest message should follow the live transcript") } }