// Copyright (c) 2026 Storm Dragon // SPDX-License-Identifier: GPL-3.0-or-later package prompt import ( "git.stormux.org/storm/fenrir/internal/screen" "testing" ) func TestShellDetectorRequiresFreshCursorPrompt(t *testing.T) { makeScreen := func(text string, cursor int) screen.Snapshot { s := screen.Snapshot{Terminal: 1, Active: true, Rows: 3, Cols: 80, Y: cursor, Cells: make([]rune, 240)} for i := range s.Cells { s.Cells[i] = ' ' } copy(s.Line(1), []rune(text)) return s } for _, text := range []string{"[Username@host directory] $", "Username@host:~$", "$", "#"} { var detector ShellDetector detector.Observe(makeScreen("application", 1)) s := makeScreen(text, 1) s.Generation = 1 if !detector.Observe(s) { t.Fatal("new shell prompt missed", text) } if detector.Observe(s) { t.Fatal("unchanged prompt repeated", text) } } for _, text := range []string{"Password:", "Confirm? [y/n]", " $", " $", "press any key to continue", "Worked for 2s • 1:00 PM"} { var detector ShellDetector detector.Observe(makeScreen("application", 1)) if detector.Observe(makeScreen(text, 1)) { t.Fatal("non-shell prompt", text) } } var detector ShellDetector s := makeScreen("$", 0) detector.Observe(s) s.Y = 1 if detector.Observe(s) { t.Fatal("old prompt became fresh after cursor motion") } }