@@ -0,0 +1,160 @@
7+ "github.com/charmbracelet/crush/internal/stringext"
8+ uv "github.com/charmbracelet/ultraviolet"
9+ "github.com/stretchr/testify/require"
12+type mockEnviron []string
14+func (m mockEnviron) Getenv(key string) string {
15+ v, _ := m.LookupEnv(key)
19+func (m mockEnviron) LookupEnv(key string) (string, bool) {
20+ for _, env := range m {
21+ kv := strings.SplitN(env, "=", 2)
22+ if len(kv) == 2 && kv[0] == key {
29+func (m mockEnviron) ExpandEnv(s string) string {
30+ return s // Not implemented for tests
33+func (m mockEnviron) Slice() []string {
37+func TestShouldQueryImageCapabilities(t *testing.T) {
46+ name: "kitty terminal",
47+ env: mockEnviron{"TERM=xterm-kitty"},
51+ name: "wezterm terminal",
52+ env: mockEnviron{"TERM=xterm-256color"},
56+ name: "wezterm with WEZTERM env",
57+ env: mockEnviron{"TERM=xterm-256color", "WEZTERM_EXECUTABLE=/Applications/WezTerm.app/Contents/MacOS/wezterm-gui"},
58+ want: true, // Not detected via TERM, only via stringext.ContainsAny which checks TERM
61+ name: "Apple Terminal",
62+ env: mockEnviron{"TERM_PROGRAM=Apple_Terminal", "TERM=xterm-256color"},
67+ env: mockEnviron{"TERM=alacritty"},
72+ env: mockEnviron{"TERM=xterm-ghostty"},
77+ env: mockEnviron{"TERM=rio"},
81+ name: "wezterm (detected via TERM)",
82+ env: mockEnviron{"TERM=wezterm"},
87+ env: mockEnviron{"SSH_TTY=/dev/pts/0", "TERM=xterm-256color"},
91+ name: "generic terminal",
92+ env: mockEnviron{"TERM=xterm-256color"},
96+ name: "kitty over SSH",
97+ env: mockEnviron{"SSH_TTY=/dev/pts/0", "TERM=xterm-kitty"},
101+ name: "Apple Terminal with kitty TERM (should still be false due to TERM_PROGRAM)",
102+ env: mockEnviron{"TERM_PROGRAM=Apple_Terminal", "TERM=xterm-kitty"},
107+ for _, tt := range tests {
108+ t.Run(tt.name, func(t *testing.T) {
110+ got := shouldQueryCapabilities(uv.Environ(tt.env))
111+ require.Equal(t, tt.want, got, "shouldQueryImageCapabilities() = %v, want %v", got, tt.want)
116+// This is a helper to test the underlying logic of stringext.ContainsAny
117+// which is used by shouldQueryImageCapabilities
118+func TestStringextContainsAny(t *testing.T) {
128+ name: "kitty in TERM",
130+ substr: kittyTerminals,
134+ name: "wezterm in TERM",
136+ substr: kittyTerminals,
140+ name: "alacritty in TERM",
142+ substr: kittyTerminals,
146+ name: "generic terminal not in list",
147+ s: "xterm-256color",
148+ substr: kittyTerminals,
153+ for _, tt := range tests {
154+ t.Run(tt.name, func(t *testing.T) {
156+ got := stringext.ContainsAny(tt.s, tt.substr...)
157+ require.Equal(t, tt.want, got)