mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-10-31 08:22:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			183 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2025 Khalid Abu Shawarib.
 | |
|  *
 | |
|  * SPDX-License-Identifier: LGPL-2.1-or-later
 | |
|  *
 | |
|  * Author: Khalid Abu Shawarib <kas@gnome.org>
 | |
|  */
 | |
| 
 | |
| #include <gio/gio.h>
 | |
| 
 | |
| static void
 | |
| create_files (const GStrv hier)
 | |
| {
 | |
|   g_mkdir_with_parents (g_get_home_dir (), 0700);
 | |
| 
 | |
|   for (guint i = 0; hier[i] != NULL; i++)
 | |
|     {
 | |
|       GFile *file = g_file_new_build_filename (g_get_home_dir (), hier[i], NULL);
 | |
|       gboolean is_directory = g_str_has_suffix (hier[i], G_DIR_SEPARATOR_S);
 | |
| 
 | |
|       if (is_directory)
 | |
|         g_file_make_directory (file, NULL, NULL);
 | |
|       else
 | |
|         {
 | |
|           GFileOutputStream *stream = g_file_create (file, G_FILE_CREATE_NONE, NULL, NULL);
 | |
| 
 | |
|           g_object_unref (stream);
 | |
|         }
 | |
| 
 | |
|       g_assert_true (g_file_query_exists (file, NULL));
 | |
| 
 | |
|       g_object_unref (file);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static GStrv
 | |
| prefix_filenames (const gchar *const strings[],
 | |
|                   const gchar *prefix)
 | |
| {
 | |
|   GStrvBuilder *builder = g_strv_builder_new ();
 | |
| 
 | |
|   for (guint i = 0; strings[i] != NULL; i++)
 | |
|     g_strv_builder_take (builder, g_build_filename (prefix, strings[i], NULL));
 | |
| 
 | |
|   return g_strv_builder_unref_to_strv (builder);
 | |
| }
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|   const gchar *string;
 | |
|   const gchar *all_completion_suffix;
 | |
|   const gchar *dirs_completion_suffix;
 | |
|   const gchar *const all_completions[5];
 | |
|   const gchar *const dirs_completions[5];
 | |
| } FilenameCompleterTestCase;
 | |
| 
 | |
| static void
 | |
| run_test_cases (const FilenameCompleterTestCase test_cases[],
 | |
|                 guint len)
 | |
| {
 | |
|   const gchar *base_path = g_get_home_dir ();
 | |
| 
 | |
|   for (guint i = 0; i < len; i++)
 | |
|     {
 | |
|       GFilenameCompleter *all_completer = g_filename_completer_new ();
 | |
|       GFilenameCompleter *dirs_completer = g_filename_completer_new ();
 | |
|       gchar *completion_suffix;
 | |
|       GStrv all_results_completions, all_expected_completions;
 | |
|       GStrv dirs_results_completions, dirs_expected_completions;
 | |
|       gchar *path_to_complete = g_build_filename (base_path, test_cases[i].string, NULL);
 | |
|       GMainLoop *loop = g_main_loop_new (NULL, FALSE);
 | |
| 
 | |
|       /* dirs_only = FALSE */
 | |
|       g_signal_connect_swapped (all_completer, "got-completion-data",
 | |
|                                 G_CALLBACK (g_main_loop_quit), loop);
 | |
|       g_filename_completer_set_dirs_only (all_completer, FALSE);
 | |
|       g_strfreev (g_filename_completer_get_completions (all_completer, path_to_complete));
 | |
| 
 | |
|       g_main_loop_run (loop);
 | |
| 
 | |
|       all_expected_completions = prefix_filenames (test_cases[i].all_completions, base_path);
 | |
|       all_results_completions = g_filename_completer_get_completions (all_completer, path_to_complete);
 | |
|       g_assert_cmpstrv (all_expected_completions, all_results_completions);
 | |
|       g_strfreev (all_expected_completions);
 | |
|       g_strfreev (all_results_completions);
 | |
| 
 | |
|       completion_suffix = g_filename_completer_get_completion_suffix (all_completer,
 | |
|                                                                       path_to_complete);
 | |
|       g_assert_cmpstr (test_cases[i].all_completion_suffix, ==, completion_suffix);
 | |
|       g_free (completion_suffix);
 | |
| 
 | |
|       /* dirs_only = TRUE */
 | |
|       g_signal_connect_swapped (dirs_completer, "got-completion-data",
 | |
|                                 G_CALLBACK (g_main_loop_quit), loop);
 | |
|       g_filename_completer_set_dirs_only (dirs_completer, TRUE);
 | |
|       g_strfreev (g_filename_completer_get_completions (dirs_completer, path_to_complete));
 | |
| 
 | |
|       g_main_loop_run (loop);
 | |
| 
 | |
|       dirs_expected_completions = prefix_filenames (test_cases[i].dirs_completions, base_path);
 | |
|       dirs_results_completions = g_filename_completer_get_completions (dirs_completer, path_to_complete);
 | |
|       g_assert_cmpstrv (dirs_expected_completions, dirs_results_completions);
 | |
| 
 | |
|       g_strfreev (dirs_expected_completions);
 | |
|       g_strfreev (dirs_results_completions);
 | |
| 
 | |
|       completion_suffix = g_filename_completer_get_completion_suffix (dirs_completer,
 | |
|                                                                       path_to_complete);
 | |
|       g_assert_cmpstr (test_cases[i].dirs_completion_suffix, ==, completion_suffix);
 | |
|       g_free (completion_suffix);
 | |
| 
 | |
|       g_object_unref (all_completer);
 | |
|       g_object_unref (dirs_completer);
 | |
|       g_free (path_to_complete);
 | |
|       g_main_loop_unref (loop);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| test_completions (void)
 | |
| {
 | |
|   const GStrv files_hier = (char *[]){
 | |
|     "file_1",
 | |
|     "file_2",
 | |
|     "folder_1" G_DIR_SEPARATOR_S,
 | |
|     "folder_2" G_DIR_SEPARATOR_S,
 | |
|     NULL
 | |
|   };
 | |
|   const FilenameCompleterTestCase test_cases[] = {
 | |
|     {
 | |
|         "f",
 | |
|         "",
 | |
|         "older_",
 | |
|         { "file_1",
 | |
|           "file_2",
 | |
|           "folder_1" G_DIR_SEPARATOR_S,
 | |
|           "folder_2" G_DIR_SEPARATOR_S,
 | |
|           NULL },
 | |
|         { "folder_1" G_DIR_SEPARATOR_S,
 | |
|           "folder_2" G_DIR_SEPARATOR_S,
 | |
|           NULL },
 | |
|     },
 | |
| 
 | |
|     {
 | |
|         "fi",
 | |
|         "le_",
 | |
|         NULL,
 | |
|         { "file_1",
 | |
|           "file_2",
 | |
|           NULL },
 | |
|         { NULL },
 | |
|     },
 | |
| 
 | |
|     {
 | |
|         "fo",
 | |
|         "lder_",
 | |
|         "lder_",
 | |
|         { "folder_1" G_DIR_SEPARATOR_S,
 | |
|           "folder_2" G_DIR_SEPARATOR_S,
 | |
|           NULL },
 | |
|         { "folder_1" G_DIR_SEPARATOR_S,
 | |
|           "folder_2" G_DIR_SEPARATOR_S,
 | |
|           NULL },
 | |
|     },
 | |
|   };
 | |
| 
 | |
|   create_files (files_hier);
 | |
| 
 | |
|   run_test_cases (test_cases, G_N_ELEMENTS (test_cases));
 | |
| }
 | |
| 
 | |
| int
 | |
| main (int argc, char *argv[])
 | |
| {
 | |
|   g_setenv ("LC_ALL", "C", TRUE);
 | |
| 
 | |
|   g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
 | |
| 
 | |
|   g_test_add_func ("/filenamecompleter/basic", test_completions);
 | |
| 
 | |
|   return g_test_run ();
 | |
| }
 |