]> Pileus Git - ~andy/gtk/blobdiff - gtk/tests/filechooser.c
filechooserbutton: Test that the expected filename is shown
[~andy/gtk] / gtk / tests / filechooser.c
index 113b219b082eeed36906f20a807ca6d0c857c0f4..04cf71b12e0debeaea85239df6dd8931cd4d0d9f 100644 (file)
 #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, ...)
@@ -53,8 +71,6 @@ log_test (gboolean passed, const char *test_name, ...)
   g_free (str);
 }
 
-static const char *get_action_name (GtkFileChooserAction action);
-
 typedef void (* SetFilenameFn) (GtkFileChooser *chooser, gpointer data);
 typedef void (* CompareFilenameFn) (GtkFileChooser *chooser, gpointer data);
 
@@ -375,6 +391,118 @@ sleep_in_main_loop (void)
     g_main_context_iteration (NULL, FALSE);
 }
 
+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 void
 test_file_chooser_button (gconstpointer data)
 {
@@ -382,6 +510,8 @@ test_file_chooser_button (gconstpointer data)
   GtkWidget *window;
   GtkWidget *fc_button;
   GtkWidget *fc_dialog;
+  int iterations;
+  int i;
 
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
@@ -396,56 +526,74 @@ test_file_chooser_button (gconstpointer data)
     gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (fc_button), setup->initial_filename);
 
   gtk_widget_show_all (window);
-  wait_for_idle ();
+  sleep_in_main_loop ();
 
+  check_that_basename_is_shown (GTK_FILE_CHOOSER_BUTTON (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++)
     {
-      GList *children;
+      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 (fc_button));
-      g_assert (children && GTK_IS_BUTTON (children->data));
-      gtk_button_clicked (GTK_BUTTON (children->data));
-      g_list_free (children);
+         /* Hack our way into the file chooser button; get its GtkButton child and click it */
+         children = gtk_container_get_children (GTK_CONTAINER (fc_button));
+         g_assert (children && GTK_IS_BUTTON (children->data));
+         gtk_button_clicked (GTK_BUTTON (children->data));
+         g_list_free (children);
 
-      wait_for_idle ();
+         sleep_in_main_loop ();
 
-      /* Give me the internal dialog, damnit */
-      fc_dialog = g_object_get_qdata (G_OBJECT (fc_button), delegate_get_quark ());
-      g_assert (GTK_IS_FILE_CHOOSER (fc_dialog));
-      g_assert (GTK_IS_DIALOG (fc_dialog));
-    }
+         /* Give me the internal dialog, damnit */
+         fc_dialog = g_object_get_qdata (G_OBJECT (fc_button), delegate_get_quark ());
+         g_assert (GTK_IS_FILE_CHOOSER (fc_dialog));
+         g_assert (GTK_IS_DIALOG (fc_dialog));
+       }
 
-  /* Okay, now frob the button and its optional dialog */
+      /* Okay, now frob the button and its optional dialog */
 
-  if (setup->tweak_current_folder)
-    gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc_button), setup->tweak_current_folder);
+      if (setup->tweak_current_folder)
+       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc_button), setup->tweak_current_folder);
 
-  if (setup->tweak_filename)
-    gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (fc_button), setup->tweak_filename);
+      if (setup->tweak_filename)
+       gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (fc_button), setup->tweak_filename);
 
-  sleep_in_main_loop ();
+      sleep_in_main_loop ();
 
-  if (setup->open_dialog)
-    {
-      gtk_dialog_response (GTK_DIALOG (fc_dialog), setup->dialog_response);
-      wait_for_idle ();
-    }
+      if (setup->open_dialog)
+       {
+         gtk_dialog_response (GTK_DIALOG (fc_dialog), setup->dialog_response);
+         wait_for_idle ();
+       }
 
-  if (setup->final_current_folder)
-    {
-      char *folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (fc_button));
+      if (setup->final_current_folder)
+       {
+         char *folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (fc_button));
 
-      g_assert_cmpstr (folder, ==, setup->final_current_folder);
-      g_free (folder);
-    }
+         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 (fc_button));
+      if (setup->final_filename)
+       {
+         char *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fc_button));
 
-      g_assert_cmpstr (filename, ==, setup->final_filename);
-      g_free (filename);
+         g_assert_cmpstr (filename, ==, setup->final_filename);
+         g_free (filename);
+       }
+
+      check_that_basename_is_shown (GTK_FILE_CHOOSER_BUTTON (fc_button),
+                                   get_expected_shown_filename (setup->action, setup->final_current_folder, setup->final_filename));
     }
 
   gtk_widget_destroy (window);
@@ -702,6 +850,81 @@ static FileChooserButtonTest button_tests[] =
       NULL                     /* final_filename */
     },
 
+    /* OPEN tests with dialog, cancelled via closing the dialog (not by selecting the Cancel button) */
+
+    {
+      "open-dialog-close-1",
+      GTK_FILE_CHOOSER_ACTION_OPEN,
+      NULL,                    /* initial_current_folder */
+      NULL,                    /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      NULL,                    /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      NULL,                    /* final_current_folder */
+      NULL                     /* final_filename */
+    },
+    {
+      "open-dialog-close-2",
+      GTK_FILE_CHOOSER_ACTION_OPEN,
+      NULL,                    /* initial_current_folder */
+      FILE_NAME,               /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      NULL,                    /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      NULL,                    /* final_current_folder */
+      FILE_NAME                        /* final_filename */
+    },
+    {
+      "open-dialog-close-3",
+      GTK_FILE_CHOOSER_ACTION_OPEN,
+      FOLDER_NAME,             /* initial_current_folder */
+      NULL,                    /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      NULL,                    /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      FOLDER_NAME,             /* final_current_folder */
+      NULL                     /* final_filename */
+    },
+    {
+      "open-dialog-close-4",
+      GTK_FILE_CHOOSER_ACTION_OPEN,
+      NULL,                    /* initial_current_folder */
+      NULL,                    /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      FILE_NAME,               /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      NULL,                    /* final_current_folder */
+      NULL                     /* final_filename */
+    },
+    {
+      "open-dialog-close-5",
+      GTK_FILE_CHOOSER_ACTION_OPEN,
+      NULL,                    /* initial_current_folder */
+      FILE_NAME,               /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      FILE_NAME_2,             /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      NULL,                    /* final_current_folder */
+      FILE_NAME                        /* final_filename */
+    },
+    {
+      "open-dialog-close-6",
+      GTK_FILE_CHOOSER_ACTION_OPEN,
+      FOLDER_NAME,             /* initial_current_folder */
+      NULL,                    /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      FILE_NAME_2,             /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      FOLDER_NAME,             /* final_current_folder */
+      NULL                     /* final_filename */
+    },
+
     /* SELECT_FOLDER tests with dialog, cancelled */
 
     {
@@ -774,7 +997,7 @@ static FileChooserButtonTest button_tests[] =
       FOLDER_NAME_2,           /* tweak_filename */
       GTK_RESPONSE_CANCEL,     /* dialog_response */
       NULL,                    /* final_current_folder */
-      FOLDER_NAME                      /* final_filename */
+      FOLDER_NAME              /* final_filename */
     },
     {
       "select-folder-dialog-cancel-7",
@@ -801,6 +1024,105 @@ static FileChooserButtonTest button_tests[] =
       FOLDER_NAME              /* final_filename */
     },
 
+    /* SELECT_FOLDER tests with dialog, cancelled via closing the dialog (not selecting the Cancel button) */
+
+    {
+      "select-folder-dialog-close-1",
+      GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+      NULL,                    /* initial_current_folder */
+      NULL,                    /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      NULL,                    /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      NULL,                    /* final_current_folder */
+      NULL                     /* final_filename */
+    },
+    {
+      "select-folder-dialog-close-2",
+      GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+      NULL,                    /* initial_current_folder */
+      FOLDER_NAME,             /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      NULL,                    /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      NULL,                    /* final_current_folder */
+      FOLDER_NAME              /* final_filename */
+    },
+    {
+      "select-folder-dialog-close-3",
+      GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+      FOLDER_NAME,             /* initial_current_folder */
+      NULL,                    /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      NULL,                    /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      FOLDER_NAME,             /* final_current_folder */
+      NULL                     /* final_filename */
+    },
+    {
+      "select-folder-dialog-close-4",
+      GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+      FOLDER_NAME,             /* initial_current_folder */
+      NULL,                    /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      NULL,                    /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      NULL,                    /* final_current_folder */
+      FOLDER_NAME              /* final_filename */
+    },
+    {
+      "select-folder-dialog-close-5",
+      GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+      NULL,                    /* initial_current_folder */
+      NULL,                    /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      FOLDER_NAME,             /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      NULL,                    /* final_current_folder */
+      NULL                     /* final_filename */
+    },
+    {
+      "select-folder-dialog-close-6",
+      GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+      NULL,                    /* initial_current_folder */
+      FOLDER_NAME,             /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      FOLDER_NAME_2,           /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      NULL,                    /* final_current_folder */
+      FOLDER_NAME              /* final_filename */
+    },
+    {
+      "select-folder-dialog-close-7",
+      GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+      FOLDER_NAME,             /* initial_current_folder */
+      NULL,                    /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      FOLDER_NAME_2,           /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      FOLDER_NAME,             /* final_current_folder */
+      NULL                     /* final_filename */
+    },
+    {
+      "select-folder-dialog-close-8",
+      GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+      FOLDER_NAME,             /* initial_current_folder */
+      NULL,                    /* initial_filename */
+      TRUE,                    /* open_dialog */
+      NULL,                    /* tweak_current_folder */
+      FOLDER_NAME_2,           /* tweak_filename */
+      GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+      NULL,                    /* final_current_folder */
+      FOLDER_NAME              /* final_filename */
+    },
+
     /* OPEN tests with dialog */
 
     {
@@ -1087,22 +1409,6 @@ has_action (const GtkFileChooserAction *actions,
   return FALSE;
 }
 
-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;
-    }
-}
-
 static GtkFileChooserDefault *
 get_impl_from_dialog (GtkWidget *dialog)
 {