1package config
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/assert"
7 "github.com/stretchr/testify/require"
8)
9
10func TestTransformLegacyActions_SliceFormat(t *testing.T) {
11 transformer := NewLegacyConfigTransformer()
12
13 rawConfig := map[string]any{
14 "workspace": map[string]any{
15 "pane_mode": map[string]any{
16 "actions": map[string]any{
17 "focus-left": []any{"h", "arrowleft"},
18 },
19 },
20 },
21 }
22
23 transformer.TransformLegacyActions(rawConfig)
24
25 actions := rawConfig["workspace"].(map[string]any)["pane_mode"].(map[string]any)["actions"].(map[string]any)
26 binding, ok := actions["focus-left"].(map[string]any)
27 require.True(t, ok, "should be converted to map")
28
29 keys, ok := binding["keys"].([]string)
30 require.True(t, ok, "keys should be []string")
31 assert.Equal(t, []string{"h", "arrowleft"}, keys)
32 assert.NotEmpty(t, binding["desc"], "should have description from defaults")
33}
34
35func TestTransformLegacyActions_AllModes(t *testing.T) {
36 transformer := NewLegacyConfigTransformer()
37
38 rawConfig := map[string]any{
39 "workspace": map[string]any{
40 "pane_mode": map[string]any{
41 "actions": map[string]any{
42 "focus-left": []any{"h"},
43 },
44 },
45 "tab_mode": map[string]any{
46 "actions": map[string]any{
47 "next-tab": []any{"l"},
48 },
49 },
50 "resize_mode": map[string]any{
51 "actions": map[string]any{
52 "resize-increase": []any{"+"},
53 },
54 },
55 "shortcuts": map[string]any{
56 "actions": map[string]any{
57 "close_pane": []any{"ctrl+w"},
58 },
59 },
60 },
61 "session": map[string]any{
62 "session_mode": map[string]any{
63 "actions": map[string]any{
64 "session-manager": []any{"m"},
65 },
66 },
67 },
68 }
69
70 transformer.TransformLegacyActions(rawConfig)
71
72 // Check pane mode
73 paneActions := rawConfig["workspace"].(map[string]any)["pane_mode"].(map[string]any)["actions"].(map[string]any)
74 paneFocus, ok := paneActions["focus-left"].(map[string]any)
75 require.True(t, ok)
76 assert.Equal(t, []string{"h"}, paneFocus["keys"])
77
78 // Check tab mode
79 tabActions := rawConfig["workspace"].(map[string]any)["tab_mode"].(map[string]any)["actions"].(map[string]any)
80 tabNext, ok := tabActions["next-tab"].(map[string]any)
81 require.True(t, ok)
82 assert.Equal(t, []string{"l"}, tabNext["keys"])
83
84 // Check resize mode
85 resizeActions := rawConfig["workspace"].(map[string]any)["resize_mode"].(map[string]any)["actions"].(map[string]any)
86 resizeInc, ok := resizeActions["resize-increase"].(map[string]any)
87 require.True(t, ok)
88 assert.Equal(t, []string{"+"}, resizeInc["keys"])
89
90 // Check shortcuts
91 shortcutActions := rawConfig["workspace"].(map[string]any)["shortcuts"].(map[string]any)["actions"].(map[string]any)
92 closePane, ok := shortcutActions["close_pane"].(map[string]any)
93 require.True(t, ok)
94 assert.Equal(t, []string{"ctrl+w"}, closePane["keys"])
95
96 // Check session mode
97 sessionActions := rawConfig["session"].(map[string]any)["session_mode"].(map[string]any)["actions"].(map[string]any)
98 sessionMgr, ok := sessionActions["session-manager"].(map[string]any)
99 require.True(t, ok)
100 assert.Equal(t, []string{"m"}, sessionMgr["keys"])
101}
102
103func TestTransformLegacyActions_AlreadyNewFormat(t *testing.T) {
104 transformer := NewLegacyConfigTransformer()
105
106 rawConfig := map[string]any{
107 "workspace": map[string]any{
108 "pane_mode": map[string]any{
109 "actions": map[string]any{
110 "focus-left": map[string]any{
111 "keys": []string{"h"},
112 "desc": "Custom description",
113 },
114 },
115 },
116 },
117 }
118
119 transformer.TransformLegacyActions(rawConfig)
120
121 actions := rawConfig["workspace"].(map[string]any)["pane_mode"].(map[string]any)["actions"].(map[string]any)
122 binding := actions["focus-left"].(map[string]any)
123
124 // Should remain unchanged
125 assert.Equal(t, "Custom description", binding["desc"])
126}
127
128func TestTransformLegacyActions_MissingSection(t *testing.T) {
129 transformer := NewLegacyConfigTransformer()
130
131 rawConfig := map[string]any{
132 "appearance": map[string]any{
133 "theme": "dark",
134 },
135 }
136
137 // Should not panic
138 transformer.TransformLegacyActions(rawConfig)
139
140 // Config should be unchanged
141 assert.Equal(t, "dark", rawConfig["appearance"].(map[string]any)["theme"])
142}
143
144func TestTransformLegacyActions_EmptyConfig(t *testing.T) {
145 transformer := NewLegacyConfigTransformer()
146
147 rawConfig := map[string]any{}
148
149 // Should not panic
150 transformer.TransformLegacyActions(rawConfig)
151
152 assert.Empty(t, rawConfig)
153}
154
155func TestTransformLegacyActions_PartialPath(t *testing.T) {
156 transformer := NewLegacyConfigTransformer()
157
158 rawConfig := map[string]any{
159 "workspace": map[string]any{
160 "pane_mode": map[string]any{
161 // actions section missing
162 },
163 },
164 }
165
166 // Should not panic
167 transformer.TransformLegacyActions(rawConfig)
168
169 // Verify config is unchanged
170 require.NotNil(t, rawConfig["workspace"])
171}
172
173func TestTransformLegacyEngineConfig_RemovesDeprecatedContextMenuHandler(t *testing.T) {
174 transformer := NewLegacyConfigTransformer()
175
176 rawConfig := map[string]any{
177 "engine": map[string]any{
178 "cef": map[string]any{
179 "enable_context_menu_handler": true,
180 },
181 },
182 }
183
184 transformer.TransformLegacyEngineConfig(rawConfig)
185
186 cef := rawConfig["engine"].(map[string]any)["cef"].(map[string]any)
187 _, exists := cef["enable_context_menu_handler"]
188 assert.False(t, exists)
189}
190
191func TestTransformLegacyEngineConfig_MigratesLegacyCEFWindowlessFrameRateDefault(t *testing.T) {
192 transformer := NewLegacyConfigTransformer()
193 rawConfig := map[string]any{
194 "engine": map[string]any{
195 "cef": map[string]any{
196 "windowless_frame_rate": 60,
197 },
198 },
199 }
200
201 transformer.TransformLegacyEngineConfig(rawConfig)
202
203 cef := rawConfig["engine"].(map[string]any)["cef"].(map[string]any)
204 assert.Equal(t, true, cef["adaptive_windowless_frame_rate"])
205 assert.Equal(t, 0, cef["windowless_frame_rate"])
206 assert.Equal(t, defaultCEFWindowlessFrameRateMax, cef["windowless_frame_rate_max"])
207}
208
209func TestTransformLegacyEngineConfig_PreservesExplicitCEFWindowlessFrameRate(t *testing.T) {
210 transformer := NewLegacyConfigTransformer()
211 rawConfig := map[string]any{
212 "engine": map[string]any{
213 "cef": map[string]any{
214 "adaptive_windowless_frame_rate": false,
215 "windowless_frame_rate": 60,
216 },
217 },
218 }
219
220 transformer.TransformLegacyEngineConfig(rawConfig)
221
222 cef := rawConfig["engine"].(map[string]any)["cef"].(map[string]any)
223 assert.Equal(t, false, cef["adaptive_windowless_frame_rate"])
224 assert.Equal(t, 60, cef["windowless_frame_rate"])
225 _, hasMax := cef["windowless_frame_rate_max"]
226 assert.False(t, hasMax)
227}
228
229func TestTransformLegacyEngineConfig_PreservesNonDefaultCEFWindowlessFrameRate(t *testing.T) {
230 transformer := NewLegacyConfigTransformer()
231 rawConfig := map[string]any{
232 "engine": map[string]any{
233 "cef": map[string]any{
234 "windowless_frame_rate": 144,
235 },
236 },
237 }
238
239 transformer.TransformLegacyEngineConfig(rawConfig)
240
241 cef := rawConfig["engine"].(map[string]any)["cef"].(map[string]any)
242 _, hasAdaptive := cef["adaptive_windowless_frame_rate"]
243 assert.False(t, hasAdaptive)
244 assert.Equal(t, 144, cef["windowless_frame_rate"])
245}
246
247func TestTransformLegacyEngineConfig_MissingCefSection(t *testing.T) {
248 transformer := NewLegacyConfigTransformer()
249 rawConfig := map[string]any{
250 "engine": map[string]any{
251 "webkit": map[string]any{"enabled": true},
252 },
253 }
254
255 transformer.TransformLegacyEngineConfig(rawConfig)
256
257 engine, ok := rawConfig["engine"].(map[string]any)
258 require.True(t, ok)
259 assert.NotNil(t, engine)
260 assert.Equal(t, true, engine["webkit"].(map[string]any)["enabled"])
261}
262
263func TestTransformLegacyEngineConfig_MissingContextMenuHandlerKey(t *testing.T) {
264 transformer := NewLegacyConfigTransformer()
265 rawConfig := map[string]any{
266 "engine": map[string]any{
267 "cef": map[string]any{
268 "other_setting": true,
269 },
270 },
271 }
272
273 transformer.TransformLegacyEngineConfig(rawConfig)
274
275 cef := rawConfig["engine"].(map[string]any)["cef"].(map[string]any)
276 assert.True(t, cef["other_setting"].(bool))
277 _, exists := cef["enable_context_menu_handler"]
278 assert.False(t, exists)
279}
280
281func TestTransformLegacyEngineConfig_NonMapEngineSection(t *testing.T) {
282 transformer := NewLegacyConfigTransformer()
283 rawConfig := map[string]any{
284 "engine": "invalid",
285 }
286
287 transformer.TransformLegacyEngineConfig(rawConfig)
288
289 assert.Equal(t, "invalid", rawConfig["engine"])
290}
291
292func TestTransformLegacyActions_UnknownAction(t *testing.T) {
293 transformer := NewLegacyConfigTransformer()
294
295 rawConfig := map[string]any{
296 "workspace": map[string]any{
297 "pane_mode": map[string]any{
298 "actions": map[string]any{
299 "unknown-action": []any{"x"},
300 },
301 },
302 },
303 }
304
305 transformer.TransformLegacyActions(rawConfig)
306
307 actions := rawConfig["workspace"].(map[string]any)["pane_mode"].(map[string]any)["actions"].(map[string]any)
308 binding, ok := actions["unknown-action"].(map[string]any)
309 require.True(t, ok)
310 assert.Equal(t, []string{"x"}, binding["keys"])
311 assert.Empty(t, binding["desc"], "unknown action should have empty description")
312}