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
37 #include <glib/gprintf.h>
39 #include "gtk/gtkfilechooserprivate.h"
40 #include "gtk/gtkfilechooserdefault.h"
41 #include "gtk/gtkfilechooserentry.h"
44 log_test (gboolean passed, const char *test_name, ...)
49 va_start (args, test_name);
50 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 (2000, set_filename_timeout_cb, &closure);
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 (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 (GTK_FILE_CHOOSER_ACTION_SAVE, 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"
250 /* https://bugzilla.novell.com/show_bug.cgi?id=184875
251 * http://bugzilla.gnome.org/show_bug.cgi?id=347066
254 test_black_box (void)
261 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, FALSE);
262 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, TRUE);
263 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, FALSE);
264 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, TRUE);
265 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, FALSE);
266 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, TRUE);
267 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, FALSE);
268 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, TRUE);
270 cwd = g_get_current_dir ();
272 passed = passed && test_black_box_set_current_name (cwd, CURRENT_NAME, FALSE);
273 passed = passed && test_black_box_set_current_name (cwd, CURRENT_NAME, TRUE);
277 log_test (passed, "Black box tests");
282 struct confirm_overwrite_closure {
284 GtkWidget *accept_button;
285 gint confirm_overwrite_signal_emitted;
289 static GtkFileChooserConfirmation
290 confirm_overwrite_cb (GtkFileChooser *chooser, gpointer data)
292 struct confirm_overwrite_closure *closure = data;
295 closure->confirm_overwrite_signal_emitted += 1;
297 return GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME;
301 overwrite_response_cb (GtkFileChooser *chooser, gint response, gpointer data)
303 struct confirm_overwrite_closure *closure = data;
308 if (response != GTK_RESPONSE_ACCEPT)
311 filename = gtk_file_chooser_get_filename (chooser);
313 if (!g_str_has_suffix (filename, closure->extension))
317 basename = g_path_get_basename (filename);
320 filename = g_strconcat (basename, closure->extension, NULL);
321 gtk_file_chooser_set_current_name (chooser, filename);
323 g_signal_stop_emission_by_name (chooser, "response");
324 gtk_dialog_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
329 confirm_overwrite_timeout_cb (gpointer data)
331 struct confirm_overwrite_closure *closure;
334 gtk_button_clicked (GTK_BUTTON (closure->accept_button));
339 /* http://bugzilla.gnome.org/show_bug.cgi?id=347883 */
341 test_confirm_overwrite_for_path (const char *path, gboolean append_extension)
344 struct confirm_overwrite_closure closure;
349 closure.extension = NULL;
350 closure.confirm_overwrite_signal_emitted = 0;
351 closure.chooser = gtk_file_chooser_dialog_new ("hello", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
352 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
354 closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (closure.chooser),
355 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
356 gtk_dialog_set_default_response (GTK_DIALOG (closure.chooser), GTK_RESPONSE_ACCEPT);
358 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (closure.chooser), TRUE);
360 g_signal_connect (closure.chooser, "confirm-overwrite",
361 G_CALLBACK (confirm_overwrite_cb), &closure);
363 if (append_extension)
367 filename = g_path_get_dirname (path);
368 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (closure.chooser), filename);
371 filename = g_path_get_basename (path);
372 extension = strchr (filename, '.');
376 closure.extension = g_strdup (extension);
380 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (closure.chooser), filename);
383 g_signal_connect (closure.chooser, "response",
384 G_CALLBACK (overwrite_response_cb), &closure);
388 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (closure.chooser), path);
391 gdk_threads_add_timeout (2000, confirm_overwrite_timeout_cb, &closure);
392 gtk_dialog_run (GTK_DIALOG (closure.chooser));
394 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (closure.chooser));
395 passed = passed && filename && (strcmp (filename, path) == 0);
398 gtk_widget_destroy (closure.chooser);
400 passed = passed && (1 == closure.confirm_overwrite_signal_emitted);
402 log_test (passed, "Confirm overwrite for %s", path);
408 test_confirm_overwrite (void)
410 gboolean passed = TRUE;
412 /* first test for a file we know will always exist */
413 passed = passed && test_confirm_overwrite_for_path ("/etc/passwd", FALSE);
414 passed = passed && test_confirm_overwrite_for_path ("/etc/resolv.conf", TRUE);
419 static const GtkFileChooserAction open_actions[] = {
420 GTK_FILE_CHOOSER_ACTION_OPEN,
421 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
424 static const GtkFileChooserAction save_actions[] = {
425 GTK_FILE_CHOOSER_ACTION_SAVE,
426 GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
431 has_action (const GtkFileChooserAction *actions,
433 GtkFileChooserAction sought_action)
437 for (i = 0; i < n_actions; i++)
438 if (actions[i] == sought_action)
445 get_action_name (GtkFileChooserAction action)
447 GEnumClass *enum_class;
448 GEnumValue *enum_value;
450 enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
452 g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
454 enum_value = g_enum_get_value (enum_class, (int) action);
456 g_error ("BUG: get_action_name(): no GEnumValue for GtkFileChooserAction %d", (int) action);
458 return enum_value->value_name;
461 static GtkFileChooserDefault *
462 get_impl_from_dialog (GtkWidget *dialog)
464 GtkFileChooserDialog *d;
465 GtkFileChooserDialogPrivate *dialog_priv;
466 GtkFileChooserWidget *chooser_widget;
467 GtkFileChooserWidgetPrivate *widget_priv;
468 GtkFileChooserDefault *impl;
470 d = GTK_FILE_CHOOSER_DIALOG (dialog);
471 dialog_priv = d->priv;
472 chooser_widget = GTK_FILE_CHOOSER_WIDGET (dialog_priv->widget);
474 g_error ("BUG: dialog_priv->widget is not a GtkFileChooserWidget");
476 widget_priv = chooser_widget->priv;
477 impl = (GtkFileChooserDefault *) (widget_priv->impl);
479 g_error ("BUG: widget_priv->impl is not a GtkFileChooserDefault");
485 test_widgets_for_current_action (GtkFileChooserDialog *dialog,
486 GtkFileChooserAction expected_action)
488 GtkFileChooserDefault *impl;
491 if (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) != expected_action)
494 impl = get_impl_from_dialog (GTK_WIDGET (dialog));
496 g_assert (impl->action == expected_action);
500 /* OPEN implies that the "new folder" button is hidden; otherwise it is shown */
501 if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN)
502 passed = passed && !GTK_WIDGET_VISIBLE (impl->browse_new_folder_button);
504 passed = passed && GTK_WIDGET_VISIBLE (impl->browse_new_folder_button);
506 /* Check that the widgets are present/visible or not */
507 if (has_action (open_actions, G_N_ELEMENTS (open_actions), impl->action))
509 passed = passed && (impl->save_widgets == NULL
510 && (impl->location_mode == LOCATION_MODE_PATH_BAR
511 ? impl->location_entry == NULL
512 : impl->location_entry != NULL)
513 && impl->save_folder_label == NULL
514 && impl->save_folder_combo == NULL
515 && impl->save_expander == NULL
516 && GTK_IS_CONTAINER (impl->browse_widgets) && GTK_WIDGET_DRAWABLE (impl->browse_widgets));
518 else if (has_action (save_actions, G_N_ELEMENTS (save_actions), impl->action))
520 /* FIXME: we can't use GTK_IS_FILE_CHOOSER_ENTRY() because it uses
521 * _gtk_file_chooser_entry_get_type(), which is a non-exported symbol.
522 * So, we just test impl->location_entry for being non-NULL
524 passed = passed && (GTK_IS_CONTAINER (impl->save_widgets) && GTK_WIDGET_DRAWABLE (impl->save_widgets)
525 && impl->location_entry != NULL && GTK_WIDGET_DRAWABLE (impl->location_entry)
526 && GTK_IS_LABEL (impl->save_folder_label) && GTK_WIDGET_DRAWABLE (impl->save_folder_label)
527 && GTK_IS_COMBO_BOX (impl->save_folder_combo) && GTK_WIDGET_DRAWABLE (impl->save_folder_combo)
528 && GTK_IS_EXPANDER (impl->save_expander) && GTK_WIDGET_DRAWABLE (impl->save_expander)
529 && GTK_IS_CONTAINER (impl->browse_widgets));
531 /* FIXME: we are in a SAVE mode; test the visibility and sensitivity of
532 * the children that change depending on the state of the expander.
537 g_error ("BAD TEST: test_widgets_for_current_action() doesn't know about %s", get_action_name (impl->action));
544 typedef gboolean (* ForeachActionCallback) (GtkFileChooserDialog *dialog,
545 GtkFileChooserAction action,
549 foreach_action (GtkFileChooserDialog *dialog,
550 ForeachActionCallback callback,
553 GEnumClass *enum_class;
556 enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
558 g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
560 for (i = 0; i < enum_class->n_values; i++)
562 GEnumValue *enum_value;
563 GtkFileChooserAction action;
566 enum_value = enum_class->values + i;
567 action = enum_value->value;
569 passed = (* callback) (dialog, action, user_data);
577 struct action_closure {
578 GtkFileChooserAction from_action;
582 switch_from_to_action_cb (GtkFileChooserDialog *dialog,
583 GtkFileChooserAction action,
586 struct action_closure *closure;
591 gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), closure->from_action);
593 passed = test_widgets_for_current_action (dialog, closure->from_action);
594 log_test (passed, "switch_from_to_action_cb(): reset to action %s", get_action_name (closure->from_action));
598 gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), action);
600 passed = test_widgets_for_current_action (dialog, action);
601 log_test (passed, "switch_from_to_action_cb(): transition from %s to %s",
602 get_action_name (closure->from_action),
603 get_action_name (action));
608 switch_from_action_cb (GtkFileChooserDialog *dialog,
609 GtkFileChooserAction action,
612 struct action_closure closure;
614 closure.from_action = action;
616 return foreach_action (dialog, switch_from_to_action_cb, &closure);
620 test_action_widgets (void)
623 GtkFileChooserAction action;
626 dialog = gtk_file_chooser_dialog_new ("Test file chooser",
628 GTK_FILE_CHOOSER_ACTION_OPEN,
634 gtk_widget_show_now (dialog);
636 action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog));
638 passed = test_widgets_for_current_action (GTK_FILE_CHOOSER_DIALOG (dialog), action);
639 log_test (passed, "test_action_widgets(): widgets for initial action %s", get_action_name (action));
643 passed = foreach_action (GTK_FILE_CHOOSER_DIALOG (dialog), switch_from_action_cb, NULL);
644 log_test (passed, "test_action_widgets(): all transitions through property change");
646 gtk_widget_destroy (dialog);
652 test_reload_sequence (gboolean set_folder_before_map)
655 GtkFileChooserDefault *impl;
658 char *current_working_dir;
662 current_working_dir = g_get_current_dir ();
664 dialog = gtk_file_chooser_dialog_new ("Test file chooser",
666 GTK_FILE_CHOOSER_ACTION_OPEN,
672 impl = get_impl_from_dialog (dialog);
674 if (set_folder_before_map)
676 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
680 passed = passed && (impl->current_folder != NULL
681 && impl->browse_files_model != NULL
682 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
683 && impl->reload_state == RELOAD_HAS_FOLDER
684 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
685 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
686 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
691 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
692 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
697 /* Initially, no folder is not loaded or pending */
698 passed = passed && (impl->current_folder == NULL
699 && impl->sort_model == NULL
700 && impl->browse_files_model == NULL
701 && impl->load_state == LOAD_EMPTY
702 && impl->reload_state == RELOAD_EMPTY
703 && impl->load_timeout_id == 0);
707 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
708 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
711 log_test (passed, "test_reload_sequence(): initial status");
713 /* After mapping, it is loading some folder, either the one that was explicitly set or the default one */
715 gtk_widget_show_now (dialog);
719 passed = passed && (impl->current_folder != NULL
720 && impl->browse_files_model != NULL
721 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
722 && impl->reload_state == RELOAD_HAS_FOLDER
723 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
724 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
725 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
728 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
729 if (set_folder_before_map)
730 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
732 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
736 log_test (passed, "test_reload_sequence(): status after map");
738 /* Unmap it; we should still have a folder */
740 gtk_widget_hide (dialog);
744 passed = passed && (impl->current_folder != NULL
745 && impl->browse_files_model != NULL
746 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
747 && impl->reload_state == RELOAD_WAS_UNMAPPED
748 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
749 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
750 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
753 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
754 if (set_folder_before_map)
755 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
757 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
761 log_test (passed, "test_reload_sequence(): status after unmap");
765 gtk_widget_show_now (dialog);
769 passed = passed && (impl->current_folder != NULL
770 && impl->browse_files_model != NULL
771 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
772 && impl->reload_state == RELOAD_HAS_FOLDER
773 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
774 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
775 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
778 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
779 if (set_folder_before_map)
780 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
782 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
786 log_test (passed, "test_reload_sequence(): status after re-map");
788 gtk_widget_destroy (dialog);
789 g_free (current_working_dir);
799 passed = test_reload_sequence (FALSE);
800 log_test (passed, "test_reload(): create and use the default folder");
804 passed = test_reload_sequence (TRUE);
805 log_test (passed, "test_reload(): set a folder explicitly before mapping");
811 test_button_folder_states_for_action (GtkFileChooserAction action, gboolean use_dialog, gboolean set_folder_on_dialog)
818 char *current_working_dir;
819 gboolean must_have_cwd;
823 current_working_dir = g_get_current_dir ();
824 must_have_cwd = !(use_dialog && set_folder_on_dialog);
826 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
830 dialog = gtk_file_chooser_dialog_new ("Test", NULL, action,
831 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
832 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
834 button = gtk_file_chooser_button_new_with_dialog (dialog);
836 if (set_folder_on_dialog)
837 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
841 button = gtk_file_chooser_button_new ("Test", action);
842 dialog = NULL; /* keep gcc happy */
845 gtk_container_add (GTK_CONTAINER (window), button);
847 /* Pre-map; no folder is set */
850 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
852 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
854 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
856 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, pre-map, %s",
857 get_action_name (action),
859 set_folder_on_dialog,
860 must_have_cwd ? "must have $cwd" : "must have explicit folder");
862 /* Map; folder should be set */
864 gtk_widget_show_all (window);
865 gtk_widget_show_now (window);
869 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
872 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
874 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
876 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, mapped, %s",
877 get_action_name (action),
879 set_folder_on_dialog,
880 must_have_cwd ? "must have $cwd" : "must have explicit folder");
883 /* Unmap; folder should be set */
885 gtk_widget_hide (window);
887 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
890 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
892 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
894 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, unmapped, %s",
895 get_action_name (action),
897 set_folder_on_dialog,
898 must_have_cwd ? "must have $cwd" : "must have explicit folder");
901 /* Re-map; folder should be set */
903 gtk_widget_show_now (window);
904 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
907 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
909 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
911 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, re-mapped, %s",
912 get_action_name (action),
914 set_folder_on_dialog,
915 must_have_cwd ? "must have $cwd" : "must have explicit folder");
918 g_free (current_working_dir);
920 gtk_widget_destroy (window);
926 test_button_folder_states (void)
928 /* GtkFileChooserButton only supports OPEN and SELECT_FOLDER */
929 static const GtkFileChooserAction actions_to_test[] = {
930 GTK_FILE_CHOOSER_ACTION_OPEN,
931 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
938 for (i = 0; i < G_N_ELEMENTS (actions_to_test); i++)
940 passed = passed && test_button_folder_states_for_action (actions_to_test[i], FALSE, FALSE);
941 passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, FALSE);
942 passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, TRUE);
943 log_test (passed, "test_button_folder_states(): action %s", get_action_name (actions_to_test[i]));
946 log_test (passed, "test_button_folder_states(): all supported actions");
951 sleep_timeout_cb (gpointer data)
958 sleep_in_main_loop (int milliseconds)
960 gdk_threads_add_timeout (milliseconds, sleep_timeout_cb, NULL);
965 test_folder_switch_and_filters (void)
970 GtkFilePath *cwd_path;
971 GtkFilePath *base_dir_path;
973 GtkFileFilter *all_filter;
974 GtkFileFilter *txt_filter;
975 GtkFileChooserDefault *impl;
979 cwd = g_get_current_dir ();
980 base_dir = g_build_filename (cwd, "file-chooser-test-dir", NULL);
982 dialog = gtk_file_chooser_dialog_new ("Test", NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
983 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
984 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
986 impl = get_impl_from_dialog (dialog);
988 cwd_path = gtk_file_system_filename_to_path (impl->file_system, cwd);
989 base_dir_path = gtk_file_system_filename_to_path (impl->file_system, base_dir);
991 passed = passed && gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
995 /* All files filter */
997 all_filter = gtk_file_filter_new ();
998 gtk_file_filter_set_name (all_filter, "All files");
999 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), all_filter);
1003 txt_filter = gtk_file_filter_new ();
1004 gtk_file_filter_set_name (all_filter, "*.txt");
1005 gtk_file_filter_add_pattern (txt_filter, "*.txt");
1006 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
1008 /* Test filter set */
1010 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), all_filter);
1011 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == all_filter);
1013 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
1014 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1016 log_test (passed, "test_folder_switch_and_filters(): set and get filter");
1018 gtk_widget_show (dialog);
1020 /* Test that filter is unchanged when we switch folders */
1022 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), cwd);
1023 sleep_in_main_loop (1000);
1024 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1026 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
1027 sleep_in_main_loop (500);
1029 g_signal_emit_by_name (impl->browse_path_bar, "path-clicked",
1030 (GtkFilePath *) cwd_path,
1031 (GtkFilePath *) base_dir_path,
1033 sleep_in_main_loop (500);
1034 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1036 log_test (passed, "test_folder_switch_and_filters(): filter after changing folder");
1041 gtk_file_path_free (cwd_path);
1042 gtk_file_path_free (base_dir_path);
1044 gtk_widget_destroy (dialog);
1046 log_test (passed, "test_folder_switch_and_filters(): all filter tests");
1050 static GLogFunc default_log_handler;
1051 static int num_warnings;
1052 static int num_errors;
1053 static int num_critical_errors;
1056 log_override_cb (const gchar *log_domain,
1057 GLogLevelFlags log_level,
1058 const gchar *message,
1061 if (log_level & G_LOG_LEVEL_WARNING)
1064 if (log_level & G_LOG_LEVEL_ERROR)
1067 if (log_level & G_LOG_LEVEL_CRITICAL)
1068 num_critical_errors++;
1070 (* default_log_handler) (log_domain, log_level, message, user_data);
1074 main (int argc, char **argv)
1077 gboolean zero_warnings;
1078 gboolean zero_errors;
1079 gboolean zero_critical_errors;
1081 default_log_handler = g_log_set_default_handler (log_override_cb, NULL);
1084 gtk_init (&argc, &argv);
1088 passed = passed && test_black_box ();
1089 passed = passed && test_confirm_overwrite ();
1090 passed = passed && test_action_widgets ();
1091 passed = passed && test_reload ();
1092 passed = passed && test_button_folder_states ();
1093 passed = passed && test_folder_switch_and_filters ();
1094 log_test (passed, "main(): main tests");
1096 /* Warnings and errors */
1098 zero_warnings = num_warnings == 0;
1099 zero_errors = num_errors == 0;
1100 zero_critical_errors = num_critical_errors == 0;
1102 log_test (zero_warnings, "main(): zero warnings (actual number %d)", num_warnings);
1103 log_test (zero_errors, "main(): zero errors (actual number %d)", num_errors);
1104 log_test (zero_critical_errors, "main(): zero critical errors (actual number %d)", num_critical_errors);
1108 passed = passed && zero_warnings && zero_errors && zero_critical_errors;
1110 log_test (passed, "main(): ALL TESTS");