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