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