#include #include #include "nautilus-file.h" #include "nautilus-file-private.h" #include "src/nautilus-file-utilities.h" #include "test-utilities.h" static void test_has_large_enough_common_prefix (void) { const char *list[] = { "test", "tests", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("test", ==, actual); } static void test_has_large_enough_common_prefix_with_spaces_in_middle (void) { const char *list[] = { "Cpt J Yossarian r1", "Cpt J Yossarian a1", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("Cpt J Yossarian", ==, actual); } static void test_has_large_enough_common_prefix_with_punctuation_in_middle (void) { const char *list[] = { "Cpt-J_Yossarian r1", "Cpt-J_Yossarian a1", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("Cpt-J_Yossarian", ==, actual); } static void test_has_large_enough_common_prefix_with_punctuation_in_middle_and_extension (void) { const char *list[] = { "Cpt-J, Yossarian.xml", "Cpt-J, Yossarian.xsl", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("Cpt-J, Yossarian", ==, actual); } static void test_doesnt_have_large_enough_common_prefix (void) { const char *list[] = { "foo", "foob", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_null (actual); } static void test_doesnt_have_large_enough_common_prefix_completely_different_strings (void) { const char *list[] = { "this string really", "isn't the same as the other", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_null (actual); } static void test_doesnt_have_large_enough_common_prefix_first_character_differs (void) { const char *list[] = { "foo", "roo", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_null (actual); } static void test_doesnt_have_large_enough_common_prefix_first_character_differs_longer_string (void) { const char *list[] = { "fools", "rools", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_null (actual); } static void test_has_large_enough_common_prefix_until_extension_removed (void) { const char *list[] = { "tes.txt", "tes.tar", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_null (actual); } static void test_extension_is_removed (void) { const char *list[] = { "nau tilus.c", "nau tilus.cpp", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("nau tilus", ==, actual); } static void test_whitespace_is_removed (void) { const char *list[] = { "nautilus ", "nautilus two", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("nautilus", ==, actual); } static void test_whitespace_and_extension_are_removed (void) { const char *list[] = { "nautilus !£ $\" foo.tar.gz", "nautilus !£ $\" .lzma", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("nautilus !£ $\"", ==, actual); } static void test_punctuation_is_preserved (void) { const char *list[] = { "nautilus (2018!£$%^&* ()_+-={}[ ];':@#~<>?,./\".mp4", "nautilus (2018!£$%^&* ()_+-={}[ ];':@#~<>?,./\".srt", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("nautilus (2018!£$%^&* ()_+-={}[ ];':@#~<>?,./\"", ==, actual); } static void test_unicode_on_outside (void) { const char *list[] = { "ӶtestӶ234", "ӶtestӶ1", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("ӶtestӶ", ==, actual); } static void test_unicode_on_inside (void) { const char *list[] = { "QQӶtestӶabb234", "QQӶtestӶabb1", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("QQӶtestӶabb", ==, actual); } static void test_unicode_whole_string (void) { const char *list[] = { "ǣȸʸͻͻΎΘΛ", "ǣȸʸͻͻΎΘ", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("ǣȸʸͻͻΎΘ", ==, actual); } static void test_unicode_extension (void) { const char *list[] = { "test.ǣȸʸͻͻΎΘΛ", "test.ǣȸʸͻͻΎΘ", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("test", ==, actual); } static void test_unicode_with_punctuation (void) { const char *list[] = { "ǣȸʸ- ͻͻΎΘ$%%^", "ǣȸʸ- ͻͻΎΘ$%%&", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 4); g_assert_cmpstr ("ǣȸʸ- ͻͻΎΘ$%%", ==, actual); } static void test_many_strings (void) { const int n_strings = 500; g_auto (GStrv) list = g_new (char *, n_strings + 1); g_autofree char *actual = NULL; for (int i = 0; i < n_strings; ++i) { list[i] = g_strdup_printf ("we are no longer the knights who say nii%d", i); } list[n_strings] = NULL; actual = nautilus_get_common_filename_prefix_from_filenames ((const char * const *) list, 4); g_assert_cmpstr ("we are no longer the knights who say nii", ==, actual); } static void test_many_strings_last_differs (void) { const int n_strings = 500; g_auto (GStrv) list = g_new (char *, n_strings + 1); g_autofree char *actual = NULL; char *filename; for (int i = 0; i < n_strings; ++i) { filename = g_strdup_printf ("we are no longer the knights who say nii%d", i); if (i == n_strings - 1) { filename[2] = 'X'; } list[i] = filename; } list[n_strings] = NULL; actual = nautilus_get_common_filename_prefix_from_filenames ((const char * const *) list, 4); g_assert_null (actual); } static void test_many_strings_first_differs (void) { const int n_strings = 500; g_auto (GStrv) list = g_new (char *, n_strings + 1); g_autofree char *actual = NULL; char *filename; for (int i = 0; i < n_strings; ++i) { filename = g_strdup_printf ("we are no longer the knights who say nii%d", i); if (i == 0) { filename[2] = 'X'; } list[i] = filename; } list[n_strings] = NULL; actual = nautilus_get_common_filename_prefix_from_filenames ((const char * const *) list, 4); g_assert_null (actual); } static void test_smaller_min_length_and_does_have_common_prefix (void) { const char *list[] = { "CA", "CB", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 1); g_assert_cmpstr ("C", ==, actual); } static void test_smaller_min_length_and_doesnt_have_common_prefix (void) { const char *list[] = { "CA", "BB", NULL }; g_autofree char *actual = nautilus_get_common_filename_prefix_from_filenames (list, 1); g_assert_null (actual); } static GList * get_files_for_names (const GStrv files_names) { gsize len = g_strv_length (files_names); GList *files = NULL; for (gsize i = 0; i < len; i++) { gchar *name = files_names[i]; g_autofree gchar *uri = g_strconcat ("file:///", name, NULL); NautilusFile *file = nautilus_file_get_by_uri (uri); if (name[strlen (name) - 1] == G_DIR_SEPARATOR) { /* Info about the file type being a directory need to be set manually. */ file->details->type = G_FILE_TYPE_DIRECTORY; } files = g_list_prepend (files, file); } return files; } static void test_empty_file_list (void) { g_autofree char *actual = nautilus_get_common_filename_prefix (NULL, 1); g_assert_null (actual); } static void test_files (void) { const GStrv names = (char *[]) { "AB", "AC", NULL }; g_autolist (NautilusFile) files = get_files_for_names (names); g_autofree gchar *prefix = nautilus_get_common_filename_prefix (files, 1); g_assert_nonnull (prefix); g_assert_cmpstr (prefix, ==, "A"); } static void test_directories (void) { const GStrv names = (char *[]) { "AB/", "AC/", NULL }; g_autolist (NautilusFile) files = get_files_for_names (names); g_autofree gchar *prefix = nautilus_get_common_filename_prefix (files, 1); g_assert_nonnull (prefix); g_assert_cmpstr (prefix, ==, "A"); } static void test_files_and_directories (void) { const GStrv names = (char *[]) { "AB", "AC/", NULL }; g_autolist (NautilusFile) files = get_files_for_names (names); g_autofree gchar *prefix = nautilus_get_common_filename_prefix (files, 1); g_assert_nonnull (prefix); g_assert_cmpstr (prefix, ==, "A"); } static void setup_test_suite (void) { /* nautilus_get_common_filename_prefix_from_filenames () */ g_test_add_func ("/get-common-filename-prefix/string-list/1.0", test_has_large_enough_common_prefix); g_test_add_func ("/get-common-filename-prefix/string-list/1.1", test_has_large_enough_common_prefix_with_spaces_in_middle); g_test_add_func ("/get-common-filename-prefix/string-list/1.2", test_has_large_enough_common_prefix_with_punctuation_in_middle); g_test_add_func ("/get-common-filename-prefix/string-list/1.3", test_has_large_enough_common_prefix_with_punctuation_in_middle_and_extension); g_test_add_func ("/get-common-filename-prefix/string-list/2.0", test_doesnt_have_large_enough_common_prefix); g_test_add_func ("/get-common-filename-prefix/string-list/2.1", test_doesnt_have_large_enough_common_prefix_completely_different_strings); g_test_add_func ("/get-common-filename-prefix/string-list/2.2", test_doesnt_have_large_enough_common_prefix_first_character_differs); g_test_add_func ("/get-common-filename-prefix/string-list/2.3", test_doesnt_have_large_enough_common_prefix_first_character_differs_longer_string); g_test_add_func ("/get-common-filename-prefix/string-list/3.0", test_has_large_enough_common_prefix_until_extension_removed); g_test_add_func ("/get-common-filename-prefix/string-list/4.0", test_extension_is_removed); g_test_add_func ("/get-common-filename-prefix/string-list/4.1", test_whitespace_is_removed); g_test_add_func ("/get-common-filename-prefix/string-list/4.2", test_whitespace_and_extension_are_removed); g_test_add_func ("/get-common-filename-prefix/string-list/4.3", test_punctuation_is_preserved); g_test_add_func ("/get-common-filename-prefix/string-list/5.0", test_unicode_on_inside); g_test_add_func ("/get-common-filename-prefix/string-list/5.1", test_unicode_on_outside); g_test_add_func ("/get-common-filename-prefix/string-list/5.2", test_unicode_whole_string); g_test_add_func ("/get-common-filename-prefix/string-list/5.3", test_unicode_extension); g_test_add_func ("/get-common-filename-prefix/string-list/5.4", test_unicode_with_punctuation); g_test_add_func ("/get-common-filename-prefix/string-list/6.0", test_many_strings); g_test_add_func ("/get-common-filename-prefix/string-list/6.1", test_many_strings_last_differs); g_test_add_func ("/get-common-filename-prefix/string-list/6.2", test_many_strings_first_differs); g_test_add_func ("/get-common-filename-prefix/string-list/7.0", test_smaller_min_length_and_does_have_common_prefix); g_test_add_func ("/get-common-filename-prefix/string-list/7.1", test_smaller_min_length_and_doesnt_have_common_prefix); /* nautilus_get_common_filename_prefix () */ g_test_add_func ("/get-common-filename-prefix/file-list/1.0", test_empty_file_list); g_test_add_func ("/get-common-filename-prefix/file-list/2.0", test_files); g_test_add_func ("/get-common-filename-prefix/file-list/3.0", test_directories); g_test_add_func ("/get-common-filename-prefix/file-list/4.0", test_files_and_directories); } int main (int argc, char *argv[]) { g_test_init (&argc, &argv, NULL); g_test_bug_base ("http://bugzilla.gnome.org/show_bug.cgi?id=747907"); g_test_set_nonfatal_assertions (); nautilus_ensure_extension_points (); setup_test_suite (); return g_test_run (); }