Blame tests/create-widgets.c

Packit 1e8aac
#include <glib.h>
Packit 1e8aac
#include <glib-object.h>
Packit 1e8aac
Packit 1e8aac
#include <gladeui/glade-app.h>
Packit 1e8aac
Packit 1e8aac
/* Avoid warnings from GVFS-RemoteVolumeMonitor */
Packit 1e8aac
static gboolean
Packit 1e8aac
ignore_gvfs_warning (const gchar *log_domain,
Packit 1e8aac
		     GLogLevelFlags log_level,
Packit 1e8aac
		     const gchar *message,
Packit 1e8aac
		     gpointer user_data)
Packit 1e8aac
{
Packit 1e8aac
  if (g_strcmp0 (log_domain, "GVFS-RemoteVolumeMonitor") == 0)
Packit 1e8aac
    return FALSE;
Packit 1e8aac
Packit 1e8aac
  return TRUE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
main_loop_quit_cb (gpointer data)
Packit 1e8aac
{
Packit 1e8aac
  gtk_main_quit ();
Packit 1e8aac
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
check_finalized (gpointer data,
Packit 1e8aac
		 GObject *where_the_object_was)
Packit 1e8aac
{
Packit 1e8aac
  gboolean *did_finalize = (gboolean *)data;
Packit 1e8aac
Packit 1e8aac
  *did_finalize = TRUE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
test_create_widget (gconstpointer data)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidgetAdaptor *adaptor = (GladeWidgetAdaptor *)data;
Packit 1e8aac
  GladeWidget        *widget;
Packit 1e8aac
  GObject            *object;
Packit 1e8aac
  gboolean            widget_finalized = FALSE;
Packit 1e8aac
  gboolean            object_finalized = FALSE;
Packit 1e8aac
Packit 1e8aac
  g_test_log_set_fatal_handler (ignore_gvfs_warning, NULL);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  widget = glade_widget_adaptor_create_widget (adaptor, FALSE, NULL);
Packit 1e8aac
  g_assert (GLADE_IS_WIDGET (widget));
Packit 1e8aac
Packit 1e8aac
  object = glade_widget_get_object (widget);
Packit 1e8aac
  g_assert (G_IS_OBJECT (object));
Packit 1e8aac
Packit 1e8aac
  g_object_weak_ref (G_OBJECT (widget),  check_finalized, &widget_finalized);
Packit 1e8aac
  g_object_weak_ref (G_OBJECT (object),  check_finalized, &object_finalized);
Packit 1e8aac
Packit 1e8aac
  /* filechoosers hold a reference until an async operation is complete */
Packit 1e8aac
  if (GTK_IS_FILE_CHOOSER (object))
Packit 1e8aac
    {
Packit 1e8aac
      g_timeout_add (2000, main_loop_quit_cb, NULL);
Packit 1e8aac
      gtk_main();
Packit 1e8aac
    }
Packit 1e8aac
  /* Our plugin code adds an idle when cell renderers are created */
Packit 1e8aac
  else if (GTK_IS_CELL_RENDERER (object))
Packit 1e8aac
    {
Packit 1e8aac
      g_timeout_add (50, main_loop_quit_cb, NULL);
Packit 1e8aac
      gtk_main();
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  /* Get rid of the GladeWidget and assert that it finalizes along 
Packit 1e8aac
   * with it's internal object
Packit 1e8aac
   */
Packit 1e8aac
  g_object_unref (widget);
Packit 1e8aac
Packit 1e8aac
  g_assert (widget_finalized);
Packit 1e8aac
  g_assert (object_finalized);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gint
Packit 1e8aac
adaptor_cmp (gconstpointer a, gconstpointer b)
Packit 1e8aac
{
Packit 1e8aac
  return g_strcmp0 (glade_widget_adaptor_get_name ((gpointer)a),
Packit 1e8aac
                    glade_widget_adaptor_get_name ((gpointer)b));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
int
Packit 1e8aac
main (int   argc,
Packit 1e8aac
      char *argv[])
Packit 1e8aac
{
Packit 1e8aac
  GList *adaptors, *l;
Packit 1e8aac
Packit 1e8aac
  gtk_test_init (&argc, &argv, NULL);
Packit 1e8aac
Packit 1e8aac
  glade_init ();
Packit 1e8aac
  glade_app_get ();
Packit 1e8aac
Packit 1e8aac
  adaptors = g_list_sort (glade_widget_adaptor_list_adaptors (), adaptor_cmp);
Packit 1e8aac
    
Packit 1e8aac
  for (l = adaptors; l; l = l->next)
Packit 1e8aac
    {
Packit 1e8aac
      GladeWidgetAdaptor *adaptor = l->data;
Packit 1e8aac
      GType               adaptor_type;
Packit 1e8aac
Packit 1e8aac
      adaptor_type = glade_widget_adaptor_get_object_type (adaptor);
Packit 1e8aac
Packit 1e8aac
      if (G_TYPE_IS_INSTANTIATABLE (adaptor_type) && !G_TYPE_IS_ABSTRACT (adaptor_type) &&
Packit 1e8aac
	  /* FIXME: FileChooserButton leaks a GTask which will crash in the following test */
Packit 1e8aac
	  adaptor_type != GTK_TYPE_FILE_CHOOSER_BUTTON &&
Packit 1e8aac
          /* FIXME: GtkRecentChooser tries to remove an unknown source id */
Packit 1e8aac
	  !g_type_is_a (adaptor_type, GTK_TYPE_RECENT_CHOOSER) &&
Packit 1e8aac
	  /* FIXME: can not create a themed icon without a name */
Packit 1e8aac
	  !g_type_is_a (adaptor_type, G_TYPE_THEMED_ICON) &&
Packit 1e8aac
	  /* FIXME: Dialogs now use a headerbar by default making gtk give a warning when adding a widget to the action area */
Packit 1e8aac
	  !g_type_is_a (adaptor_type, GTK_TYPE_DIALOG) &&
Packit 1e8aac
	  /* FIXME: The same goes for assistant */
Packit 1e8aac
	  !g_type_is_a (adaptor_type, GTK_TYPE_ASSISTANT) &&
Packit 1e8aac
	  /* FIXME: GtkPopoverMenu gives a few warnings */
Packit 1e8aac
	  !g_type_is_a (adaptor_type, GTK_TYPE_POPOVER_MENU))
Packit 1e8aac
	{
Packit 1e8aac
	  gchar *test_path = g_strdup_printf ("/CreateWidget/%s", glade_widget_adaptor_get_name (adaptor));
Packit 1e8aac
Packit 1e8aac
	  g_test_add_data_func (test_path, adaptor, test_create_widget);
Packit 1e8aac
Packit 1e8aac
	  g_free (test_path);
Packit 1e8aac
	}
Packit 1e8aac
    }
Packit 1e8aac
  g_list_free (adaptors);
Packit 1e8aac
Packit 1e8aac
  return g_test_run ();
Packit 1e8aac
}