dte test coverage


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 50.0% high: ≥ 85.0%
Coverage Exec / Excl / Total
Lines: 100.0% 497 / 0 / 497
Functions: 100.0% 3 / 0 / 3
Branches: -% 0 / 0 / 0

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