dte test coverage


Directory: ./
File: test/cmdline.c
Date: 2025-07-13 15:27:15
Exec Total Coverage
Lines: 477 477 100.0%
Functions: 3 3 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 #include <stdlib.h>
2 #include "test.h"
3 #include "cmdline.h"
4 #include "commands.h"
5 #include "completion.h"
6 #include "editor.h"
7 #include "mode.h"
8
9 1 static void test_command_mode(TestContext *ctx)
10 {
11 1 EditorState *e = ctx->userdata;
12 1 CommandLine *c = &e->cmdline;
13 1 push_input_mode(e, e->command_mode);
14 1 EXPECT_PTREQ(e->mode, e->command_mode);
15
16 1 EXPECT_TRUE(handle_input(e, 'a'));
17 1 EXPECT_EQ(c->pos, 1);
18 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "a");
19
20 1 EXPECT_TRUE(handle_input(e, 0x1F999));
21 1 EXPECT_EQ(c->pos, 5);
22 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "a\xF0\x9F\xA6\x99");
23
24 1 CommandRunner runner = cmdrunner(e, &cmd_mode_commands);
25 1 EXPECT_PTREQ(runner.e, e);
26 1 EXPECT_PTREQ(runner.cmds, &cmd_mode_commands);
27 1 EXPECT_NULL(runner.lookup_alias);
28 1 EXPECT_EQ(runner.recursion_count, 0);
29 1 EXPECT_UINT_EQ(runner.flags, CMDRUNNER_EXPAND_TILDE_SLASH);
30
31 // Delete at end-of-line should do nothing
32 1 CommandRunner *r = &runner;
33 1 EXPECT_TRUE(handle_command(r, "delete"));
34 1 EXPECT_EQ(c->pos, 5);
35 1 EXPECT_EQ(c->buf.len, 5);
36
37 1 EXPECT_TRUE(handle_command(r, "erase"));
38 1 EXPECT_EQ(c->pos, 1);
39 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "a");
40
41 1 EXPECT_TRUE(handle_command(r, "erase"));
42 1 EXPECT_EQ(c->pos, 0);
43 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "");
44
45 1 cmdline_set_text(c, "word1 word2 word3 word4");
46 1 EXPECT_TRUE(handle_command(r, "eol"));
47 1 EXPECT_EQ(c->pos, 23);
48
49 1 EXPECT_TRUE(handle_command(r, "erase-word"));
50 1 EXPECT_EQ(c->pos, 18);
51 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "word1 word2 word3 ");
52
53 1 EXPECT_TRUE(handle_command(r, "erase-word"));
54 1 EXPECT_EQ(c->pos, 12);
55 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "word1 word2 ");
56
57 1 EXPECT_TRUE(handle_command(r, "word-bwd"));
58 1 EXPECT_EQ(c->pos, 6);
59
60 1 EXPECT_TRUE(handle_command(r, "word-fwd"));
61 1 EXPECT_EQ(c->pos, 12);
62
63 1 EXPECT_TRUE(handle_command(r, "bol"));
64 1 EXPECT_EQ(c->pos, 0);
65
66 1 EXPECT_TRUE(handle_command(r, "delete-word"));
67 1 EXPECT_EQ(c->pos, 0);
68 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "word2 ");
69
70 1 EXPECT_TRUE(handle_command(r, "right"));
71 1 EXPECT_EQ(c->pos, 1);
72
73 1 EXPECT_TRUE(handle_command(r, "erase-bol"));
74 1 EXPECT_EQ(c->pos, 0);
75 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "ord2 ");
76
77 1 EXPECT_TRUE(handle_command(r, "delete"));
78 1 EXPECT_EQ(c->pos, 0);
79 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "rd2 ");
80
81 1 EXPECT_TRUE(handle_command(r, "delete-eol"));
82 1 EXPECT_EQ(c->pos, 0);
83 1 EXPECT_EQ(c->buf.len, 0);
84
85 // Left at beginning-of-line should do nothing
86 1 EXPECT_TRUE(handle_command(r, "left"));
87 1 EXPECT_EQ(c->pos, 0);
88
89 1 cmdline_set_text(c, "...");
90 1 EXPECT_EQ(c->pos, 3);
91 1 EXPECT_EQ(c->buf.len, 3);
92
93 1 EXPECT_TRUE(handle_command(r, "bol"));
94 1 EXPECT_EQ(c->pos, 0);
95 1 EXPECT_EQ(c->buf.len, 3);
96
97 1 EXPECT_TRUE(handle_command(r, "right"));
98 1 EXPECT_EQ(c->pos, 1);
99
100 1 EXPECT_TRUE(handle_command(r, "word-bwd"));
101 1 EXPECT_EQ(c->pos, 0);
102
103 1 EXPECT_TRUE(handle_command(r, "eol"));
104 1 EXPECT_EQ(c->pos, 3);
105
106 1 r->flags |= CMDRUNNER_STOP_AT_FIRST_ERROR;
107 1 EXPECT_FALSE(handle_command(r, "left; invalid-cmd; bol"));
108 1 EXPECT_EQ(c->pos, 2);
109 1 r->flags &= ~CMDRUNNER_STOP_AT_FIRST_ERROR;
110
111 1 EXPECT_TRUE(handle_command(r, "cancel"));
112 1 EXPECT_EQ(c->pos, 0);
113 1 EXPECT_NULL(c->search_pos);
114 1 EXPECT_EQ(c->buf.len, 0);
115 1 EXPECT_PTREQ(e->mode, e->normal_mode);
116
117 1 string_free(&c->buf);
118 1 EXPECT_NULL(c->buf.buffer);
119 1 EXPECT_EQ(c->buf.alloc, 0);
120 1 }
121
122 #define ENV_VAR_PREFIX "D__p_tYmz3_"
123 #define ENV_VAR_NAME ENV_VAR_PREFIX "_VAR"
124
125 1 static void test_complete_command(TestContext *ctx)
126 {
127 1 EditorState *e = ctx->userdata;
128 1 CommandLine *c = &e->cmdline;
129 1 complete_command_next(e);
130 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "alias");
131 1 maybe_reset_completion(c);
132
133 1 cmdline_set_text(c, "bind C-invalidkey");
134 1 complete_command_next(e);
135 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind C-invalidkey");
136 1 reset_completion(c);
137
138 1 cmdline_set_text(c, "bind -s C-M-S-l");
139 1 complete_command_next(e);
140 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -s C-M-S-l");
141 1 reset_completion(c);
142
143 1 cmdline_set_text(c, "bind -cs ");
144 1 complete_command_next(e);
145 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -cs ");
146 1 reset_completion(c);
147
148 1 cmdline_set_text(c, "bind -c -T search ");
149 1 complete_command_next(e);
150 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -c -T search ");
151 1 reset_completion(c);
152
153 1 cmdline_set_text(c, "bind -T ");
154 1 complete_command_next(e);
155 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -T command");
156 1 reset_completion(c);
157
158 1 cmdline_set_text(c, "bind -T se");
159 1 complete_command_next(e);
160 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -T search ");
161 1 reset_completion(c);
162
163 1 cmdline_set_text(c, "def-mode ");
164 1 complete_command_next(e);
165 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "def-mode ");
166 1 reset_completion(c);
167
168 1 cmdline_set_text(c, "def-mode xyz ");
169 1 complete_command_next(e);
170 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "def-mode xyz normal ");
171 1 complete_command_next(e);
172 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "def-mode xyz normal ");
173 1 reset_completion(c);
174
175 1 cmdline_set_text(c, "mode ");
176 1 complete_command_next(e);
177 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "mode command");
178 1 complete_command_next(e);
179 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "mode normal");
180 1 complete_command_next(e);
181 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "mode search");
182 1 complete_command_next(e);
183 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "mode command");
184 1 reset_completion(c);
185
186 1 cmdline_set_text(c, "wrap");
187 1 complete_command_next(e);
188 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wrap-paragraph ");
189 1 reset_completion(c);
190
191 1 cmdline_set_text(c, "open test/data/.e");
192 1 complete_command_next(e);
193 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "open test/data/.editorconfig ");
194 1 reset_completion(c);
195
196 1 cmdline_set_text(c, "open GNUma");
197 1 complete_command_next(e);
198 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "open GNUmakefile ");
199 1 reset_completion(c);
200
201 1 cmdline_set_text(c, "wsplit -bhr test/data/.e");
202 1 complete_command_next(e);
203 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wsplit -bhr test/data/.editorconfig ");
204 1 reset_completion(c);
205
206 1 cmdline_set_text(c, "toggle ");
207 1 complete_command_next(e);
208 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "toggle auto-indent");
209 1 reset_completion(c);
210
211 1 cmdline_set_text(c, "set expand-tab f");
212 1 complete_command_next(e);
213 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set expand-tab false ");
214 1 reset_completion(c);
215
216 1 cmdline_set_text(c, "set case-sensitive-search a");
217 1 complete_command_next(e);
218 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set case-sensitive-search auto ");
219 1 reset_completion(c);
220
221 1 cmdline_set_text(c, "insert ${builtin:");
222 1 complete_command_next(e);
223 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "insert ${builtin:binding/default}");
224 1 reset_completion(c);
225
226 1 cmdline_set_text(c, "insert ${builtin:c");
227 1 complete_command_next(e);
228 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "insert ${builtin:color/darkgray}");
229 1 reset_completion(c);
230
231 1 ASSERT_EQ(setenv(ENV_VAR_NAME, "xyz", 1), 0);
232
233 1 cmdline_set_text(c, "insert $" ENV_VAR_PREFIX);
234 1 complete_command_next(e);
235 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "insert $" ENV_VAR_NAME);
236 1 reset_completion(c);
237
238 1 cmdline_set_text(c, "setenv " ENV_VAR_PREFIX);
239 1 complete_command_next(e);
240 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "setenv " ENV_VAR_NAME " ");
241 1 complete_command_next(e);
242 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "setenv " ENV_VAR_NAME " xyz ");
243 1 reset_completion(c);
244
245 1 ASSERT_EQ(unsetenv(ENV_VAR_NAME), 0);
246
247 1 cmdline_clear(c);
248 1 complete_command_prev(e);
249 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "alias");
250 1 complete_command_prev(e);
251 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wswap");
252 1 complete_command_prev(e);
253 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wsplit");
254 1 reset_completion(c);
255
256 1 cmdline_set_text(c, "hi default ");
257 1 complete_command_next(e);
258 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "hi default black");
259 1 complete_command_prev(e);
260 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "hi default yellow");
261 1 complete_command_next(e);
262 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "hi default black");
263 1 complete_command_next(e);
264 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "hi default blink");
265 1 reset_completion(c);
266
267 1 cmdline_set_text(c, "cursor i");
268 1 complete_command_next(e);
269 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor insert ");
270 1 complete_command_next(e);
271 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor insert bar");
272 1 reset_completion(c);
273
274 1 cmdline_set_text(c, "cursor default blo");
275 1 complete_command_next(e);
276 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor default block ");
277 1 complete_command_next(e);
278 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor default block #22AABB");
279 1 complete_command_next(e);
280 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor default block default");
281 1 complete_command_next(e);
282 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor default block keep");
283 1 reset_completion(c);
284
285 1 cmdline_set_text(c, "show opt");
286 1 complete_command_next(e);
287 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show option ");
288 1 complete_command_next(e);
289 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show option auto-indent");
290 1 reset_completion(c);
291
292 1 cmdline_set_text(c, "show builtin syntax/gitcom");
293 1 complete_command_next(e);
294 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show builtin syntax/gitcommit ");
295 1 reset_completion(c);
296
297 1 cmdline_set_text(c, "set ws-error tr");
298 1 complete_command_next(e);
299 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set ws-error trailing ");
300 1 reset_completion(c);
301
302 1 cmdline_set_text(c, "set ws-error special,tab-");
303 1 complete_command_next(e);
304 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set ws-error special,tab-after-indent");
305 1 complete_command_next(e);
306 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set ws-error special,tab-indent");
307 1 complete_command_next(e);
308 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set ws-error special,tab-after-indent");
309 1 reset_completion(c);
310
311 1 cmdline_set_text(c, "set esc-timeout ");
312 1 complete_command_next(e);
313 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set esc-timeout 100 ");
314 1 reset_completion(c);
315
316 1 cmdline_set_text(c, "set x y tab-b");
317 1 complete_command_next(e);
318 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set x y tab-bar ");
319 1 complete_command_next(e);
320 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set x y tab-bar true ");
321 1 reset_completion(c);
322
323 1 cmdline_set_text(c, "save -u test/data/");
324 1 complete_command_next(e);
325 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "save -u test/data/3lines.txt");
326 1 reset_completion(c);
327
328 1 cmdline_set_text(c, "include -b r");
329 1 complete_command_next(e);
330 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "include -b rc ");
331 1 reset_completion(c);
332
333 1 cmdline_set_text(c, "option gitcom");
334 1 complete_command_next(e);
335 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option gitcommit ");
336 1 complete_command_next(e);
337 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option gitcommit auto-indent");
338 1 reset_completion(c);
339
340 1 cmdline_set_text(c, "errorfmt c r ");
341 1 complete_command_next(e);
342 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt c r _");
343 1 complete_command_next(e);
344 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt c r column");
345 1 reset_completion(c);
346
347 1 cmdline_set_text(c, "ft javasc");
348 1 complete_command_next(e);
349 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "ft javascript ");
350 1 reset_completion(c);
351
352 1 cmdline_set_text(c, "macro rec");
353 1 complete_command_next(e);
354 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "macro record ");
355 1 reset_completion(c);
356
357 1 cmdline_set_text(c, "move-tab ");
358 1 complete_command_next(e);
359 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "move-tab left");
360 1 complete_command_next(e);
361 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "move-tab right");
362 1 reset_completion(c);
363
364 1 cmdline_set_text(c, "quit ");
365 1 complete_command_next(e);
366 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 0");
367 1 complete_command_next(e);
368 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 1");
369 1 reset_completion(c);
370
371 1 cmdline_set_text(c, "repeat 3 ");
372 1 complete_command_next(e);
373 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "repeat 3 alias");
374 1 reset_completion(c);
375
376 1 cmdline_set_text(c, "repeat 3 hi ");
377 1 complete_command_next(e);
378 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "repeat 3 hi activetab");
379 1 reset_completion(c);
380
381 1 cmdline_set_text(c, "left; right; word-");
382 1 complete_command_next(e);
383 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "left; right; word-bwd");
384 1 reset_completion(c);
385
386 1 cmdline_set_text(c, "replace -");
387 1 complete_command_next(e);
388 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -b");
389 1 complete_command_next(e);
390 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -c");
391 1 complete_command_next(e);
392 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -e");
393 1 complete_command_next(e);
394 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -g");
395 1 complete_command_next(e);
396 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -i");
397 1 complete_command_next(e);
398 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -b");
399 1 reset_completion(c);
400
401 1 cmdline_set_text(c, "replace -- -");
402 1 complete_command_next(e);
403 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -- -");
404 1 reset_completion(c);
405
406 1 cmdline_set_text(c, "left -c; replace -b -");
407 1 complete_command_next(e);
408 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "left -c; replace -b -c");
409 1 reset_completion(c);
410
411 1 cmdline_set_text(c, "replace -bcei -");
412 1 complete_command_next(e);
413 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -bcei -g ");
414 1 reset_completion(c);
415
416 1 cmdline_set_text(c, "replace -bcegi -");
417 1 complete_command_next(e);
418 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -bcegi -");
419 1 reset_completion(c);
420
421 1 cmdline_set_text(c, "replace -i");
422 1 complete_command_next(e);
423 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -i ");
424 1 reset_completion(c);
425
426 1 cmdline_set_text(c, "wswap -");
427 1 complete_command_next(e);
428 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wswap -");
429 1 reset_completion(c);
430
431 1 cmdline_set_text(c, "exec -");
432 1 complete_command_next(e);
433 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -e");
434 1 reset_completion(c);
435
436 1 cmdline_set_text(c, "exec -o");
437 1 complete_command_next(e);
438 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o ");
439 1 complete_command_next(e);
440 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o buffer");
441 1 complete_command_next(e);
442 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o echo");
443 1 complete_command_next(e);
444 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o eval");
445 1 reset_completion(c);
446
447 1 cmdline_set_text(c, "exec -- -");
448 1 complete_command_next(e);
449 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -- -");
450 1 reset_completion(c);
451
452 1 cmdline_set_text(c, "exec -p ls -");
453 1 complete_command_next(e);
454 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -p ls -");
455 1 reset_completion(c);
456
457 1 cmdline_set_text(c, "exec -p ls -l");
458 1 complete_command_next(e);
459 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -p ls -l");
460 1 reset_completion(c);
461
462 1 cmdline_set_text(c, "exec -s -i buffer -o buffer -");
463 1 complete_command_next(e);
464 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -s -i buffer -o buffer -e");
465 1 reset_completion(c);
466
467 1 cmdline_set_text(c, "exec -s -i buffer ls -");
468 1 complete_command_next(e);
469 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -s -i buffer ls -");
470 1 reset_completion(c);
471
472 1 cmdline_set_text(c, "replace -cg");
473 1 complete_command_next(e);
474 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -cg");
475 1 reset_completion(c);
476
477 1 cmdline_set_text(c, "left -");
478 1 complete_command_next(e);
479 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "left -c");
480 1 reset_completion(c);
481
482 1 cmdline_set_text(c, "option -");
483 1 complete_command_next(e);
484 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option -r ");
485 1 reset_completion(c);
486
487 1 cmdline_set_text(c, "quit 1 -");
488 1 complete_command_next(e);
489 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 1 -C");
490 1 reset_completion(c);
491
492 1 cmdline_set_text(c, "quit 1 2 -");
493 1 complete_command_next(e);
494 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 1 2 -");
495 1 reset_completion(c);
496
497 1 const Command *wflip = find_normal_command("wflip");
498 1 EXPECT_EQ(wflip->flags[0], '\0');
499 1 EXPECT_EQ(wflip->max_args, 0);
500
501 1 cmdline_set_text(c, "wflip ");
502 1 complete_command_next(e);
503 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wflip ");
504 1 reset_completion(c);
505
506 1 cmdline_set_text(c, "wflip -");
507 1 complete_command_next(e);
508 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wflip -");
509 1 reset_completion(c);
510
511 1 cmdline_set_text(c, "wflip -- -");
512 1 complete_command_next(e);
513 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wflip -- -");
514 1 reset_completion(c);
515 1 }
516
517 // This should only be run after init_headless_mode() because the completions
518 // depend on the buffer and default config being initialized
519 1 static void test_complete_command_extra(TestContext *ctx)
520 {
521 1 EditorState *e = ctx->userdata;
522 1 CommandLine *c = &e->cmdline;
523
524 1 cmdline_set_text(c, "alias reverse-li");
525 1 complete_command_next(e);
526 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "alias reverse-lines ");
527 1 complete_command_next(e);
528 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "alias reverse-lines 'filter tac' ");
529 1 reset_completion(c);
530
531 1 cmdline_set_text(c, "bind C-z");
532 1 complete_command_next(e);
533 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind C-z ");
534 1 complete_command_next(e);
535 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind C-z undo ");
536 1 reset_completion(c);
537
538 1 cmdline_set_text(c, "bind -s C-g");
539 1 complete_command_next(e);
540 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -s C-g ");
541 1 complete_command_next(e);
542 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -s C-g cancel ");
543 1 reset_completion(c);
544
545 1 cmdline_set_text(c, "bind -T command tab ");
546 1 complete_command_next(e);
547 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -T command tab complete-next ");
548 1 reset_completion(c);
549
550 1 cmdline_set_text(c, "bind -qc C-left ");
551 1 complete_command_next(e);
552 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -qc C-left word-bwd ");
553 1 reset_completion(c);
554
555 1 cmdline_set_text(c, "compile -1s bas");
556 1 complete_command_next(e);
557 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "compile -1s basic ");
558 1 reset_completion(c);
559
560 1 cmdline_set_text(c, "errorfmt bas");
561 1 complete_command_next(e);
562 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt basic ");
563 1 reset_completion(c);
564
565 1 cmdline_set_text(c, "errorfmt xyz '^(.*)$' m");
566 1 complete_command_next(e);
567 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt xyz '^(.*)$' message ");
568 1 reset_completion(c);
569
570 1 cmdline_set_text(c, "show bi");
571 1 complete_command_next(e);
572 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show bind ");
573 1 complete_command_next(e);
574 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show bind C-M-S-delete");
575 1 complete_command_prev(e);
576 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show bind up");
577 1 reset_completion(c);
578
579 1 cmdline_set_text(c, "show errorfmt gc");
580 1 complete_command_next(e);
581 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show errorfmt gcc ");
582 1 reset_completion(c);
583
584 1 cmdline_set_text(c, "option c expand-tab ");
585 1 complete_command_next(e);
586 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option c expand-tab true ");
587 1 reset_completion(c);
588
589 1 static const char create_files[] =
590 "run -s mkdir -p $HOME/sub;"
591 "run -s touch $HOME/file $HOME/sub/subfile;";
592
593 1 EXPECT_TRUE(handle_normal_command(e, create_files, false));
594 1 cmdline_set_text(c, "open ~/");
595 1 complete_command_next(e);
596 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "open ~/file");
597 1 complete_command_next(e);
598 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "open ~/sub/");
599 1 reset_completion(c);
600
601 1 cmdline_set_text(c, "open ~/sub/");
602 1 complete_command_next(e);
603 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "open ~/sub/subfile ");
604 1 reset_completion(c);
605 1 }
606
607 static const TestEntry tests[] = {
608 TEST(test_command_mode),
609 TEST(test_complete_command),
610 };
611
612 static const TestEntry tests_late[] = {
613 TEST(test_complete_command_extra),
614 };
615
616 const TestGroup cmdline_tests = TEST_GROUP(tests);
617 const TestGroup cmdline_tests_late = TEST_GROUP(tests_late);
618