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
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);
52 g_printf ("%s: %s\n", passed ? "PASSED" : "FAILED", str);
56 typedef void (* SetFilenameFn) (GtkFileChooser *chooser, gpointer data);
57 typedef gboolean (* CompareFilenameFn) (GtkFileChooser *chooser, gpointer data);
59 struct test_set_filename_closure {
61 GtkWidget *accept_button;
62 gboolean focus_button;
66 set_filename_timeout_cb (gpointer data)
68 struct test_set_filename_closure *closure;
72 if (closure->focus_button)
73 gtk_widget_grab_focus (closure->accept_button);
75 gtk_button_clicked (GTK_BUTTON (closure->accept_button));
81 test_set_filename (GtkFileChooserAction action,
82 gboolean focus_button,
83 SetFilenameFn set_filename_fn,const
84 CompareFilenameFn compare_filename_fn,
88 struct test_set_filename_closure closure;
91 chooser = gtk_file_chooser_dialog_new ("hello", NULL, action,
92 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
95 closure.chooser = chooser;
96 closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (chooser), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
97 closure.focus_button = focus_button;
99 gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
101 (* set_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
103 g_timeout_add (2000, set_filename_timeout_cb, &closure);
104 gtk_dialog_run (GTK_DIALOG (chooser));
106 retval = (* compare_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
108 gtk_widget_destroy (chooser);
114 set_filename_cb (GtkFileChooser *chooser, gpointer data)
116 const char *filename;
119 gtk_file_chooser_set_filename (chooser, filename);
123 compare_filename_cb (GtkFileChooser *chooser, gpointer data)
125 const char *filename;
130 out_filename = gtk_file_chooser_get_filename (chooser);
134 retval = (strcmp (out_filename, filename) == 0);
135 g_free (out_filename);
143 test_black_box_set_filename (GtkFileChooserAction action, const char *filename, gboolean focus_button)
147 passed = test_set_filename (action, focus_button, set_filename_cb, compare_filename_cb, (char *) filename);
149 log_test (passed, "set_filename: action %d, focus_button=%s",
151 focus_button ? "TRUE" : "FALSE");
157 struct current_name_closure {
159 const char *current_name;
163 set_current_name_cb (GtkFileChooser *chooser, gpointer data)
165 struct current_name_closure *closure;
169 gtk_file_chooser_set_current_folder (chooser, closure->path);
170 gtk_file_chooser_set_current_name (chooser, closure->current_name);
174 compare_current_name_cb (GtkFileChooser *chooser, gpointer data)
176 struct current_name_closure *closure;
182 out_filename = gtk_file_chooser_get_filename (chooser);
188 filename = g_build_filename (closure->path, closure->current_name, NULL);
189 retval = (strcmp (filename, out_filename) == 0);
191 g_free (out_filename);
199 test_black_box_set_current_name (const char *path, const char *current_name, gboolean focus_button)
201 struct current_name_closure closure;
205 closure.current_name = current_name;
207 passed = test_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, focus_button,
208 set_current_name_cb, compare_current_name_cb, &closure);
210 log_test (passed, "set_current_name, focus_button=%s", focus_button ? "TRUE" : "FALSE");
215 /* FIXME: fails in CREATE_FOLDER mode when FOLDER_NAME == "/" */
218 #define FILE_NAME "/nonexistent"
219 #define FOLDER_NAME "/etc"
221 #define FILE_NAME "/etc/passwd"
222 #define FOLDER_NAME "/etc"
225 #define CURRENT_NAME "parangaricutirimicuaro.txt"
227 /* https://bugzilla.novell.com/show_bug.cgi?id=184875
228 * http://bugzilla.gnome.org/show_bug.cgi?id=347066
231 test_black_box (void)
238 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, FALSE);
239 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, TRUE);
240 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, FALSE);
241 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, TRUE);
242 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, FALSE);
243 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, TRUE);
244 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, FALSE);
245 passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, TRUE);
247 cwd = g_get_current_dir ();
249 passed = passed && test_black_box_set_current_name (cwd, CURRENT_NAME, FALSE);
250 passed = passed && test_black_box_set_current_name (cwd, CURRENT_NAME, TRUE);
254 log_test (passed, "Black box tests");
259 struct confirm_overwrite_closure {
261 GtkWidget *accept_button;
262 gboolean emitted_confirm_overwrite_signal;
265 static GtkFileChooserConfirmation
266 confirm_overwrite_cb (GtkFileChooser *chooser, gpointer data)
268 struct confirm_overwrite_closure *closure;
274 closure->emitted_confirm_overwrite_signal = TRUE;
276 return GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME;
280 confirm_overwrite_timeout_cb (gpointer data)
282 struct confirm_overwrite_closure *closure;
285 gtk_button_clicked (GTK_BUTTON (closure->accept_button));
290 /* http://bugzilla.gnome.org/show_bug.cgi?id=347883 */
292 test_confirm_overwrite (void)
295 struct confirm_overwrite_closure closure;
300 closure.emitted_confirm_overwrite_signal = FALSE;
301 closure.chooser = gtk_file_chooser_dialog_new ("hello", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
302 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
304 closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (closure.chooser), GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
305 gtk_dialog_set_default_response (GTK_DIALOG (closure.chooser), GTK_RESPONSE_ACCEPT);
307 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (closure.chooser), TRUE);
308 g_signal_connect (closure.chooser, "confirm-overwrite",
309 G_CALLBACK (confirm_overwrite_cb), &closure);
311 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (closure.chooser), "/etc/passwd"); /* a file we know will always exist */
313 g_timeout_add (2000, confirm_overwrite_timeout_cb, &closure);
314 gtk_dialog_run (GTK_DIALOG (closure.chooser));
316 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (closure.chooser));
317 passed = passed && filename && (strcmp (filename, "/etc/passwd") == 0);
320 gtk_widget_destroy (closure.chooser);
322 passed = passed && closure.emitted_confirm_overwrite_signal;
324 log_test (passed, "Confirm overwrite");
329 static const GtkFileChooserAction open_actions[] = {
330 GTK_FILE_CHOOSER_ACTION_OPEN,
331 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
334 static const GtkFileChooserAction save_actions[] = {
335 GTK_FILE_CHOOSER_ACTION_SAVE,
336 GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
341 has_action (const GtkFileChooserAction *actions,
343 GtkFileChooserAction sought_action)
347 for (i = 0; i < n_actions; i++)
348 if (actions[i] == sought_action)
355 get_action_name (GtkFileChooserAction action)
357 GEnumClass *enum_class;
358 GEnumValue *enum_value;
360 enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
362 g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
364 enum_value = g_enum_get_value (enum_class, (int) action);
366 g_error ("BUG: get_action_name(): no GEnumValue for GtkFileChooserAction %d", (int) action);
368 return enum_value->value_name;
371 static GtkFileChooserDefault *
372 get_impl_from_dialog (GtkWidget *dialog)
374 GtkFileChooserDialog *d;
375 GtkFileChooserDialogPrivate *dialog_priv;
376 GtkFileChooserWidget *chooser_widget;
377 GtkFileChooserWidgetPrivate *widget_priv;
378 GtkFileChooserDefault *impl;
380 d = GTK_FILE_CHOOSER_DIALOG (dialog);
381 dialog_priv = d->priv;
382 chooser_widget = GTK_FILE_CHOOSER_WIDGET (dialog_priv->widget);
384 g_error ("BUG: dialog_priv->widget is not a GtkFileChooserWidget");
386 widget_priv = chooser_widget->priv;
387 impl = (GtkFileChooserDefault *) (widget_priv->impl);
389 g_error ("BUG: widget_priv->impl is not a GtkFileChooserDefault");
395 test_widgets_for_current_action (GtkFileChooserDialog *dialog,
396 GtkFileChooserAction expected_action)
398 GtkFileChooserDefault *impl;
401 if (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) != expected_action)
404 impl = get_impl_from_dialog (GTK_WIDGET (dialog));
406 g_assert (impl->action == expected_action);
410 /* OPEN implies that the "new folder" button is hidden; otherwise it is shown */
411 if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN)
412 passed = passed && !GTK_WIDGET_VISIBLE (impl->browse_new_folder_button);
414 passed = passed && GTK_WIDGET_VISIBLE (impl->browse_new_folder_button);
416 /* Check that the widgets are present/visible or not */
417 if (has_action (open_actions, G_N_ELEMENTS (open_actions), impl->action))
419 passed = passed && (impl->save_widgets == NULL
420 && (impl->location_mode == LOCATION_MODE_PATH_BAR
421 ? impl->location_entry == NULL
422 : impl->location_entry != NULL)
423 && impl->save_folder_label == NULL
424 && impl->save_folder_combo == NULL
425 && impl->save_expander == NULL
426 && GTK_IS_CONTAINER (impl->browse_widgets) && GTK_WIDGET_DRAWABLE (impl->browse_widgets));
428 else if (has_action (save_actions, G_N_ELEMENTS (save_actions), impl->action))
430 /* FIXME: we can't use GTK_IS_FILE_CHOOSER_ENTRY() because it uses
431 * _gtk_file_chooser_entry_get_type(), which is a non-exported symbol.
432 * So, we just test impl->location_entry for being non-NULL
434 passed = passed && (GTK_IS_CONTAINER (impl->save_widgets) && GTK_WIDGET_DRAWABLE (impl->save_widgets)
435 && impl->location_entry != NULL && GTK_WIDGET_DRAWABLE (impl->location_entry)
436 && GTK_IS_LABEL (impl->save_folder_label) && GTK_WIDGET_DRAWABLE (impl->save_folder_label)
437 && GTK_IS_COMBO_BOX (impl->save_folder_combo) && GTK_WIDGET_DRAWABLE (impl->save_folder_combo)
438 && GTK_IS_EXPANDER (impl->save_expander) && GTK_WIDGET_DRAWABLE (impl->save_expander)
439 && GTK_IS_CONTAINER (impl->browse_widgets));
441 /* FIXME: we are in a SAVE mode; test the visibility and sensitivity of
442 * the children that change depending on the state of the expander.
447 g_error ("BAD TEST: test_widgets_for_current_action() doesn't know about %s", get_action_name (impl->action));
454 typedef gboolean (* ForeachActionCallback) (GtkFileChooserDialog *dialog,
455 GtkFileChooserAction action,
459 foreach_action (GtkFileChooserDialog *dialog,
460 ForeachActionCallback callback,
463 GEnumClass *enum_class;
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 for (i = 0; i < enum_class->n_values; i++)
472 GEnumValue *enum_value;
473 GtkFileChooserAction action;
476 enum_value = enum_class->values + i;
477 action = enum_value->value;
479 passed = (* callback) (dialog, action, user_data);
487 struct action_closure {
488 GtkFileChooserAction from_action;
492 switch_from_to_action_cb (GtkFileChooserDialog *dialog,
493 GtkFileChooserAction action,
496 struct action_closure *closure;
501 gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), closure->from_action);
503 passed = test_widgets_for_current_action (dialog, closure->from_action);
504 log_test (passed, "switch_from_to_action_cb(): reset to action %s", get_action_name (closure->from_action));
508 gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), action);
510 passed = test_widgets_for_current_action (dialog, action);
511 log_test (passed, "switch_from_to_action_cb(): transition from %s to %s",
512 get_action_name (closure->from_action),
513 get_action_name (action));
518 switch_from_action_cb (GtkFileChooserDialog *dialog,
519 GtkFileChooserAction action,
522 struct action_closure closure;
524 closure.from_action = action;
526 return foreach_action (dialog, switch_from_to_action_cb, &closure);
530 test_action_widgets (void)
533 GtkFileChooserAction action;
536 dialog = gtk_file_chooser_dialog_new ("Test file chooser",
538 GTK_FILE_CHOOSER_ACTION_OPEN,
544 gtk_widget_show_now (dialog);
546 action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog));
548 passed = test_widgets_for_current_action (GTK_FILE_CHOOSER_DIALOG (dialog), action);
549 log_test (passed, "test_action_widgets(): widgets for initial action %s", get_action_name (action));
553 passed = foreach_action (GTK_FILE_CHOOSER_DIALOG (dialog), switch_from_action_cb, NULL);
554 log_test (passed, "test_action_widgets(): all transitions through property change");
556 gtk_widget_destroy (dialog);
562 test_reload_sequence (gboolean set_folder_before_map)
565 GtkFileChooserDefault *impl;
568 char *current_working_dir;
572 current_working_dir = g_get_current_dir ();
574 dialog = gtk_file_chooser_dialog_new ("Test file chooser",
576 GTK_FILE_CHOOSER_ACTION_OPEN,
582 impl = get_impl_from_dialog (dialog);
584 if (set_folder_before_map)
586 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
588 passed = passed && (impl->current_folder != NULL
589 && impl->browse_files_model != NULL
590 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
591 && impl->reload_state == RELOAD_HAS_FOLDER
592 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
593 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
594 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
597 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
598 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
603 /* Initially, no folder is not loaded or pending */
604 passed = passed && (impl->current_folder == NULL
605 && impl->sort_model == NULL
606 && impl->browse_files_model == NULL
607 && impl->load_state == LOAD_EMPTY
608 && impl->reload_state == RELOAD_EMPTY
609 && impl->load_timeout_id == 0);
611 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
612 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
615 log_test (passed, "test_reload_sequence(): initial status");
617 /* After mapping, it is loading some folder, either the one that was explicitly set or the default one */
619 gtk_widget_show_now (dialog);
621 passed = passed && (impl->current_folder != NULL
622 && impl->browse_files_model != NULL
623 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
624 && impl->reload_state == RELOAD_HAS_FOLDER
625 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
626 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
627 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
630 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
631 if (set_folder_before_map)
632 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
634 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
638 log_test (passed, "test_reload_sequence(): status after map");
640 /* Unmap it; we should still have a folder */
642 gtk_widget_hide (dialog);
644 passed = passed && (impl->current_folder != NULL
645 && impl->browse_files_model != NULL
646 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
647 && impl->reload_state == RELOAD_WAS_UNMAPPED
648 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
649 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
650 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
653 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
654 if (set_folder_before_map)
655 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
657 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
661 log_test (passed, "test_reload_sequence(): status after unmap");
665 gtk_widget_show_now (dialog);
667 passed = passed && (impl->current_folder != NULL
668 && impl->browse_files_model != NULL
669 && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
670 && impl->reload_state == RELOAD_HAS_FOLDER
671 && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
672 && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
673 ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
676 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
677 if (set_folder_before_map)
678 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
680 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
684 log_test (passed, "test_reload_sequence(): status after re-map");
686 gtk_widget_destroy (dialog);
687 g_free (current_working_dir);
697 passed = test_reload_sequence (FALSE);
698 log_test (passed, "test_reload(): create and use the default folder");
702 passed = test_reload_sequence (TRUE);
703 log_test (passed, "test_reload(): set a folder explicitly before mapping");
709 test_button_folder_states_for_action (GtkFileChooserAction action, gboolean use_dialog, gboolean set_folder_on_dialog)
716 char *current_working_dir;
717 gboolean must_have_cwd;
721 current_working_dir = g_get_current_dir ();
722 must_have_cwd = !(use_dialog && set_folder_on_dialog);
724 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
728 dialog = gtk_file_chooser_dialog_new ("Test", NULL, action,
729 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
730 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
732 button = gtk_file_chooser_button_new_with_dialog (dialog);
734 if (set_folder_on_dialog)
735 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
739 button = gtk_file_chooser_button_new ("Test", action);
740 dialog = NULL; /* keep gcc happy */
743 gtk_container_add (GTK_CONTAINER (window), button);
745 /* Pre-map; no folder is set */
747 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
749 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
751 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
753 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, pre-map, %s",
754 get_action_name (action),
756 set_folder_on_dialog,
757 must_have_cwd ? "must have $cwd" : "must have explicit folder");
759 /* Map; folder should be set */
761 gtk_widget_show_all (window);
762 gtk_widget_show_now (window);
763 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
766 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
768 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
770 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, mapped, %s",
771 get_action_name (action),
773 set_folder_on_dialog,
774 must_have_cwd ? "must have $cwd" : "must have explicit folder");
777 /* Unmap; folder should be set */
779 gtk_widget_hide (window);
780 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
783 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
785 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
787 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, unmapped, %s",
788 get_action_name (action),
790 set_folder_on_dialog,
791 must_have_cwd ? "must have $cwd" : "must have explicit folder");
794 /* Re-map; folder should be set */
796 gtk_widget_show_now (window);
797 folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
800 passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
802 passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
804 log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, re-mapped, %s",
805 get_action_name (action),
807 set_folder_on_dialog,
808 must_have_cwd ? "must have $cwd" : "must have explicit folder");
811 g_free (current_working_dir);
813 gtk_widget_destroy (window);
819 test_button_folder_states (void)
821 /* GtkFileChooserButton only supports OPEN and SELECT_FOLDER */
822 static const GtkFileChooserAction actions_to_test[] = {
823 GTK_FILE_CHOOSER_ACTION_OPEN,
824 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
831 for (i = 0; i < G_N_ELEMENTS (actions_to_test); i++)
833 passed = passed && test_button_folder_states_for_action (actions_to_test[i], FALSE, FALSE);
834 passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, FALSE);
835 passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, TRUE);
836 log_test (passed, "test_button_folder_states(): action %s", get_action_name (actions_to_test[i]));
839 log_test (passed, "test_button_folder_states(): all supported actions");
844 sleep_timeout_cb (gpointer data)
851 sleep_in_main_loop (int milliseconds)
853 g_timeout_add (milliseconds, sleep_timeout_cb, NULL);
858 test_folder_switch_and_filters (void)
863 GtkFilePath *cwd_path;
864 GtkFilePath *base_dir_path;
866 GtkFileFilter *all_filter;
867 GtkFileFilter *txt_filter;
868 GtkFileChooserDefault *impl;
872 cwd = g_get_current_dir ();
873 base_dir = g_build_filename (cwd, "file-chooser-test-dir", NULL);
875 dialog = gtk_file_chooser_dialog_new ("Test", NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
876 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
877 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
879 impl = get_impl_from_dialog (dialog);
881 cwd_path = gtk_file_system_filename_to_path (impl->file_system, cwd);
882 base_dir_path = gtk_file_system_filename_to_path (impl->file_system, base_dir);
884 passed = passed && gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
888 /* All files filter */
890 all_filter = gtk_file_filter_new ();
891 gtk_file_filter_set_name (all_filter, "All files");
892 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), all_filter);
896 txt_filter = gtk_file_filter_new ();
897 gtk_file_filter_set_name (all_filter, "*.txt");
898 gtk_file_filter_add_pattern (txt_filter, "*.txt");
899 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
901 /* Test filter set */
903 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), all_filter);
904 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == all_filter);
906 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
907 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
909 log_test (passed, "test_folder_switch_and_filters(): set and get filter");
911 gtk_widget_show (dialog);
913 /* Test that filter is unchanged when we switch folders */
915 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), cwd);
916 sleep_in_main_loop (1000);
917 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
919 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
920 sleep_in_main_loop (500);
922 g_signal_emit_by_name (impl->browse_path_bar, "path-clicked",
923 (GtkFilePath *) cwd_path,
924 (GtkFilePath *) base_dir_path,
926 sleep_in_main_loop (500);
927 passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
929 log_test (passed, "test_folder_switch_and_filters(): filter after changing folder");
934 gtk_file_path_free (cwd_path);
935 gtk_file_path_free (base_dir_path);
937 gtk_widget_destroy (dialog);
939 log_test (passed, "test_folder_switch_and_filters(): all filter tests");
943 static GLogFunc default_log_handler;
944 static int num_warnings;
945 static int num_errors;
946 static int num_critical_errors;
949 log_override_cb (const gchar *log_domain,
950 GLogLevelFlags log_level,
951 const gchar *message,
954 if (log_level & G_LOG_LEVEL_WARNING)
957 if (log_level & G_LOG_LEVEL_ERROR)
960 if (log_level & G_LOG_LEVEL_CRITICAL)
961 num_critical_errors++;
963 (* default_log_handler) (log_domain, log_level, message, user_data);
967 main (int argc, char **argv)
970 gboolean zero_warnings;
971 gboolean zero_errors;
972 gboolean zero_critical_errors;
974 default_log_handler = g_log_set_default_handler (log_override_cb, NULL);
977 gtk_init (&argc, &argv);
981 passed = passed && test_black_box ();
983 passed = passed && test_confirm_overwrite ();
985 passed = passed && test_action_widgets ();
986 passed = passed && test_reload ();
987 passed = passed && test_button_folder_states ();
988 passed = passed && test_folder_switch_and_filters ();
990 log_test (passed, "main(): main tests");
992 /* Warnings and errors */
994 zero_warnings = num_warnings == 0;
995 zero_errors = num_errors == 0;
996 zero_critical_errors = num_critical_errors == 0;
998 log_test (zero_warnings, "main(): zero warnings (actual number %d)", num_warnings);
999 log_test (zero_errors, "main(): zero errors (actual number %d)", num_errors);
1000 log_test (zero_critical_errors, "main(): zero critical errors (actual number %d)", num_critical_errors);
1004 passed = passed && zero_warnings && zero_errors && zero_critical_errors;
1006 log_test (passed, "main(): ALL TESTS");