xaizek / vifm (License: GPLv2+) (since 2018-12-07)
Vifm is a file manager with curses interface, which provides Vi[m]-like environment for managing objects within file systems, extended with some useful ideas from mutt.
<root> / tests / misc / visual_restore.c (d6a8a2bb193f1126bae5b78f650027d0ce35812a) (3,706B) (mode 100644) [raw]
#include <stic.h>

#include <string.h> /* strcpy() strdup() */

#include <test-utils.h>

#include "../../src/engine/keys.h"
#include "../../src/modes/modes.h"
#include "../../src/modes/visual.h"
#include "../../src/modes/wk.h"
#include "../../src/ui/ui.h"
#include "../../src/utils/dynarray.h"
#include "../../src/sort.h"
#include "../../src/marks.h"

SETUP_ONCE()
{
	curr_view = &lwin;
	other_view = &rwin;
}

SETUP()
{
	modes_init();
	view_setup(&lwin);
	opt_handlers_setup();

	strcpy(lwin.curr_dir, TEST_DATA_PATH);
	lwin.list_rows = 3;
	lwin.list_pos = 0;
	lwin.dir_entry = dynarray_cextend(NULL,
			lwin.list_rows*sizeof(*lwin.dir_entry));
	lwin.dir_entry[0].name = strdup("file0");
	lwin.dir_entry[0].origin = lwin.curr_dir;
	lwin.dir_entry[0].selected = 0;
	lwin.dir_entry[1].name = strdup("file1");
	lwin.dir_entry[1].origin = lwin.curr_dir;
	lwin.dir_entry[1].selected = 0;
	lwin.dir_entry[2].name = strdup("file2");
	lwin.dir_entry[2].origin = lwin.curr_dir;
	lwin.dir_entry[2].selected = 0;
	lwin.selected_files = 0;

	view_set_sort(lwin.sort, SK_BY_INAME, SK_NONE);
	sort_view(&lwin);

	(void)vle_keys_exec_timed_out(WK_v);
	(void)vle_keys_exec_timed_out(WK_j);

	assert_int_equal(2, lwin.selected_files);
	assert_true(lwin.dir_entry[0].selected);
	assert_true(lwin.dir_entry[1].selected);
	assert_false(lwin.dir_entry[2].selected);
	assert_int_equal(1, lwin.list_pos);

	(void)vle_keys_exec_timed_out(WK_ESC);

	assert_int_equal(0, lwin.selected_files);
	assert_false(lwin.dir_entry[0].selected);
	assert_false(lwin.dir_entry[1].selected);
	assert_false(lwin.dir_entry[2].selected);
	assert_int_equal(1, lwin.list_pos);
}

TEARDOWN()
{
	modvis_leave(/*save_msg=*/0, /*goto_top=*/1, /*clear_selection=*/0);
	view_teardown(&lwin);
	opt_handlers_teardown();
	vle_keys_reset();
}

TEST(gv_works)
{
	modvis_enter(VS_RESTORE);

	assert_string_equal("VISUAL", modvis_describe());

	const mark_t *mark;
	mark = get_mark_by_name(&lwin, '<');
	assert_string_equal("file0", mark->file);
	mark = get_mark_by_name(&lwin, '>');
	assert_string_equal("file1", mark->file);

	assert_int_equal(0, marks_find_in_view(&lwin, '<'));
	assert_int_equal(1, marks_find_in_view(&lwin, '>'));

	assert_int_equal(2, lwin.selected_files);
	assert_true(lwin.dir_entry[0].selected);
	assert_true(lwin.dir_entry[1].selected);
	assert_false(lwin.dir_entry[2].selected);
}

TEST(gv_works_after_inverting_the_order_of_files)
{
	const mark_t *mark;

	view_set_sort(lwin.sort, -SK_BY_INAME, SK_NONE);
	sort_view(&lwin);

	modvis_enter(VS_RESTORE);

	mark = get_mark_by_name(&lwin, '<');
	assert_string_equal("file1", mark->file);
	mark = get_mark_by_name(&lwin, '>');
	assert_string_equal("file0", mark->file);

	assert_int_equal(1, marks_find_in_view(&lwin, '<'));
	assert_int_equal(2, marks_find_in_view(&lwin, '>'));

	assert_int_equal(2, lwin.selected_files);
	assert_false(lwin.dir_entry[0].selected);
	assert_true(lwin.dir_entry[1].selected);
	assert_true(lwin.dir_entry[2].selected);

	modvis_leave(/*save_msg=*/0, /*goto_top=*/1, /*clear_selection=*/0);

	view_set_sort(lwin.sort, SK_BY_INAME, SK_NONE);
	sort_view(&lwin);

	modvis_enter(VS_RESTORE);

	mark = get_mark_by_name(&lwin, '<');
	assert_string_equal("file0", mark->file);
	mark = get_mark_by_name(&lwin, '>');
	assert_string_equal("file1", mark->file);

	assert_int_equal(0, marks_find_in_view(&lwin, '<'));
	assert_int_equal(1, marks_find_in_view(&lwin, '>'));

	assert_int_equal(2, lwin.selected_files);
	assert_true(lwin.dir_entry[0].selected);
	assert_true(lwin.dir_entry[1].selected);
	assert_false(lwin.dir_entry[2].selected);
}

/* vim: set tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab cinoptions-=(0 : */
/* vim: set cinoptions+=t0 filetype=c : */
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/vifm

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/vifm

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master