diff --git a/gtk/fnmatch.c b/gtk/fnmatch.c index ba661afbbe..0ad1cd8992 100644 --- a/gtk/fnmatch.c +++ b/gtk/fnmatch.c @@ -253,109 +253,3 @@ _gtk_fnmatch (const char *pattern, { return gtk_fnmatch_intern (pattern, string, TRUE, no_leading_period, casefold); } - -#undef FNMATCH_TEST_CASES -#ifdef FNMATCH_TEST_CASES - -#define TEST(pat, str, no_leading_period, result) \ - g_assert (_gtk_fnmatch ((pat), (str), (no_leading_period)) == result) - -int main (int argc, char **argv) -{ - TEST ("[a-]", "-", TRUE, TRUE); - - TEST ("a", "a", TRUE, TRUE); - TEST ("a", "b", TRUE, FALSE); - - /* Test what ? matches */ - TEST ("?", "a", TRUE, TRUE); - TEST ("?", ".", TRUE, FALSE); - TEST ("a?", "a.", TRUE, TRUE); - TEST ("a/?", "a/b", TRUE, TRUE); - TEST ("a/?", "a/.", TRUE, FALSE); - TEST ("?", "/", TRUE, FALSE); - - /* Test what * matches */ - TEST ("*", "a", TRUE, TRUE); - TEST ("*", ".", TRUE, FALSE); - TEST ("a*", "a.", TRUE, TRUE); - TEST ("a/*", "a/b", TRUE, TRUE); - TEST ("a/*", "a/.", TRUE, FALSE); - TEST ("*", "/", TRUE, FALSE); - - /* Range tests */ - TEST ("[ab]", "a", TRUE, TRUE); - TEST ("[ab]", "c", TRUE, FALSE); - TEST ("[^ab]", "a", TRUE, FALSE); - TEST ("[!ab]", "a", TRUE, FALSE); - TEST ("[^ab]", "c", TRUE, TRUE); - TEST ("[!ab]", "c", TRUE, TRUE); - TEST ("[a-c]", "b", TRUE, TRUE); - TEST ("[a-c]", "d", TRUE, FALSE); - TEST ("[a-]", "-", TRUE, TRUE); - TEST ("[]]", "]", TRUE, TRUE); - TEST ("[^]]", "a", TRUE, TRUE); - TEST ("[!]]", "a", TRUE, TRUE); - - /* Various unclosed ranges */ - TEST ("[ab", "a", TRUE, FALSE); - TEST ("[a-", "a", TRUE, FALSE); - TEST ("[ab", "c", TRUE, FALSE); - TEST ("[a-", "c", TRUE, FALSE); - TEST ("[^]", "a", TRUE, FALSE); - - /* Ranges and special no-wildcard matches */ - TEST ("[.]", ".", TRUE, FALSE); - TEST ("a[.]", "a.", TRUE, TRUE); - TEST ("a/[.]", "a/.", TRUE, FALSE); - TEST ("[/]", "/", TRUE, FALSE); - TEST ("[^/]", "a", TRUE, TRUE); - - /* Basic tests of * (and combinations of * and ?) */ - TEST ("a*b", "ab", TRUE, TRUE); - TEST ("a*b", "axb", TRUE, TRUE); - TEST ("a*b", "axxb", TRUE, TRUE); - TEST ("a**b", "ab", TRUE, TRUE); - TEST ("a**b", "axb", TRUE, TRUE); - TEST ("a**b", "axxb", TRUE, TRUE); - TEST ("a*?*b", "ab", TRUE, FALSE); - TEST ("a*?*b", "axb", TRUE, TRUE); - TEST ("a*?*b", "axxb", TRUE, TRUE); - - /* Test of *[range] */ - TEST ("a*[cd]", "ac", TRUE, TRUE); - TEST ("a*[cd]", "axc", TRUE, TRUE); - TEST ("a*[cd]", "axx", TRUE, FALSE); - - TEST ("a/[.]", "a/.", TRUE, FALSE); - TEST ("a*[.]", "a/.", TRUE, FALSE); - - /* Test of UTF-8 */ - - TEST ("ä", "ä", TRUE, TRUE); /* TEST ("ä", "ä", TRUE); */ - TEST ("?", "ä", TRUE, TRUE); /* TEST ("?", "ä", TRUE); */ - TEST ("*ö", "äö", TRUE, TRUE); /* TEST ("*ö", "äö", TRUE); */ - TEST ("*ö", "ääö", TRUE, TRUE); /* TEST ("*ö", "ääö", TRUE); */ - TEST ("[ä]", "ä", TRUE, TRUE); /* TEST ("[ä]", "ä", TRUE); */ - TEST ("[ä-ö]", "é", TRUE, TRUE); /* TEST ("[ä-ö]", "é", TRUE); */ - TEST ("[ä-ö]", "a", TRUE, FALSE); /* TEST ("[ä-ö]", "a", FALSE); */ - -#ifdef DO_ESCAPE - /* Tests of escaping */ - TEST ("\\\\", "\\", TRUE, TRUE); - TEST ("\\?", "?", TRUE, TRUE); - TEST ("\\?", "a", TRUE, FALSE); - TEST ("\\*", "*", TRUE, TRUE); - TEST ("\\*", "a", TRUE, FALSE); - TEST ("\\[a-b]", "[a-b]", TRUE, TRUE); - TEST ("[\\\\]", "\\", TRUE, TRUE); - TEST ("[\\^a]", "a", TRUE, TRUE); - TEST ("[a\\-c]", "b", TRUE, FALSE); - TEST ("[a\\-c]", "-", TRUE, TRUE); - TEST ("[a\\]", "a", TRUE, FALSE); -#endif /* DO_ESCAPE */ - - return 0; -} - -#endif /* FNMATCH_TEST_CASES */ diff --git a/testsuite/gtk/fnmatch.c b/testsuite/gtk/fnmatch.c new file mode 100644 index 0000000000..a614c1f99b --- /dev/null +++ b/testsuite/gtk/fnmatch.c @@ -0,0 +1,140 @@ +#include +#include "gtk/gtkprivate.h" + +#if defined(G_OS_WIN32) || defined(G_WITH_CYGWIN) +#define DO_ESCAPE 0 +#else +#define DO_ESCAPE 1 +#endif + +typedef struct { + const char *pat; + const char *str; + gboolean no_leading_period; + gboolean ci; + gboolean result; +} TestCase; + +static TestCase tests[] = { + { "[a-]", "-", TRUE, FALSE, TRUE }, + + { "a", "a", TRUE, FALSE, TRUE }, + { "a", "b", TRUE, FALSE, FALSE }, + + /* Test what ? matches */ + { "?", "a", TRUE, FALSE, TRUE }, + { "?", ".", TRUE, FALSE, FALSE }, + { "a?", "a.", TRUE, FALSE, TRUE }, + { "a/?", "a/b", TRUE, FALSE, TRUE }, + { "a/?", "a/.", TRUE, FALSE, FALSE }, + { "?", "/", TRUE, FALSE, FALSE }, + + /* Test what * matches */ + { "*", "a", TRUE, FALSE, TRUE }, + { "*", ".", TRUE, FALSE, FALSE }, + { "a*", "a.", TRUE, FALSE, TRUE }, + { "a/*", "a/b", TRUE, FALSE, TRUE }, + { "a/*", "a/.", TRUE, FALSE, FALSE }, + { "*", "/", TRUE, FALSE, FALSE }, + + /* Range tests */ + { "[ab]", "a", TRUE, FALSE, TRUE }, + { "[ab]", "c", TRUE, FALSE, FALSE }, + { "[^ab]", "a", TRUE, FALSE, FALSE }, + { "[!ab]", "a", TRUE, FALSE, FALSE }, + { "[^ab]", "c", TRUE, FALSE, TRUE }, + { "[!ab]", "c", TRUE, FALSE, TRUE }, + { "[a-c]", "b", TRUE, FALSE, TRUE }, + { "[a-c]", "d", TRUE, FALSE, FALSE }, + { "[a-]", "-", TRUE, FALSE, TRUE }, + { "[]]", "]", TRUE, FALSE, TRUE }, + { "[^]]", "a", TRUE, FALSE, TRUE }, + { "[!]]", "a", TRUE, FALSE, TRUE }, + + /* Various unclosed ranges */ + { "[ab", "a", TRUE, FALSE, FALSE }, + { "[a-", "a", TRUE, FALSE, FALSE }, + { "[ab", "c", TRUE, FALSE, FALSE }, + { "[a-", "c", TRUE, FALSE, FALSE }, + { "[^]", "a", TRUE, FALSE, FALSE }, + + /* Ranges and special no-wildcard matches */ + { "[.]", ".", TRUE, FALSE, FALSE }, + { "a[.]", "a.", TRUE, FALSE, TRUE }, + { "a/[.]", "a/.", TRUE, FALSE, FALSE }, + { "[/]", "/", TRUE, FALSE, FALSE }, + { "[^/]", "a", TRUE, FALSE, TRUE }, + + /* Basic tests of * (and combinations of * and ?) */ + { "a*b", "ab", TRUE, FALSE, TRUE }, + { "a*b", "axb", TRUE, FALSE, TRUE }, + { "a*b", "axxb", TRUE, FALSE, TRUE }, + { "a**b", "ab", TRUE, FALSE, TRUE }, + { "a**b", "axb", TRUE, FALSE, TRUE }, + { "a**b", "axxb", TRUE, FALSE, TRUE }, + { "a*?*b", "ab", TRUE, FALSE, FALSE }, + { "a*?*b", "axb", TRUE, FALSE, TRUE }, + { "a*?*b", "axxb", TRUE, FALSE, TRUE }, + + /* Test of *[range] */ + { "a*[cd]", "ac", TRUE, FALSE, TRUE }, + { "a*[cd]", "axc", TRUE, FALSE, TRUE }, + { "a*[cd]", "axx", TRUE, FALSE, FALSE }, + + { "a/[.]", "a/.", TRUE, FALSE, FALSE }, + { "a*[.]", "a/.", TRUE, FALSE, FALSE }, + + + /* Test of UTF-8 */ + + { "ä", "ä", TRUE, FALSE, TRUE }, + { "?", "ä", TRUE, FALSE, TRUE }, + { "*ö", "äö", TRUE, FALSE, TRUE }, + { "*ö", "ääö", TRUE, FALSE, TRUE }, + { "[ä]", "ä", TRUE, FALSE, TRUE }, + { "[ä-ö]", "é", TRUE, FALSE, TRUE }, + { "[ä-ö]", "a", TRUE, FALSE, FALSE }, + + /* ci patterns */ + { "*.txt", "a.TXT", TRUE, TRUE, TRUE }, + { "*.txt", "a.TxT", TRUE, TRUE, TRUE }, + { "*.txt", "a.txT", TRUE, TRUE, TRUE }, + { "*ö", "äÖ", TRUE, TRUE, TRUE }, + +#ifdef DO_ESCAPE + /* Tests of escaping */ + { "\\\\", "\\", TRUE, FALSE, TRUE }, + { "\\?", "?", TRUE, FALSE, TRUE }, + { "\\?", "a", TRUE, FALSE, FALSE }, + { "\\*", "*", TRUE, FALSE, TRUE }, + { "\\*", "a", TRUE, FALSE, FALSE }, + { "\\[a-b]", "[a-b]", TRUE, FALSE, TRUE }, + { "[\\\\]", "\\", TRUE, FALSE, TRUE }, + { "[\\^a]", "a", TRUE, FALSE, TRUE }, + { "[a\\-c]", "b", TRUE, FALSE, FALSE }, + { "[a\\-c]", "-", TRUE, FALSE, TRUE }, + { "[a\\]", "a", TRUE, FALSE, FALSE }, +#endif /* DO_ESCAPE */ +}; + +static void +test_fnmatch (gconstpointer data) +{ + const TestCase *test = data; + + g_assert_true (_gtk_fnmatch (test->pat, test->str, test->no_leading_period, test->ci) == test->result); +} + +int +main (int argc, char *argv[]) +{ + (g_test_init) (&argc, &argv, NULL); + + for (int i = 0; i < G_N_ELEMENTS (tests); i++) + { + char *path = g_strdup_printf ("/fnmatch/test%d", i); + g_test_add_data_func (path, &tests[i], test_fnmatch); + } + + return g_test_run (); +} diff --git a/testsuite/gtk/meson.build b/testsuite/gtk/meson.build index 9fe45d339b..a0b53250ed 100644 --- a/testsuite/gtk/meson.build +++ b/testsuite/gtk/meson.build @@ -118,6 +118,7 @@ internal_tests = [ { 'name': 'rbtree' }, { 'name': 'timsort' }, { 'name': 'texthistory' }, + { 'name': 'fnmatch' }, ] # Tests that are expected to fail