1 #include <stic.h>
2
3 #include <stddef.h> /* NULL */
4 #include <stdio.h> /* snprintf() */
5 #include <string.h> /* strcpy() */
6
7 #include <stubs.h>
8 #include <test-utils.h>
9
10 #include "../../src/cfg/config.h"
11 #include "../../src/engine/keys.h"
12 #include "../../src/modes/modes.h"
13 #include "../../src/modes/view.h"
14 #include "../../src/modes/wk.h"
15 #include "../../src/ui/color_scheme.h"
16 #include "../../src/ui/tabs.h"
17 #include "../../src/ui/ui.h"
18 #include "../../src/utils/fs.h"
19 #include "../../src/cmd_core.h"
20 #include "../../src/compare.h"
21 #include "../../src/filelist.h"
22 #include "../../src/status.h"
23
SETUP()24 SETUP()
25 {
26 view_setup(&lwin);
27 setup_grid(&lwin, 1, 1, 1);
28 curr_view = &lwin;
29 view_setup(&rwin);
30 setup_grid(&rwin, 1, 1, 1);
31 other_view = &rwin;
32
33 init_modes();
34
35 opt_handlers_setup();
36
37 columns_setup_column(SK_BY_NAME);
38 columns_setup_column(SK_BY_SIZE);
39
40 init_commands();
41 }
42
TEARDOWN()43 TEARDOWN()
44 {
45 vle_cmds_reset();
46
47 tabs_only(&lwin);
48 tabs_only(&rwin);
49 cfg.pane_tabs = 0;
50 tabs_only(&lwin);
51
52 vle_keys_reset();
53
54 opt_handlers_teardown();
55
56 view_teardown(&lwin);
57 view_teardown(&rwin);
58
59 columns_teardown();
60 }
61
TEST(tab_is_created_without_name)62 TEST(tab_is_created_without_name)
63 {
64 tab_info_t tab_info;
65
66 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
67 assert_int_equal(2, tabs_count(&lwin));
68
69 assert_true(tabs_get(&lwin, 1, &tab_info));
70 assert_string_equal(NULL, tab_info.name);
71 }
72
TEST(tab_is_not_created_on_wrong_path)73 TEST(tab_is_not_created_on_wrong_path)
74 {
75 char cwd[PATH_MAX + 1];
76 assert_non_null(get_cwd(cwd, sizeof(cwd)));
77 make_abs_path(lwin.curr_dir, sizeof(lwin.curr_dir), TEST_DATA_PATH, "", cwd);
78
79 (void)exec_commands("tabnew no-such-subdir", &lwin, CIT_COMMAND);
80 assert_int_equal(1, tabs_count(&lwin));
81
82 tab_info_t tab_info;
83 assert_true(tabs_get(&lwin, 0, &tab_info));
84 assert_true(paths_are_same(lwin.curr_dir, TEST_DATA_PATH));
85 }
86
TEST(tab_in_path_is_created)87 TEST(tab_in_path_is_created)
88 {
89 char cwd[PATH_MAX + 1];
90 assert_non_null(get_cwd(cwd, sizeof(cwd)));
91
92 char test_data[PATH_MAX + 1];
93 make_abs_path(test_data, sizeof(test_data), TEST_DATA_PATH, "", cwd);
94
95 strcpy(lwin.curr_dir, test_data);
96
97 assert_success(exec_commands("tabnew read", &lwin, CIT_COMMAND));
98 assert_int_equal(2, tabs_count(&lwin));
99
100 tab_info_t tab_info;
101 assert_true(tabs_get(&lwin, 1, &tab_info));
102
103 char read_data[PATH_MAX + 1];
104 snprintf(read_data, sizeof(read_data), "%s/read", test_data);
105 assert_true(paths_are_same(lwin.curr_dir, read_data));
106 }
107
TEST(tab_in_parent_is_created)108 TEST(tab_in_parent_is_created)
109 {
110 char cwd[PATH_MAX + 1];
111 assert_non_null(get_cwd(cwd, sizeof(cwd)));
112
113 char test_data[PATH_MAX + 1];
114 make_abs_path(test_data, sizeof(test_data), TEST_DATA_PATH, "", cwd);
115
116 snprintf(lwin.curr_dir, sizeof(lwin.curr_dir), "%s/read", test_data);
117
118 assert_success(exec_commands("tabnew ..", &lwin, CIT_COMMAND));
119 assert_int_equal(2, tabs_count(&lwin));
120
121 tab_info_t tab_info;
122 assert_true(tabs_get(&lwin, 1, &tab_info));
123
124 assert_true(paths_are_same(lwin.curr_dir, test_data));
125 }
126
TEST(newtab_fails_in_diff_mode_for_tab_panes)127 TEST(newtab_fails_in_diff_mode_for_tab_panes)
128 {
129 strcpy(lwin.curr_dir, TEST_DATA_PATH "/compare/a");
130 strcpy(rwin.curr_dir, TEST_DATA_PATH "/compare/b");
131
132 cfg.pane_tabs = 1;
133 (void)compare_two_panes(CT_CONTENTS, LT_ALL, 1, 0);
134 assert_failure(exec_commands("tabnew", &lwin, CIT_COMMAND));
135 assert_int_equal(1, tabs_count(&lwin));
136 }
137
TEST(tab_name_is_set)138 TEST(tab_name_is_set)
139 {
140 tab_info_t tab_info;
141
142 assert_success(exec_commands("tabname new-name", &lwin, CIT_COMMAND));
143
144 assert_true(tabs_get(&lwin, 0, &tab_info));
145 assert_string_equal("new-name", tab_info.name);
146 }
147
TEST(tab_name_is_reset)148 TEST(tab_name_is_reset)
149 {
150 tab_info_t tab_info;
151
152 assert_success(exec_commands("tabname new-name", &lwin, CIT_COMMAND));
153 assert_success(exec_commands("tabname", &lwin, CIT_COMMAND));
154
155 assert_true(tabs_get(&lwin, 0, &tab_info));
156 assert_string_equal(NULL, tab_info.name);
157 }
158
TEST(tab_is_closed)159 TEST(tab_is_closed)
160 {
161 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
162 assert_success(exec_commands("tabclose", &lwin, CIT_COMMAND));
163 assert_int_equal(1, tabs_count(&lwin));
164 }
165
TEST(last_tab_is_not_closed)166 TEST(last_tab_is_not_closed)
167 {
168 assert_success(exec_commands("tabclose", &lwin, CIT_COMMAND));
169 assert_int_equal(1, tabs_count(&lwin));
170 }
171
TEST(quit_commands_close_tabs)172 TEST(quit_commands_close_tabs)
173 {
174 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
175 assert_success(exec_commands("quit", &lwin, CIT_COMMAND));
176 assert_int_equal(1, tabs_count(&lwin));
177
178 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
179 assert_success(exec_commands("wq", &lwin, CIT_COMMAND));
180 assert_int_equal(1, tabs_count(&lwin));
181
182 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
183 (void)vle_keys_exec_timed_out(WK_Z WK_Z);
184 assert_int_equal(1, tabs_count(&lwin));
185
186 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
187 (void)vle_keys_exec_timed_out(WK_Z WK_Q);
188 assert_int_equal(1, tabs_count(&lwin));
189 }
190
TEST(quit_all_commands_ignore_tabs)191 TEST(quit_all_commands_ignore_tabs)
192 {
193 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
194
195 vifm_tests_exited = 0;
196 assert_success(exec_commands("qall", &lwin, CIT_COMMAND));
197 assert_true(vifm_tests_exited);
198
199 vifm_tests_exited = 0;
200 assert_success(exec_commands("wqall", &lwin, CIT_COMMAND));
201 assert_true(vifm_tests_exited);
202
203 vifm_tests_exited = 0;
204 assert_success(exec_commands("xall", &lwin, CIT_COMMAND));
205 assert_true(vifm_tests_exited);
206
207 assert_int_equal(2, tabs_count(&lwin));
208 }
209
TEST(tabs_are_switched_with_shortcuts)210 TEST(tabs_are_switched_with_shortcuts)
211 {
212 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
213
214 (void)vle_keys_exec_timed_out(WK_g WK_t);
215 assert_int_equal(0, tabs_current(&lwin));
216
217 (void)vle_keys_exec_timed_out(WK_g WK_T);
218 assert_int_equal(1, tabs_current(&lwin));
219
220 (void)vle_keys_exec_timed_out(L"1" WK_g WK_t);
221 assert_int_equal(0, tabs_current(&lwin));
222 }
223
TEST(tabs_are_switched_with_commands)224 TEST(tabs_are_switched_with_commands)
225 {
226 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
227
228 /* Valid arguments. */
229
230 assert_success(exec_commands("tabnext", &lwin, CIT_COMMAND));
231 assert_int_equal(0, tabs_current(&lwin));
232
233 assert_success(exec_commands("tabnext", &lwin, CIT_COMMAND));
234 assert_int_equal(1, tabs_current(&lwin));
235
236 assert_success(exec_commands("tabnext 1", &lwin, CIT_COMMAND));
237 assert_int_equal(0, tabs_current(&lwin));
238
239 assert_success(exec_commands("tabnext 1", &lwin, CIT_COMMAND));
240 assert_int_equal(0, tabs_current(&lwin));
241
242 assert_success(exec_commands("tabnext 2", &lwin, CIT_COMMAND));
243 assert_int_equal(1, tabs_current(&lwin));
244
245 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
246 assert_int_equal(2, tabs_current(&lwin));
247
248 assert_success(exec_commands("tabprevious", &lwin, CIT_COMMAND));
249 assert_int_equal(1, tabs_current(&lwin));
250
251 assert_success(exec_commands("tabprevious 2", &lwin, CIT_COMMAND));
252 assert_int_equal(2, tabs_current(&lwin));
253
254 assert_success(exec_commands("tabprevious 3", &lwin, CIT_COMMAND));
255 assert_int_equal(2, tabs_current(&lwin));
256
257 assert_success(exec_commands("tabprevious 4", &lwin, CIT_COMMAND));
258 assert_int_equal(1, tabs_current(&lwin));
259
260 /* Invalid arguments. */
261
262 assert_failure(exec_commands("tabnext 1z", &lwin, CIT_COMMAND));
263 assert_int_equal(1, tabs_current(&lwin));
264
265 assert_failure(exec_commands("tabnext -1", &lwin, CIT_COMMAND));
266 assert_int_equal(1, tabs_current(&lwin));
267
268 assert_failure(exec_commands("tabnext 4", &lwin, CIT_COMMAND));
269 assert_int_equal(1, tabs_current(&lwin));
270
271 assert_failure(exec_commands("tabnext 10", &lwin, CIT_COMMAND));
272 assert_int_equal(1, tabs_current(&lwin));
273
274 assert_failure(exec_commands("tabprevious 0", &lwin, CIT_COMMAND));
275 assert_int_equal(1, tabs_current(&lwin));
276
277 assert_failure(exec_commands("tabprevious -1", &lwin, CIT_COMMAND));
278 assert_int_equal(1, tabs_current(&lwin));
279
280 assert_failure(exec_commands("tabprevious -1", &lwin, CIT_COMMAND));
281 assert_int_equal(1, tabs_current(&lwin));
282 }
283
TEST(tabs_are_moved)284 TEST(tabs_are_moved)
285 {
286 for (cfg.pane_tabs = 0; cfg.pane_tabs < 2; ++cfg.pane_tabs)
287 {
288 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
289 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
290
291 assert_int_equal(2, tabs_current(&lwin));
292
293 assert_success(exec_commands("tabmove 0", &lwin, CIT_COMMAND));
294 assert_int_equal(0, tabs_current(&lwin));
295 assert_success(exec_commands("tabmove 1", &lwin, CIT_COMMAND));
296 assert_int_equal(0, tabs_current(&lwin));
297
298 assert_success(exec_commands("tabmove 2", &lwin, CIT_COMMAND));
299 assert_int_equal(1, tabs_current(&lwin));
300 assert_success(exec_commands("tabmove 2", &lwin, CIT_COMMAND));
301 assert_int_equal(1, tabs_current(&lwin));
302
303 assert_success(exec_commands("tabmove 3", &lwin, CIT_COMMAND));
304 assert_int_equal(2, tabs_current(&lwin));
305 assert_success(exec_commands("tabmove 3", &lwin, CIT_COMMAND));
306 assert_int_equal(2, tabs_current(&lwin));
307
308 assert_success(exec_commands("tabmove 1", &lwin, CIT_COMMAND));
309 assert_int_equal(1, tabs_current(&lwin));
310 assert_success(exec_commands("tabmove", &lwin, CIT_COMMAND));
311 assert_int_equal(2, tabs_current(&lwin));
312
313 assert_success(exec_commands("tabmove 0", &lwin, CIT_COMMAND));
314 assert_int_equal(0, tabs_current(&lwin));
315 assert_success(exec_commands("tabmove $", &lwin, CIT_COMMAND));
316 assert_int_equal(2, tabs_current(&lwin));
317
318 assert_success(exec_commands("tabmove 0", &lwin, CIT_COMMAND));
319 assert_int_equal(0, tabs_current(&lwin));
320 assert_failure(exec_commands("tabmove wrong", &lwin, CIT_COMMAND));
321 assert_int_equal(0, tabs_current(&lwin));
322
323 tabs_only(&lwin);
324 }
325 }
326
TEST(view_mode_is_fine_with_tabs)327 TEST(view_mode_is_fine_with_tabs)
328 {
329 char cwd[PATH_MAX + 1];
330 assert_non_null(get_cwd(cwd, sizeof(cwd)));
331 make_abs_path(lwin.curr_dir, sizeof(lwin.curr_dir), TEST_DATA_PATH, "read",
332 cwd);
333 populate_dir_list(&lwin, 0);
334
335 (void)vle_keys_exec_timed_out(WK_e);
336 (void)vle_keys_exec_timed_out(WK_q);
337
338 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
339 assert_int_equal(2, tabs_count(&lwin));
340
341 (void)vle_keys_exec_timed_out(WK_e);
342 (void)vle_keys_exec_timed_out(WK_q);
343
344 assert_success(exec_commands("tabclose", &lwin, CIT_COMMAND));
345 assert_int_equal(1, tabs_count(&lwin));
346
347 (void)vle_keys_exec_timed_out(WK_e);
348 (void)vle_keys_exec_timed_out(WK_q);
349 }
350
TEST(left_view_mode_is_fine_with_tabs)351 TEST(left_view_mode_is_fine_with_tabs)
352 {
353 char cwd[PATH_MAX + 1];
354 assert_non_null(get_cwd(cwd, sizeof(cwd)));
355 make_abs_path(lwin.curr_dir, sizeof(lwin.curr_dir), TEST_DATA_PATH, "read",
356 cwd);
357 populate_dir_list(&lwin, 0);
358
359 (void)vle_keys_exec_timed_out(WK_e);
360 (void)vle_keys_exec_timed_out(WK_C_i);
361
362 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
363 assert_int_equal(2, tabs_count(&lwin));
364
365 (void)vle_keys_exec_timed_out(WK_SPACE);
366 (void)vle_keys_exec_timed_out(WK_e);
367 (void)vle_keys_exec_timed_out(WK_C_i);
368
369 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
370 assert_int_equal(3, tabs_count(&lwin));
371
372 assert_success(exec_commands("q", &lwin, CIT_COMMAND));
373 assert_int_equal(2, tabs_count(&lwin));
374 assert_success(exec_commands("q", &lwin, CIT_COMMAND));
375 assert_int_equal(1, tabs_count(&lwin));
376
377 (void)vle_keys_exec_timed_out(WK_SPACE);
378 (void)vle_keys_exec_timed_out(WK_q);
379 }
380
TEST(hidden_tabs_are_updated_on_cs_invalidation)381 TEST(hidden_tabs_are_updated_on_cs_invalidation)
382 {
383 char cs[PATH_MAX + 1];
384 make_abs_path(cs, sizeof(cs), TEST_DATA_PATH, "color-schemes", NULL);
385
386 strcpy(lwin.curr_dir, cs);
387 assert_success(populate_dir_list(&lwin, 0));
388 strcpy(rwin.curr_dir, cs);
389 assert_success(populate_dir_list(&rwin, 0));
390
391 curr_stats.cs = &cfg.cs;
392
393 assert_success(exec_commands("highlight {*.vifm} cterm=bold", &lwin,
394 CIT_COMMAND));
395 assert_non_null(cs_get_file_hi(curr_stats.cs, "some.vifm",
396 &lwin.dir_entry[0].hi_num));
397 assert_non_null(cs_get_file_hi(curr_stats.cs, "some.vifm",
398 &rwin.dir_entry[0].hi_num));
399 assert_int_equal(0, lwin.dir_entry[0].hi_num);
400 assert_int_equal(0, rwin.dir_entry[0].hi_num);
401
402 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
403
404 tab_info_t tab_info;
405
406 assert_true(tabs_get(&lwin, 0, &tab_info));
407 assert_int_equal(0, tab_info.view->dir_entry[0].hi_num);
408 assert_int_equal(0, lwin.dir_entry[0].hi_num);
409 assert_true(tabs_get(&rwin, 0, &tab_info));
410 assert_int_equal(0, tab_info.view->dir_entry[0].hi_num);
411 assert_int_equal(0, rwin.dir_entry[0].hi_num);
412
413 assert_success(exec_commands("highlight clear", &lwin, CIT_COMMAND));
414
415 assert_true(tabs_enum(&lwin, 0, &tab_info));
416 assert_int_equal(-1, tab_info.view->dir_entry[0].hi_num);
417 assert_int_equal(-1, lwin.dir_entry[0].hi_num);
418 assert_true(tabs_enum(&rwin, 0, &tab_info));
419 assert_int_equal(-1, tab_info.view->dir_entry[0].hi_num);
420 assert_int_equal(-1, rwin.dir_entry[0].hi_num);
421 }
422
TEST(setting_tabscope_drops_previous_tabs)423 TEST(setting_tabscope_drops_previous_tabs)
424 {
425 assert_false(cfg.pane_tabs);
426 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
427
428 assert_success(exec_commands("set tabscope=pane", &lwin, CIT_COMMAND));
429 assert_int_equal(1, tabs_count(&lwin));
430 assert_int_equal(1, tabs_count(&rwin));
431 assert_true(cfg.pane_tabs);
432
433 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
434 swap_view_roles();
435 assert_success(exec_commands("tabnew", &rwin, CIT_COMMAND));
436
437 assert_success(exec_commands("set tabscope=global", &lwin, CIT_COMMAND));
438 assert_int_equal(1, tabs_count(&lwin));
439 assert_false(cfg.pane_tabs);
440
441 assert_success(exec_commands("set tabscope=pane", &lwin, CIT_COMMAND));
442 assert_int_equal(1, tabs_count(&lwin));
443 assert_int_equal(1, tabs_count(&rwin));
444 assert_true(cfg.pane_tabs);
445 }
446
TEST(tabonly_leave_only_one_global_tab)447 TEST(tabonly_leave_only_one_global_tab)
448 {
449 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
450 assert_success(exec_commands("tabnew", &lwin, CIT_COMMAND));
451
452 assert_success(exec_commands("tabonly", &lwin, CIT_COMMAND));
453 assert_int_equal(1, tabs_count(&lwin));
454 }
455
TEST(tabonly_leaves_only_one_pane_tab)456 TEST(tabonly_leaves_only_one_pane_tab)
457 {
458 cfg.pane_tabs = 1;
459 assert_success(exec_commands("tabnew", curr_view, CIT_COMMAND));
460 assert_success(exec_commands("tabnew", curr_view, CIT_COMMAND));
461
462 assert_success(exec_commands("tabonly", &lwin, CIT_COMMAND));
463 assert_int_equal(1, tabs_count(curr_view));
464 }
465
TEST(tabonly_keeps_inactive_side_intact)466 TEST(tabonly_keeps_inactive_side_intact)
467 {
468 cfg.pane_tabs = 1;
469 assert_success(exec_commands("tabnew", curr_view, CIT_COMMAND));
470 assert_success(exec_commands("tabnew", curr_view, CIT_COMMAND));
471 swap_view_roles();
472 assert_success(exec_commands("tabnew", curr_view, CIT_COMMAND));
473 swap_view_roles();
474
475 assert_success(exec_commands("tabonly", &lwin, CIT_COMMAND));
476 assert_int_equal(1, tabs_count(curr_view));
477 assert_int_equal(2, tabs_count(other_view));
478 }
479
480 /* vim: set tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab cinoptions-=(0 : */
481 /* vim: set cinoptions+=t0 : */
482