1package prompt
2
3import (
4 "strings"
5 "testing"
6
7 renderer "github.com/bnema/vev-vt"
8 "github.com/bnema/vev/internal/domain"
9 "github.com/stretchr/testify/require"
10)
11
12func TestModelPrefillAndEditingClearsError(t *testing.T) {
13 m := New(" Rename session ", "0")
14 require.Equal(t, " Rename session ", m.Title())
15 require.Equal(t, "0", m.Value())
16
17 m.SetError("name already in use")
18 m.Insert('x')
19 require.Equal(t, "0x", m.Value())
20 require.Empty(t, m.errMsg)
21
22 m.SetError("bad")
23 m.Backspace()
24 require.Equal(t, "0", m.Value())
25 require.Empty(t, m.errMsg)
26}
27
28func TestModelRenderDrawsInputAndError(t *testing.T) {
29 m := New(" Rename session ", "work")
30 m.SetError("name already in use")
31
32 frame := m.Render(domain.Size{Cols: 24, Rows: 2})
33
34 require.Equal(t, "> work ", promptRowText(frame.Row(0)))
35 require.True(t, frame.At(6, 0).Style.Inverse, "caret follows prefilled value")
36 require.Equal(t, "name already in use ", promptRowText(frame.Row(1)))
37 require.True(t, frame.At(0, 1).Style.Inverse, "error line is visually distinct")
38}
39
40func promptRowText(row []renderer.Cell) string {
41 var b strings.Builder
42 for _, c := range row {
43 if c.Rune == 0 {
44 b.WriteRune(' ')
45 continue
46 }
47 b.WriteRune(c.Rune)
48 }
49 return b.String()
50}
51
52func TestModelRenderHandlesTinySize(t *testing.T) {
53 m := New(" Rename session ", "work")
54
55 frame := m.Render(domain.Size{Cols: 0, Rows: 0})
56
57 require.Equal(t, 0, frame.Width)
58 require.Equal(t, 0, frame.Height)
59}
60
61func TestModelRenderStyledFillsBaseAndSelection(t *testing.T) {
62 m := New(" Rename ", "x")
63 base := renderer.Style{Foreground: 1, Background: 2}
64 selection := renderer.Style{Foreground: 3, Background: 4}
65 frame := m.RenderStyled(domain.Size{Cols: 12, Rows: 2}, RenderStyles{Base: base, Selection: selection})
66
67 require.True(t, frame.At(11, 1).Style.Equal(base), "blank filler keeps base surface")
68 require.True(t, frame.At(3, 0).Style.Equal(selection), "caret keeps selection surface")
69}