1package tui
2
3import (
4 "fmt"
5 "strings"
6 "testing"
7)
8
9func TestReaderParsesAZERTYProfileKeys(t *testing.T) {
10 for _, r := range "&é\"'(-è_ç" {
11 for _, sequence := range []string{
12 fmt.Sprintf("\x1b[%d;5u", r),
13 fmt.Sprintf("\x1b[%d:49:49;5u", r),
14 fmt.Sprintf("\x1b[27;5;%d~", r),
15 } {
16 k := readKey(t, sequence)
17 if k.Kind != KeyRune || k.Rune != r || !k.Ctrl {
18 t.Fatalf("%q: %+v", sequence, k)
19 }
20 }
21 k := readKey(t, fmt.Sprintf("\x1b[%d;1u", r))
22 if k.Kind != KeyRune || k.Rune != r || k.Ctrl {
23 t.Fatalf("unmodified %c: %+v", r, k)
24 }
25 }
26}
27
28func TestReaderKeepsUnboundEnhancedCtrlPrintablesUnknown(t *testing.T) {
29 for _, r := range "[/\\=ö" {
30 for _, sequence := range []string{
31 fmt.Sprintf("\x1b[%d;5u", r),
32 fmt.Sprintf("\x1b[27;5;%d~", r),
33 } {
34 k := readKey(t, sequence)
35 if k.Kind != KeyUnknown {
36 t.Fatalf("Ctrl+%c parsed as %+v, want unknown", r, k)
37 }
38 ed := NewEditor("")
39 ed.HandleKey(k)
40 if ed.Value() != "" {
41 t.Fatalf("Ctrl+%c inserted %q", r, ed.Value())
42 }
43 }
44 }
45}
46
47func TestStatusBarModelProfileIndicator(t *testing.T) {
48 for _, cols := range []int{10, 25, 80, 160} {
49 lines := StatusBar(StatusBarParams{Theme: Dark, Model: "gpt-5.6-sol", Reasoning: "max", ModelProfile: 9, Cols: cols})
50 if !strings.Contains(stripANSI(strings.Join(lines, "\n")), "[9]") {
51 t.Fatalf("missing profile at width %d: %q", cols, lines)
52 }
53 for _, line := range lines {
54 if visibleWidth(line) > cols {
55 t.Fatalf("overflow at width %d: %q", cols, line)
56 }
57 }
58 }
59}