dte test coverage


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 50.0% high: ≥ 85.0%
Coverage Exec / Excl / Total
Lines: 100.0% 493 / 0 / 493
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 1 cmdline_set_text(c, "save -u test/data/");
337 1 complete_command_next(e);
338 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "save -u test/data/3lines.txt");
339 1 reset_completion(c);
340
341 1 cmdline_set_text(c, "include -b r");
342 1 complete_command_next(e);
343 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "include -b rc ");
344 1 reset_completion(c);
345
346 1 cmdline_set_text(c, "option gitcom");
347 1 complete_command_next(e);
348 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option gitcommit ");
349 1 complete_command_next(e);
350 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option gitcommit auto-indent");
351 1 reset_completion(c);
352
353 1 cmdline_set_text(c, "errorfmt c r ");
354 1 complete_command_next(e);
355 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt c r _");
356 1 complete_command_next(e);
357 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt c r column");
358 1 reset_completion(c);
359
360 1 cmdline_set_text(c, "ft javasc");
361 1 complete_command_next(e);
362 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "ft javascript ");
363 1 reset_completion(c);
364
365 1 cmdline_set_text(c, "macro rec");
366 1 complete_command_next(e);
367 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "macro record ");
368 1 reset_completion(c);
369
370 1 cmdline_set_text(c, "move-tab ");
371 1 complete_command_next(e);
372 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "move-tab left");
373 1 complete_command_next(e);
374 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "move-tab right");
375 1 reset_completion(c);
376
377 1 cmdline_set_text(c, "quit ");
378 1 complete_command_next(e);
379 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 0");
380 1 complete_command_next(e);
381 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 1");
382 1 reset_completion(c);
383
384 1 cmdline_set_text(c, "repeat 3 ");
385 1 complete_command_next(e);
386 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "repeat 3 alias");
387 1 reset_completion(c);
388
389 1 cmdline_set_text(c, "repeat 3 hi ");
390 1 complete_command_next(e);
391 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "repeat 3 hi activetab");
392 1 reset_completion(c);
393
394 1 cmdline_set_text(c, "left; right; word-");
395 1 complete_command_next(e);
396 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "left; right; word-bwd");
397 1 reset_completion(c);
398
399 1 cmdline_set_text(c, "replace -");
400 1 complete_command_next(e);
401 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -b");
402 1 complete_command_next(e);
403 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -c");
404 1 complete_command_next(e);
405 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -e");
406 1 complete_command_next(e);
407 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -g");
408 1 complete_command_next(e);
409 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -i");
410 1 complete_command_next(e);
411 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -b");
412 1 reset_completion(c);
413
414 1 cmdline_set_text(c, "replace -- -");
415 1 complete_command_next(e);
416 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -- -");
417 1 reset_completion(c);
418
419 1 cmdline_set_text(c, "left -c; replace -b -");
420 1 complete_command_next(e);
421 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "left -c; replace -b -c");
422 1 reset_completion(c);
423
424 1 cmdline_set_text(c, "replace -bcei -");
425 1 complete_command_next(e);
426 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -bcei -g ");
427 1 reset_completion(c);
428
429 1 cmdline_set_text(c, "replace -bcegi -");
430 1 complete_command_next(e);
431 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -bcegi -");
432 1 reset_completion(c);
433
434 1 cmdline_set_text(c, "replace -i");
435 1 complete_command_next(e);
436 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -i ");
437 1 reset_completion(c);
438
439 1 cmdline_set_text(c, "wswap -");
440 1 complete_command_next(e);
441 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wswap -");
442 1 reset_completion(c);
443
444 1 cmdline_set_text(c, "exec -");
445 1 complete_command_next(e);
446 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -e");
447 1 reset_completion(c);
448
449 1 cmdline_set_text(c, "exec -o");
450 1 complete_command_next(e);
451 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o ");
452 1 complete_command_next(e);
453 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o buffer");
454 1 complete_command_next(e);
455 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o echo");
456 1 complete_command_next(e);
457 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -o eval");
458 1 reset_completion(c);
459
460 1 cmdline_set_text(c, "exec -- -");
461 1 complete_command_next(e);
462 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -- -");
463 1 reset_completion(c);
464
465 1 cmdline_set_text(c, "exec -p ls -");
466 1 complete_command_next(e);
467 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -p ls -");
468 1 reset_completion(c);
469
470 1 cmdline_set_text(c, "exec -p ls -l");
471 1 complete_command_next(e);
472 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -p ls -l");
473 1 reset_completion(c);
474
475 1 cmdline_set_text(c, "exec -s -i buffer -o buffer -");
476 1 complete_command_next(e);
477 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -s -i buffer -o buffer -e");
478 1 reset_completion(c);
479
480 1 cmdline_set_text(c, "exec -s -i buffer ls -");
481 1 complete_command_next(e);
482 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "exec -s -i buffer ls -");
483 1 reset_completion(c);
484
485 1 cmdline_set_text(c, "replace -cg");
486 1 complete_command_next(e);
487 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "replace -cg");
488 1 reset_completion(c);
489
490 1 cmdline_set_text(c, "left -");
491 1 complete_command_next(e);
492 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "left -c");
493 1 reset_completion(c);
494
495 1 cmdline_set_text(c, "option -");
496 1 complete_command_next(e);
497 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option -r ");
498 1 reset_completion(c);
499
500 1 cmdline_set_text(c, "quit 1 -");
501 1 complete_command_next(e);
502 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 1 -C");
503 1 reset_completion(c);
504
505 1 cmdline_set_text(c, "quit 1 2 -");
506 1 complete_command_next(e);
507 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "quit 1 2 -");
508 1 reset_completion(c);
509
510 1 const Command *wflip = find_normal_command("wflip");
511 1 EXPECT_EQ(wflip->flags[0], '\0');
512 1 EXPECT_EQ(wflip->max_args, 0);
513
514 1 cmdline_set_text(c, "wflip ");
515 1 complete_command_next(e);
516 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wflip ");
517 1 reset_completion(c);
518
519 1 cmdline_set_text(c, "wflip -");
520 1 complete_command_next(e);
521 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wflip -");
522 1 reset_completion(c);
523
524 1 cmdline_set_text(c, "wflip -- -");
525 1 complete_command_next(e);
526 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "wflip -- -");
527 1 reset_completion(c);
528 1 }
529
530 // This should only be run after init_headless_mode() because the completions
531 // depend on the buffer and default config being initialized
532 1 static void test_complete_command_extra(TestContext *ctx)
533 {
534 1 EditorState *e = ctx->userdata;
535 1 CommandLine *c = &e->cmdline;
536
537 1 cmdline_set_text(c, "alias reverse-li");
538 1 complete_command_next(e);
539 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "alias reverse-lines ");
540 1 complete_command_next(e);
541 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--]}'\" ");
542 1 reset_completion(c);
543
544 1 cmdline_set_text(c, "bind C-z");
545 1 complete_command_next(e);
546 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind C-z ");
547 1 complete_command_next(e);
548 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind C-z undo ");
549 1 reset_completion(c);
550
551 1 cmdline_set_text(c, "bind -s C-g");
552 1 complete_command_next(e);
553 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -s C-g ");
554 1 complete_command_next(e);
555 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -s C-g cancel ");
556 1 reset_completion(c);
557
558 1 cmdline_set_text(c, "bind -T command tab ");
559 1 complete_command_next(e);
560 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -T command tab complete-next ");
561 1 reset_completion(c);
562
563 1 cmdline_set_text(c, "bind -qc C-left ");
564 1 complete_command_next(e);
565 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "bind -qc C-left word-bwd ");
566 1 reset_completion(c);
567
568 1 cmdline_set_text(c, "compile -1s bas");
569 1 complete_command_next(e);
570 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "compile -1s basic ");
571 1 reset_completion(c);
572
573 1 cmdline_set_text(c, "errorfmt bas");
574 1 complete_command_next(e);
575 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt basic ");
576 1 reset_completion(c);
577
578 1 cmdline_set_text(c, "errorfmt xyz '^(.*)$' m");
579 1 complete_command_next(e);
580 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "errorfmt xyz '^(.*)$' message ");
581 1 reset_completion(c);
582
583 1 cmdline_set_text(c, "show bi");
584 1 complete_command_next(e);
585 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show bind ");
586 1 complete_command_next(e);
587 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show bind C-M-S-delete");
588 1 complete_command_prev(e);
589 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show bind up");
590 1 reset_completion(c);
591
592 1 cmdline_set_text(c, "show errorfmt gc");
593 1 complete_command_next(e);
594 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "show errorfmt gcc ");
595 1 reset_completion(c);
596
597 1 cmdline_set_text(c, "option c expand-tab ");
598 1 complete_command_next(e);
599 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option c expand-tab false");
600 1 complete_command_next(e);
601 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option c expand-tab true");
602 1 complete_command_next(e);
603 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "option c expand-tab false");
604 1 reset_completion(c);
605
606 1 static const char create_files[] =
607 "run -s mkdir -p $HOME/sub;"
608 "run -s touch $HOME/file $HOME/sub/subfile;";
609
610 1 EXPECT_TRUE(handle_normal_command(e, create_files, false));
611 1 cmdline_set_text(c, "open ~/");
612 1 complete_command_next(e);
613 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "open ~/file");
614 1 complete_command_next(e);
615 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "open ~/sub/");
616 1 reset_completion(c);
617
618 1 cmdline_set_text(c, "open ~/sub/");
619 1 complete_command_next(e);
620 1 EXPECT_STRING_EQ_CSTRING(&c->buf, "open ~/sub/subfile ");
621 1 reset_completion(c);
622 1 }
623
624 static const TestEntry tests[] = {
625 TEST(test_command_mode),
626 TEST(test_complete_command),
627 };
628
629 static const TestEntry tests_late[] = {
630 TEST(test_complete_command_extra),
631 };
632
633 const TestGroup cmdline_tests = TEST_GROUP(tests);
634 const TestGroup cmdline_tests_late = TEST_GROUP(tests_late);
635