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 SLEEP_DURATION 100
36 #include <glib/gprintf.h>
38 #include "gtk/gtkfilechooserprivate.h"
39 #include "gtk/gtkfilechooserdefault.h"
40 #include "gtk/gtkfilechooserentry.h"
43 log_test (gboolean passed, const char *test_name, ...)
48 va_start (args, test_name);
49 str = g_strdup_vprintf (test_name, args);
53 g_printf ("%s: %s\n", passed ? "PASSED" : "FAILED", str);
57 typedef void (* SetFilenameFn) (GtkFileChooser *chooser, gpointer data);
58 typedef gboolean (* CompareFilenameFn) (GtkFileChooser *chooser, gpointer data);
60 struct test_set_filename_closure {
62 GtkWidget *accept_button;
63 gboolean focus_button;
67 set_filename_timeout_cb (gpointer data)
69 struct test_set_filename_closure *closure;
73 if (closure->focus_button)
74 gtk_widget_grab_focus (closure->accept_button);
76 gtk_button_clicked (GTK_BUTTON (closure->accept_button));
82 static guint wait_for_idle_id = 0;
85 wait_for_idle_idle (gpointer data)
95 wait_for_idle_id = g_idle_add_full (G_PRIORITY_LOW + 100,
99 while (wait_for_idle_id)
100 gtk_main_iteration ();
104 test_set_filename (GtkFileChooserAction action,
105 gboolean focus_button,
106 SetFilenameFn set_filename_fn,const
107 CompareFilenameFn compare_filename_fn,
111 struct test_set_filename_closure closure;
114 chooser = gtk_file_chooser_dialog_new ("hello", NULL, action,
115 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
118 closure.chooser = chooser;
119 closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (chooser), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
120 closure.focus_button = focus_button;
122 gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
124 (* set_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
126 gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, set_filename_timeout_cb, &closure, NULL);
127 gtk_dialog_run (GTK_DIALOG (chooser));
129 retval = (* compare_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
131 gtk_widget_destroy (chooser);
137 set_filename_cb (GtkFileChooser *chooser, gpointer data)
139 const char *filename;
142 gtk_file_chooser_set_filename (chooser, filename);
146 compare_filename_cb (GtkFileChooser *chooser, gpointer data)
148 const char *filename;
153 out_filename = gtk_file_chooser_get_filename (chooser);
157 retval = (strcmp (out_filename, filename) == 0);
158 g_free (out_filename);
166 test_black_box_set_filename (GtkFileChooserAction action, const char *filename, gboolean focus_button)
170 passed = test_set_filename (action, focus_button, set_filename_cb, compare_filename_cb, (char *) filename);
172 log_test (passed, "set_filename: action %d, focus_button=%s",
174 focus_button ? "TRUE" : "FALSE");
180 struct current_name_closure {
182 const char *current_name;
186 set_current_name_cb (GtkFileChooser *chooser, gpointer data)
188 struct current_name_closure *closure;
192 gtk_file_chooser_set_current_folder (chooser, closure->path);
193 gtk_file_chooser_set_current_name (chooser, closure->current_name);
197 compare_current_name_cb (GtkFileChooser *chooser, gpointer data)
199 struct current_name_closure *closure;
205 out_filename = gtk_file_chooser_get_filename (chooser);
211 filename = g_build_filename (closure->path, closure->current_name, NULL);
212 retval = (strcmp (filename, out_filename) == 0);
214 g_free (out_filename);
222 test_black_box_set_current_name (GtkFileChooserAction action, const char *path, const char *current_name, gboolean focus_button)
224 struct current_name_closure closure;
228 closure.current_name = current_name;
230 passed = test_set_filename (action, focus_button,
231 set_current_name_cb, compare_current_name_cb, &closure);
233 log_test (passed, "set_current_name, focus_button=%s", focus_button ? "TRUE" : "FALSE");
238 /* FIXME: fails in CREATE_FOLDER mode when FOLDER_NAME == "/" */
241 #define FILE_NAME "/nonexistent"
242 #define FOLDER_NAME "/etc"
244 #define FILE_NAME "/etc/passwd"
245 #define FOLDER_NAME "/etc"
248 #define CURRENT_NAME "parangaricutirimicuaro.txt"
249 #define CURRENT_NAME_FOLDER "parangaricutirimicuaro"
251 /* https://bugzilla.novell.com/show_bug.cgi?id=184875
252 * http://bugzilla.gnome.org/show_bug.cgi?id=347066
253 * http://bugzilla.gnome.org/show_bug.cgi?id=346058
256 test_black_box (void)
263 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, FALSE);
265 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, TRUE);
267 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, FALSE);
269 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, TRUE);
271 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, FALSE);
273 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, TRUE);
275 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, FALSE);
277 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, TRUE);
280 cwd = g_get_current_dir ();
282 passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_SAVE, cwd, CURRENT_NAME, FALSE);
284 passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_SAVE, cwd, CURRENT_NAME, TRUE);
286 passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, cwd, CURRENT_NAME_FOLDER, FALSE);
288 passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, cwd, CURRENT_NAME_FOLDER, TRUE);
293 log_test (passed, "Black box tests");
296 struct confirm_overwrite_closure {
298 GtkWidget *accept_button;
299 gint confirm_overwrite_signal_emitted;
303 static GtkFileChooserConfirmation
304 confirm_overwrite_cb (GtkFileChooser *chooser, gpointer data)
306 struct confirm_overwrite_closure *closure = data;
308 if (g_test_verbose())
310 closure->confirm_overwrite_signal_emitted += 1;
312 return GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME;
316 overwrite_response_cb (GtkFileChooser *chooser, gint response, gpointer data)
318 struct confirm_overwrite_closure *closure = data;
321 if (g_test_verbose())
324 if (response != GTK_RESPONSE_ACCEPT)
327 filename = gtk_file_chooser_get_filename (chooser);
329 if (!g_str_has_suffix (filename, closure->extension))
333 basename = g_path_get_basename (filename);
336 filename = g_strconcat (basename, closure->extension, NULL);
337 gtk_file_chooser_set_current_name (chooser, filename);
339 g_signal_stop_emission_by_name (chooser, "response");
340 gtk_dialog_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
345 confirm_overwrite_timeout_cb (gpointer data)
347 struct confirm_overwrite_closure *closure;
350 gtk_button_clicked (GTK_BUTTON (closure->accept_button));
355 /* http://bugzilla.gnome.org/show_bug.cgi?id=347883 */
357 test_confirm_overwrite_for_path (const char *path, gboolean append_extension)
360 struct confirm_overwrite_closure closure;
365 closure.extension = NULL;
366 closure.confirm_overwrite_signal_emitted = 0;
367 closure.chooser = gtk_file_chooser_dialog_new ("hello", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
368 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
370 closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (closure.chooser),
371 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
372 gtk_dialog_set_default_response (GTK_DIALOG (closure.chooser), GTK_RESPONSE_ACCEPT);
374 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (closure.chooser), TRUE);
376 g_signal_connect (closure.chooser, "confirm-overwrite",
377 G_CALLBACK (confirm_overwrite_cb), &closure);
379 if (append_extension)
383 filename = g_path_get_dirname (path);
384 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (closure.chooser), filename);
387 filename = g_path_get_basename (path);
388 extension = strchr (filename, '.');
392 closure.extension = g_strdup (extension);
396 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (closure.chooser), filename);
399 g_signal_connect (closure.chooser, "response",
400 G_CALLBACK (overwrite_response_cb), &closure);
404 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (closure.chooser), path);
407 gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, confirm_overwrite_timeout_cb, &closure, NULL);
408 gtk_dialog_run (GTK_DIALOG (closure.chooser));
410 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (closure.chooser));
411 passed = passed && filename && (strcmp (filename, path) == 0);
414 gtk_widget_destroy (closure.chooser);
416 passed = passed && (1 == closure.confirm_overwrite_signal_emitted);
418 log_test (passed, "Confirm overwrite for %s", path);
424 test_confirm_overwrite (void)
426 gboolean passed = TRUE;
428 /* first test for a file we know will always exist */
429 passed = passed && test_confirm_overwrite_for_path ("/etc/passwd", FALSE);
431 passed = passed && test_confirm_overwrite_for_path ("/etc/resolv.conf", TRUE);
435 static const GtkFileChooserAction open_actions[] = {
436 GTK_FILE_CHOOSER_ACTION_OPEN,
437 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
440 static const GtkFileChooserAction save_actions[] = {
441 GTK_FILE_CHOOSER_ACTION_SAVE,
442 GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
447 has_action (const GtkFileChooserAction *actions,
449 GtkFileChooserAction sought_action)
453 for (i = 0; i < n_actions; i++)
454 if (actions[i] == sought_action)
461 get_action_name (GtkFileChooserAction action)
463 GEnumClass *enum_class;
464 GEnumValue *enum_value;
466 enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
468 g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
470 enum_value = g_enum_get_value (enum_class, (int) action);
472 g_error ("BUG: get_action_name(): no GEnumValue for GtkFileChooserAction %d", (int) action);
474 return enum_value->value_name;
477 static GtkFileChooserDefault *
478 get_impl_from_dialog (GtkWidget *dialog)
480 GtkFileChooserDialog *d;
481 GtkFileChooserDialogPrivate *dialog_priv;
482 GtkFileChooserWidget *chooser_widget;
483 GtkFileChooserWidgetPrivate *widget_priv;
484 GtkFileChooserDefault *impl;
486 d = GTK_FILE_CHOOSER_DIALOG (dialog);
487 dialog_priv = d->priv;
488 chooser_widget = GTK_FILE_CHOOSER_WIDGET (dialog_priv->widget);
490 g_error ("BUG: dialog_priv->widget is not a GtkFileChooserWidget");
492 widget_priv = chooser_widget->priv;
493 impl = (GtkFileChooserDefault *) (widget_priv->impl);
495 g_error ("BUG: widget_priv->impl is not a GtkFileChooserDefault");
501 test_widgets_for_current_action (GtkFileChooserDialog *dialog,
502 GtkFileChooserAction expected_action)
504 GtkFileChooserDefault *impl;
507 if (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) != expected_action)
510 impl = get_impl_from_dialog (GTK_WIDGET (dialog));
512 g_assert (impl->action == expected_action);
516 /* OPEN implies that the "new folder" button is hidden; otherwise it is shown */
517 if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN)
518 passed = passed && !gtk_widget_get_visible (impl->browse_new_folder_button);
520 passed = passed && gtk_widget_get_visible (impl->browse_new_folder_button);
522 /* Check that the widgets are present/visible or not */
523 if (has_action (open_actions, G_N_ELEMENTS (open_actions), impl->action))
525 passed = passed && (impl->save_widgets == NULL
526 && (impl->location_mode == LOCATION_MODE_PATH_BAR
527 ? impl->location_entry == NULL
528 : impl->location_entry != NULL)
529 && impl->save_folder_label == NULL
530 && impl->save_folder_combo == NULL
531 && impl->save_expander == NULL
532 && GTK_IS_CONTAINER (impl->browse_widgets) && gtk_widget_is_drawable (impl->browse_widgets));
534 else if (has_action (save_actions, G_N_ELEMENTS (save_actions), impl->action))
536 /* FIXME: we can't use GTK_IS_FILE_CHOOSER_ENTRY() because it uses
537 * _gtk_file_chooser_entry_get_type(), which is a non-exported symbol.
538 * So, we just test impl->location_entry for being non-NULL
540 passed = passed && (GTK_IS_CONTAINER (impl->save_widgets) && gtk_widget_is_drawable (impl->save_widgets)
541 && impl->location_entry != NULL && gtk_widget_is_drawable (impl->location_entry)
542 && GTK_IS_LABEL (impl->save_folder_label) && gtk_widget_is_drawable (impl->save_folder_label)
543 && GTK_IS_COMBO_BOX (impl->save_folder_combo) && gtk_widget_is_drawable (impl->save_folder_combo)
544 && GTK_IS_EXPANDER (impl->save_expander) && gtk_widget_is_drawable (impl->save_expander)
545 && GTK_IS_CONTAINER (impl->browse_widgets));
547 /* FIXME: we are in a SAVE mode; test the visibility and sensitivity of
548 * the children that change depending on the state of the expander.
553 g_error ("BAD TEST: test_widgets_for_current_action() doesn't know about %s", get_action_name (impl->action));
560 typedef gboolean (* ForeachActionCallback) (GtkFileChooserDialog *dialog,
561 GtkFileChooserAction action,
565 foreach_action (GtkFileChooserDialog *dialog,
566 ForeachActionCallback callback,
569 GEnumClass *enum_class;
572 enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
574 g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
576 for (i = 0; i < enum_class->n_values; i++)
578 GEnumValue *enum_value;
579 GtkFileChooserAction action;
582 enum_value = enum_class->values + i;
583 action = enum_value->value;
585 passed = (* callback) (dialog, action, user_data);
593 struct action_closure {
594 GtkFileChooserAction from_action;
598 switch_from_to_action_cb (GtkFileChooserDialog *dialog,
599 GtkFileChooserAction action,
602 struct action_closure *closure;
607 gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), closure->from_action);
609 passed = test_widgets_for_current_action (dialog, closure->from_action);
610 log_test (passed, "switch_from_to_action_cb(): reset to action %s", get_action_name (closure->from_action));
614 gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), action);
616 passed = test_widgets_for_current_action (dialog, action);
617 log_test (passed, "switch_from_to_action_cb(): transition from %s to %s",
618 get_action_name (closure->from_action),
619 get_action_name (action));
624 switch_from_action_cb (GtkFileChooserDialog *dialog,
625 GtkFileChooserAction action,
628 struct action_closure closure;
630 closure.from_action = action;
632 return foreach_action (dialog, switch_from_to_action_cb, &closure);
636 test_action_widgets (void)
639 GtkFileChooserAction action;
642 dialog = gtk_file_chooser_dialog_new ("Test file chooser",
644 GTK_FILE_CHOOSER_ACTION_OPEN,
650 gtk_widget_show_now (dialog);
652 action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog));
654 passed = test_widgets_for_current_action (GTK_FILE_CHOOSER_DIALOG (dialog), action);
655 log_test (passed, "test_action_widgets(): widgets for initial action %s", get_action_name (action));
658 passed = foreach_action (GTK_FILE_CHOOSER_DIALOG (dialog), switch_from_action_cb, NULL);
659 log_test (passed, "test_action_widgets(): all transitions through property change");
662 gtk_widget_destroy (dialog);
666 test_reload_sequence (gboolean set_folder_before_map)
669 GtkFileChooserDefault *impl;
672 char *current_working_dir;
676 current_working_dir = g_get_current_dir ();
678 dialog = gtk_file_chooser_dialog_new ("Test file chooser",
680 GTK_FILE_CHOOSER_ACTION_OPEN,
686 impl = get_impl_from_dialog (dialog);
688 if (set_folder_before_map)
690 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
694 passed = passed && (impl->current_folder != NULL
695 && impl->browse_files_model != NULL
696 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
697 && impl->reload_state == RELOAD_HAS_FOLDER
698 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
699 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
700 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
705 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
706 passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
711 /* Initially, no folder is not loaded or pending */
712 passed = passed && (impl->current_folder == NULL
713 && impl->sort_model == NULL
714 && impl->browse_files_model == NULL
715 && impl->load_state == LOAD_EMPTY
716 && impl->reload_state == RELOAD_EMPTY
717 && impl->load_timeout_id == 0);
721 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
722 passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
725 log_test (passed, "test_reload_sequence(): initial status");
727 /* After mapping, it is loading some folder, either the one that was explicitly set or the default one */
729 gtk_widget_show_now (dialog);
733 passed = passed && (impl->current_folder != NULL
734 && impl->browse_files_model != NULL
735 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
736 && impl->reload_state == RELOAD_HAS_FOLDER
737 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
738 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
739 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
742 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
743 if (set_folder_before_map)
744 passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
746 passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
750 log_test (passed, "test_reload_sequence(): status after map");
752 /* Unmap it; we should still have a folder */
754 gtk_widget_hide (dialog);
758 passed = passed && (impl->current_folder != NULL
759 && impl->browse_files_model != NULL
760 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
761 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
762 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
763 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
766 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
767 if (set_folder_before_map)
768 passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
770 passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
774 log_test (passed, "test_reload_sequence(): status after unmap");
778 gtk_widget_show_now (dialog);
782 passed = passed && (impl->current_folder != NULL
783 && impl->browse_files_model != NULL
784 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
785 && impl->reload_state == RELOAD_HAS_FOLDER
786 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
787 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
788 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
791 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
792 if (set_folder_before_map)
793 passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
795 passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
799 log_test (passed, "test_reload_sequence(): status after re-map");
801 gtk_widget_destroy (dialog);
802 g_free (current_working_dir);
812 passed = test_reload_sequence (FALSE);
813 log_test (passed, "test_reload(): create and use the default folder");
816 passed = test_reload_sequence (TRUE);
817 log_test (passed, "test_reload(): set a folder explicitly before mapping");
822 test_button_folder_states_for_action (GtkFileChooserAction action, gboolean use_dialog, gboolean set_folder_on_dialog)
829 char *current_working_dir;
830 gboolean must_have_cwd;
834 current_working_dir = g_get_current_dir ();
835 must_have_cwd = !(use_dialog && set_folder_on_dialog);
837 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
841 dialog = gtk_file_chooser_dialog_new ("Test", NULL, action,
842 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
843 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
845 button = gtk_file_chooser_button_new_with_dialog (dialog);
847 if (set_folder_on_dialog)
848 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
852 button = gtk_file_chooser_button_new ("Test", action);
853 dialog = NULL; /* keep gcc happy */
856 gtk_container_add (GTK_CONTAINER (window), button);
858 /* Pre-map; no folder is set */
861 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
863 passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
865 passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
867 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, pre-map, %s",
868 get_action_name (action),
870 set_folder_on_dialog,
871 must_have_cwd ? "must have $cwd" : "must have explicit folder");
873 /* Map; folder should be set */
875 gtk_widget_show_all (window);
876 gtk_widget_show_now (window);
880 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
883 passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
885 passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
887 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, mapped, %s",
888 get_action_name (action),
890 set_folder_on_dialog,
891 must_have_cwd ? "must have $cwd" : "must have explicit folder");
894 /* Unmap; folder should be set */
896 gtk_widget_hide (window);
898 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
901 passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
903 passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
905 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, unmapped, %s",
906 get_action_name (action),
908 set_folder_on_dialog,
909 must_have_cwd ? "must have $cwd" : "must have explicit folder");
912 /* Re-map; folder should be set */
914 gtk_widget_show_now (window);
915 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
918 passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
920 passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
922 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, re-mapped, %s",
923 get_action_name (action),
925 set_folder_on_dialog,
926 must_have_cwd ? "must have $cwd" : "must have explicit folder");
929 g_free (current_working_dir);
931 gtk_widget_destroy (window);
937 test_button_folder_states (void)
939 /* GtkFileChooserButton only supports OPEN and SELECT_FOLDER */
940 static const GtkFileChooserAction actions_to_test[] = {
941 GTK_FILE_CHOOSER_ACTION_OPEN,
942 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
949 for (i = 0; i < G_N_ELEMENTS (actions_to_test); i++)
951 passed = passed && test_button_folder_states_for_action (actions_to_test[i], FALSE, FALSE);
953 passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, FALSE);
955 passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, TRUE);
957 log_test (passed, "test_button_folder_states(): action %s", get_action_name (actions_to_test[i]));
960 log_test (passed, "test_button_folder_states(): all supported actions");
964 sleep_timeout_cb (gpointer data)
971 sleep_in_main_loop (double fraction)
973 /* process all pending idles and events */
974 while (g_main_context_pending (NULL))
975 g_main_context_iteration (NULL, FALSE);
976 /* sleeping probably isn't strictly necessary here */
977 gdk_threads_add_timeout_full (G_MAXINT, fraction * SLEEP_DURATION, sleep_timeout_cb, NULL, NULL);
979 /* process any pending idles or events that arrived during sleep */
980 while (g_main_context_pending (NULL))
981 g_main_context_iteration (NULL, FALSE);
985 test_folder_switch_and_filters (void)
990 GtkFilePath *cwd_path;
991 GtkFilePath *base_dir_path;
993 GtkFileFilter *all_filter;
994 GtkFileFilter *txt_filter;
995 GtkFileChooserDefault *impl;
999 cwd = g_get_current_dir ();
1000 base_dir = g_build_filename (cwd, "file-chooser-test-dir", NULL);
1002 dialog = gtk_file_chooser_dialog_new ("Test", NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
1003 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1004 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1006 impl = get_impl_from_dialog (dialog);
1008 cwd_path = gtk_file_system_filename_to_path (impl->file_system, cwd);
1009 base_dir_path = gtk_file_system_filename_to_path (impl->file_system, base_dir);
1011 passed = passed && gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
1014 /* All files filter */
1016 all_filter = gtk_file_filter_new ();
1017 gtk_file_filter_set_name (all_filter, "All files");
1018 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), all_filter);
1022 txt_filter = gtk_file_filter_new ();
1023 gtk_file_filter_set_name (all_filter, "*.txt");
1024 gtk_file_filter_add_pattern (txt_filter, "*.txt");
1025 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
1027 /* Test filter set */
1029 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), all_filter);
1030 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == all_filter);
1033 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
1034 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1035 log_test (passed, "test_folder_switch_and_filters(): set and get filter");
1038 gtk_widget_show (dialog);
1040 /* Test that filter is unchanged when we switch folders */
1042 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), cwd);
1043 sleep_in_main_loop (0.5);
1044 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1047 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
1048 sleep_in_main_loop (0.25);
1050 g_signal_emit_by_name (impl->browse_path_bar, "path-clicked",
1051 (GtkFilePath *) cwd_path,
1052 (GtkFilePath *) base_dir_path,
1054 sleep_in_main_loop (0.25);
1055 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1056 log_test (passed, "test_folder_switch_and_filters(): filter after changing folder");
1062 gtk_file_path_free (cwd_path);
1063 gtk_file_path_free (base_dir_path);
1065 gtk_widget_destroy (dialog);
1067 log_test (passed, "test_folder_switch_and_filters(): all filter tests");
1070 extern void pixbuf_init (void);
1077 /* initialize test program */
1078 gtk_test_init (&argc, &argv);
1080 /* register tests */
1081 g_test_add_func ("/GtkFileChooser/black_box", test_black_box);
1082 g_test_add_func ("/GtkFileChooser/confirm_overwrite", test_confirm_overwrite);
1083 g_test_add_func ("/GtkFileChooser/action_widgets", test_action_widgets);
1084 g_test_add_func ("/GtkFileChooser/reload", test_reload);
1085 g_test_add_func ("/GtkFileChooser/button_folder_states", test_button_folder_states);
1086 g_test_add_func ("/GtkFileChooser/folder_switch_and_filters", test_folder_switch_and_filters);
1088 /* run and check selected tests */
1089 return g_test_run();