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 / menus / search.c (326cdbc6c2c81cad6831b26c77f7daf01e5a9c47) (3,950B) (mode 100644) [raw]
#include <stic.h>

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

#include <test-utils.h>

#include "../../src/cfg/config.h"
#include "../../src/menus/menus.h"
#include "../../src/ui/ui.h"
#include "../../src/utils/string_array.h"

/* This tests search without activating the mode. */

static menu_data_t m;

SETUP()
{
	menus_init_data(&m, &lwin, strdup("test"), strdup("No matches"));

	m.len = add_to_string_array(&m.items, m.len, "a");
	m.len = add_to_string_array(&m.items, m.len, "b");
	m.len = add_to_string_array(&m.items, m.len, "c");

	menus_set_active(&m);
}

TEARDOWN()
{
	menus_reset_data(&m);
}

TEST(nothing_is_searched_if_no_pattern)
{
	menus_search_repeat(m.state, 0);
	assert_int_equal(0, menus_search_matched(&m));
}

TEST(nothing_is_searched_for_wrong_pattern)
{
	menus_search_reset(m.state, 0, 1);
	assert_true(menus_search("*a", &m, 1));
	assert_int_equal(0, menus_search_matched(&m));
}

TEST(search_via_menu_search)
{
	menus_search_reset(m.state, 0, 1);
	assert_true(menus_search("[abc]", &m, 1));
	assert_int_equal(1, m.pos);
	menus_search_repeat(m.state, 0);
	assert_int_equal(2, m.pos);
}

TEST(ok_to_print_message_if_there_is_no_pattern)
{
	menus_search_print_msg(&m);
}

TEST(ok_to_print_message_for_wrong_pattern)
{
	assert_true(menus_search("*", &m, 1));
	menus_search_print_msg(&m);
}

TEST(forward_found_no_wrap)
{
	cfg.wrap_scan = 0;
	assert_true(menus_search("c", &m, 1));
	assert_int_equal(2, m.pos);
}

TEST(forward_found_wrap)
{
	m.pos = 1;
	cfg.wrap_scan = 1;
	assert_true(menus_search("a", &m, 1));
	assert_int_equal(0, m.pos);
}

TEST(forward_not_found_no_wrap)
{
	cfg.wrap_scan = 0;
	assert_true(menus_search("d", &m, 1));
	assert_int_equal(0, m.pos);
}

TEST(forward_not_found_wrap)
{
	cfg.wrap_scan = 1;
	assert_true(menus_search("d", &m, 1));
	assert_int_equal(0, m.pos);
}

TEST(forward_find_next_no_wrap)
{
	cfg.wrap_scan = 0;
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(1, m.pos);
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(2, m.pos);
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(2, m.pos);
}

TEST(forward_find_next_wrap)
{
	cfg.wrap_scan = 1;
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(1, m.pos);
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(2, m.pos);
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(0, m.pos);
}

TEST(backward_found_no_wrap)
{
	m.pos = 2;
	cfg.wrap_scan = 0;
	menus_search_reset(m.state, 1, 1);
	assert_true(menus_search("a", &m, 1));
	assert_int_equal(0, m.pos);
}

TEST(backward_found_wrap)
{
	cfg.wrap_scan = 1;
	menus_search_reset(m.state, 1, 1);
	assert_true(menus_search("c", &m, 1));
	assert_int_equal(2, m.pos);
}

TEST(backward_not_found_no_wrap)
{
	cfg.wrap_scan = 0;
	menus_search_reset(m.state, 1, 1);
	assert_true(menus_search("d", &m, 1));
	assert_int_equal(0, m.pos);
}

TEST(backward_not_found_wrap)
{
	cfg.wrap_scan = 1;
	menus_search_reset(m.state, 1, 1);
	assert_true(menus_search("d", &m, 1));
	assert_int_equal(0, m.pos);
}

TEST(backward_find_next_no_wrap)
{
	m.pos = 2;
	cfg.wrap_scan = 0;
	menus_search_reset(m.state, 1, 1);
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(1, m.pos);
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(0, m.pos);
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(0, m.pos);
}

TEST(backward_find_next_wrap)
{
	m.pos = 2;
	cfg.wrap_scan = 1;
	menus_search_reset(m.state, 1, 1);
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(1, m.pos);
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(0, m.pos);
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(2, m.pos);
}

TEST(null_pattern_causes_pattern_reuse)
{
	menus_search_reset(m.state, 0, 1);
	assert_true(menus_search(".", &m, 1));
	assert_int_equal(1, m.pos);
	assert_true(menus_search(NULL, &m, 1));
	assert_int_equal(2, m.pos);
}

/* 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