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