autosuggest: add tests to clang suggest provider

A small refactor became obvious because the lookup is not really
using the curword passed in - we want all options then filter later!
This commit is contained in:
Andy Williams 2016-12-27 13:26:38 +00:00
parent c5a4aafe4d
commit 53e7419009
9 changed files with 164 additions and 11 deletions

View File

@ -163,6 +163,7 @@ static void
_suggest_list_update(Edi_Editor *editor, char *word)
{
Edi_Editor_Suggest_Item *suggest_it;
Edi_Editor_Suggest_Provider *provider;
Eina_List *list, *l;
Elm_Genlist_Item_Class *ic;
Elm_Object_Item *item;
@ -175,10 +176,11 @@ _suggest_list_update(Edi_Editor *editor, char *word)
ic->item_style = "full";
ic->func.content_get = _suggest_list_content_get;
provider = edi_editor_suggest_provider_get(editor);
EINA_LIST_FOREACH(list, l, suggest_it)
{
const char *term;
term = edi_editor_suggest_provider_get(editor)->summary_get(editor, suggest_it);
term = provider->summary_get(editor, suggest_it);
if (eina_str_has_prefix(term, word))
{
@ -229,7 +231,7 @@ _suggest_list_set(Edi_Editor *editor)
elm_code_widget_cursor_position_get(editor->entry, &row, &col);
curword = _edi_editor_current_word_get(editor, row, col);
list = edi_editor_suggest_provider_get(editor)->lookup(editor, curword);
list = edi_editor_suggest_provider_get(editor)->lookup(editor, row, col - strlen(curword));
evas_object_data_set(editor->suggest_genlist, "suggest_list", list);
_suggest_list_update(editor, curword);

View File

@ -31,7 +31,7 @@ typedef struct _Edi_Editor_Suggest_Provider
void (*add)(Edi_Editor *editor);
void (*del)(Edi_Editor *editor);
Eina_List *(*lookup)(Edi_Editor *editor, const char *word);
Eina_List *(*lookup)(Edi_Editor *editor, unsigned int row, unsigned int col);
const char *(*summary_get)(Edi_Editor *editor, Edi_Editor_Suggest_Item *item);
char *(*detail_get)(Edi_Editor *editor, Edi_Editor_Suggest_Item *item);
void (*item_free)(Edi_Editor_Suggest_Item *item);

View File

@ -2,6 +2,13 @@
# include "config.h"
#endif
#if HAVE_LIBCLANG
#include <clang-c/Index.h>
#endif
#include <Eina.h>
#include <Elementary.h>
#include "edi_editor_suggest_provider.h"
#include "edi_config.h"
@ -89,7 +96,7 @@ _edi_editor_sugget_c_del(Edi_Editor *editor)
}
Eina_List *
_edi_editor_suggest_c_lookup(Edi_Editor *editor, const char *curword)
_edi_editor_suggest_c_lookup(Edi_Editor *editor, unsigned int row, unsigned int col)
{
Eina_List *list = NULL;
@ -97,22 +104,21 @@ _edi_editor_suggest_c_lookup(Edi_Editor *editor, const char *curword)
CXCodeCompleteResults *res;
struct CXUnsavedFile unsaved_file;
Elm_Code *code;
const char *path;
unsigned int col, row;
const char *path = NULL;
if (!editor->as_unit)
return list;
code = elm_code_widget_code_get(editor->entry);
path = elm_code_file_path_get(code->file);
elm_code_widget_cursor_position_get(editor->entry, &row, &col);
if (code->file->file)
path = elm_code_file_path_get(code->file);
unsaved_file.Filename = path;
unsaved_file.Contents = elm_code_widget_text_between_positions_get(
editor->entry, 1, 1, col, row);
unsaved_file.Length = strlen(unsaved_file.Contents);
res = clang_codeCompleteAt(editor->as_unit, path, row, col - strlen(curword),
res = clang_codeCompleteAt(editor->as_unit, path, row, col,
&unsaved_file, 1,
CXCodeComplete_IncludeMacros |
CXCodeComplete_IncludeCodePatterns);

View File

@ -4,18 +4,24 @@ CLEANFILES = check-results.xml
if EFL_HAVE_TESTS
check_PROGRAMS = edi_suite
efl_cflags_safe = '@EFL_CFLAGS@'
clang_include = '$(CLANG_INCLUDE)'
edi_suite_SOURCES = \
edi_test_path.c \
edi_test_content_provider.c \
edi_test_editor_suggest_provider.c \
edi_test_editor_suggest_provider_c.c \
edi_suite.c
edi_suite_CPPFLAGS = -I$(top_builddir)/src/lib/ -I$(top_builddir)/src/bin/ \
-I$(top_srcdir)/src/lib \
-I$(top_srcdir)/src/bin \
-DPACKAGE_TESTS_DIR=\"$(top_srcdir)/src/tests/\" \
-DPACKAGE_TESTS_DIR=\"`pwd`/$(top_srcdir)/src/tests/\" \
-DPACKAGE_BUILD_DIR=\"`pwd`/$(top_builddir)/src/tests/\" \
-DEFL_BETA_API_SUPPORT \
-DEFL_CFLAGS=\"$(efl_cflags_safe)\" \
-DCLANG_INCLUDES=\"$(clang_include)\" \
@EFL_CFLAGS@ \
@CHECK_CFLAGS@

View File

@ -15,7 +15,9 @@ static const struct {
} tests[] = {
{ "basic", edi_test_basic },
{ "path", edi_test_path },
{ "content_provider", edi_test_content_provider }
{ "content_provider", edi_test_content_provider },
{ "editor_suggest_provider", edi_test_editor_suggest_provider },
{ "editor_suggest_provider_c", edi_test_editor_suggest_provider_c }
};
START_TEST(edi_initialization)

View File

@ -9,5 +9,7 @@ void edi_test_basic(TCase *tc);
void edi_test_console(TCase *tc);
void edi_test_path(TCase *tc);
void edi_test_content_provider(TCase *tc);
void edi_test_editor_suggest_provider(TCase *tc);
void edi_test_editor_suggest_provider_c(TCase *tc);
#endif /* _EDI_SUITE_H */

View File

@ -0,0 +1,26 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "editor/edi_editor_suggest_provider.c"
#include "edi_suite.h"
START_TEST (edi_test_editor_suggest_provider_lookup)
{
Edi_Editor editor;
Edi_Editor_Suggest_Provider *provider;
editor.mimetype = "text/x-csrc";
provider = edi_editor_suggest_provider_get(&editor);
ck_assert(provider);
ck_assert_str_eq(provider->id, "c");
}
END_TEST
void edi_test_editor_suggest_provider(TCase *tc)
{
tcase_add_test(tc, edi_test_editor_suggest_provider_lookup);
}

View File

@ -0,0 +1,106 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <Elementary.h>
#include "../bin/edi_private.h"
#include "editor/edi_editor_suggest_provider.h"
#include "edi_suite.h"
static Elm_Code *
_setup(Edi_Editor *editor, Evas_Object *win)
{
Elm_Code *code;
Elm_Code_Widget *widget;
code = elm_code_create();
elm_code_file_open(code, PACKAGE_TESTS_DIR "test.c");
widget = elm_code_widget_add(win, code);
editor->entry = widget;
elm_code_widget_cursor_position_set(widget, 3, 12);
return code;
}
static Eina_List *
_filtered_list_get(Edi_Editor *editor, Edi_Editor_Suggest_Provider *provider,
Eina_List *list, const char *word)
{
Edi_Editor_Suggest_Item *suggest_it;
Eina_List *l, *ret = NULL;
EINA_LIST_FOREACH(list, l, suggest_it)
{
const char *term;
term = provider->summary_get(editor, suggest_it);
if (eina_str_has_prefix(term, word))
ret = eina_list_append(ret, suggest_it);
}
return ret;
}
START_TEST (edi_test_editor_suggest_provider_c_lookup)
{
Elm_Code *code;
Evas_Object *win;
Edi_Editor editor;
Edi_Editor_Suggest_Provider *provider;
Eina_List *list;
elm_init(1, NULL);
win = elm_win_add(NULL, "entry", ELM_WIN_BASIC);
editor.mimetype = "text/x-csrc";
code = _setup(&editor, win);
provider = edi_editor_suggest_provider_get(&editor);
provider->add(&editor);
list = provider->lookup(&editor, 3, 12);
ck_assert_int_eq(eina_list_count(_filtered_list_get(&editor, provider, list, "_xyzabc_")), 1);
provider->del(&editor);
elm_code_free(code);
elm_shutdown();
}
END_TEST
START_TEST (edi_test_editor_suggest_provider_c_summary)
{
Elm_Code *code;
Evas_Object *win;
Edi_Editor editor;
Edi_Editor_Suggest_Provider *provider;
Edi_Editor_Suggest_Item *item;
Eina_List *list;
const char *key;
elm_init(1, NULL);
win = elm_win_add(NULL, "entry", ELM_WIN_BASIC);
editor.mimetype = "text/x-csrc";
code = _setup(&editor, win);
provider = edi_editor_suggest_provider_get(&editor);
provider->add(&editor);
list = provider->lookup(&editor, 3, 12);
item = eina_list_nth(_filtered_list_get(&editor, provider, list, "_xyzabc_"), 0);
key = provider->summary_get(&editor, item);
ck_assert_str_eq(key, "_xyzabc_test");
provider->del(&editor);
elm_code_free(code);
elm_shutdown();
}
END_TEST
void edi_test_editor_suggest_provider_c(TCase *tc)
{
#if HAVE_LIBCLANG
tcase_add_test(tc, edi_test_editor_suggest_provider_c_lookup);
tcase_add_test(tc, edi_test_editor_suggest_provider_c_summary);
#endif
}

3
src/tests/test.c Normal file
View File

@ -0,0 +1,3 @@
static void _xyzabc_test() {}
static void _thing() {
_xyzabc_