static void test_space_at_the_end(void) { const char *start; char *completed; vle_compl_reset(); complete_options("fusehome=a\\ b\\ ", &start); completed = vle_compl_next(); assert_string_equal("a\\ b\\ ", completed); free(completed); vle_compl_reset(); complete_options("fusehome=a\\ b ", &start); completed = vle_compl_next(); assert_string_equal("all", completed); free(completed); completed = vle_compl_next(); assert_string_equal("cpoptions", completed); free(completed); completed = vle_compl_next(); assert_string_equal("fastrun", completed); free(completed); }
static void test_invalid_input(void) { const char *start; char *completed; vle_compl_reset(); complete_options("fast ?f", &start); completed = vle_compl_next(); assert_string_equal("fast ?f", completed); free(completed); }
char * fast_run_complete(const char cmd[]) { char *result = NULL; const char *args; char command[NAME_MAX]; char *completed; args = extract_cmd_name(cmd, 0, sizeof(command), command); if(is_path_absolute(command)) { return strdup(cmd); } vle_compl_reset(); complete_command_name(command); vle_compl_unite_groups(); completed = vle_compl_next(); if(vle_compl_get_count() > 2) { int c = vle_compl_get_count() - 1; while(c-- > 0) { if(stroscmp(command, completed) == 0) { result = strdup(cmd); break; } else { free(completed); completed = vle_compl_next(); } } if(result == NULL) { status_bar_error("Command beginning is ambiguous"); } } else { free(completed); completed = vle_compl_next(); result = format_str("%s %s", completed, args); } free(completed); return result; }
static void test_umbiguous_beginning(void) { const char *start; char *completed; vle_compl_reset(); complete_options("sort", &start); completed = vle_compl_next(); assert_string_equal("sort", completed); free(completed); completed = vle_compl_next(); assert_string_equal("sortorder", completed); free(completed); }
static void test_expand_abbreviations(void) { const char *start; char *completed; vle_compl_reset(); complete_options("fr", &start); completed = vle_compl_next(); assert_string_equal("fastrun", completed); free(completed); completed = vle_compl_next(); assert_string_equal("fastrun", completed); free(completed); }
static void test_skip_abbreviations(void) { const char *start; char *completed; vle_compl_reset(); complete_options("", &start); completed = vle_compl_next(); assert_string_equal("all", completed); free(completed); completed = vle_compl_next(); assert_string_equal("cpoptions", completed); free(completed); completed = vle_compl_next(); assert_string_equal("fastrun", completed); free(completed); completed = vle_compl_next(); assert_string_equal("fusehome", completed); free(completed); completed = vle_compl_next(); assert_string_equal("sort", completed); free(completed); completed = vle_compl_next(); assert_string_equal("sortorder", completed); free(completed); completed = vle_compl_next(); assert_string_equal("tabstop", completed); free(completed); completed = vle_compl_next(); assert_string_equal("vifminfo", completed); free(completed); completed = vle_compl_next(); assert_string_equal("", completed); free(completed); }
static int complete_args(int id, const char *args, int argc, char **argv, int arg_pos, void *extra_arg) { const char *arg; vle_compl_reset(); vle_compl_add_match("followlinks"); vle_compl_add_match("fastrun"); vle_compl_finish_group(); vle_compl_add_last_match("f"); arg = strrchr(args, ' '); if(arg == NULL) arg = args; else arg++; return arg - args; }
static void test_after_peq_value_completion(void) { char buf[] = "vifminfo+=op"; const char *start; char *completed; vle_compl_reset(); complete_options(buf, &start); assert_true(start == buf + 10); completed = vle_compl_next(); assert_string_equal("options", completed); free(completed); completed = vle_compl_next(); assert_string_equal("options", completed); free(completed); }
static void test_one_choice_opt(void) { const char *start; char *completed; vle_compl_reset(); complete_options("fuse", &start); completed = vle_compl_next(); assert_string_equal("fusehome", completed); free(completed); completed = vle_compl_next(); assert_string_equal("fusehome", completed); free(completed); completed = vle_compl_next(); assert_string_equal("fusehome", completed); free(completed); }
static void test_matching_short_full(void) { const char *start; char *completed; vle_compl_reset(); complete_options("so", &start); completed = vle_compl_next(); assert_string_equal("sort", completed); free(completed); completed = vle_compl_next(); assert_string_equal("sortorder", completed); free(completed); completed = vle_compl_next(); assert_string_equal("so", completed); free(completed); }
/* Composes and draws suggestion box. */ static void display_suggestion_box(const wchar_t input[]) { size_t prefix; /* Don't do this for ESC because it's prefix for other keys. */ if(!should_display_suggestion_box() || wcscmp(input, L"\033") == 0) { return; } /* Fill completion list with suggestions of keys and marks. */ vle_compl_reset(); vle_keys_suggest(input, &process_suggestion, !(cfg.sug.flags & SF_KEYS), (cfg.sug.flags & SF_FOLDSUBKEYS)); /* Completion grouping removes duplicates. Because user-defined keys are * reported first, this has an effect of leaving only them in the resulting * list, which is correct as they have higher priority. */ vle_compl_finish_group(); /* Handle registers suggestions. */ prefix = wcsspn(input, L"0123456789"); if((cfg.sug.flags & SF_REGISTERS) && input[prefix] == L'"' && input[prefix + 1U] == L'\0') { regs_sync_from_shared_memory(); /* No vle_compl_finish_group() after this to prevent sorting and * deduplication. */ regs_suggest(&process_suggestion, cfg.sug.maxregfiles); } if(vle_compl_get_count() != 0) { draw_suggestion_box(); suggestions_are_visible = 1; } }
static void test_one_choice_val(void) { char buf[] = "sort=n"; const char *start; char *completed; vle_compl_reset(); complete_options(buf, &start); assert_true(start == buf + 5); completed = vle_compl_next(); assert_string_equal("name", completed); free(completed); completed = vle_compl_next(); assert_string_equal("name", completed); free(completed); completed = vle_compl_next(); assert_string_equal("name", completed); free(completed); }
static void test_set_values_completion(void) { char buf[] = "vifminfo=tui,c"; const char *start; char *completed; vle_compl_reset(); complete_options(buf, &start); assert_true(start == buf + 13); completed = vle_compl_next(); assert_string_equal("commands", completed); free(completed); completed = vle_compl_next(); assert_string_equal("cs", completed); free(completed); completed = vle_compl_next(); assert_string_equal("c", completed); free(completed); }
SETUP() { static int option_changed; optval_t def = { .str_val = "/tmp" }; cfg.slow_fs_list = strdup(""); init_builtin_functions(); stats.line = wcsdup(L"set "); stats.index = wcslen(stats.line); stats.curs_pos = 0; stats.len = stats.index; stats.cmd_pos = -1; stats.complete_continue = 0; stats.history_search = 0; stats.line_buf = NULL; stats.complete = &complete_cmd; init_commands(); execute_cmd("command bar a"); execute_cmd("command baz b"); execute_cmd("command foo c"); init_options(&option_changed); add_option("fusehome", "fh", OPT_STR, 0, NULL, fusehome_handler, def); assert_int_equal(0, chdir("test-data/existing-files")); } TEARDOWN() { assert_int_equal(0, chdir("../..")); free(cfg.slow_fs_list); cfg.slow_fs_list = NULL; free(stats.line); reset_cmds(); clear_options(); function_reset_all(); } static void fusehome_handler(OPT_OP op, optval_t val) { } TEST(leave_spaces_at_begin) { char *buf; vle_compl_reset(); assert_int_equal(1, complete_cmd(" qui", NULL)); buf = vle_compl_next(); assert_string_equal("quit", buf); free(buf); buf = vle_compl_next(); assert_string_equal("quit", buf); free(buf); } TEST(only_user) { char *buf; vle_compl_reset(); assert_int_equal(8, complete_cmd("command ", NULL)); buf = vle_compl_next(); assert_string_equal("bar", buf); free(buf); vle_compl_reset(); assert_int_equal(9, complete_cmd(" command ", NULL)); buf = vle_compl_next(); assert_string_equal("bar", buf); free(buf); vle_compl_reset(); assert_int_equal(10, complete_cmd(" command ", NULL)); buf = vle_compl_next(); assert_string_equal("bar", buf); free(buf); } TEST(test_set_completion) { vle_compl_reset(); assert_success(line_completion(&stats)); assert_wstring_equal(L"set all", stats.line); } TEST(no_sdquoted_completion_does_nothing) { free(stats.line); stats.line = wcsdup(L"command '"); stats.len = wcslen(stats.line); stats.index = stats.len; vle_compl_reset(); assert_success(line_completion(&stats)); assert_wstring_equal(L"command '", stats.line); } static void prepare_for_line_completion(const wchar_t str[]) { free(stats.line); stats.line = wcsdup(str); stats.len = wcslen(stats.line); stats.index = stats.len; stats.complete_continue = 0; vle_compl_reset(); }
static void test_after_equal_sign_completion_ok(void) { const char *start; char *completed; optval_t val = { .str_val = "/home/tmp" }; set_option("fusehome", val); vle_compl_reset(); complete_options("fusehome=", &start); completed = vle_compl_next(); assert_string_equal("/home/tmp", completed); free(completed); } static void test_after_equal_sign_completion_spaces_ok(void) { const char *start; char *completed; optval_t val = { .str_val = "/home directory/tmp" }; set_option("fusehome", val); vle_compl_reset(); complete_options("fusehome=", &start); completed = vle_compl_next(); assert_string_equal("/home\\ directory/tmp", completed); free(completed); } static void test_after_fake_equal_sign_completion_fail(void) { const char *start; char *completed; optval_t val = { .str_val = "/home/tmp" }; set_option("fusehome", val); vle_compl_reset(); complete_options("fusehome=a=", &start); completed = vle_compl_next(); assert_string_equal("a=", completed); free(completed); } static void test_all_completion_ok(void) { const char *start; char *completed; vle_compl_reset(); complete_options("all=", &start); completed = vle_compl_next(); assert_string_equal("", completed); free(completed); } static void test_charset_completion_skips_entered_elements(void) { const char *start; char *completed; vle_compl_reset(); complete_options("cpo=a", &start); completed = vle_compl_next(); assert_string_equal("b", completed); free(completed); completed = vle_compl_next(); assert_string_equal("c", completed); free(completed); completed = vle_compl_next(); assert_string_equal("", completed); free(completed); completed = vle_compl_next(); assert_string_equal("b", completed); free(completed); } void opt_completion(void) { test_fixture_start(); run_test(test_space_at_the_end); run_test(test_one_choice_opt); run_test(test_one_choice_val); run_test(test_invalid_input); run_test(test_skip_abbreviations); run_test(test_expand_abbreviations); run_test(test_after_eq_value_completion); run_test(test_after_meq_value_completion); run_test(test_after_peq_value_completion); run_test(test_set_values_completion); run_test(test_colon); run_test(test_umbiguous_beginning); run_test(test_matching_short_full); run_test(test_after_equal_sign_completion_ok); run_test(test_after_equal_sign_completion_spaces_ok); run_test(test_after_fake_equal_sign_completion_fail); run_test(test_all_completion_ok); run_test(test_charset_completion_skips_entered_elements); test_fixture_end(); }