*/
/* TODO:
- *
- * - Use g_log_set_default_handler() instead of the mess of specific handlers we
- * have in main().
*
* - In test_reload_sequence(), test that the selection is preserved properly
* between unmap/map.
g_free (str);
}
+typedef void (* SetFilenameFn) (GtkFileChooser *chooser, gpointer data);
+typedef gboolean (* CompareFilenameFn) (GtkFileChooser *chooser, gpointer data);
+
+struct test_set_filename_closure {
+ GtkWidget *chooser;
+ GtkWidget *accept_button;
+ gboolean focus_button;
+};
+
+static gboolean
+set_filename_timeout_cb (gpointer data)
+{
+ struct test_set_filename_closure *closure;
+
+ closure = data;
+
+ if (closure->focus_button)
+ gtk_widget_grab_focus (closure->accept_button);
+
+ gtk_button_clicked (GTK_BUTTON (closure->accept_button));
+
+ return FALSE;
+}
+
+
+static guint wait_for_idle_id = 0;
+
+static gboolean
+wait_for_idle_idle (gpointer data)
+{
+ wait_for_idle_id = 0;
+
+ return FALSE;
+}
+
+static void
+wait_for_idle (void)
+{
+ wait_for_idle_id = g_idle_add_full (G_PRIORITY_LOW + 100,
+ wait_for_idle_idle,
+ NULL, NULL);
+
+ while (wait_for_idle_id)
+ gtk_main_iteration ();
+}
+
+static gboolean
+test_set_filename (GtkFileChooserAction action,
+ gboolean focus_button,
+ SetFilenameFn set_filename_fn,const
+ CompareFilenameFn compare_filename_fn,
+ gpointer data)
+{
+ GtkWidget *chooser;
+ struct test_set_filename_closure closure;
+ gboolean retval;
+
+ chooser = gtk_file_chooser_dialog_new ("hello", NULL, action,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ NULL);
+
+ closure.chooser = chooser;
+ closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (chooser), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
+ closure.focus_button = focus_button;
+
+ gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
+
+ (* set_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
+
+ gdk_threads_add_timeout (2000, set_filename_timeout_cb, &closure);
+ gtk_dialog_run (GTK_DIALOG (chooser));
+
+ retval = (* compare_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
+
+ gtk_widget_destroy (chooser);
+
+ return retval;
+}
+
+static void
+set_filename_cb (GtkFileChooser *chooser, gpointer data)
+{
+ const char *filename;
+
+ filename = data;
+ gtk_file_chooser_set_filename (chooser, filename);
+}
+
+static gboolean
+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;
+
+ return retval;
+}
+
+static gboolean
+test_black_box_set_filename (GtkFileChooserAction action, const char *filename, gboolean focus_button)
+{
+ 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");
+
+ return passed;
+
+}
+
+struct current_name_closure {
+ const char *path;
+ const char *current_name;
+};
+
+static void
+set_current_name_cb (GtkFileChooser *chooser, gpointer data)
+{
+ struct current_name_closure *closure;
+
+ closure = data;
+
+ gtk_file_chooser_set_current_folder (chooser, closure->path);
+ gtk_file_chooser_set_current_name (chooser, closure->current_name);
+}
+
+static gboolean
+compare_current_name_cb (GtkFileChooser *chooser, gpointer data)
+{
+ struct current_name_closure *closure;
+ char *out_filename;
+ gboolean retval;
+
+ closure = data;
+
+ out_filename = gtk_file_chooser_get_filename (chooser);
+
+ if (out_filename)
+ {
+ char *filename;
+
+ 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;
+
+ return retval;
+}
+
+static gboolean
+test_black_box_set_current_name (const char *path, const char *current_name, gboolean focus_button)
+{
+ struct current_name_closure closure;
+ gboolean passed;
+
+ closure.path = path;
+ closure.current_name = current_name;
+
+ passed = test_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, focus_button,
+ set_current_name_cb, compare_current_name_cb, &closure);
+
+ log_test (passed, "set_current_name, focus_button=%s", focus_button ? "TRUE" : "FALSE");
+
+ return passed;
+}
+
+/* FIXME: fails in CREATE_FOLDER mode when FOLDER_NAME == "/" */
+
+#if 0
+#define FILE_NAME "/nonexistent"
+#define FOLDER_NAME "/etc"
+#else
+#define FILE_NAME "/etc/passwd"
+#define FOLDER_NAME "/etc"
+#endif
+
+#define CURRENT_NAME "parangaricutirimicuaro.txt"
+
+/* https://bugzilla.novell.com/show_bug.cgi?id=184875
+ * http://bugzilla.gnome.org/show_bug.cgi?id=347066
+ */
+static gboolean
+test_black_box (void)
+{
+ gboolean passed;
+ char *cwd;
+
+ passed = TRUE;
+
+ passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, FALSE);
+ passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, TRUE);
+ passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, FALSE);
+ passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, TRUE);
+ passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, FALSE);
+ passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, TRUE);
+ passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, FALSE);
+ passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, TRUE);
+
+ cwd = g_get_current_dir ();
+
+ passed = passed && test_black_box_set_current_name (cwd, CURRENT_NAME, FALSE);
+ passed = passed && test_black_box_set_current_name (cwd, CURRENT_NAME, TRUE);
+
+ g_free (cwd);
+
+ log_test (passed, "Black box tests");
+
+ return passed;
+}
+
+struct confirm_overwrite_closure {
+ GtkWidget *chooser;
+ GtkWidget *accept_button;
+ gboolean emitted_confirm_overwrite_signal;
+};
+
+static GtkFileChooserConfirmation
+confirm_overwrite_cb (GtkFileChooser *chooser, gpointer data)
+{
+ struct confirm_overwrite_closure *closure;
+
+ closure = data;
+
+ printf ("bling!\n");
+
+ closure->emitted_confirm_overwrite_signal = TRUE;
+
+ return GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME;
+}
+
+static gboolean
+confirm_overwrite_timeout_cb (gpointer data)
+{
+ struct confirm_overwrite_closure *closure;
+
+ closure = data;
+ gtk_button_clicked (GTK_BUTTON (closure->accept_button));
+
+ return FALSE;
+}
+
+/* http://bugzilla.gnome.org/show_bug.cgi?id=347883 */
+static gboolean
+test_confirm_overwrite_for_path (const char *path)
+{
+ gboolean passed;
+ struct confirm_overwrite_closure closure;
+ char *filename;
+
+ passed = TRUE;
+
+ closure.emitted_confirm_overwrite_signal = FALSE;
+ closure.chooser = gtk_file_chooser_dialog_new ("hello", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ NULL);
+ closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (closure.chooser), GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
+ gtk_dialog_set_default_response (GTK_DIALOG (closure.chooser), GTK_RESPONSE_ACCEPT);
+
+ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (closure.chooser), TRUE);
+ g_signal_connect (closure.chooser, "confirm-overwrite",
+ G_CALLBACK (confirm_overwrite_cb), &closure);
+
+ gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (closure.chooser), path);
+
+ gdk_threads_add_timeout (2000, confirm_overwrite_timeout_cb, &closure);
+ gtk_dialog_run (GTK_DIALOG (closure.chooser));
+
+ 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 && closure.emitted_confirm_overwrite_signal;
+
+ log_test (passed, "Confirm overwrite");
+
+ return passed;
+}
+
+static gboolean
+test_confirm_overwrite (void)
+{
+ gboolean passed = TRUE;
+
+ passed = passed && test_confirm_overwrite_for_path ("/etc/passwd"); /* a file we know will always exist */
+
+ return passed;
+}
+
static const GtkFileChooserAction open_actions[] = {
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
{
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
+ wait_for_idle ();
+
passed = passed && (impl->current_folder != NULL
&& impl->browse_files_model != NULL
&& (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
: TRUE));
+ wait_for_idle ();
+
folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
g_free (folder);
&& impl->reload_state == RELOAD_EMPTY
&& impl->load_timeout_id == 0);
+ wait_for_idle ();
+
folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
}
gtk_widget_show_now (dialog);
+ wait_for_idle ();
+
passed = passed && (impl->current_folder != NULL
&& impl->browse_files_model != NULL
&& (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
gtk_widget_hide (dialog);
+ wait_for_idle ();
+
passed = passed && (impl->current_folder != NULL
&& impl->browse_files_model != NULL
&& (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
gtk_widget_show_now (dialog);
+ wait_for_idle ();
+
passed = passed && (impl->current_folder != NULL
&& impl->browse_files_model != NULL
&& (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
gtk_container_add (GTK_CONTAINER (window), button);
/* Pre-map; no folder is set */
+ wait_for_idle ();
folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
if (must_have_cwd)
gtk_widget_show_all (window);
gtk_widget_show_now (window);
+
+ wait_for_idle ();
+
folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
if (must_have_cwd)
/* Unmap; folder should be set */
gtk_widget_hide (window);
+ wait_for_idle ();
folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
if (must_have_cwd)
passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
else
passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
-
+ wait_for_idle ();
log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, re-mapped, %s",
get_action_name (action),
use_dialog,
static void
sleep_in_main_loop (int milliseconds)
{
- g_timeout_add (milliseconds, sleep_timeout_cb, NULL);
+ gdk_threads_add_timeout (milliseconds, sleep_timeout_cb, NULL);
gtk_main ();
}
gtk_init (&argc, &argv);
/* Start tests */
+
+ passed = passed && test_black_box ();
+ passed = passed && test_confirm_overwrite ();
passed = passed && test_action_widgets ();
passed = passed && test_reload ();
passed = passed && test_button_folder_states ();