#include #include #include #include typedef struct { const gchar **input; const gchar **sorted; const gchar **file_sorted; } CollateTest; typedef struct { gchar *key; const gchar *str; } Line; static void clear_line (Line *line) { g_free (line->key); } static int compare_collate (const void *a, const void *b) { const Line *line_a = a; const Line *line_b = b; return g_utf8_collate (line_a->str, line_b->str); } static int compare_key (const void *a, const void *b) { const Line *line_a = a; const Line *line_b = b; return strcmp (line_a->key, line_b->key); } static void do_collate (gboolean for_file, gboolean use_key, const CollateTest *test) { GArray *line_array; Line line; gint i; line_array = g_array_new (FALSE, FALSE, sizeof(Line)); g_array_set_clear_func (line_array, (GDestroyNotify)clear_line); for (i = 0; test->input[i]; i++) { line.str = test->input[i]; if (for_file) line.key = g_utf8_collate_key_for_filename (line.str, -1); else line.key = g_utf8_collate_key (line.str, -1); g_array_append_val (line_array, line); } qsort (line_array->data, line_array->len, sizeof (Line), use_key ? compare_key : compare_collate); for (i = 0; test->input[i]; i++) { const gchar *str; str = g_array_index (line_array, Line, i).str; if (for_file) g_assert_cmpstr (str, ==, test->file_sorted[i]); else g_assert_cmpstr (str, ==, test->sorted[i]); } g_array_free (line_array, TRUE); } static void test_collate (gconstpointer d) { const CollateTest *test = d; do_collate (FALSE, FALSE, test); } static void test_collate_key (gconstpointer d) { const CollateTest *test = d; do_collate (FALSE, TRUE, test); } static void test_collate_file (gconstpointer d) { const CollateTest *test = d; do_collate (TRUE, TRUE, test); } const gchar *input0[] = { "z", "c", "eer34", "223", "er1", "üĠണ", "foo", "bar", "baz", "GTK+", NULL }; const gchar *sorted0[] = { "223", "bar", "baz", "c", "eer34", "er1", "foo", "GTK+", "üĠണ", "z", NULL }; const gchar *file_sorted0[] = { "223", "bar", "baz", "c", "eer34", "er1", "foo", "GTK+", "üĠണ", "z", NULL }; const gchar *input1[] = { "file.txt", "file2.bla", "file.c", "file3.xx", "bla001", "bla02", "bla03", "bla4", "bla10", "bla100", "event.c", "eventgenerator.c", "event.h", NULL }; const gchar *sorted1[] = { "bla001", "bla02", "bla03", "bla10", "bla100", "bla4", "event.c", "eventgenerator.c", "event.h", "file2.bla", "file3.xx", "file.c", "file.txt", NULL }; const gchar *file_sorted1[] = { "bla001", "bla02", "bla03", "bla4", "bla10", "bla100", "event.c", "event.h", "eventgenerator.c", "file.c", "file.txt", "file2.bla", "file3.xx", NULL }; int main (int argc, char *argv[]) { gchar *path; gint i; const gchar *locale; CollateTest test[2]; g_test_init (&argc, &argv, NULL); g_setenv ("LC_ALL", "en_US", TRUE); locale = setlocale (LC_ALL, ""); if (locale == NULL || strcmp (locale, "en_US") != 0) { g_test_message ("No suitable locale, skipping test"); return 0; } test[0].input = input0; test[0].sorted = sorted0; test[0].file_sorted = file_sorted0; test[1].input = input1; test[1].sorted = sorted1; test[1].file_sorted = file_sorted1; for (i = 0; i < G_N_ELEMENTS (test); i++) { path = g_strdup_printf ("/unicode/collate/%d", i); g_test_add_data_func (path, &test[i], test_collate); g_free (path); path = g_strdup_printf ("/unicode/collate-key/%d", i); g_test_add_data_func (path, test, test_collate_key); g_free (path); path = g_strdup_printf ("/unicode/collate-filename/%d", i); g_test_add_data_func (path, test, test_collate_file); g_free (path); } return g_test_run (); }