Blame tests/add-child.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
typedef void (* AssertParentedFunc) (GObject *parent, GObject *child);
Packit 1e8aac
Packit 1e8aac
typedef struct {
Packit 1e8aac
  GType parent_type;
Packit 1e8aac
  GType child_type;
Packit 1e8aac
  AssertParentedFunc func;
Packit 1e8aac
} TestData;
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_add_child (gconstpointer data)
Packit 1e8aac
{
Packit 1e8aac
  TestData *test = (TestData *)data;
Packit 1e8aac
  GladeWidgetAdaptor *parent_adaptor;
Packit 1e8aac
  GladeWidgetAdaptor *child_adaptor;
Packit 1e8aac
  GladeWidget        *gparent, *gchild;
Packit 1e8aac
  GObject            *parent, *child;
Packit 1e8aac
  gboolean            parent_finalized = FALSE;
Packit 1e8aac
  gboolean            child_finalized = FALSE;
Packit 1e8aac
  gboolean            gparent_finalized = FALSE;
Packit 1e8aac
  gboolean            gchild_finalized = FALSE;
Packit 1e8aac
Packit 1e8aac
  g_test_log_set_fatal_handler (ignore_gvfs_warning, NULL);
Packit 1e8aac
Packit 1e8aac
  parent_adaptor = glade_widget_adaptor_get_by_type (test->parent_type);
Packit 1e8aac
  child_adaptor  = glade_widget_adaptor_get_by_type (test->child_type);
Packit 1e8aac
Packit 1e8aac
  gparent = glade_widget_adaptor_create_widget (parent_adaptor, FALSE, NULL);
Packit 1e8aac
  gchild  = glade_widget_adaptor_create_widget (child_adaptor, FALSE, NULL);
Packit 1e8aac
Packit 1e8aac
  parent = glade_widget_get_object (gparent);
Packit 1e8aac
  child  = glade_widget_get_object (gchild);
Packit 1e8aac
Packit 1e8aac
  glade_widget_add_child (gparent, gchild, FALSE);
Packit 1e8aac
Packit 1e8aac
  /* Pass ownership to the parent */
Packit 1e8aac
  g_object_unref (gchild);
Packit 1e8aac
Packit 1e8aac
  g_assert (glade_widget_get_parent (gchild) == gparent);
Packit 1e8aac
Packit 1e8aac
  if (test->func)
Packit 1e8aac
    test->func (parent, child);
Packit 1e8aac
Packit 1e8aac
  /* filechoosers hold a reference until an async operation is complete */
Packit 1e8aac
  if (GTK_IS_FILE_CHOOSER (parent) || GTK_IS_FILE_CHOOSER (child))
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 (child))
Packit 1e8aac
    {
Packit 1e8aac
      g_timeout_add (50, main_loop_quit_cb, NULL);
Packit 1e8aac
      gtk_main();
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  /* Unreffing the parent should finalize the parent and child runtime objects */
Packit 1e8aac
  g_object_weak_ref (G_OBJECT (gparent), check_finalized, &gparent_finalized);
Packit 1e8aac
  g_object_weak_ref (G_OBJECT (gchild),  check_finalized, &gchild_finalized);
Packit 1e8aac
  g_object_weak_ref (G_OBJECT (parent), check_finalized, &parent_finalized);
Packit 1e8aac
  g_object_weak_ref (G_OBJECT (child),  check_finalized, &child_finalized);
Packit 1e8aac
Packit 1e8aac
  g_object_unref (gparent);
Packit 1e8aac
Packit 1e8aac
  g_assert (gparent_finalized);
Packit 1e8aac
  g_assert (gchild_finalized);
Packit 1e8aac
  g_assert (parent_finalized);
Packit 1e8aac
  g_assert (child_finalized);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
add_test (GType parent_type,
Packit 1e8aac
	  GType child_type,
Packit 1e8aac
	  AssertParentedFunc func)
Packit 1e8aac
{
Packit 1e8aac
  gchar *test_path;
Packit 1e8aac
  TestData *data = g_new (TestData, 1);
Packit 1e8aac
Packit 1e8aac
  test_path = g_strdup_printf ("/AddChild/%s/%s",
Packit 1e8aac
			       g_type_name (parent_type),
Packit 1e8aac
			       g_type_name (child_type));
Packit 1e8aac
Packit 1e8aac
  data->parent_type = parent_type;
Packit 1e8aac
  data->child_type  = child_type;
Packit 1e8aac
  data->func        = func;
Packit 1e8aac
Packit 1e8aac
  g_test_add_data_func_full (test_path, data, test_add_child, g_free);
Packit 1e8aac
  g_free (test_path);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
assert_widget_parented (GObject *parent,
Packit 1e8aac
			GObject *child)
Packit 1e8aac
{
Packit 1e8aac
  g_assert (gtk_widget_get_parent (GTK_WIDGET (child)) == GTK_WIDGET (parent));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
assert_submenu (GObject *parent,
Packit 1e8aac
		GObject *child)
Packit 1e8aac
{
Packit 1e8aac
  if (GTK_IS_MENU_ITEM (parent))
Packit 1e8aac
    g_assert (gtk_menu_item_get_submenu (GTK_MENU_ITEM (parent)) == GTK_WIDGET (child));
Packit 1e8aac
  else if (GTK_IS_MENU_TOOL_BUTTON (parent))
Packit 1e8aac
    g_assert (gtk_menu_tool_button_get_menu (GTK_MENU_TOOL_BUTTON (parent)) == GTK_WIDGET (child));
Packit 1e8aac
  else
Packit 1e8aac
    g_assert_not_reached ();
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
assert_cell_parented (GObject *parent,
Packit 1e8aac
		      GObject *child)
Packit 1e8aac
{
Packit 1e8aac
  GList *cells;
Packit 1e8aac
Packit 1e8aac
  cells = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (parent));
Packit 1e8aac
  g_assert (g_list_find (cells, child) != NULL);
Packit 1e8aac
  g_list_free (cells);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
assert_column_parented (GObject *parent,
Packit 1e8aac
			GObject *child)
Packit 1e8aac
{
Packit 1e8aac
  g_assert (gtk_tree_view_get_column (GTK_TREE_VIEW (parent), 0) == GTK_TREE_VIEW_COLUMN (child));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/* Ignore deprecated classes, we test them regardless */
Packit 1e8aac
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
add_child_widgets (GType parent_type)
Packit 1e8aac
{
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_IMAGE,               assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_LABEL,               assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_ACCEL_LABEL,         assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_ENTRY,               assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_SEARCH_ENTRY,        assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_SPIN_BUTTON,         assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_SWITCH,              assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_SEPARATOR,           assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_ARROW,               assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_DRAWING_AREA,        assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_SPINNER,             assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_LEVEL_BAR,           assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_PROGRESS_BAR,        assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_SCALE,               assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_SCROLLBAR,           assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_BUTTON,              assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_TOGGLE_BUTTON,       assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_CHECK_BUTTON,        assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_RADIO_BUTTON,        assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_LINK_BUTTON,         assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_MENU_BUTTON,         assert_widget_parented);
Packit 1e8aac
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_COMBO_BOX,           assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_COMBO_BOX_TEXT,      assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_SCALE_BUTTON,        assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_VOLUME_BUTTON,       assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_FONT_BUTTON,         assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_COLOR_BUTTON,        assert_widget_parented);
Packit 1e8aac
Packit 1e8aac
  /* FIXME: FileChooserButton leaks a GTask which will crash in the following test */
Packit 1e8aac
  /* add_test (parent_type, GTK_TYPE_FILE_CHOOSER_BUTTON, assert_widget_parented); */
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_APP_CHOOSER_BUTTON,  assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_TEXT_VIEW,           assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_TREE_VIEW,           assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_ICON_VIEW,           assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_CALENDAR,            assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_BOX,                 assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_NOTEBOOK,            assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_FRAME,               assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_ASPECT_FRAME,        assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_OVERLAY,             assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_MENU_BAR,            assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_TOOLBAR,             assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_TOOL_PALETTE,        assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_PANED,               assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_BUTTON_BOX,          assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_LAYOUT,              assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_FIXED,               assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_EVENT_BOX,           assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_EXPANDER,            assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_VIEWPORT,            assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_ALIGNMENT,           assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_GRID,                assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_SCROLLED_WINDOW,     assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_INFO_BAR,            assert_widget_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_STATUSBAR,           assert_widget_parented);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
add_child_cells (GType parent_type)
Packit 1e8aac
{
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_CELL_RENDERER_TEXT, assert_cell_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_CELL_RENDERER_ACCEL, assert_cell_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_CELL_RENDERER_TOGGLE, assert_cell_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_CELL_RENDERER_COMBO, assert_cell_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_CELL_RENDERER_SPIN, assert_cell_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_CELL_RENDERER_PIXBUF, assert_cell_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_CELL_RENDERER_PROGRESS, assert_cell_parented);
Packit 1e8aac
  add_test (parent_type, GTK_TYPE_CELL_RENDERER_SPINNER, assert_cell_parented);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
int
Packit 1e8aac
main (int   argc,
Packit 1e8aac
      char *argv[])
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
  /* Normal GtkContainer / GtkWidget parenting */
Packit 1e8aac
  add_child_widgets (GTK_TYPE_WINDOW);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_BOX);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_GRID);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_NOTEBOOK);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_OVERLAY);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_PANED);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_BUTTON_BOX);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_LAYOUT);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_FIXED);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_EVENT_BOX);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_EXPANDER);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_VIEWPORT);
Packit 1e8aac
  add_child_widgets (GTK_TYPE_ALIGNMENT);
Packit 1e8aac
Packit 1e8aac
  /* Actions */
Packit 1e8aac
  add_test (GTK_TYPE_ACTION_GROUP, GTK_TYPE_ACTION, NULL);
Packit 1e8aac
  add_test (GTK_TYPE_ACTION_GROUP, GTK_TYPE_TOGGLE_ACTION, NULL);
Packit 1e8aac
  add_test (GTK_TYPE_ACTION_GROUP, GTK_TYPE_RADIO_ACTION, NULL);
Packit 1e8aac
  add_test (GTK_TYPE_ACTION_GROUP, GTK_TYPE_RECENT_ACTION, NULL);
Packit 1e8aac
Packit 1e8aac
  /* Menus */
Packit 1e8aac
  add_test (GTK_TYPE_MENU_BAR, GTK_TYPE_MENU_ITEM, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_MENU_BAR, GTK_TYPE_IMAGE_MENU_ITEM, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_MENU_BAR, GTK_TYPE_CHECK_MENU_ITEM, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_MENU_BAR, GTK_TYPE_RADIO_MENU_ITEM, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_MENU_BAR, GTK_TYPE_SEPARATOR_MENU_ITEM, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_MENU, GTK_TYPE_MENU_ITEM, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_MENU, GTK_TYPE_IMAGE_MENU_ITEM, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_MENU, GTK_TYPE_CHECK_MENU_ITEM, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_MENU, GTK_TYPE_RADIO_MENU_ITEM, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_MENU, GTK_TYPE_SEPARATOR_MENU_ITEM, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_MENU_ITEM, GTK_TYPE_MENU, assert_submenu);
Packit 1e8aac
  add_test (GTK_TYPE_IMAGE_MENU_ITEM, GTK_TYPE_MENU, assert_submenu);
Packit 1e8aac
  add_test (GTK_TYPE_CHECK_MENU_ITEM, GTK_TYPE_MENU, assert_submenu);
Packit 1e8aac
  add_test (GTK_TYPE_RADIO_MENU_ITEM, GTK_TYPE_MENU, assert_submenu);
Packit 1e8aac
Packit 1e8aac
  /* Toolbars / ToolPalette */
Packit 1e8aac
  add_test (GTK_TYPE_TOOLBAR, GTK_TYPE_TOOL_BUTTON, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_TOOLBAR, GTK_TYPE_TOGGLE_TOOL_BUTTON, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_TOOLBAR, GTK_TYPE_RADIO_TOOL_BUTTON, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_TOOLBAR, GTK_TYPE_MENU_TOOL_BUTTON, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_TOOL_ITEM_GROUP, GTK_TYPE_TOOL_BUTTON, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_TOOL_ITEM_GROUP, GTK_TYPE_TOGGLE_TOOL_BUTTON, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_TOOL_ITEM_GROUP, GTK_TYPE_RADIO_TOOL_BUTTON, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_TOOL_ITEM_GROUP, GTK_TYPE_MENU_TOOL_BUTTON, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_TOOL_PALETTE, GTK_TYPE_TOOL_ITEM_GROUP, assert_widget_parented);
Packit 1e8aac
  add_test (GTK_TYPE_MENU_TOOL_BUTTON, GTK_TYPE_MENU, assert_submenu);
Packit 1e8aac
Packit 1e8aac
  /* Cell layouts */
Packit 1e8aac
  /* FIXME: GtkTreeViewColumn gives a critical when creating it */
Packit 1e8aac
  /* add_test (GTK_TYPE_TREE_VIEW, GTK_TYPE_TREE_VIEW_COLUMN, assert_column_parented); */
Packit 1e8aac
  add_child_cells (GTK_TYPE_TREE_VIEW_COLUMN);
Packit 1e8aac
  add_child_cells (GTK_TYPE_ICON_VIEW);
Packit 1e8aac
  add_child_cells (GTK_TYPE_COMBO_BOX);
Packit 1e8aac
Packit 1e8aac
  /* TextTag */
Packit 1e8aac
  add_test (GTK_TYPE_TEXT_TAG_TABLE, GTK_TYPE_TEXT_TAG, NULL);
Packit 1e8aac
Packit 1e8aac
  return g_test_run ();
Packit 1e8aac
}