#include "config.h" #include #include typedef struct { const gchar *string; const gchar *prefix; const gchar *locale; gboolean should_match; } SearchTest; /* Test word separators and case */ SearchTest basic[] = { { "Hello World", "he", "C", TRUE }, { "Hello World", "wo", "C", TRUE }, { "Hello World", "lo", "C", FALSE }, { "Hello World", "ld", "C", FALSE }, { "Hello-World", "wo", "C", TRUE }, { "HelloWorld", "wo", "C", FALSE }, { NULL, NULL, NULL, FALSE } }; /* Test composed chars (accentued letters) */ SearchTest composed[] = { { "Jörgen", "jor", "sv_SE.UTF-8", TRUE }, { "Gaëtan", "gaetan", "fr_FR.UTF-8", TRUE }, { "élève", "ele", "fr_FR.UTF-8", TRUE }, { "Azais", "AzaÏs", "fr_FR.UTF-8", FALSE }, { "AzaÏs", "Azais", "fr_FR.UTF-8", TRUE }, { NULL, NULL, NULL, FALSE } }; /* Test decomposed chars, they looks the same, but are actually * composed of multiple unicodes */ SearchTest decomposed[] = { { "Jorgen", "Jör", "sv_SE.UTF-8", FALSE }, { "Jörgen", "jor", "sv_SE.UTF-8", TRUE }, { NULL, NULL, NULL, FALSE } }; /* Turkish special case */ SearchTest turkish[] = { { "İstanbul", "ist", "tr_TR.UTF-8", TRUE }, { "Diyarbakır", "diyarbakir", "tr_TR.UTF-8", TRUE }, { NULL, NULL, NULL, FALSE } }; /* Test unicode chars when no locale is available */ SearchTest c_locale_unicode[] = { { "Jörgen", "jor", "C", TRUE }, { "Jorgen", "Jör", "C", FALSE }, { "Jörgen", "jor", "C", TRUE }, { NULL, NULL, NULL, FALSE } }; /* Multi words */ SearchTest multi_words[] = { { "Xavier Claessens", "Xav Cla", "C", TRUE }, { "Xavier Claessens", "Cla Xav", "C", TRUE }, { "Foo Bar Baz", " b ", "C", TRUE }, { "Foo Bar Baz", "bar bazz", "C", FALSE }, { NULL, NULL, NULL, FALSE } }; static void test_search (gconstpointer d) { const SearchTest *tests = d; guint i; gboolean all_skipped = TRUE; g_debug ("Started"); for (i = 0; tests[i].string != NULL; i++) { gboolean match; gboolean ok = FALSE; gboolean skipped; if (setlocale (LC_ALL, tests[i].locale)) { skipped = FALSE; all_skipped = FALSE; match = g_str_match_string (tests[i].prefix, tests[i].string, TRUE); ok = (match == tests[i].should_match); } else { skipped = TRUE; g_test_message ("Locale '%s' is unavailable", tests[i].locale); } g_debug ("'%s' - '%s' %s: %s", tests[i].prefix, tests[i].string, tests[i].should_match ? "should match" : "should NOT match", skipped ? "SKIPPED" : ok ? "OK" : "FAILED"); g_assert (skipped || ok); } if (all_skipped) g_test_skip ("No locales for the test set are available"); } int main (int argc, char **argv) { gchar *user_locale; g_test_init (&argc, &argv, NULL); setlocale (LC_ALL, ""); user_locale = setlocale (LC_ALL, NULL); g_debug ("Current user locale: %s", user_locale); g_test_add_data_func ("/search/basic", basic, test_search); g_test_add_data_func ("/search/composed", composed, test_search); g_test_add_data_func ("/search/decomposed", decomposed, test_search); g_test_add_data_func ("/search/turkish", turkish, test_search); g_test_add_data_func ("/search/c_locale_unicode", c_locale_unicode, test_search); g_test_add_data_func ("/search/multi_words", multi_words, test_search); return g_test_run (); }