1package daemon
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7
8 "github.com/bnema/vev/internal/domain/terminalcap"
9)
10
11func TestColorDowngradeNotice(t *testing.T) {
12 tests := []struct {
13 name string
14 color terminalcap.ColorCapabilities
15 want string
16 }{
17 {name: "declared 256 colors", color: terminalcap.ColorCapabilities{Mode: terminalcap.ANSI256, Source: terminalcap.SourceDeclared}, want: "Terminal supports 256 colors; vev UI colors are reduced."},
18 {name: "declared 16 colors", color: terminalcap.ColorCapabilities{Mode: terminalcap.ANSI16, Source: terminalcap.SourceDeclared}, want: "Terminal supports 16 colors; vev UI colors are reduced."},
19 {name: "declared monochrome", color: terminalcap.ColorCapabilities{Mode: terminalcap.Monochrome, Source: terminalcap.SourceDeclared}, want: "Terminal has no color support; vev UI uses bold and reverse."},
20 {name: "declared truecolor", color: terminalcap.ColorCapabilities{Mode: terminalcap.TrueColor, Source: terminalcap.SourceDeclared}},
21 {name: "forced 256 colors", color: terminalcap.ColorCapabilities{Mode: terminalcap.ANSI256, Source: terminalcap.SourceForced}},
22 {name: "forced 16 colors", color: terminalcap.ColorCapabilities{Mode: terminalcap.ANSI16, Source: terminalcap.SourceForced}},
23 {name: "forced monochrome", color: terminalcap.ColorCapabilities{Mode: terminalcap.Monochrome, Source: terminalcap.SourceForced}},
24 {name: "heuristic 256 colors", color: terminalcap.ColorCapabilities{Mode: terminalcap.ANSI256, Source: terminalcap.SourceHeuristic}},
25 {name: "unknown 256 colors", color: terminalcap.ColorCapabilities{Mode: terminalcap.ANSI256}},
26 {name: "zero value", color: terminalcap.ColorCapabilities{}},
27 }
28 for _, tt := range tests {
29 t.Run(tt.name, func(t *testing.T) {
30 got, ok := colorDowngradeNotice(tt.color)
31 require.Equal(t, tt.want != "", ok)
32 require.Equal(t, tt.want, got)
33 })
34 }
35}
36
37// TestFinishAttachedClientColorToast drives the real attach completion path:
38// only a declared reduced mode toasts, and a forced mode never does.
39func TestFinishAttachedClientColorToast(t *testing.T) {
40 tests := []struct {
41 name string
42 color terminalcap.ColorCapabilities
43 wantToast string
44 }{
45 {name: "declared 256 colors toasts", color: terminalcap.ColorCapabilities{Mode: terminalcap.ANSI256, Source: terminalcap.SourceDeclared}, wantToast: "Terminal supports 256 colors; vev UI colors are reduced."},
46 {name: "declared 16 colors toasts", color: terminalcap.ColorCapabilities{Mode: terminalcap.ANSI16, Source: terminalcap.SourceDeclared}, wantToast: "Terminal supports 16 colors; vev UI colors are reduced."},
47 {name: "forced 16 colors is silent", color: terminalcap.ColorCapabilities{Mode: terminalcap.ANSI16, Source: terminalcap.SourceForced}},
48 {name: "declared truecolor is silent", color: terminalcap.ColorCapabilities{Mode: terminalcap.TrueColor, Source: terminalcap.SourceDeclared}},
49 }
50 for _, tt := range tests {
51 t.Run(tt.name, func(t *testing.T) {
52 pty, release := newBlockingPTY(t)
53 defer release()
54 d, sess, ac, _ := newManualSessionWithPTYs(t, pty)
55 ac.terminalCapabilities = terminalcap.Capabilities{Color: tt.color}
56
57 d.finishAttachedClient(sess, ac, attachClientOptions{})
58
59 toasts, _ := visibleToasts(ac)
60 if tt.wantToast == "" {
61 require.Empty(t, toasts)
62 return
63 }
64 require.Len(t, toasts, 1)
65 require.Equal(t, tt.wantToast, toasts[0].Message)
66 })
67 }
68}