|
Packit |
116408 |
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
|
|
Packit |
116408 |
/*
|
|
Packit |
116408 |
* Copyright (C) 2018 Sébastien Wilmet <swilmet@gnome.org>
|
|
Packit |
116408 |
*
|
|
Packit |
116408 |
* This program is free software; you can redistribute it and/or
|
|
Packit |
116408 |
* modify it under the terms of the GNU General Public License as
|
|
Packit |
116408 |
* published by the Free Software Foundation; either version 2 of the
|
|
Packit |
116408 |
* License, or (at your option) any later version.
|
|
Packit |
116408 |
*
|
|
Packit |
116408 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
116408 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
116408 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
116408 |
* General Public License for more details.
|
|
Packit |
116408 |
*
|
|
Packit |
116408 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
116408 |
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
116408 |
*/
|
|
Packit |
116408 |
|
|
Packit |
116408 |
#include "dh-search-context.h"
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static gboolean
|
|
Packit |
116408 |
strv_equal (GStrv strv1,
|
|
Packit |
116408 |
GStrv strv2)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
gint i1;
|
|
Packit |
116408 |
gint i2;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (strv1 == NULL || strv2 == NULL)
|
|
Packit |
116408 |
return strv1 == NULL && strv2 == NULL;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
for (i1 = 0, i2 = 0;
|
|
Packit |
116408 |
strv1[i1] != NULL && strv2[i2] != NULL;
|
|
Packit |
116408 |
i1++, i2++) {
|
|
Packit |
116408 |
const gchar *cur_str1 = strv1[i1];
|
|
Packit |
116408 |
const gchar *cur_str2 = strv2[i2];
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (!g_str_equal (cur_str1, cur_str2))
|
|
Packit |
116408 |
return FALSE;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
return strv1[i1] == NULL && strv2[i2] == NULL;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
check_process_search_string (const gchar *search_string,
|
|
Packit |
116408 |
gboolean expected_valid,
|
|
Packit |
116408 |
const gchar *expected_book_id,
|
|
Packit |
116408 |
const gchar *expected_page_id,
|
|
Packit |
116408 |
GStrv expected_keywords)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhSearchContext *search_context;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
search_context = _dh_search_context_new (search_string);
|
|
Packit |
116408 |
g_assert_cmpint (expected_valid, ==, (search_context != NULL));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (search_context == NULL) {
|
|
Packit |
116408 |
g_assert (expected_book_id == NULL);
|
|
Packit |
116408 |
g_assert (expected_page_id == NULL);
|
|
Packit |
116408 |
g_assert (expected_keywords == NULL);
|
|
Packit |
116408 |
return;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_assert_cmpstr (_dh_search_context_get_book_id (search_context), ==, expected_book_id);
|
|
Packit |
116408 |
g_assert_cmpstr (_dh_search_context_get_page_id (search_context), ==, expected_page_id);
|
|
Packit |
116408 |
g_assert (strv_equal (_dh_search_context_get_keywords (search_context), expected_keywords));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
_dh_search_context_free (search_context);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
test_process_search_string (void)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
GPtrArray *array;
|
|
Packit |
116408 |
GStrv keywords1;
|
|
Packit |
116408 |
GStrv keywords2;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Empty or only whitespace. */
|
|
Packit |
116408 |
check_process_search_string ("", FALSE, NULL, NULL, NULL);
|
|
Packit |
116408 |
check_process_search_string (" ", FALSE, NULL, NULL, NULL);
|
|
Packit |
116408 |
check_process_search_string (" \t ", FALSE, NULL, NULL, NULL);
|
|
Packit |
116408 |
check_process_search_string (" \t \n", FALSE, NULL, NULL, NULL);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* book_id and page_id without keywords. */
|
|
Packit |
116408 |
check_process_search_string ("book:devhelp", TRUE, "devhelp", NULL, NULL);
|
|
Packit |
116408 |
check_process_search_string ("page:DhBook", TRUE, NULL, "DhBook", NULL);
|
|
Packit |
116408 |
check_process_search_string ("book:devhelp page:DhBook", TRUE, "devhelp", "DhBook", NULL);
|
|
Packit |
116408 |
check_process_search_string ("page:DhBook book:devhelp", TRUE, "devhelp", "DhBook", NULL);
|
|
Packit |
116408 |
check_process_search_string ("book:devhelp page:", TRUE, "devhelp", NULL, NULL);
|
|
Packit |
116408 |
check_process_search_string ("book: page:DhBook", TRUE, NULL, "DhBook", NULL);
|
|
Packit |
116408 |
check_process_search_string ("book:devhelp book:gtk3", FALSE, NULL, NULL, NULL);
|
|
Packit |
116408 |
check_process_search_string ("page:DhBook page:DhCompletion", FALSE, NULL, NULL, NULL);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Normal keywords before book_id or page_id. */
|
|
Packit |
116408 |
check_process_search_string ("dh_link_ book:devhelp", FALSE, NULL, NULL, NULL);
|
|
Packit |
116408 |
check_process_search_string ("dh_link_ get page:DhLink", FALSE, NULL, NULL, NULL);
|
|
Packit |
116408 |
check_process_search_string ("dh_link_ get book:devhelp page:DhLink", FALSE, NULL, NULL, NULL);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Only normal keywords. */
|
|
Packit |
116408 |
|
|
Packit |
116408 |
array = g_ptr_array_new ();
|
|
Packit |
116408 |
g_ptr_array_add (array, (gpointer) "dh_link_");
|
|
Packit |
116408 |
g_ptr_array_add (array, NULL);
|
|
Packit |
116408 |
keywords1 = (GStrv) g_ptr_array_free (array, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
array = g_ptr_array_new ();
|
|
Packit |
116408 |
g_ptr_array_add (array, (gpointer) "dh_link_");
|
|
Packit |
116408 |
g_ptr_array_add (array, (gpointer) "get");
|
|
Packit |
116408 |
g_ptr_array_add (array, NULL);
|
|
Packit |
116408 |
keywords2 = (GStrv) g_ptr_array_free (array, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
check_process_search_string ("dh_link_", TRUE, NULL, NULL, keywords1);
|
|
Packit |
116408 |
check_process_search_string (" dh_link_ ", TRUE, NULL, NULL, keywords1);
|
|
Packit |
116408 |
check_process_search_string ("dh_link_ get", TRUE, NULL, NULL, keywords2);
|
|
Packit |
116408 |
check_process_search_string ("dh_link_ get ", TRUE, NULL, NULL, keywords2);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* book_id, page_id and keywords. */
|
|
Packit |
116408 |
check_process_search_string ("book:devhelp dh_link_", TRUE, "devhelp", NULL, keywords1);
|
|
Packit |
116408 |
check_process_search_string ("book:devhelp dh_link_ get ", TRUE, "devhelp", NULL, keywords2);
|
|
Packit |
116408 |
check_process_search_string ("page:DhLink dh_link_", TRUE, NULL, "DhLink", keywords1);
|
|
Packit |
116408 |
check_process_search_string ("page:DhLink dh_link_ get", TRUE, NULL, "DhLink", keywords2);
|
|
Packit |
116408 |
check_process_search_string ("book:devhelp page:DhLink dh_link_", TRUE, "devhelp", "DhLink", keywords1);
|
|
Packit |
116408 |
check_process_search_string ("book:devhelp page:DhLink \t dh_link_ ", TRUE, "devhelp", "DhLink", keywords1);
|
|
Packit |
116408 |
check_process_search_string ("page:DhLink book:devhelp dh_link_", TRUE, "devhelp", "DhLink", keywords1);
|
|
Packit |
116408 |
check_process_search_string ("book:devhelp page:DhLink dh_link_ get", TRUE, "devhelp", "DhLink", keywords2);
|
|
Packit |
116408 |
check_process_search_string ("book:devhelp page:DhLink dh_link_ \t get\n", TRUE, "devhelp", "DhLink", keywords2);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_free (keywords1);
|
|
Packit |
116408 |
g_free (keywords2);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
check_case_sensitive (const gchar *search_string,
|
|
Packit |
116408 |
gboolean expected_case_sensitive)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhSearchContext *search_context;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
search_context = _dh_search_context_new (search_string);
|
|
Packit |
116408 |
g_assert (search_context != NULL);
|
|
Packit |
116408 |
g_assert_cmpint (_dh_search_context_get_case_sensitive (search_context), ==, expected_case_sensitive);
|
|
Packit |
116408 |
_dh_search_context_free (search_context);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
test_case_sensitive (void)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
/* Only keywords. */
|
|
Packit |
116408 |
check_case_sensitive ("dh_link_", FALSE);
|
|
Packit |
116408 |
check_case_sensitive ("dh_link_ get", FALSE);
|
|
Packit |
116408 |
check_case_sensitive ("DhLink", TRUE);
|
|
Packit |
116408 |
check_case_sensitive ("a DhLink", TRUE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* book_id and page_id only. */
|
|
Packit |
116408 |
check_case_sensitive ("book:devhelp", FALSE);
|
|
Packit |
116408 |
check_case_sensitive ("page:DhLink", FALSE);
|
|
Packit |
116408 |
check_case_sensitive ("book:devhelp page:DhLink", FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* book_id, page_id and keywords. */
|
|
Packit |
116408 |
|
|
Packit |
116408 |
// Only normal keywords must be taken into account for case sensitivity.
|
|
Packit |
116408 |
check_case_sensitive ("book:devhelp page:DhLink dh_link_ get", FALSE);
|
|
Packit |
116408 |
check_case_sensitive ("page:DhLink dh_link_ get", FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
check_case_sensitive ("book:devhelp dh_link_ get", FALSE);
|
|
Packit |
116408 |
check_case_sensitive ("book:devhelp page:DhLink DhLink", TRUE);
|
|
Packit |
116408 |
check_case_sensitive ("book:devhelp DhLink", TRUE);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
check_link_simple (const gchar *search_string,
|
|
Packit |
116408 |
const gchar *link_name,
|
|
Packit |
116408 |
gboolean prefix,
|
|
Packit |
116408 |
gboolean expected_match,
|
|
Packit |
116408 |
gboolean expected_exact)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhSearchContext *search_context;
|
|
Packit |
116408 |
DhLink *book_link;
|
|
Packit |
116408 |
DhLink *link;
|
|
Packit |
116408 |
gboolean match;
|
|
Packit |
116408 |
gboolean exact;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
search_context = _dh_search_context_new (search_string);
|
|
Packit |
116408 |
g_assert (search_context != NULL);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
book_link = dh_link_new_book ("/usr/share/gtk-doc/html/devhelp-3",
|
|
Packit |
116408 |
"devhelp",
|
|
Packit |
116408 |
"Devhelp Reference Manual",
|
|
Packit |
116408 |
"index.html");
|
|
Packit |
116408 |
|
|
Packit |
116408 |
link = dh_link_new (DH_LINK_TYPE_FUNCTION,
|
|
Packit |
116408 |
book_link,
|
|
Packit |
116408 |
link_name,
|
|
Packit |
116408 |
"ClassName.html#function-name");
|
|
Packit |
116408 |
|
|
Packit |
116408 |
match = _dh_search_context_match_link (search_context, link, prefix);
|
|
Packit |
116408 |
g_assert_cmpint (match, ==, expected_match);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (match && prefix) {
|
|
Packit |
116408 |
exact = _dh_search_context_is_exact_link (search_context, link);
|
|
Packit |
116408 |
g_assert_cmpint (exact, ==, expected_exact);
|
|
Packit |
116408 |
} else {
|
|
Packit |
116408 |
g_assert (!expected_exact);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
_dh_search_context_free (search_context);
|
|
Packit |
116408 |
dh_link_unref (book_link);
|
|
Packit |
116408 |
dh_link_unref (link);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
test_link_simple (void)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
/* Prefix match but not exact. */
|
|
Packit |
116408 |
check_link_simple ("dh_link_", "dh_link_new", TRUE, TRUE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("dh_link_", "dh_link_new", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Prefix match and exact. */
|
|
Packit |
116408 |
check_link_simple ("dh_link_new", "dh_link_new", TRUE, TRUE, TRUE);
|
|
Packit |
116408 |
check_link_simple ("dh_link_new", "dh_link_new", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Nonprefix match. */
|
|
Packit |
116408 |
check_link_simple ("link", "dh_link_new", TRUE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("link", "dh_link_new", FALSE, TRUE, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Case insensitive. */
|
|
Packit |
116408 |
check_link_simple ("link", "DhLink", TRUE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("link", "DhLink", FALSE, TRUE, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Case sensitive. */
|
|
Packit |
116408 |
check_link_simple ("Link", "DhLink", TRUE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("Link", "DhLink", FALSE, TRUE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("Link", "dh_link_new", TRUE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("Link", "dh_link_new", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Several keywords. */
|
|
Packit |
116408 |
check_link_simple ("dh_link_ book", "dh_link_new_book", TRUE, TRUE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("dh_link_ book", "dh_link_new_book", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("dh_link_ book", "dh_link_new", TRUE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("dh_link_ book", "dh_link_new", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Globs */
|
|
Packit |
116408 |
check_link_simple ("dh_link_*book", "dh_link_new_book", TRUE, TRUE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("dh_link_*book", "dh_link_new_book", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("dh_link_*book", "dh_link_new", TRUE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("dh_link_*book", "dh_link_new", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
check_link_simple ("??_link_new", "dh_link_new", TRUE, TRUE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("??_link_new", "dh_link_new", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("??_link_new", "dh_link_compare", TRUE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("??_link_new", "dh_link_compare", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Several keywords, not necessarily in the same order. */
|
|
Packit |
116408 |
check_link_simple ("gtk window application", "gtk_window_get_application", TRUE, TRUE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("gtk window application", "gtk_window_get_application", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("gtk window application", "GtkApplicationWindow", TRUE, TRUE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("gtk window application", "GtkApplicationWindow", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
check_link_simple ("gtk*window*application", "gtk_window_get_application", TRUE, TRUE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("gtk*window*application", "gtk_window_get_application", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("gtk*window*application", "GtkApplicationWindow", TRUE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("gtk*window*application", "GtkApplicationWindow", FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Prefix appearing several times.
|
|
Packit |
116408 |
* The DhLink must not appear two times in the search results.
|
|
Packit |
116408 |
*/
|
|
Packit |
116408 |
check_link_simple ("GTK CELL_RENDERER_ACCEL_MODE_GTK", "GTK_CELL_RENDERER_ACCEL_MODE_GTK",
|
|
Packit |
116408 |
TRUE, TRUE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("GTK CELL_RENDERER_ACCEL_MODE_GTK", "GTK_CELL_RENDERER_ACCEL_MODE_GTK",
|
|
Packit |
116408 |
FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("GTK* CELL_RENDERER_ACCEL_MODE_GTK", "GTK_CELL_RENDERER_ACCEL_MODE_GTK",
|
|
Packit |
116408 |
TRUE, TRUE, FALSE);
|
|
Packit |
116408 |
check_link_simple ("GTK* CELL_RENDERER_ACCEL_MODE_GTK", "GTK_CELL_RENDERER_ACCEL_MODE_GTK",
|
|
Packit |
116408 |
FALSE, FALSE, FALSE);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
int
|
|
Packit |
116408 |
main (int argc,
|
|
Packit |
116408 |
char **argv)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
g_test_init (&argc, &argv, NULL);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_test_add_func ("/search_context/process_search_string", test_process_search_string);
|
|
Packit |
116408 |
g_test_add_func ("/search_context/case_sensitive", test_case_sensitive);
|
|
Packit |
116408 |
g_test_add_func ("/search_context/link_simple", test_link_simple);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
return g_test_run ();
|
|
Packit |
116408 |
}
|