1 /* GTK - The GIMP Toolkit
2 * autotestfilechooser.c: Automated unit tests for the GtkFileChooser widget
3 * Copyright (C) 2005, Novell, Inc.
6 * Federico Mena-Quintero <federico@novell.com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
26 * - In test_reload_sequence(), test that the selection is preserved properly
32 #define GTK_FILE_SYSTEM_ENABLE_UNSUPPORTED
33 #undef GTK_DISABLE_DEPRECATED
34 #define SLEEP_DURATION 100
38 #include <glib/gprintf.h>
40 #include "gtk/gtkfilechooserprivate.h"
41 #include "gtk/gtkfilechooserdefault.h"
42 #include "gtk/gtkfilechooserentry.h"
45 log_test (gboolean passed, const char *test_name, ...)
50 va_start (args, test_name);
51 str = g_strdup_vprintf (test_name, args);
55 g_printf ("%s: %s\n", passed ? "PASSED" : "FAILED", str);
59 typedef void (* SetFilenameFn) (GtkFileChooser *chooser, gpointer data);
60 typedef gboolean (* CompareFilenameFn) (GtkFileChooser *chooser, gpointer data);
62 struct test_set_filename_closure {
64 GtkWidget *accept_button;
65 gboolean focus_button;
69 set_filename_timeout_cb (gpointer data)
71 struct test_set_filename_closure *closure;
75 if (closure->focus_button)
76 gtk_widget_grab_focus (closure->accept_button);
78 gtk_button_clicked (GTK_BUTTON (closure->accept_button));
84 static guint wait_for_idle_id = 0;
87 wait_for_idle_idle (gpointer data)
97 wait_for_idle_id = g_idle_add_full (G_PRIORITY_LOW + 100,
101 while (wait_for_idle_id)
102 gtk_main_iteration ();
106 test_set_filename (GtkFileChooserAction action,
107 gboolean focus_button,
108 SetFilenameFn set_filename_fn,const
109 CompareFilenameFn compare_filename_fn,
113 struct test_set_filename_closure closure;
116 chooser = gtk_file_chooser_dialog_new ("hello", NULL, action,
117 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
120 closure.chooser = chooser;
121 closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (chooser), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
122 closure.focus_button = focus_button;
124 gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
126 (* set_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
128 gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, set_filename_timeout_cb, &closure, NULL);
129 gtk_dialog_run (GTK_DIALOG (chooser));
131 retval = (* compare_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
133 gtk_widget_destroy (chooser);
139 set_filename_cb (GtkFileChooser *chooser, gpointer data)
141 const char *filename;
144 gtk_file_chooser_set_filename (chooser, filename);
148 compare_filename_cb (GtkFileChooser *chooser, gpointer data)
150 const char *filename;
155 out_filename = gtk_file_chooser_get_filename (chooser);
159 retval = (strcmp (out_filename, filename) == 0);
160 g_free (out_filename);
168 test_black_box_set_filename (GtkFileChooserAction action, const char *filename, gboolean focus_button)
172 passed = test_set_filename (action, focus_button, set_filename_cb, compare_filename_cb, (char *) filename);
174 log_test (passed, "set_filename: action %d, focus_button=%s",
176 focus_button ? "TRUE" : "FALSE");
182 struct current_name_closure {
184 const char *current_name;
188 set_current_name_cb (GtkFileChooser *chooser, gpointer data)
190 struct current_name_closure *closure;
194 gtk_file_chooser_set_current_folder (chooser, closure->path);
195 gtk_file_chooser_set_current_name (chooser, closure->current_name);
199 compare_current_name_cb (GtkFileChooser *chooser, gpointer data)
201 struct current_name_closure *closure;
207 out_filename = gtk_file_chooser_get_filename (chooser);
213 filename = g_build_filename (closure->path, closure->current_name, NULL);
214 retval = (strcmp (filename, out_filename) == 0);
216 g_free (out_filename);
224 test_black_box_set_current_name (GtkFileChooserAction action, const char *path, const char *current_name, gboolean focus_button)
226 struct current_name_closure closure;
230 closure.current_name = current_name;
232 passed = test_set_filename (action, focus_button,
233 set_current_name_cb, compare_current_name_cb, &closure);
235 log_test (passed, "set_current_name, focus_button=%s", focus_button ? "TRUE" : "FALSE");
240 /* FIXME: fails in CREATE_FOLDER mode when FOLDER_NAME == "/" */
243 #define FILE_NAME "/nonexistent"
244 #define FOLDER_NAME "/etc"
246 #define FILE_NAME "/etc/passwd"
247 #define FOLDER_NAME "/etc"
250 #define CURRENT_NAME "parangaricutirimicuaro.txt"
251 #define CURRENT_NAME_FOLDER "parangaricutirimicuaro"
253 /* https://bugzilla.novell.com/show_bug.cgi?id=184875
254 * http://bugzilla.gnome.org/show_bug.cgi?id=347066
255 * http://bugzilla.gnome.org/show_bug.cgi?id=346058
258 test_black_box (void)
265 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, FALSE);
267 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, TRUE);
269 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, FALSE);
271 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, TRUE);
273 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, FALSE);
275 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, TRUE);
277 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, FALSE);
279 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, TRUE);
282 cwd = g_get_current_dir ();
284 passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_SAVE, cwd, CURRENT_NAME, FALSE);
286 passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_SAVE, cwd, CURRENT_NAME, TRUE);
288 passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, cwd, CURRENT_NAME_FOLDER, FALSE);
290 passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, cwd, CURRENT_NAME_FOLDER, TRUE);
295 log_test (passed, "Black box tests");
298 struct confirm_overwrite_closure {
300 GtkWidget *accept_button;
301 gint confirm_overwrite_signal_emitted;
305 static GtkFileChooserConfirmation
306 confirm_overwrite_cb (GtkFileChooser *chooser, gpointer data)
308 struct confirm_overwrite_closure *closure = data;
310 if (g_test_verbose())
312 closure->confirm_overwrite_signal_emitted += 1;
314 return GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME;
318 overwrite_response_cb (GtkFileChooser *chooser, gint response, gpointer data)
320 struct confirm_overwrite_closure *closure = data;
323 if (g_test_verbose())
326 if (response != GTK_RESPONSE_ACCEPT)
329 filename = gtk_file_chooser_get_filename (chooser);
331 if (!g_str_has_suffix (filename, closure->extension))
335 basename = g_path_get_basename (filename);
338 filename = g_strconcat (basename, closure->extension, NULL);
339 gtk_file_chooser_set_current_name (chooser, filename);
341 g_signal_stop_emission_by_name (chooser, "response");
342 gtk_dialog_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
347 confirm_overwrite_timeout_cb (gpointer data)
349 struct confirm_overwrite_closure *closure;
352 gtk_button_clicked (GTK_BUTTON (closure->accept_button));
357 /* http://bugzilla.gnome.org/show_bug.cgi?id=347883 */
359 test_confirm_overwrite_for_path (const char *path, gboolean append_extension)
362 struct confirm_overwrite_closure closure;
367 closure.extension = NULL;
368 closure.confirm_overwrite_signal_emitted = 0;
369 closure.chooser = gtk_file_chooser_dialog_new ("hello", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
370 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
372 closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (closure.chooser),
373 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
374 gtk_dialog_set_default_response (GTK_DIALOG (closure.chooser), GTK_RESPONSE_ACCEPT);
376 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (closure.chooser), TRUE);
378 g_signal_connect (closure.chooser, "confirm-overwrite",
379 G_CALLBACK (confirm_overwrite_cb), &closure);
381 if (append_extension)
385 filename = g_path_get_dirname (path);
386 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (closure.chooser), filename);
389 filename = g_path_get_basename (path);
390 extension = strchr (filename, '.');
394 closure.extension = g_strdup (extension);
398 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (closure.chooser), filename);
401 g_signal_connect (closure.chooser, "response",
402 G_CALLBACK (overwrite_response_cb), &closure);
406 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (closure.chooser), path);
409 gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, confirm_overwrite_timeout_cb, &closure, NULL);
410 gtk_dialog_run (GTK_DIALOG (closure.chooser));
412 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (closure.chooser));
413 passed = passed && filename && (strcmp (filename, path) == 0);
416 gtk_widget_destroy (closure.chooser);
418 passed = passed && (1 == closure.confirm_overwrite_signal_emitted);
420 log_test (passed, "Confirm overwrite for %s", path);
426 test_confirm_overwrite (void)
428 gboolean passed = TRUE;
430 /* first test for a file we know will always exist */
431 passed = passed && test_confirm_overwrite_for_path ("/etc/passwd", FALSE);
433 passed = passed && test_confirm_overwrite_for_path ("/etc/resolv.conf", TRUE);
437 static const GtkFileChooserAction open_actions[] = {
438 GTK_FILE_CHOOSER_ACTION_OPEN,
439 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
442 static const GtkFileChooserAction save_actions[] = {
443 GTK_FILE_CHOOSER_ACTION_SAVE,
444 GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
449 has_action (const GtkFileChooserAction *actions,
451 GtkFileChooserAction sought_action)
455 for (i = 0; i < n_actions; i++)
456 if (actions[i] == sought_action)
463 get_action_name (GtkFileChooserAction action)
465 GEnumClass *enum_class;
466 GEnumValue *enum_value;
468 enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
470 g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
472 enum_value = g_enum_get_value (enum_class, (int) action);
474 g_error ("BUG: get_action_name(): no GEnumValue for GtkFileChooserAction %d", (int) action);
476 return enum_value->value_name;
479 static GtkFileChooserDefault *
480 get_impl_from_dialog (GtkWidget *dialog)
482 GtkFileChooserDialog *d;
483 GtkFileChooserDialogPrivate *dialog_priv;
484 GtkFileChooserWidget *chooser_widget;
485 GtkFileChooserWidgetPrivate *widget_priv;
486 GtkFileChooserDefault *impl;
488 d = GTK_FILE_CHOOSER_DIALOG (dialog);
489 dialog_priv = d->priv;
490 chooser_widget = GTK_FILE_CHOOSER_WIDGET (dialog_priv->widget);
492 g_error ("BUG: dialog_priv->widget is not a GtkFileChooserWidget");
494 widget_priv = chooser_widget->priv;
495 impl = (GtkFileChooserDefault *) (widget_priv->impl);
497 g_error ("BUG: widget_priv->impl is not a GtkFileChooserDefault");
503 test_widgets_for_current_action (GtkFileChooserDialog *dialog,
504 GtkFileChooserAction expected_action)
506 GtkFileChooserDefault *impl;
509 if (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) != expected_action)
512 impl = get_impl_from_dialog (GTK_WIDGET (dialog));
514 g_assert (impl->action == expected_action);
518 /* OPEN implies that the "new folder" button is hidden; otherwise it is shown */
519 if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN)
520 passed = passed && !gtk_widget_get_visible (impl->browse_new_folder_button);
522 passed = passed && gtk_widget_get_visible (impl->browse_new_folder_button);
524 /* Check that the widgets are present/visible or not */
525 if (has_action (open_actions, G_N_ELEMENTS (open_actions), impl->action))
527 passed = passed && (impl->save_widgets == NULL
528 && (impl->location_mode == LOCATION_MODE_PATH_BAR
529 ? impl->location_entry == NULL
530 : impl->location_entry != NULL)
531 && impl->save_folder_label == NULL
532 && impl->save_folder_combo == NULL
533 && impl->save_expander == NULL
534 && GTK_IS_CONTAINER (impl->browse_widgets) && gtk_widget_is_drawable (impl->browse_widgets));
536 else if (has_action (save_actions, G_N_ELEMENTS (save_actions), impl->action))
538 /* FIXME: we can't use GTK_IS_FILE_CHOOSER_ENTRY() because it uses
539 * _gtk_file_chooser_entry_get_type(), which is a non-exported symbol.
540 * So, we just test impl->location_entry for being non-NULL
542 passed = passed && (GTK_IS_CONTAINER (impl->save_widgets) && gtk_widget_is_drawable (impl->save_widgets)
543 && impl->location_entry != NULL && gtk_widget_is_drawable (impl->location_entry)
544 && GTK_IS_LABEL (impl->save_folder_label) && gtk_widget_is_drawable (impl->save_folder_label)
545 && GTK_IS_COMBO_BOX (impl->save_folder_combo) && gtk_widget_is_drawable (impl->save_folder_combo)
546 && GTK_IS_EXPANDER (impl->save_expander) && gtk_widget_is_drawable (impl->save_expander)
547 && GTK_IS_CONTAINER (impl->browse_widgets));
549 /* FIXME: we are in a SAVE mode; test the visibility and sensitivity of
550 * the children that change depending on the state of the expander.
555 g_error ("BAD TEST: test_widgets_for_current_action() doesn't know about %s", get_action_name (impl->action));
562 typedef gboolean (* ForeachActionCallback) (GtkFileChooserDialog *dialog,
563 GtkFileChooserAction action,
567 foreach_action (GtkFileChooserDialog *dialog,
568 ForeachActionCallback callback,
571 GEnumClass *enum_class;
574 enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
576 g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
578 for (i = 0; i < enum_class->n_values; i++)
580 GEnumValue *enum_value;
581 GtkFileChooserAction action;
584 enum_value = enum_class->values + i;
585 action = enum_value->value;
587 passed = (* callback) (dialog, action, user_data);
595 struct action_closure {
596 GtkFileChooserAction from_action;
600 switch_from_to_action_cb (GtkFileChooserDialog *dialog,
601 GtkFileChooserAction action,
604 struct action_closure *closure;
609 gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), closure->from_action);
611 passed = test_widgets_for_current_action (dialog, closure->from_action);
612 log_test (passed, "switch_from_to_action_cb(): reset to action %s", get_action_name (closure->from_action));
616 gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), action);
618 passed = test_widgets_for_current_action (dialog, action);
619 log_test (passed, "switch_from_to_action_cb(): transition from %s to %s",
620 get_action_name (closure->from_action),
621 get_action_name (action));
626 switch_from_action_cb (GtkFileChooserDialog *dialog,
627 GtkFileChooserAction action,
630 struct action_closure closure;
632 closure.from_action = action;
634 return foreach_action (dialog, switch_from_to_action_cb, &closure);
638 test_action_widgets (void)
641 GtkFileChooserAction action;
644 dialog = gtk_file_chooser_dialog_new ("Test file chooser",
646 GTK_FILE_CHOOSER_ACTION_OPEN,
652 gtk_widget_show_now (dialog);
654 action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog));
656 passed = test_widgets_for_current_action (GTK_FILE_CHOOSER_DIALOG (dialog), action);
657 log_test (passed, "test_action_widgets(): widgets for initial action %s", get_action_name (action));
660 passed = foreach_action (GTK_FILE_CHOOSER_DIALOG (dialog), switch_from_action_cb, NULL);
661 log_test (passed, "test_action_widgets(): all transitions through property change");
664 gtk_widget_destroy (dialog);
668 test_reload_sequence (gboolean set_folder_before_map)
671 GtkFileChooserDefault *impl;
674 char *current_working_dir;
678 current_working_dir = g_get_current_dir ();
680 dialog = gtk_file_chooser_dialog_new ("Test file chooser",
682 GTK_FILE_CHOOSER_ACTION_OPEN,
688 impl = get_impl_from_dialog (dialog);
690 if (set_folder_before_map)
692 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
696 passed = passed && (impl->current_folder != NULL
697 && impl->browse_files_model != NULL
698 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
699 && impl->reload_state == RELOAD_HAS_FOLDER
700 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
701 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
702 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
707 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
708 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
713 /* Initially, no folder is not loaded or pending */
714 passed = passed && (impl->current_folder == NULL
715 && impl->sort_model == NULL
716 && impl->browse_files_model == NULL
717 && impl->load_state == LOAD_EMPTY
718 && impl->reload_state == RELOAD_EMPTY
719 && impl->load_timeout_id == 0);
723 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
724 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
727 log_test (passed, "test_reload_sequence(): initial status");
729 /* After mapping, it is loading some folder, either the one that was explicitly set or the default one */
731 gtk_widget_show_now (dialog);
735 passed = passed && (impl->current_folder != NULL
736 && impl->browse_files_model != NULL
737 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
738 && impl->reload_state == RELOAD_HAS_FOLDER
739 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
740 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
741 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
744 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
745 if (set_folder_before_map)
746 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
748 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
752 log_test (passed, "test_reload_sequence(): status after map");
754 /* Unmap it; we should still have a folder */
756 gtk_widget_hide (dialog);
760 passed = passed && (impl->current_folder != NULL
761 && impl->browse_files_model != NULL
762 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
763 && impl->reload_state == RELOAD_WAS_UNMAPPED
764 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
765 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
766 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
769 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
770 if (set_folder_before_map)
771 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
773 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
777 log_test (passed, "test_reload_sequence(): status after unmap");
781 gtk_widget_show_now (dialog);
785 passed = passed && (impl->current_folder != NULL
786 && impl->browse_files_model != NULL
787 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
788 && impl->reload_state == RELOAD_HAS_FOLDER
789 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
790 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
791 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
794 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
795 if (set_folder_before_map)
796 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
798 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
802 log_test (passed, "test_reload_sequence(): status after re-map");
804 gtk_widget_destroy (dialog);
805 g_free (current_working_dir);
815 passed = test_reload_sequence (FALSE);
816 log_test (passed, "test_reload(): create and use the default folder");
819 passed = test_reload_sequence (TRUE);
820 log_test (passed, "test_reload(): set a folder explicitly before mapping");
825 test_button_folder_states_for_action (GtkFileChooserAction action, gboolean use_dialog, gboolean set_folder_on_dialog)
832 char *current_working_dir;
833 gboolean must_have_cwd;
837 current_working_dir = g_get_current_dir ();
838 must_have_cwd = !(use_dialog && set_folder_on_dialog);
840 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
844 dialog = gtk_file_chooser_dialog_new ("Test", NULL, action,
845 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
846 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
848 button = gtk_file_chooser_button_new_with_dialog (dialog);
850 if (set_folder_on_dialog)
851 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
855 button = gtk_file_chooser_button_new ("Test", action);
856 dialog = NULL; /* keep gcc happy */
859 gtk_container_add (GTK_CONTAINER (window), button);
861 /* Pre-map; no folder is set */
864 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
866 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
868 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
870 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, pre-map, %s",
871 get_action_name (action),
873 set_folder_on_dialog,
874 must_have_cwd ? "must have $cwd" : "must have explicit folder");
876 /* Map; folder should be set */
878 gtk_widget_show_all (window);
879 gtk_widget_show_now (window);
883 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
886 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
888 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
890 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, mapped, %s",
891 get_action_name (action),
893 set_folder_on_dialog,
894 must_have_cwd ? "must have $cwd" : "must have explicit folder");
897 /* Unmap; folder should be set */
899 gtk_widget_hide (window);
901 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
904 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
906 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
908 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, unmapped, %s",
909 get_action_name (action),
911 set_folder_on_dialog,
912 must_have_cwd ? "must have $cwd" : "must have explicit folder");
915 /* Re-map; folder should be set */
917 gtk_widget_show_now (window);
918 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
921 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
923 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
925 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, re-mapped, %s",
926 get_action_name (action),
928 set_folder_on_dialog,
929 must_have_cwd ? "must have $cwd" : "must have explicit folder");
932 g_free (current_working_dir);
934 gtk_widget_destroy (window);
940 test_button_folder_states (void)
942 /* GtkFileChooserButton only supports OPEN and SELECT_FOLDER */
943 static const GtkFileChooserAction actions_to_test[] = {
944 GTK_FILE_CHOOSER_ACTION_OPEN,
945 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
952 for (i = 0; i < G_N_ELEMENTS (actions_to_test); i++)
954 passed = passed && test_button_folder_states_for_action (actions_to_test[i], FALSE, FALSE);
956 passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, FALSE);
958 passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, TRUE);
960 log_test (passed, "test_button_folder_states(): action %s", get_action_name (actions_to_test[i]));
963 log_test (passed, "test_button_folder_states(): all supported actions");
967 sleep_timeout_cb (gpointer data)
974 sleep_in_main_loop (double fraction)
976 /* process all pending idles and events */
977 while (g_main_context_pending (NULL))
978 g_main_context_iteration (NULL, FALSE);
979 /* sleeping probably isn't strictly necessary here */
980 gdk_threads_add_timeout_full (G_MAXINT, fraction * SLEEP_DURATION, sleep_timeout_cb, NULL, NULL);
982 /* process any pending idles or events that arrived during sleep */
983 while (g_main_context_pending (NULL))
984 g_main_context_iteration (NULL, FALSE);
988 test_folder_switch_and_filters (void)
993 GtkFilePath *cwd_path;
994 GtkFilePath *base_dir_path;
996 GtkFileFilter *all_filter;
997 GtkFileFilter *txt_filter;
998 GtkFileChooserDefault *impl;
1002 cwd = g_get_current_dir ();
1003 base_dir = g_build_filename (cwd, "file-chooser-test-dir", NULL);
1005 dialog = gtk_file_chooser_dialog_new ("Test", NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
1006 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1007 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1009 impl = get_impl_from_dialog (dialog);
1011 cwd_path = gtk_file_system_filename_to_path (impl->file_system, cwd);
1012 base_dir_path = gtk_file_system_filename_to_path (impl->file_system, base_dir);
1014 passed = passed && gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
1017 /* All files filter */
1019 all_filter = gtk_file_filter_new ();
1020 gtk_file_filter_set_name (all_filter, "All files");
1021 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), all_filter);
1025 txt_filter = gtk_file_filter_new ();
1026 gtk_file_filter_set_name (all_filter, "*.txt");
1027 gtk_file_filter_add_pattern (txt_filter, "*.txt");
1028 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
1030 /* Test filter set */
1032 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), all_filter);
1033 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == all_filter);
1036 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
1037 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1038 log_test (passed, "test_folder_switch_and_filters(): set and get filter");
1041 gtk_widget_show (dialog);
1043 /* Test that filter is unchanged when we switch folders */
1045 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), cwd);
1046 sleep_in_main_loop (0.5);
1047 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1050 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
1051 sleep_in_main_loop (0.25);
1053 g_signal_emit_by_name (impl->browse_path_bar, "path-clicked",
1054 (GtkFilePath *) cwd_path,
1055 (GtkFilePath *) base_dir_path,
1057 sleep_in_main_loop (0.25);
1058 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1059 log_test (passed, "test_folder_switch_and_filters(): filter after changing folder");
1065 gtk_file_path_free (cwd_path);
1066 gtk_file_path_free (base_dir_path);
1068 gtk_widget_destroy (dialog);
1070 log_test (passed, "test_folder_switch_and_filters(): all filter tests");
1073 extern void pixbuf_init (void);
1080 /* initialize test program */
1081 gtk_test_init (&argc, &argv);
1083 /* register tests */
1084 g_test_add_func ("/GtkFileChooser/black_box", test_black_box);
1085 g_test_add_func ("/GtkFileChooser/confirm_overwrite", test_confirm_overwrite);
1086 g_test_add_func ("/GtkFileChooser/action_widgets", test_action_widgets);
1087 g_test_add_func ("/GtkFileChooser/reload", test_reload);
1088 g_test_add_func ("/GtkFileChooser/button_folder_states", test_button_folder_states);
1089 g_test_add_func ("/GtkFileChooser/folder_switch_and_filters", test_folder_switch_and_filters);
1091 /* run and check selected tests */
1092 return g_test_run();