summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-10-28 12:37:37 -0400
committerMatthias Clasen <mclasen@redhat.com>2020-10-28 12:37:37 -0400
commit3cba584172cde1f9913a3f08872b7fa59a832fda (patch)
treef2046d779a7f05b5aa8be8c77736809ec16e8282
parentdd9aa14eb343a8058f0b871e51e1a4cbf810a9b6 (diff)
downloadglib-wip/otte/interface-types.tar.gz
Add a test for signals returning interface typeswip/otte/interface-types
Add a test for a signal returning interface types, using the generic marshaller. This will hopefully exercise newly added code in value_from_ffi_type().
-rw-r--r--gobject/tests/signals.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/gobject/tests/signals.c b/gobject/tests/signals.c
index 08b54d0fa..120f90b5c 100644
--- a/gobject/tests/signals.c
+++ b/gobject/tests/signals.c
@@ -135,6 +135,47 @@ static GType flags_type;
static guint simple_id;
static guint simple2_id;
+typedef struct {
+ GTypeInterface g_iface;
+} FooInterface;
+
+GType foo_get_type (void);
+
+G_DEFINE_INTERFACE (Foo, foo, G_TYPE_OBJECT)
+
+static void
+foo_default_init (FooInterface *iface)
+{
+}
+
+typedef struct {
+ GObject parent;
+} Baa;
+
+typedef struct {
+ GObjectClass parent_class;
+} BaaClass;
+
+static void
+baa_init_foo (FooInterface *iface)
+{
+}
+
+GType baa_get_type (void);
+
+G_DEFINE_TYPE_WITH_CODE (Baa, baa, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (foo_get_type (), baa_init_foo))
+
+static void
+baa_init (Baa *baa)
+{
+}
+
+static void
+baa_class_init (BaaClass *class)
+{
+}
+
typedef struct _Test Test;
typedef struct _TestClass TestClass;
@@ -257,6 +298,14 @@ test_class_init (TestClass *klass)
NULL,
G_TYPE_UINT,
0);
+ g_signal_new ("generic-marshaller-interface-return",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ NULL,
+ foo_get_type (),
+ 0);
s = g_signal_new ("va-marshaller-uint-return",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
@@ -754,6 +803,35 @@ test_generic_marshaller_signal_uint_return (void)
g_object_unref (test);
}
+static gpointer
+on_generic_marshaller_interface_return (Test *test)
+{
+ return g_object_new (baa_get_type (), NULL);
+}
+
+static void
+test_generic_marshaller_signal_interface_return (void)
+{
+ Test *test;
+ guint id;
+ gpointer retval;
+
+ test = g_object_new (test_get_type (), NULL);
+
+ /* Test return value -30 */
+ id = g_signal_connect (test,
+ "generic-marshaller-interface-return",
+ G_CALLBACK (on_generic_marshaller_interface_return),
+ NULL);
+ g_signal_emit_by_name (test, "generic-marshaller-interface-return", &retval);
+ g_assert_true (g_type_check_instance_is_a ((GTypeInstance*)retval, foo_get_type ()));
+ g_object_unref (retval);
+
+ g_signal_handler_disconnect (test, id);
+
+ g_object_unref (test);
+}
+
static const GSignalInvocationHint dont_use_this = { 0, };
static void
@@ -1082,6 +1160,7 @@ test_introspection (void)
"generic-marshaller-int-return",
"va-marshaller-int-return",
"generic-marshaller-uint-return",
+ "generic-marshaller-interface-return",
"va-marshaller-uint-return",
"variant-changed-no-slot",
"variant-changed",
@@ -1495,6 +1574,7 @@ main (int argc,
g_test_add_func ("/gobject/signals/generic-marshaller-enum-return-unsigned", test_generic_marshaller_signal_enum_return_unsigned);
g_test_add_func ("/gobject/signals/generic-marshaller-int-return", test_generic_marshaller_signal_int_return);
g_test_add_func ("/gobject/signals/generic-marshaller-uint-return", test_generic_marshaller_signal_uint_return);
+ g_test_add_func ("/gobject/signals/generic-marshaller-interface-return", test_generic_marshaller_signal_interface_return);
g_test_add_func ("/gobject/signals/custom-marshaller", test_custom_marshaller);
g_test_add_func ("/gobject/signals/connect", test_connect);
g_test_add_func ("/gobject/signals/emission-hook", test_emission_hook);