* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
/* TODO:
#include "gtk/gtkfilechooserdefault.h"
#include "gtk/gtkfilechooserentry.h"
+#if 0
+static const char *
+get_action_name (GtkFileChooserAction action)
+{
+ switch (action)
+ {
+ case GTK_FILE_CHOOSER_ACTION_OPEN: return "OPEN";
+ case GTK_FILE_CHOOSER_ACTION_SAVE: return "SAVE";
+ case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: return "SELECT_FOLDER";
+ case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: return "CREATE_FOLDER";
+
+ default:
+ g_assert_not_reached ();
+ return NULL;
+ }
+}
+#endif
+
+#ifdef BROKEN_TESTS
static void
log_test (gboolean passed, const char *test_name, ...)
{
}
typedef void (* SetFilenameFn) (GtkFileChooser *chooser, gpointer data);
-typedef gboolean (* CompareFilenameFn) (GtkFileChooser *chooser, gpointer data);
+typedef void (* CompareFilenameFn) (GtkFileChooser *chooser, gpointer data);
struct test_set_filename_closure {
GtkWidget *chooser;
return FALSE;
}
+#endif
static guint wait_for_idle_id = 0;
{
wait_for_idle_id = 0;
- return FALSE;
+ return G_SOURCE_REMOVE;
}
static void
gtk_main_iteration ();
}
-static gboolean
+#ifdef BROKEN_TESTS
+static void
test_set_filename (GtkFileChooserAction action,
gboolean focus_button,
SetFilenameFn set_filename_fn,const
{
GtkWidget *chooser;
struct test_set_filename_closure closure;
- gboolean retval;
+ guint timeout_id;
chooser = gtk_file_chooser_dialog_new ("hello", NULL, action,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
(* set_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
- gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, set_filename_timeout_cb, &closure, NULL);
+ timeout_id = gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, set_filename_timeout_cb, &closure, NULL);
gtk_dialog_run (GTK_DIALOG (chooser));
+ g_source_remove (timeout_id);
- retval = (* compare_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
+ (* compare_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
gtk_widget_destroy (chooser);
-
- return retval;
}
static void
gtk_file_chooser_set_filename (chooser, filename);
}
-static gboolean
+static void
compare_filename_cb (GtkFileChooser *chooser, gpointer data)
{
const char *filename;
char *out_filename;
- gboolean retval;
filename = data;
out_filename = gtk_file_chooser_get_filename (chooser);
- if (out_filename)
- {
- retval = (strcmp (out_filename, filename) == 0);
- g_free (out_filename);
- } else
- retval = FALSE;
+ g_assert_cmpstr (out_filename, ==, filename);
- return retval;
+ if (out_filename)
+ g_free (out_filename);
}
-static gboolean
-test_black_box_set_filename (GtkFileChooserAction action, const char *filename, gboolean focus_button)
+typedef struct
{
- gboolean passed;
-
- passed = test_set_filename (action, focus_button, set_filename_cb, compare_filename_cb, (char *) filename);
-
- log_test (passed, "set_filename: action %d, focus_button=%s",
- (int) action,
- focus_button ? "TRUE" : "FALSE");
+ const char *test_name;
+ GtkFileChooserAction action;
+ const char *filename;
+ gboolean focus_button;
+} TestSetFilenameSetup;
- return passed;
+static void
+test_black_box_set_filename (gconstpointer data)
+{
+ const TestSetFilenameSetup *setup = data;
+ test_set_filename (setup->action, setup->focus_button, set_filename_cb, compare_filename_cb, (char *) setup->filename);
}
struct current_name_closure {
gtk_file_chooser_set_current_name (chooser, closure->current_name);
}
-static gboolean
+static void
compare_current_name_cb (GtkFileChooser *chooser, gpointer data)
{
struct current_name_closure *closure;
char *out_filename;
- gboolean retval;
+ char *filename;
closure = data;
out_filename = gtk_file_chooser_get_filename (chooser);
- if (out_filename)
- {
- char *filename;
+ g_assert (out_filename != NULL);
- filename = g_build_filename (closure->path, closure->current_name, NULL);
- retval = (strcmp (filename, out_filename) == 0);
- g_free (filename);
- g_free (out_filename);
- } else
- retval = FALSE;
+ filename = g_build_filename (closure->path, closure->current_name, NULL);
+ g_assert_cmpstr (filename, ==, out_filename);
- return retval;
+ g_free (filename);
+ g_free (out_filename);
}
-static gboolean
-test_black_box_set_current_name (GtkFileChooserAction action, const char *path, const char *current_name, gboolean focus_button)
+typedef struct
+{
+ const char *test_name;
+ GtkFileChooserAction action;
+ const char *current_name;
+ gboolean focus_button;
+} TestSetCurrentNameSetup;
+
+static void
+test_black_box_set_current_name (gconstpointer data)
{
+ const TestSetCurrentNameSetup *setup = data;
struct current_name_closure closure;
- gboolean passed;
+ char *cwd;
- closure.path = path;
- closure.current_name = current_name;
+ cwd = g_get_current_dir ();
- passed = test_set_filename (action, focus_button,
- set_current_name_cb, compare_current_name_cb, &closure);
+ closure.path = cwd;
+ closure.current_name = setup->current_name;
- log_test (passed, "set_current_name, focus_button=%s", focus_button ? "TRUE" : "FALSE");
+ test_set_filename (setup->action, setup->focus_button, set_current_name_cb, compare_current_name_cb, &closure);
- return passed;
+ g_free (cwd);
}
+#endif
/* FIXME: fails in CREATE_FOLDER mode when FOLDER_NAME == "/" */
#if 0
#define FILE_NAME "/nonexistent"
+#define FILE_NAME_2 "/nonexistent2"
#define FOLDER_NAME "/etc"
+#define FOLDER_NAME_2 "/usr"
#else
#define FILE_NAME "/etc/passwd"
+#define FILE_NAME_2 "/etc/group"
#define FOLDER_NAME "/etc"
+#define FOLDER_NAME_2 "/usr"
#endif
#define CURRENT_NAME "parangaricutirimicuaro.txt"
* http://bugzilla.gnome.org/show_bug.cgi?id=347066
* http://bugzilla.gnome.org/show_bug.cgi?id=346058
*/
+
+#ifdef BROKEN_TESTS
static void
-test_black_box (void)
+setup_set_filename_tests (void)
{
- gboolean passed;
- char *cwd;
+ static TestSetFilenameSetup tests[] =
+ {
+ { "/GtkFileChooser/black_box/set_filename/open/no_focus", GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, FALSE },
+ { "/GtkFileChooser/black_box/set_filename/open/focus", GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, TRUE },
+ { "/GtkFileChooser/black_box/set_filename/save/no_focus", GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, FALSE },
+ { "/GtkFileChooser/black_box/set_filename/save/focus", GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, TRUE },
+ { "/GtkFileChooser/black_box/set_filename/select_folder/no_focus", GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME,FALSE },
+ { "/GtkFileChooser/black_box/set_filename/select_folder/focus", GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME,TRUE },
+ { "/GtkFileChooser/black_box/set_filename/create_folder/no_focus", GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME,FALSE },
+ { "/GtkFileChooser/black_box/set_filename/create_folder/focus", GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME,TRUE },
+ };
+ int i;
- passed = TRUE;
+ for (i = 0; i < G_N_ELEMENTS (tests); i++)
+ g_test_add_data_func (tests[i].test_name, &tests[i], test_black_box_set_filename);
+}
- passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, FALSE);
- g_assert (passed);
- passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, TRUE);
- g_assert (passed);
- passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, FALSE);
- g_assert (passed);
- passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, TRUE);
- g_assert (passed);
- passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, FALSE);
- g_assert (passed);
- passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, TRUE);
- g_assert (passed);
- passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, FALSE);
- g_assert (passed);
- passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, TRUE);
- g_assert (passed);
+static void
+setup_set_current_name_tests (void)
+{
+ static TestSetCurrentNameSetup tests[] =
+ {
+ { "/GtkFileChooser/black_box/set_current_name/save/no_focus", GTK_FILE_CHOOSER_ACTION_SAVE, CURRENT_NAME, FALSE },
+ { "/GtkFileChooser/black_box/set_current_name/save/focus", GTK_FILE_CHOOSER_ACTION_SAVE, CURRENT_NAME, TRUE },
+ { "/GtkFileChooser/black_box/set_current_name/create_folder/no_focus", GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, CURRENT_NAME_FOLDER, FALSE },
+ { "/GtkFileChooser/black_box/set_current_name/create_folder/focus", GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, CURRENT_NAME_FOLDER, TRUE },
+ };
+ int i;
- cwd = g_get_current_dir ();
+ for (i = 0; i < G_N_ELEMENTS (tests); i++)
+ g_test_add_data_func (tests[i].test_name, &tests[i], test_black_box_set_current_name);
+}
+#endif
- passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_SAVE, cwd, CURRENT_NAME, FALSE);
- g_assert (passed);
- passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_SAVE, cwd, CURRENT_NAME, TRUE);
- g_assert (passed);
- passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, cwd, CURRENT_NAME_FOLDER, FALSE);
- g_assert (passed);
- passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, cwd, CURRENT_NAME_FOLDER, TRUE);
- g_assert (passed);
+typedef struct
+{
+ const char *shortname;
+ GtkFileChooserAction action;
+ const char *initial_current_folder;
+ const char *initial_filename;
+ gboolean open_dialog;
+ enum {
+ BUTTON,
+ DIALOG
+ } what_to_tweak;
+ const char *tweak_current_folder;
+ const char *tweak_filename;
+ gint dialog_response;
+ gboolean unselect_all;
+ const char *final_current_folder;
+ const char *final_filename;
+} FileChooserButtonTest;
+
+static char *
+make_button_test_name (FileChooserButtonTest *t)
+{
+ return g_strdup_printf ("/GtkFileChooserButton/%s", t->shortname);
+#if 0
+ GString *s = g_string_new ("/GtkFileChooserButton");
- g_free (cwd);
+ g_string_append_printf (s, "/%s/%s/%s/%s",
+ get_action_name (t->action),
+ t->initial_current_folder ? "set_initial_folder" : "no_default_folder",
+ t->initial_filename ? "set_initial_filename" : "no_initial_filename",
+ t->open_dialog ? "open_dialog" : "no_dialog");
+
+ if (t->tweak_current_folder)
+ g_string_append (s, "/tweak_current_folder");
+
+ if (t->tweak_filename)
+ g_string_append (s, "/tweak_filename");
+
+ if (t->open_dialog)
+ g_string_append_printf (s, "/%s",
+ t->dialog_response == GTK_RESPONSE_ACCEPT ? "accept" : "cancel");
+
+ if (t->final_current_folder)
+ g_string_append (s, "/final_current_folder");
+
+ if (t->final_filename)
+ g_string_append (s, "/final_filename");
+
+ return g_string_free (s, FALSE);
+#endif
+}
+
+static gboolean
+sleep_timeout_cb (gpointer data)
+{
+ gtk_main_quit ();
+ return FALSE;
+}
+
+static void
+sleep_in_main_loop (void)
+{
+ guint timeout_id;
+
+ timeout_id = gdk_threads_add_timeout_full (G_MAXINT, 250, sleep_timeout_cb, NULL, NULL);
+ gtk_main ();
+ g_source_remove (timeout_id);
+}
+
+static void
+build_children_list (GtkWidget *widget, gpointer data)
+{
+ GList **list;
+
+ list = data;
+ *list = g_list_prepend (*list, widget);
+}
+
+static GtkWidget *
+find_child_widget_with_atk_role (GtkWidget *widget, AtkRole role)
+{
+ AtkObject *accessible;
+ AtkRole a_role;
+
+ accessible = gtk_widget_get_accessible (widget);
+ a_role = atk_object_get_role (accessible);
+
+ if (a_role == role)
+ return widget;
+ else
+ {
+ GtkWidget *found_child;
+
+ found_child = NULL;
+
+ if (GTK_IS_CONTAINER (widget))
+ {
+ GList *children;
+ GList *l;
+
+ children = NULL;
+ gtk_container_forall (GTK_CONTAINER (widget), build_children_list, &children);
+
+ l = children;
+
+ while (l && !found_child)
+ {
+ GtkWidget *child;
+
+ child = GTK_WIDGET (l->data);
+
+ found_child = find_child_widget_with_atk_role (child, role);
+
+ l = l->next;
+ }
+
+ g_list_free (children);
+ }
+
+ return found_child;
+ }
+}
+
+static const char *
+get_atk_name_for_filechooser_button (GtkFileChooserButton *button)
+{
+ GtkFileChooserAction action;
+ GtkWidget *widget;
+ AtkObject *accessible;
+
+ action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (button));
+ g_assert (action == GTK_FILE_CHOOSER_ACTION_OPEN || action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+ if (action == GTK_FILE_CHOOSER_ACTION_OPEN)
+ widget = find_child_widget_with_atk_role (GTK_WIDGET (button), ATK_ROLE_PUSH_BUTTON);
+ else
+ widget = find_child_widget_with_atk_role (GTK_WIDGET (button), ATK_ROLE_COMBO_BOX);
+
+ accessible = gtk_widget_get_accessible (widget);
+ return atk_object_get_name (accessible);
+}
+
+static void
+check_that_basename_is_shown (GtkFileChooserButton *button, const char *expected_filename)
+{
+ GtkFileChooserAction action;
+ const char *name_on_button;
+ char *expected_basename;
+
+ name_on_button = get_atk_name_for_filechooser_button (button);
+
+ action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (button));
+ g_assert (action == GTK_FILE_CHOOSER_ACTION_OPEN || action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+ if (expected_filename)
+ expected_basename = g_path_get_basename (expected_filename);
+ else
+ expected_basename = NULL;
+
+ if (expected_basename)
+ g_assert_cmpstr (expected_basename, ==, name_on_button);
+ else
+ g_assert_cmpstr (name_on_button, ==, "(None)"); /* see gtkfilechooserbutton.c:FALLBACK_DISPLAY_NAME */ /* FIXME: how do we translate this? */
+
+ g_free (expected_basename);
+}
+
+static const char *
+get_expected_shown_filename (GtkFileChooserAction action, const char *folder_name, const char *filename)
+{
+ if (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
+ {
+ if (filename)
+ return filename;
+ else
+ return folder_name;
+ }
+ else
+ return filename;
+}
+
+static GtkWidget *
+get_file_chooser_dialog_from_button (GtkFileChooserButton *button)
+{
+ GtkWidget *fc_dialog;
+
+ /* Give me the internal dialog, damnit */
+ fc_dialog = g_object_get_qdata (G_OBJECT (button), g_quark_from_static_string ("gtk-file-chooser-delegate"));
+ g_assert (GTK_IS_FILE_CHOOSER (fc_dialog));
+ g_assert (GTK_IS_DIALOG (fc_dialog));
+
+ return fc_dialog;
+}
- log_test (passed, "Black box tests");
+typedef struct {
+ GtkWidget *window;
+ GtkWidget *fc_button;
+} WindowAndButton;
+
+static WindowAndButton
+create_window_and_file_chooser_button (GtkFileChooserAction action)
+{
+ WindowAndButton w;
+
+ w.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ w.fc_button = gtk_file_chooser_button_new (action == GTK_FILE_CHOOSER_ACTION_OPEN ? "Select a file" : "Select a folder",
+ action);
+ gtk_container_add (GTK_CONTAINER (w.window), w.fc_button);
+
+ return w;
+}
+
+typedef struct
+{
+ GObject *object;
+ GHashTable *signals;
+ gboolean in_main_loop;
+} SignalWatcher;
+
+typedef struct
+{
+ SignalWatcher *watcher;
+ char *signal_name;
+ gulong id;
+ gboolean emitted;
+} SignalConnection;
+
+static SignalWatcher *
+signal_watcher_new (GObject *object)
+{
+ SignalWatcher *watcher = g_new0 (SignalWatcher, 1);
+
+ watcher->object = g_object_ref (object);
+ watcher->signals = g_hash_table_new (g_str_hash, g_str_equal);
+
+ return watcher;
+}
+
+static void
+dummy_callback (GObject *object)
+{
+ /* nothing */
+}
+
+static void
+marshal_notify_cb (gpointer data, GClosure *closure)
+{
+ if (data)
+ {
+ SignalConnection *conn;
+
+ conn = data;
+ conn->emitted = TRUE;
+
+ if (conn->watcher->in_main_loop)
+ {
+ gtk_main_quit ();
+ conn->watcher->in_main_loop = FALSE;
+ }
+ }
}
+static void
+signal_watcher_watch_signal (SignalWatcher *watcher, const char *signal_name)
+{
+ SignalConnection *conn;
+
+ conn = g_hash_table_lookup (watcher->signals, signal_name);
+ if (!conn)
+ {
+ GClosure *closure;
+
+ conn = g_new0 (SignalConnection, 1);
+ conn->watcher = watcher;
+ conn->signal_name = g_strdup (signal_name);
+
+ closure = g_cclosure_new (G_CALLBACK (dummy_callback), NULL, NULL);
+ g_closure_add_marshal_guards (closure, conn, marshal_notify_cb, NULL, marshal_notify_cb);
+ conn->id = g_signal_connect_closure (watcher->object, signal_name, closure, FALSE);
+ conn->emitted = FALSE;
+
+ g_hash_table_insert (watcher->signals, conn->signal_name, conn);
+ }
+ else
+ conn->emitted = FALSE;
+}
+
+static gboolean
+signal_watcher_expect (SignalWatcher *watcher, const char *signal_name, char *unused_description)
+{
+ SignalConnection *conn;
+ gboolean emitted;
+
+ conn = g_hash_table_lookup (watcher->signals, signal_name);
+ g_assert (conn != NULL);
+
+ if (!conn->emitted)
+ {
+ guint timeout_id;
+
+ timeout_id = gdk_threads_add_timeout_full (G_MAXINT, 1000, sleep_timeout_cb, NULL, NULL);
+
+ watcher->in_main_loop = TRUE;
+ gtk_main ();
+ watcher->in_main_loop = FALSE;
+
+ g_source_remove (timeout_id);
+ }
+
+ emitted = conn->emitted;
+ conn->emitted = FALSE;
+
+ return emitted;
+}
+
+static void
+destroy_connection (gpointer key, gpointer value, gpointer user_data)
+{
+ SignalConnection *conn;
+
+ conn = value;
+ g_signal_handler_disconnect (conn->watcher->object, conn->id);
+ g_free (conn->signal_name);
+ g_free (conn);
+}
+
+static void
+signal_watcher_destroy (SignalWatcher *watcher)
+{
+ g_hash_table_foreach (watcher->signals, destroy_connection, NULL);
+ g_hash_table_destroy (watcher->signals);
+ g_object_unref (watcher->object);
+ g_free (watcher);
+}
+
+static void
+test_file_chooser_button_with_response (const FileChooserButtonTest *setup, gint dialog_response)
+{
+ WindowAndButton w;
+ SignalWatcher *watcher;
+ GtkWidget *fc_dialog;
+ int iterations;
+ int i;
+
+ w = create_window_and_file_chooser_button (setup->action);
+
+ watcher = signal_watcher_new (G_OBJECT (w.fc_button));
+ signal_watcher_watch_signal (watcher, "current-folder-changed");
+ signal_watcher_watch_signal (watcher, "selection-changed");
+
+ if (setup->initial_current_folder)
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (w.fc_button), setup->initial_current_folder);
+
+ if (setup->initial_filename)
+ gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (w.fc_button), setup->initial_filename);
+
+ gtk_widget_show_all (w.window);
+ wait_for_idle ();
+
+ if (setup->initial_current_folder)
+ g_assert (signal_watcher_expect (watcher, "current-folder-changed", "initial current folder"));
+
+ if (setup->initial_filename)
+ g_assert (signal_watcher_expect (watcher, "selection-changed", "initial filename"));
+
+ check_that_basename_is_shown (GTK_FILE_CHOOSER_BUTTON (w.fc_button),
+ get_expected_shown_filename (setup->action, setup->initial_current_folder, setup->initial_filename));
+
+ /* If there is a dialog to be opened, we actually test going through it a
+ * couple of times. This ensures that any state that the button frobs for
+ * each appearance of the dialog will make sense.
+ */
+ if (setup->open_dialog)
+ iterations = 2;
+ else
+ iterations = 1;
+
+ for (i = 0; i < iterations; i++)
+ {
+ GtkFileChooser *chooser_to_tweak;
+
+ if (setup->open_dialog)
+ {
+ GList *children;
+
+ /* Hack our way into the file chooser button; get its GtkButton child and click it */
+ children = gtk_container_get_children (GTK_CONTAINER (w.fc_button));
+ g_assert (children && GTK_IS_BUTTON (children->data));
+ gtk_button_clicked (GTK_BUTTON (children->data));
+ g_list_free (children);
+
+ wait_for_idle ();
+
+ fc_dialog = get_file_chooser_dialog_from_button (GTK_FILE_CHOOSER_BUTTON (w.fc_button));
+ }
+
+ if (setup->what_to_tweak == BUTTON)
+ chooser_to_tweak = GTK_FILE_CHOOSER (w.fc_button);
+ else if (setup->what_to_tweak == DIALOG)
+ chooser_to_tweak = GTK_FILE_CHOOSER (fc_dialog);
+ else
+ g_assert_not_reached ();
+
+ /* Okay, now frob the button or its optional dialog */
+
+ if (setup->tweak_current_folder)
+ {
+ if (setup->what_to_tweak == BUTTON)
+ signal_watcher_watch_signal (watcher, "current-folder-changed");
+
+ gtk_file_chooser_set_current_folder (chooser_to_tweak, setup->tweak_current_folder);
+
+ if (setup->what_to_tweak == BUTTON)
+ g_assert (signal_watcher_expect (watcher, "current-folder-changed", "tweak current folder in button"));
+ }
+
+ if (setup->tweak_filename)
+ {
+ if (setup->what_to_tweak == BUTTON)
+ signal_watcher_watch_signal (watcher, "selection-changed");
+
+ gtk_file_chooser_select_filename (chooser_to_tweak, setup->tweak_filename);
+
+ if (setup->what_to_tweak == BUTTON)
+ g_assert (signal_watcher_expect (watcher, "selection-changed", "tweak filename in button"));
+ }
+
+ if (setup->unselect_all)
+ {
+ if (setup->what_to_tweak == BUTTON)
+ signal_watcher_watch_signal (watcher, "selection-changed");
+
+ gtk_file_chooser_unselect_all (chooser_to_tweak);
+
+ if (setup->what_to_tweak == BUTTON)
+ g_assert (signal_watcher_expect (watcher, "selection-changed", "tweak unselect_all in button"));
+ }
+
+ wait_for_idle ();
+
+ if (setup->open_dialog)
+ {
+ gtk_dialog_response (GTK_DIALOG (fc_dialog), dialog_response);
+ wait_for_idle ();
+
+ gtk_window_resize (GTK_WINDOW (fc_dialog), 500, 500);
+ }
+
+ if (setup->final_current_folder)
+ {
+ char *folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (w.fc_button));
+
+ g_assert_cmpstr (folder, ==, setup->final_current_folder);
+ g_free (folder);
+ }
+
+ if (setup->final_filename)
+ {
+ char *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (w.fc_button));
+
+ g_assert_cmpstr (filename, ==, setup->final_filename);
+ g_free (filename);
+ }
+
+ check_that_basename_is_shown (GTK_FILE_CHOOSER_BUTTON (w.fc_button),
+ get_expected_shown_filename (setup->action, setup->final_current_folder, setup->final_filename));
+ }
+
+ signal_watcher_destroy (watcher);
+ gtk_widget_destroy (w.window);
+}
+
+static void
+test_file_chooser_button (gconstpointer data)
+{
+ const FileChooserButtonTest *setup = data;
+
+ test_file_chooser_button_with_response (setup, setup->dialog_response);
+
+ if (setup->open_dialog && setup->dialog_response == GTK_RESPONSE_CANCEL)
+ {
+ /* Runs the test again, with DELETE_EVENT (as if the user closed the
+ * dialog instead of using the Cancel button), since the button misbehaved
+ * in that case sometimes.
+ */
+ test_file_chooser_button_with_response (setup, GTK_RESPONSE_DELETE_EVENT);
+ }
+}
+
+static int
+find_accessible_action_num (AtkObject *object, const char *action_name)
+{
+ AtkAction *action_a;
+ int num_actions;
+ int i;
+
+ action_a = ATK_ACTION (object);
+
+ num_actions = atk_action_get_n_actions (action_a);
+
+ for (i = 0; i < num_actions; i++)
+ if (strcmp (atk_action_get_name (action_a, i), action_name) == 0)
+ return i;
+
+ return -1;
+}
+
+static void
+do_accessible_action (AtkObject *object, const char *action_name)
+{
+ int action_num;
+
+ action_num = find_accessible_action_num (object, action_name);
+ g_assert (action_num != -1);
+
+ atk_action_do_action (ATK_ACTION (object), action_num);
+}
+
+static void
+test_file_chooser_button_combo_box_1 (void)
+{
+ WindowAndButton w;
+ GtkWidget *combo_box;
+ AtkObject *combo_box_a;
+ AtkObject *menu_a;
+ int num_items;
+ int other_index;
+ AtkObject *item_a;
+ GtkWidget *fc_dialog;
+
+ w = create_window_and_file_chooser_button (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+ gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (w.fc_button), FOLDER_NAME);
+
+ gtk_widget_show_all (w.window);
+
+ /* Get the accessible for the combo box */
+
+ combo_box = find_child_widget_with_atk_role (GTK_WIDGET (w.fc_button), ATK_ROLE_COMBO_BOX);
+ combo_box_a = gtk_widget_get_accessible (combo_box);
+
+ /* Press the combo box to bring up the menu */
+
+ do_accessible_action (combo_box_a, "press");
+ sleep_in_main_loop (); /* have to wait because bringing up the menu is asynchronous... */
+
+ /* Get the menu from the combo box; it's the first child */
+
+ menu_a = atk_object_ref_accessible_child (combo_box_a, 0);
+ g_assert (atk_object_get_role (menu_a) == ATK_ROLE_MENU);
+
+ /* Check that the last item in the menu is the "Other…" one */
+
+ num_items = atk_object_get_n_accessible_children (menu_a);
+ g_assert (num_items > 0);
+
+ other_index = num_items - 1;
+
+ item_a = atk_object_ref_accessible_child (menu_a, other_index);
+ g_assert_cmpstr (atk_object_get_name (item_a), ==, "Other…"); /* FIXME: how do we translate this? */
+
+ /* Activate the item */
+
+ do_accessible_action (item_a, "click");
+
+ /* Cancel the dialog */
+
+ sleep_in_main_loop ();
+ fc_dialog = get_file_chooser_dialog_from_button (GTK_FILE_CHOOSER_BUTTON (w.fc_button));
+
+ gtk_dialog_response (GTK_DIALOG (fc_dialog), GTK_RESPONSE_CANCEL);
+
+ /* Now check the selection in the combo box */
+ check_that_basename_is_shown (GTK_FILE_CHOOSER_BUTTON (w.fc_button), FOLDER_NAME);
+
+ gtk_widget_destroy (w.window);
+}
+
+static void
+setup_file_chooser_button_combo_box_tests (void)
+{
+ g_test_add_func ("/GtkFileChooserButton/combo_box-1", test_file_chooser_button_combo_box_1);
+}
+
+static FileChooserButtonTest button_tests[] =
+ {
+ /* OPEN tests without dialog */
+
+ {
+ "open-1",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-2",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ FILE_NAME, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FILE_NAME /* final_filename */
+ },
+ {
+ "open-3",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FILE_NAME, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FILE_NAME /* final_filename */
+ },
+ {
+ "open-4",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ FILE_NAME, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FILE_NAME_2, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FILE_NAME_2 /* final_filename */
+ },
+ {
+ "open-5",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-6",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ FOLDER_NAME_2, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME_2, /* final_current_folder */
+ NULL /* final_filename */
+ },
+
+ /* SELECT_FOLDER tests without dialog */
+
+ {
+ "select-folder-1",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-2",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ FOLDER_NAME, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+ {
+ "select-folder-3",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ FOLDER_NAME, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME_2 /* final_filename */
+ },
+ {
+ "select-folder-4",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+ {
+ "select-folder-5",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-6",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ FOLDER_NAME_2, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME_2 /* final_filename */
+ },
+ {
+ "select-folder-7",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ FOLDER_NAME_2, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME_2, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-8",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ 0, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME_2 /* final_filename */
+ },
+
+ /* OPEN tests with dialog, cancelled
+ *
+ * Test names are "open-dialog-cancel-A-B", where A and B can be:
+ *
+ * A:
+ * ni - no initial filename
+ * i - initial filename
+ * nf - no initial folder
+ * f - initial folder
+ *
+ * B:
+ * nt - no tweaks
+ * b - tweak button
+ * d - tweak dialog
+ */
+
+ {
+ "open-dialog-cancel-ni-nt",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-dialog-cancel-ni-b",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FILE_NAME, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FILE_NAME /* final_filename */
+ },
+ {
+ "open-dialog-cancel-ni-d",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ DIALOG, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FILE_NAME, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-dialog-cancel-i-nt",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ FILE_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FILE_NAME /* final_filename */
+ },
+ {
+ "open-dialog-cancel-i-b",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ FILE_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FILE_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FILE_NAME_2 /* final_filename */
+ },
+ {
+ "open-dialog-cancel-i-d",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ FILE_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ DIALOG, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FILE_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FILE_NAME /* final_filename */
+ },
+ {
+ "open-dialog-cancel-nf-nt",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-dialog-cancel-nf-b",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ FOLDER_NAME, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-dialog-cancel-nf-d",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ DIALOG, /* what_to_tweak */
+ FOLDER_NAME, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-dialog-cancel-f-nt",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-dialog-cancel-f-b",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ FOLDER_NAME_2, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME_2, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-dialog-cancel-f-d",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ DIALOG, /* what_to_tweak */
+ FOLDER_NAME_2, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+
+ /* SELECT_FOLDER tests with dialog, cancelled */
+
+ {
+ "select-folder-dialog-cancel-ni-nt",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-ni-b",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-ni-d",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ DIALOG, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-i-nt",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ FOLDER_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-i-b",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ FOLDER_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME_2 /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-i-d",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ FOLDER_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ DIALOG, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-nf-nt",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-nf-b",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ FOLDER_NAME, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-nf-d",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ DIALOG, /* what_to_tweak */
+ FOLDER_NAME, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-f-nt",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-f-nt-2",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-f-b",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ FOLDER_NAME_2, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME_2, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-f-b-2",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME_2 /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-f-d",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ DIALOG, /* what_to_tweak */
+ FOLDER_NAME_2, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-cancel-f-d-2",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ DIALOG, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_CANCEL, /* dialog_response */
+ FALSE, /* unselect_all */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+
+ /* OPEN tests with dialog */
+
+ {
+ "open-dialog-1",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FILE_NAME, /* tweak_filename */
+ GTK_RESPONSE_ACCEPT, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FILE_NAME /* final_filename */
+ },
+ {
+ "open-dialog-2",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ FILE_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_ACCEPT, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FILE_NAME /* final_filename */
+ },
+ {
+ "open-dialog-3",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ FILE_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FILE_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_ACCEPT, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FILE_NAME_2 /* final_filename */
+ },
+ {
+ "open-dialog-4",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FILE_NAME, /* tweak_filename */
+ GTK_RESPONSE_ACCEPT, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FILE_NAME /* final_filename */
+ },
+
+ /* SELECT_FOLDER tests with dialog */
+
+ {
+ "select-folder-dialog-1",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ FOLDER_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_ACCEPT, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+ {
+ "select-folder-dialog-2",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_ACCEPT, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+ {
+ "select-folder-dialog-3",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ FOLDER_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_ACCEPT, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME_2 /* final_filename */
+ },
+ {
+ "select-folder-dialog-4",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_ACCEPT, /* dialog_response */
+ FALSE, /* unselect_all */
+ NULL, /* final_current_folder */
+ FOLDER_NAME_2 /* final_filename */
+ },
+
+ /* Unselection tests */
+ {
+ "unselect-all-1",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ TRUE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "unselect-all-2",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ FILE_NAME, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ TRUE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "unselect-all-3",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ FILE_NAME, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FILE_NAME_2, /* tweak_filename */
+ 0, /* dialog_response */
+ TRUE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "unselect-all-4",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ TRUE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "unselect-all-5",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ FOLDER_NAME, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ 0, /* dialog_response */
+ TRUE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "unselect-all-6",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ FOLDER_NAME, /* initial_filename */
+ FALSE, /* open_dialog */
+ BUTTON, /* what_to_tweak */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ 0, /* dialog_response */
+ TRUE, /* unselect_all */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+
+ };
+
+static void
+setup_file_chooser_button_tests (void)
+{
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (button_tests); i++)
+ {
+ char *test_name;
+
+ test_name = make_button_test_name (&button_tests[i]);
+ g_test_add_data_func (test_name, &button_tests[i], test_file_chooser_button);
+ g_free (test_name);
+ }
+
+ setup_file_chooser_button_combo_box_tests ();
+}
+
+#ifdef BROKEN_TESTS
struct confirm_overwrite_closure {
GtkWidget *chooser;
GtkWidget *accept_button;
gboolean passed;
struct confirm_overwrite_closure closure;
char *filename;
+ guint timeout_id;
passed = TRUE;
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (closure.chooser), path);
}
- gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, confirm_overwrite_timeout_cb, &closure, NULL);
+ timeout_id = gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, confirm_overwrite_timeout_cb, &closure, NULL);
gtk_dialog_run (GTK_DIALOG (closure.chooser));
+ g_source_remove (timeout_id);
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (closure.chooser));
passed = passed && filename && (strcmp (filename, path) == 0);
g_free (filename);
-
+
gtk_widget_destroy (closure.chooser);
passed = passed && (1 == closure.confirm_overwrite_signal_emitted);
gboolean passed = TRUE;
/* first test for a file we know will always exist */
- passed = passed && test_confirm_overwrite_for_path ("/etc/passwd", FALSE);
+ passed = passed && test_confirm_overwrite_for_path ("/etc/passwd", FALSE);
g_assert (passed);
- passed = passed && test_confirm_overwrite_for_path ("/etc/resolv.conf", TRUE);
+ passed = passed && test_confirm_overwrite_for_path ("/etc/resolv.conf", TRUE);
g_assert (passed);
}
+#endif
static const GtkFileChooserAction open_actions[] = {
GTK_FILE_CHOOSER_ACTION_OPEN,
};
+#ifdef BROKEN_TESTS
static gboolean
has_action (const GtkFileChooserAction *actions,
int n_actions,
return FALSE;
}
-static const char *
-get_action_name (GtkFileChooserAction action)
-{
- GEnumClass *enum_class;
- GEnumValue *enum_value;
-
- enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
- if (!enum_class)
- g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
-
- enum_value = g_enum_get_value (enum_class, (int) action);
- if (!enum_value)
- g_error ("BUG: get_action_name(): no GEnumValue for GtkFileChooserAction %d", (int) action);
-
- return enum_value->value_name;
-}
-
static GtkFileChooserDefault *
get_impl_from_dialog (GtkWidget *dialog)
{
gtk_widget_destroy (dialog);
}
+#endif
+#ifdef BROKEN_TESTS
static gboolean
test_reload_sequence (gboolean set_folder_before_map)
{
log_test (passed, "test_button_folder_states(): all supported actions");
}
-static gboolean
-sleep_timeout_cb (gpointer data)
-{
- gtk_main_quit ();
- return FALSE;
-}
-
-static void
-sleep_in_main_loop (double fraction)
-{
- /* process all pending idles and events */
- while (g_main_context_pending (NULL))
- g_main_context_iteration (NULL, FALSE);
- /* sleeping probably isn't strictly necessary here */
- gdk_threads_add_timeout_full (G_MAXINT, fraction * SLEEP_DURATION, sleep_timeout_cb, NULL, NULL);
- gtk_main ();
- /* process any pending idles or events that arrived during sleep */
- while (g_main_context_pending (NULL))
- g_main_context_iteration (NULL, FALSE);
-}
-
static void
test_folder_switch_and_filters (void)
{
gboolean passed;
char *cwd;
char *base_dir;
- GtkFilePath *cwd_path;
- GtkFilePath *base_dir_path;
+ GFile *cwd_file;
+ GFile *base_dir_file;
GtkWidget *dialog;
GtkFileFilter *all_filter;
GtkFileFilter *txt_filter;
NULL);
impl = get_impl_from_dialog (dialog);
- cwd_path = gtk_file_system_filename_to_path (impl->file_system, cwd);
- base_dir_path = gtk_file_system_filename_to_path (impl->file_system, base_dir);
+ cwd_file = g_file_new_for_path (cwd);
+ base_dir_file = g_file_new_for_path (base_dir);
passed = passed && gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
g_assert (passed);
/* Test that filter is unchanged when we switch folders */
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), cwd);
- sleep_in_main_loop (0.5);
+ sleep_in_main_loop ();
passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
g_assert (passed);
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
- sleep_in_main_loop (0.25);
+ sleep_in_main_loop ();
g_signal_emit_by_name (impl->browse_path_bar, "path-clicked",
- (GtkFilePath *) cwd_path,
- (GtkFilePath *) base_dir_path,
+ cwd_file,
+ base_dir_file,
FALSE);
- sleep_in_main_loop (0.25);
+ sleep_in_main_loop ();
passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
log_test (passed, "test_folder_switch_and_filters(): filter after changing folder");
g_assert (passed);
/* cleanups */
g_free (cwd);
g_free (base_dir);
- gtk_file_path_free (cwd_path);
- gtk_file_path_free (base_dir_path);
+ g_object_unref (cwd_file);
+ g_object_unref (base_dir_file);
gtk_widget_destroy (dialog);
log_test (passed, "test_folder_switch_and_filters(): all filter tests");
}
-
-extern void pixbuf_init (void);
+#endif
int
main (int argc,
char **argv)
{
- pixbuf_init ();
/* initialize test program */
gtk_test_init (&argc, &argv);
- /* register tests */
- g_test_add_func ("/GtkFileChooser/black_box", test_black_box);
+ /* Register tests */
+
+ setup_file_chooser_button_tests ();
+#ifdef BROKEN_TESTS
+ setup_set_filename_tests ();
+ setup_set_current_name_tests ();
+
g_test_add_func ("/GtkFileChooser/confirm_overwrite", test_confirm_overwrite);
g_test_add_func ("/GtkFileChooser/action_widgets", test_action_widgets);
g_test_add_func ("/GtkFileChooser/reload", test_reload);
g_test_add_func ("/GtkFileChooser/button_folder_states", test_button_folder_states);
g_test_add_func ("/GtkFileChooser/folder_switch_and_filters", test_folder_switch_and_filters);
+#endif
/* run and check selected tests */
return g_test_run();