dte test coverage


Directory: ./
File: test/cmdline.c
Date: 2025-07-03 15:44:24
Exec Total Coverage
Lines: 469 469 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 ASSERT_EQ(setenv(ENV_VAR_NAME, "xyz", 1), 0);
222
223 1 cmdline_set_text(c, "insert $" ENV_VAR_PREFIX);
224 1 complete_command_next(e);
225 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "insert $" ENV_VAR_NAME);
226 1 reset_completion(c);
227
228 1 cmdline_set_text(c, "setenv " ENV_VAR_PREFIX);
229 1 complete_command_next(e);
230 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "setenv " ENV_VAR_NAME " ");
231 1 complete_command_next(e);
232 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "setenv " ENV_VAR_NAME " xyz ");
233 1 reset_completion(c);
234
235 1 ASSERT_EQ(unsetenv(ENV_VAR_NAME), 0);
236
237 1 cmdline_clear(c);
238 1 complete_command_prev(e);
239 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "alias");
240 1 complete_command_prev(e);
241 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wswap");
242 1 complete_command_prev(e);
243 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wsplit");
244 1 reset_completion(c);
245
246 1 cmdline_set_text(c, "hi default ");
247 1 complete_command_next(e);
248 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "hi default black");
249 1 complete_command_prev(e);
250 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "hi default yellow");
251 1 complete_command_next(e);
252 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "hi default black");
253 1 complete_command_next(e);
254 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "hi default blink");
255 1 reset_completion(c);
256
257 1 cmdline_set_text(c, "cursor i");
258 1 complete_command_next(e);
259 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor insert ");
260 1 complete_command_next(e);
261 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor insert bar");
262 1 reset_completion(c);
263
264 1 cmdline_set_text(c, "cursor default blo");
265 1 complete_command_next(e);
266 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor default block ");
267 1 complete_command_next(e);
268 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor default block #22AABB");
269 1 complete_command_next(e);
270 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor default block default");
271 1 complete_command_next(e);
272 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "cursor default block keep");
273 1 reset_completion(c);
274
275 1 cmdline_set_text(c, "show opt");
276 1 complete_command_next(e);
277 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show option ");
278 1 complete_command_next(e);
279 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show option auto-indent");
280 1 reset_completion(c);
281
282 1 cmdline_set_text(c, "show builtin syntax/gitcom");
283 1 complete_command_next(e);
284 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show builtin syntax/gitcommit ");
285 1 reset_completion(c);
286
287 1 cmdline_set_text(c, "set ws-error tr");
288 1 complete_command_next(e);
289 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set ws-error trailing ");
290 1 reset_completion(c);
291
292 1 cmdline_set_text(c, "set ws-error special,tab-");
293 1 complete_command_next(e);
294 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set ws-error special,tab-after-indent");
295 1 complete_command_next(e);
296 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set ws-error special,tab-indent");
297 1 complete_command_next(e);
298 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set ws-error special,tab-after-indent");
299 1 reset_completion(c);
300
301 1 cmdline_set_text(c, "set esc-timeout ");
302 1 complete_command_next(e);
303 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set esc-timeout 100 ");
304 1 reset_completion(c);
305
306 1 cmdline_set_text(c, "set x y tab-b");
307 1 complete_command_next(e);
308 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set x y tab-bar ");
309 1 complete_command_next(e);
310 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "set x y tab-bar true ");
311 1 reset_completion(c);
312
313 1 cmdline_set_text(c, "save -u test/data/");
314 1 complete_command_next(e);
315 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "save -u test/data/3lines.txt");
316 1 reset_completion(c);
317
318 1 cmdline_set_text(c, "include -b r");
319 1 complete_command_next(e);
320 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "include -b rc ");
321 1 reset_completion(c);
322
323 1 cmdline_set_text(c, "option gitcom");
324 1 complete_command_next(e);
325 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option gitcommit ");
326 1 complete_command_next(e);
327 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option gitcommit auto-indent");
328 1 reset_completion(c);
329
330 1 cmdline_set_text(c, "errorfmt c r ");
331 1 complete_command_next(e);
332 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt c r _");
333 1 complete_command_next(e);
334 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt c r column");
335 1 reset_completion(c);
336
337 1 cmdline_set_text(c, "ft javasc");
338 1 complete_command_next(e);
339 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "ft javascript ");
340 1 reset_completion(c);
341
342 1 cmdline_set_text(c, "macro rec");
343 1 complete_command_next(e);
344 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "macro record ");
345 1 reset_completion(c);
346
347 1 cmdline_set_text(c, "move-tab ");
348 1 complete_command_next(e);
349 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "move-tab left");
350 1 complete_command_next(e);
351 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "move-tab right");
352 1 reset_completion(c);
353
354 1 cmdline_set_text(c, "quit ");
355 1 complete_command_next(e);
356 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 0");
357 1 complete_command_next(e);
358 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 1");
359 1 reset_completion(c);
360
361 1 cmdline_set_text(c, "repeat 3 ");
362 1 complete_command_next(e);
363 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "repeat 3 alias");
364 1 reset_completion(c);
365
366 1 cmdline_set_text(c, "repeat 3 hi ");
367 1 complete_command_next(e);
368 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "repeat 3 hi activetab");
369 1 reset_completion(c);
370
371 1 cmdline_set_text(c, "left; right; word-");
372 1 complete_command_next(e);
373 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "left; right; word-bwd");
374 1 reset_completion(c);
375
376 1 cmdline_set_text(c, "replace -");
377 1 complete_command_next(e);
378 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -b");
379 1 complete_command_next(e);
380 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -c");
381 1 complete_command_next(e);
382 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -e");
383 1 complete_command_next(e);
384 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -g");
385 1 complete_command_next(e);
386 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -i");
387 1 complete_command_next(e);
388 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -b");
389 1 reset_completion(c);
390
391 1 cmdline_set_text(c, "replace -- -");
392 1 complete_command_next(e);
393 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -- -");
394 1 reset_completion(c);
395
396 1 cmdline_set_text(c, "left -c; replace -b -");
397 1 complete_command_next(e);
398 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "left -c; replace -b -c");
399 1 reset_completion(c);
400
401 1 cmdline_set_text(c, "replace -bcei -");
402 1 complete_command_next(e);
403 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -bcei -g ");
404 1 reset_completion(c);
405
406 1 cmdline_set_text(c, "replace -bcegi -");
407 1 complete_command_next(e);
408 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -bcegi -");
409 1 reset_completion(c);
410
411 1 cmdline_set_text(c, "replace -i");
412 1 complete_command_next(e);
413 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -i ");
414 1 reset_completion(c);
415
416 1 cmdline_set_text(c, "wswap -");
417 1 complete_command_next(e);
418 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wswap -");
419 1 reset_completion(c);
420
421 1 cmdline_set_text(c, "exec -");
422 1 complete_command_next(e);
423 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -b");
424 1 reset_completion(c);
425
426 1 cmdline_set_text(c, "exec -o");
427 1 complete_command_next(e);
428 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o ");
429 1 complete_command_next(e);
430 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o buffer");
431 1 complete_command_next(e);
432 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o echo");
433 1 complete_command_next(e);
434 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o eval");
435 1 reset_completion(c);
436
437 1 cmdline_set_text(c, "exec -- -");
438 1 complete_command_next(e);
439 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -- -");
440 1 reset_completion(c);
441
442 1 cmdline_set_text(c, "exec -p ls -");
443 1 complete_command_next(e);
444 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -p ls -");
445 1 reset_completion(c);
446
447 1 cmdline_set_text(c, "exec -p ls -l");
448 1 complete_command_next(e);
449 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -p ls -l");
450 1 reset_completion(c);
451
452 1 cmdline_set_text(c, "exec -s -i buffer -o buffer -");
453 1 complete_command_next(e);
454 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -s -i buffer -o buffer -b");
455 1 reset_completion(c);
456
457 1 cmdline_set_text(c, "exec -s -i buffer ls -");
458 1 complete_command_next(e);
459 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -s -i buffer ls -");
460 1 reset_completion(c);
461
462 1 cmdline_set_text(c, "replace -cg");
463 1 complete_command_next(e);
464 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -cg");
465 1 reset_completion(c);
466
467 1 cmdline_set_text(c, "left -");
468 1 complete_command_next(e);
469 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "left -c");
470 1 reset_completion(c);
471
472 1 cmdline_set_text(c, "option -");
473 1 complete_command_next(e);
474 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option -r ");
475 1 reset_completion(c);
476
477 1 cmdline_set_text(c, "quit 1 -");
478 1 complete_command_next(e);
479 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 1 -C");
480 1 reset_completion(c);
481
482 1 cmdline_set_text(c, "quit 1 2 -");
483 1 complete_command_next(e);
484 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 1 2 -");
485 1 reset_completion(c);
486
487 1 const Command *wflip = find_normal_command("wflip");
488 1 EXPECT_EQ(wflip->flags[0], '\0');
489 1 EXPECT_EQ(wflip->max_args, 0);
490
491 1 cmdline_set_text(c, "wflip ");
492 1 complete_command_next(e);
493 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wflip ");
494 1 reset_completion(c);
495
496 1 cmdline_set_text(c, "wflip -");
497 1 complete_command_next(e);
498 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wflip -");
499 1 reset_completion(c);
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 1 }
506
507 // This should only be run after init_headless_mode() because the completions
508 // depend on the buffer and default config being initialized
509 1 static void test_complete_command_extra(TestContext *ctx)
510 {
511 1 EditorState *e = ctx->userdata;
512 1 CommandLine *c = &e->cmdline;
513
514 1 cmdline_set_text(c, "alias reverse-li");
515 1 complete_command_next(e);
516 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "alias reverse-lines ");
517 1 complete_command_next(e);
518 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "alias reverse-lines 'filter tac' ");
519 1 reset_completion(c);
520
521 1 cmdline_set_text(c, "bind C-z");
522 1 complete_command_next(e);
523 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind C-z ");
524 1 complete_command_next(e);
525 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind C-z undo ");
526 1 reset_completion(c);
527
528 1 cmdline_set_text(c, "bind -s C-g");
529 1 complete_command_next(e);
530 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -s C-g ");
531 1 complete_command_next(e);
532 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -s C-g cancel ");
533 1 reset_completion(c);
534
535 1 cmdline_set_text(c, "bind -T command tab ");
536 1 complete_command_next(e);
537 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -T command tab complete-next ");
538 1 reset_completion(c);
539
540 1 cmdline_set_text(c, "bind -qc C-left ");
541 1 complete_command_next(e);
542 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -qc C-left word-bwd ");
543 1 reset_completion(c);
544
545 1 cmdline_set_text(c, "compile -1s bas");
546 1 complete_command_next(e);
547 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "compile -1s basic ");
548 1 reset_completion(c);
549
550 1 cmdline_set_text(c, "errorfmt bas");
551 1 complete_command_next(e);
552 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt basic ");
553 1 reset_completion(c);
554
555 1 cmdline_set_text(c, "errorfmt xyz '^(.*)$' m");
556 1 complete_command_next(e);
557 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt xyz '^(.*)$' message ");
558 1 reset_completion(c);
559
560 1 cmdline_set_text(c, "show bi");
561 1 complete_command_next(e);
562 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show bind ");
563 1 complete_command_next(e);
564 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show bind C-M-S-delete");
565 1 complete_command_prev(e);
566 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show bind up");
567 1 reset_completion(c);
568
569 1 cmdline_set_text(c, "show errorfmt gc");
570 1 complete_command_next(e);
571 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show errorfmt gcc ");
572 1 reset_completion(c);
573
574 1 cmdline_set_text(c, "option c expand-tab ");
575 1 complete_command_next(e);
576 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option c expand-tab true ");
577 1 reset_completion(c);
578
579 1 static const char create_files[] =
580 "run -s mkdir -p $HOME/sub;"
581 "run -s touch $HOME/file $HOME/sub/subfile;";
582
583 1 EXPECT_TRUE(handle_normal_command(e, create_files, false));
584 1 cmdline_set_text(c, "open ~/");
585 1 complete_command_next(e);
586 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "open ~/file");
587 1 complete_command_next(e);
588 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "open ~/sub/");
589 1 reset_completion(c);
590
591 1 cmdline_set_text(c, "open ~/sub/");
592 1 complete_command_next(e);
593 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "open ~/sub/subfile ");
594 1 reset_completion(c);
595 1 }
596
597 static const TestEntry tests[] = {
598 TEST(test_command_mode),
599 TEST(test_complete_command),
600 };
601
602 static const TestEntry tests_late[] = {
603 TEST(test_complete_command_extra),
604 };
605
606 const TestGroup cmdline_tests = TEST_GROUP(tests);
607 const TestGroup cmdline_tests_late = TEST_GROUP(tests_late);
608