1 #include <glib-object.h>
2 #include "marshalers.h"
4 #define g_assert_cmpflags(type,n1, cmp, n2) G_STMT_START { \
5 type __n1 = (n1), __n2 = (n2); \
6 if (__n1 cmp __n2) ; else \
7 g_assertion_message_cmpint (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
8 #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); \
10 #define g_assert_cmpenum(type,n1, cmp, n2) G_STMT_START { \
11 type __n1 = (n1), __n2 = (n2); \
12 if (__n1 cmp __n2) ; else \
13 g_assertion_message_cmpint (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
14 #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); \
18 TEST_ENUM_NEGATIVE = -30,
25 TEST_UNSIGNED_ENUM_FOO = 1,
26 TEST_UNSIGNED_ENUM_BAR = 42
27 /* Don't test 0x80000000 for now- nothing appears to do this in
28 * practice, and it triggers GValue/GEnum bugs on ppc64.
33 custom_marshal_VOID__INVOCATIONHINT (GClosure *closure,
34 GValue *return_value G_GNUC_UNUSED,
36 const GValue *param_values,
37 gpointer invocation_hint,
38 gpointer marshal_data)
40 typedef void (*GMarshalFunc_VOID__INVOCATIONHINT) (gpointer data1,
41 gpointer invocation_hint,
43 GMarshalFunc_VOID__INVOCATIONHINT callback;
44 GCClosure *cc = (GCClosure*) closure;
45 gpointer data1, data2;
47 g_return_if_fail (n_param_values == 2);
49 if (G_CCLOSURE_SWAP_DATA (closure))
51 data1 = closure->data;
52 data2 = g_value_peek_pointer (param_values + 0);
56 data1 = g_value_peek_pointer (param_values + 0);
57 data2 = closure->data;
59 callback = (GMarshalFunc_VOID__INVOCATIONHINT) (marshal_data ? marshal_data : cc->callback);
67 test_enum_get_type (void)
69 static gsize static_g_define_type_id = 0;
71 if (g_once_init_enter (&static_g_define_type_id))
73 static const GEnumValue values[] = {
74 { TEST_ENUM_NEGATIVE, "TEST_ENUM_NEGATIVE", "negative" },
75 { TEST_ENUM_NONE, "TEST_ENUM_NONE", "none" },
76 { TEST_ENUM_FOO, "TEST_ENUM_FOO", "foo" },
77 { TEST_ENUM_BAR, "TEST_ENUM_BAR", "bar" },
80 GType g_define_type_id =
81 g_enum_register_static (g_intern_static_string ("TestEnum"), values);
82 g_once_init_leave (&static_g_define_type_id, g_define_type_id);
85 return static_g_define_type_id;
89 test_unsigned_enum_get_type (void)
91 static gsize static_g_define_type_id = 0;
93 if (g_once_init_enter (&static_g_define_type_id))
95 static const GEnumValue values[] = {
96 { TEST_UNSIGNED_ENUM_FOO, "TEST_UNSIGNED_ENUM_FOO", "foo" },
97 { TEST_UNSIGNED_ENUM_BAR, "TEST_UNSIGNED_ENUM_BAR", "bar" },
100 GType g_define_type_id =
101 g_enum_register_static (g_intern_static_string ("TestUnsignedEnum"), values);
102 g_once_init_leave (&static_g_define_type_id, g_define_type_id);
105 return static_g_define_type_id;
112 static const GEnumValue my_enum_values[] =
114 { MY_ENUM_VALUE, "the first value", "one" },
119 MY_FLAGS_FIRST_BIT = (1 << 0),
120 MY_FLAGS_THIRD_BIT = (1 << 2),
121 MY_FLAGS_LAST_BIT = (1 << 31)
124 static const GFlagsValue my_flag_values[] =
126 { MY_FLAGS_FIRST_BIT, "the first bit", "first-bit" },
127 { MY_FLAGS_THIRD_BIT, "the third bit", "third-bit" },
128 { MY_FLAGS_LAST_BIT, "the last bit", "last-bit" },
132 static GType enum_type;
133 static GType flags_type;
135 static guint simple_id;
136 static guint simple2_id;
139 GTypeInterface g_iface;
142 GType foo_get_type (void);
144 G_DEFINE_INTERFACE (Foo, foo, G_TYPE_OBJECT)
147 foo_default_init (FooInterface *iface)
156 GObjectClass parent_class;
160 baa_init_foo (FooInterface *iface)
164 GType baa_get_type (void);
166 G_DEFINE_TYPE_WITH_CODE (Baa, baa, G_TYPE_OBJECT,
167 G_IMPLEMENT_INTERFACE (foo_get_type (), baa_init_foo))
175 baa_class_init (BaaClass *class)
179 typedef struct _Test Test;
180 typedef struct _TestClass TestClass;
184 GObject parent_instance;
187 static void all_types_handler (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, MyEnum e, MyFlags f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64);
188 static gboolean accumulator_sum (GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer data);
189 static gboolean accumulator_concat_string (GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer data);
190 static gchar * accumulator_class (Test *test);
194 GObjectClass parent_class;
196 void (* variant_changed) (Test *, GVariant *);
197 void (* all_types) (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, MyEnum e, MyFlags f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64);
198 void (* all_types_null) (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, MyEnum e, MyFlags f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64);
199 gchar * (*accumulator_class) (Test *test);
202 static GType test_get_type (void);
203 G_DEFINE_TYPE (Test, test, G_TYPE_OBJECT)
206 test_init (Test *test)
211 test_class_init (TestClass *klass)
215 enum_type = g_enum_register_static ("MyEnum", my_enum_values);
216 flags_type = g_flags_register_static ("MyFlag", my_flag_values);
218 klass->all_types = all_types_handler;
219 klass->accumulator_class = accumulator_class;
221 simple_id = g_signal_new ("simple",
222 G_TYPE_FROM_CLASS (klass),
229 g_signal_new ("simple-detailed",
230 G_TYPE_FROM_CLASS (klass),
231 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
237 /* Deliberately install this one in non-canonical form to check that’s handled correctly: */
238 simple2_id = g_signal_new ("simple_2",
239 G_TYPE_FROM_CLASS (klass),
240 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE,
246 g_signal_new ("simple-accumulator",
247 G_TYPE_FROM_CLASS (klass),
250 accumulator_sum, NULL,
254 g_signal_new ("accumulator-class-first",
255 G_TYPE_FROM_CLASS (klass),
257 G_STRUCT_OFFSET (TestClass, accumulator_class),
258 accumulator_concat_string, NULL,
262 g_signal_new ("accumulator-class-last",
263 G_TYPE_FROM_CLASS (klass),
265 G_STRUCT_OFFSET (TestClass, accumulator_class),
266 accumulator_concat_string, NULL,
270 g_signal_new ("accumulator-class-cleanup",
271 G_TYPE_FROM_CLASS (klass),
272 G_SIGNAL_RUN_CLEANUP,
273 G_STRUCT_OFFSET (TestClass, accumulator_class),
274 accumulator_concat_string, NULL,
278 g_signal_new ("accumulator-class-first-last",
279 G_TYPE_FROM_CLASS (klass),
280 G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
281 G_STRUCT_OFFSET (TestClass, accumulator_class),
282 accumulator_concat_string, NULL,
286 g_signal_new ("accumulator-class-first-last-cleanup",
287 G_TYPE_FROM_CLASS (klass),
288 G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP,
289 G_STRUCT_OFFSET (TestClass, accumulator_class),
290 accumulator_concat_string, NULL,
294 g_signal_new ("accumulator-class-last-cleanup",
295 G_TYPE_FROM_CLASS (klass),
296 G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP,
297 G_STRUCT_OFFSET (TestClass, accumulator_class),
298 accumulator_concat_string, NULL,
302 g_signal_new ("generic-marshaller-1",
303 G_TYPE_FROM_CLASS (klass),
310 G_TYPE_CHAR, G_TYPE_UCHAR, G_TYPE_INT, G_TYPE_LONG, G_TYPE_POINTER, G_TYPE_DOUBLE, G_TYPE_FLOAT);
311 g_signal_new ("generic-marshaller-2",
312 G_TYPE_FROM_CLASS (klass),
319 G_TYPE_INT, test_enum_get_type(), G_TYPE_INT, test_unsigned_enum_get_type (), G_TYPE_INT);
320 g_signal_new ("generic-marshaller-enum-return-signed",
321 G_TYPE_FROM_CLASS (klass),
326 test_enum_get_type(),
328 g_signal_new ("generic-marshaller-enum-return-unsigned",
329 G_TYPE_FROM_CLASS (klass),
334 test_unsigned_enum_get_type(),
336 g_signal_new ("generic-marshaller-int-return",
337 G_TYPE_FROM_CLASS (klass),
344 s = g_signal_new ("va-marshaller-int-return",
345 G_TYPE_FROM_CLASS (klass),
352 g_signal_set_va_marshaller (s, G_TYPE_FROM_CLASS (klass),
354 g_signal_new ("generic-marshaller-uint-return",
355 G_TYPE_FROM_CLASS (klass),
362 g_signal_new ("generic-marshaller-interface-return",
363 G_TYPE_FROM_CLASS (klass),
370 s = g_signal_new ("va-marshaller-uint-return",
371 G_TYPE_FROM_CLASS (klass),
378 g_signal_set_va_marshaller (s, G_TYPE_FROM_CLASS (klass),
380 g_signal_new ("custom-marshaller",
381 G_TYPE_FROM_CLASS (klass),
385 custom_marshal_VOID__INVOCATIONHINT,
389 g_signal_new ("variant-changed-no-slot",
390 G_TYPE_FROM_CLASS (klass),
391 G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
394 g_cclosure_marshal_VOID__VARIANT,
398 g_signal_new ("variant-changed",
399 G_TYPE_FROM_CLASS (klass),
400 G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
401 G_STRUCT_OFFSET (TestClass, variant_changed),
403 g_cclosure_marshal_VOID__VARIANT,
407 g_signal_new ("all-types",
408 G_TYPE_FROM_CLASS (klass),
410 G_STRUCT_OFFSET (TestClass, all_types),
412 test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64,
434 s = g_signal_new ("all-types-va",
435 G_TYPE_FROM_CLASS (klass),
437 G_STRUCT_OFFSET (TestClass, all_types),
439 test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64,
461 g_signal_set_va_marshaller (s, G_TYPE_FROM_CLASS (klass),
462 test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64v);
464 g_signal_new ("all-types-generic",
465 G_TYPE_FROM_CLASS (klass),
467 G_STRUCT_OFFSET (TestClass, all_types),
491 g_signal_new ("all-types-null",
492 G_TYPE_FROM_CLASS (klass),
494 G_STRUCT_OFFSET (TestClass, all_types_null),
496 test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64,
518 g_signal_new ("all-types-empty",
519 G_TYPE_FROM_CLASS (klass),
523 test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64,
547 typedef struct _Test Test2;
548 typedef struct _TestClass Test2Class;
550 static GType test2_get_type (void);
551 G_DEFINE_TYPE (Test2, test2, G_TYPE_OBJECT)
554 test2_init (Test2 *test)
559 test2_class_init (Test2Class *klass)
564 test_variant_signal (void)
569 /* Tests that the signal emission consumes the variant,
570 * even if there are no handlers connected.
573 test = g_object_new (test_get_type (), NULL);
575 v = g_variant_new_boolean (TRUE);
577 g_assert_true (g_variant_is_floating (v));
578 g_signal_emit_by_name (test, "variant-changed-no-slot", v);
579 g_assert_false (g_variant_is_floating (v));
582 v = g_variant_new_boolean (TRUE);
584 g_assert_true (g_variant_is_floating (v));
585 g_signal_emit_by_name (test, "variant-changed", v);
586 g_assert_false (g_variant_is_floating (v));
589 g_object_unref (test);
593 on_generic_marshaller_1 (Test *obj,
603 g_assert_cmpint (v_schar, ==, 42);
604 g_assert_cmpint (v_uchar, ==, 43);
605 g_assert_cmpint (v_int, ==, 4096);
606 g_assert_cmpint (v_long, ==, 8192);
607 g_assert_null (v_pointer);
608 g_assert_cmpfloat (v_double, >, 0.0);
609 g_assert_cmpfloat (v_double, <, 1.0);
610 g_assert_cmpfloat (v_float, >, 5.0);
611 g_assert_cmpfloat (v_float, <, 6.0);
615 test_generic_marshaller_signal_1 (void)
618 test = g_object_new (test_get_type (), NULL);
620 g_signal_connect (test, "generic-marshaller-1", G_CALLBACK (on_generic_marshaller_1), NULL);
622 g_signal_emit_by_name (test, "generic-marshaller-1", 42, 43, 4096, 8192, NULL, 0.5, 5.5);
624 g_object_unref (test);
628 on_generic_marshaller_2 (Test *obj,
632 TestUnsignedEnum v_uenum,
635 g_assert_cmpint (v_int1, ==, 42);
636 g_assert_cmpint (v_enum, ==, TEST_ENUM_BAR);
637 g_assert_cmpint (v_int2, ==, 43);
638 g_assert_cmpint (v_uenum, ==, TEST_UNSIGNED_ENUM_BAR);
639 g_assert_cmpint (v_int3, ==, 44);
643 test_generic_marshaller_signal_2 (void)
646 test = g_object_new (test_get_type (), NULL);
648 g_signal_connect (test, "generic-marshaller-2", G_CALLBACK (on_generic_marshaller_2), NULL);
650 g_signal_emit_by_name (test, "generic-marshaller-2", 42, TEST_ENUM_BAR, 43, TEST_UNSIGNED_ENUM_BAR, 44);
652 g_object_unref (test);
656 on_generic_marshaller_enum_return_signed_1 (Test *obj)
658 return TEST_ENUM_NEGATIVE;
662 on_generic_marshaller_enum_return_signed_2 (Test *obj)
664 return TEST_ENUM_BAR;
668 test_generic_marshaller_signal_enum_return_signed (void)
674 test = g_object_new (test_get_type (), NULL);
676 /* Test return value NEGATIVE */
677 id = g_signal_connect (test,
678 "generic-marshaller-enum-return-signed",
679 G_CALLBACK (on_generic_marshaller_enum_return_signed_1),
681 g_signal_emit_by_name (test, "generic-marshaller-enum-return-signed", &retval);
682 g_assert_cmpint (retval, ==, TEST_ENUM_NEGATIVE);
683 g_signal_handler_disconnect (test, id);
685 /* Test return value BAR */
687 id = g_signal_connect (test,
688 "generic-marshaller-enum-return-signed",
689 G_CALLBACK (on_generic_marshaller_enum_return_signed_2),
691 g_signal_emit_by_name (test, "generic-marshaller-enum-return-signed", &retval);
692 g_assert_cmpint (retval, ==, TEST_ENUM_BAR);
693 g_signal_handler_disconnect (test, id);
695 g_object_unref (test);
698 static TestUnsignedEnum
699 on_generic_marshaller_enum_return_unsigned_1 (Test *obj)
701 return TEST_UNSIGNED_ENUM_FOO;
704 static TestUnsignedEnum
705 on_generic_marshaller_enum_return_unsigned_2 (Test *obj)
707 return TEST_UNSIGNED_ENUM_BAR;
711 test_generic_marshaller_signal_enum_return_unsigned (void)
715 TestUnsignedEnum retval = 0;
717 test = g_object_new (test_get_type (), NULL);
719 /* Test return value FOO */
720 id = g_signal_connect (test,
721 "generic-marshaller-enum-return-unsigned",
722 G_CALLBACK (on_generic_marshaller_enum_return_unsigned_1),
724 g_signal_emit_by_name (test, "generic-marshaller-enum-return-unsigned", &retval);
725 g_assert_cmpint (retval, ==, TEST_UNSIGNED_ENUM_FOO);
726 g_signal_handler_disconnect (test, id);
728 /* Test return value BAR */
730 id = g_signal_connect (test,
731 "generic-marshaller-enum-return-unsigned",
732 G_CALLBACK (on_generic_marshaller_enum_return_unsigned_2),
734 g_signal_emit_by_name (test, "generic-marshaller-enum-return-unsigned", &retval);
735 g_assert_cmpint (retval, ==, TEST_UNSIGNED_ENUM_BAR);
736 g_signal_handler_disconnect (test, id);
738 g_object_unref (test);
741 /**********************/
744 on_generic_marshaller_int_return_signed_1 (Test *obj)
750 on_generic_marshaller_int_return_signed_2 (Test *obj)
756 test_generic_marshaller_signal_int_return (void)
762 test = g_object_new (test_get_type (), NULL);
764 /* Test return value -30 */
765 id = g_signal_connect (test,
766 "generic-marshaller-int-return",
767 G_CALLBACK (on_generic_marshaller_int_return_signed_1),
769 g_signal_emit_by_name (test, "generic-marshaller-int-return", &retval);
770 g_assert_cmpint (retval, ==, -30);
771 g_signal_handler_disconnect (test, id);
773 /* Test return value positive */
775 id = g_signal_connect (test,
776 "generic-marshaller-int-return",
777 G_CALLBACK (on_generic_marshaller_int_return_signed_2),
779 g_signal_emit_by_name (test, "generic-marshaller-int-return", &retval);
780 g_assert_cmpint (retval, ==, 2);
781 g_signal_handler_disconnect (test, id);
783 /* Same test for va marshaller */
785 /* Test return value -30 */
786 id = g_signal_connect (test,
787 "va-marshaller-int-return",
788 G_CALLBACK (on_generic_marshaller_int_return_signed_1),
790 g_signal_emit_by_name (test, "va-marshaller-int-return", &retval);
791 g_assert_cmpint (retval, ==, -30);
792 g_signal_handler_disconnect (test, id);
794 /* Test return value positive */
796 id = g_signal_connect (test,
797 "va-marshaller-int-return",
798 G_CALLBACK (on_generic_marshaller_int_return_signed_2),
800 g_signal_emit_by_name (test, "va-marshaller-int-return", &retval);
801 g_assert_cmpint (retval, ==, 2);
802 g_signal_handler_disconnect (test, id);
804 g_object_unref (test);
808 on_generic_marshaller_uint_return_1 (Test *obj)
814 on_generic_marshaller_uint_return_2 (Test *obj)
820 test_generic_marshaller_signal_uint_return (void)
826 test = g_object_new (test_get_type (), NULL);
828 id = g_signal_connect (test,
829 "generic-marshaller-uint-return",
830 G_CALLBACK (on_generic_marshaller_uint_return_1),
832 g_signal_emit_by_name (test, "generic-marshaller-uint-return", &retval);
833 g_assert_cmpint (retval, ==, 1);
834 g_signal_handler_disconnect (test, id);
837 id = g_signal_connect (test,
838 "generic-marshaller-uint-return",
839 G_CALLBACK (on_generic_marshaller_uint_return_2),
841 g_signal_emit_by_name (test, "generic-marshaller-uint-return", &retval);
842 g_assert_cmpint (retval, ==, G_MAXUINT);
843 g_signal_handler_disconnect (test, id);
845 /* Same test for va marshaller */
847 id = g_signal_connect (test,
848 "va-marshaller-uint-return",
849 G_CALLBACK (on_generic_marshaller_uint_return_1),
851 g_signal_emit_by_name (test, "va-marshaller-uint-return", &retval);
852 g_assert_cmpint (retval, ==, 1);
853 g_signal_handler_disconnect (test, id);
856 id = g_signal_connect (test,
857 "va-marshaller-uint-return",
858 G_CALLBACK (on_generic_marshaller_uint_return_2),
860 g_signal_emit_by_name (test, "va-marshaller-uint-return", &retval);
861 g_assert_cmpint (retval, ==, G_MAXUINT);
862 g_signal_handler_disconnect (test, id);
864 g_object_unref (test);
868 on_generic_marshaller_interface_return (Test *test)
870 return g_object_new (baa_get_type (), NULL);
874 test_generic_marshaller_signal_interface_return (void)
880 test = g_object_new (test_get_type (), NULL);
882 /* Test return value -30 */
883 id = g_signal_connect (test,
884 "generic-marshaller-interface-return",
885 G_CALLBACK (on_generic_marshaller_interface_return),
887 g_signal_emit_by_name (test, "generic-marshaller-interface-return", &retval);
888 g_assert_true (g_type_check_instance_is_a ((GTypeInstance*)retval, foo_get_type ()));
889 g_object_unref (retval);
891 g_signal_handler_disconnect (test, id);
893 g_object_unref (test);
896 static const GSignalInvocationHint dont_use_this = { 0, };
899 custom_marshaller_callback (Test *test,
900 GSignalInvocationHint *hint,
903 GSignalInvocationHint *ihint;
905 g_assert_true (hint != &dont_use_this);
907 ihint = g_signal_get_invocation_hint (test);
909 g_assert_cmpuint (hint->signal_id, ==, ihint->signal_id);
910 g_assert_cmpuint (hint->detail , ==, ihint->detail);
911 g_assert_cmpflags (GSignalFlags, hint->run_type, ==, ihint->run_type);
915 test_custom_marshaller (void)
919 test = g_object_new (test_get_type (), NULL);
921 g_signal_connect (test,
923 G_CALLBACK (custom_marshaller_callback),
926 g_signal_emit_by_name (test, "custom-marshaller", &dont_use_this);
928 g_object_unref (test);
931 static int all_type_handlers_count = 0;
934 all_types_handler (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, MyEnum e, MyFlags f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64)
936 all_type_handlers_count++;
938 g_assert_cmpint (i, ==, 42);
939 g_assert_cmpint (b, ==, TRUE);
940 g_assert_cmpint (c, ==, 17);
941 g_assert_cmpuint (uc, ==, 140);
942 g_assert_cmpuint (ui, ==, G_MAXUINT - 42);
943 g_assert_cmpint (l, ==, -1117);
944 g_assert_cmpuint (ul, ==, G_MAXULONG - 999);
945 g_assert_cmpenum (MyEnum, e, ==, MY_ENUM_VALUE);
946 g_assert_cmpflags (MyFlags, f, ==, MY_FLAGS_FIRST_BIT | MY_FLAGS_THIRD_BIT | MY_FLAGS_LAST_BIT);
947 g_assert_cmpfloat (fl, ==, 0.25);
948 g_assert_cmpfloat (db, ==, 1.5);
949 g_assert_cmpstr (str, ==, "Test");
950 g_assert_cmpstr (g_param_spec_get_nick (param), ==, "nick");
951 g_assert_cmpstr (g_bytes_get_data (bytes, NULL), ==, "Blah");
952 g_assert_true (ptr == &enum_type);
953 g_assert_cmpuint (g_variant_get_uint16 (var), == , 99);
954 g_assert_cmpint (i64, ==, G_MAXINT64 - 1234);
955 g_assert_cmpuint (ui64, ==, G_MAXUINT64 - 123456);
959 all_types_handler_cb (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, MyEnum e, guint f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64, gpointer user_data)
961 g_assert_true (user_data == &flags_type);
962 all_types_handler (test, i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, obj, var, i64, ui64);
966 test_all_types (void)
974 guint ui = G_MAXUINT - 42;
976 gulong ul = G_MAXULONG - 999;
977 MyEnum e = MY_ENUM_VALUE;
978 MyFlags f = MY_FLAGS_FIRST_BIT | MY_FLAGS_THIRD_BIT | MY_FLAGS_LAST_BIT;
982 GParamSpec *param = g_param_spec_long ("param", "nick", "blurb", 0, 10, 4, 0);
983 GBytes *bytes = g_bytes_new_static ("Blah", 5);
984 gpointer ptr = &enum_type;
985 GVariant *var = g_variant_new_uint16 (99);
988 g_variant_ref_sink (var);
989 i64 = G_MAXINT64 - 1234;
990 ui64 = G_MAXUINT64 - 123456;
992 test = g_object_new (test_get_type (), NULL);
994 all_type_handlers_count = 0;
996 g_signal_emit_by_name (test, "all-types",
997 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
998 g_signal_emit_by_name (test, "all-types-va",
999 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1000 g_signal_emit_by_name (test, "all-types-generic",
1001 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1002 g_signal_emit_by_name (test, "all-types-empty",
1003 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1004 g_signal_emit_by_name (test, "all-types-null",
1005 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1007 g_assert_cmpint (all_type_handlers_count, ==, 3);
1009 all_type_handlers_count = 0;
1011 g_signal_connect (test, "all-types", G_CALLBACK (all_types_handler_cb), &flags_type);
1012 g_signal_connect (test, "all-types-va", G_CALLBACK (all_types_handler_cb), &flags_type);
1013 g_signal_connect (test, "all-types-generic", G_CALLBACK (all_types_handler_cb), &flags_type);
1014 g_signal_connect (test, "all-types-empty", G_CALLBACK (all_types_handler_cb), &flags_type);
1015 g_signal_connect (test, "all-types-null", G_CALLBACK (all_types_handler_cb), &flags_type);
1017 g_signal_emit_by_name (test, "all-types",
1018 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1019 g_signal_emit_by_name (test, "all-types-va",
1020 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1021 g_signal_emit_by_name (test, "all-types-generic",
1022 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1023 g_signal_emit_by_name (test, "all-types-empty",
1024 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1025 g_signal_emit_by_name (test, "all-types-null",
1026 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1028 g_assert_cmpint (all_type_handlers_count, ==, 3 + 5);
1030 all_type_handlers_count = 0;
1032 g_signal_connect (test, "all-types", G_CALLBACK (all_types_handler_cb), &flags_type);
1033 g_signal_connect (test, "all-types-va", G_CALLBACK (all_types_handler_cb), &flags_type);
1034 g_signal_connect (test, "all-types-generic", G_CALLBACK (all_types_handler_cb), &flags_type);
1035 g_signal_connect (test, "all-types-empty", G_CALLBACK (all_types_handler_cb), &flags_type);
1036 g_signal_connect (test, "all-types-null", G_CALLBACK (all_types_handler_cb), &flags_type);
1038 g_signal_emit_by_name (test, "all-types",
1039 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1040 g_signal_emit_by_name (test, "all-types-va",
1041 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1042 g_signal_emit_by_name (test, "all-types-generic",
1043 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1044 g_signal_emit_by_name (test, "all-types-empty",
1045 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1046 g_signal_emit_by_name (test, "all-types-null",
1047 i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64);
1049 g_assert_cmpint (all_type_handlers_count, ==, 3 + 5 + 5);
1051 g_object_unref (test);
1052 g_param_spec_unref (param);
1053 g_bytes_unref (bytes);
1054 g_variant_unref (var);
1063 test = g_object_new (test_get_type (), NULL);
1065 g_object_connect (test,
1066 "signal::generic-marshaller-int-return",
1067 G_CALLBACK (on_generic_marshaller_int_return_signed_1),
1069 "object-signal::va-marshaller-int-return",
1070 G_CALLBACK (on_generic_marshaller_int_return_signed_2),
1073 g_signal_emit_by_name (test, "generic-marshaller-int-return", &retval);
1074 g_assert_cmpint (retval, ==, -30);
1075 g_signal_emit_by_name (test, "va-marshaller-int-return", &retval);
1076 g_assert_cmpint (retval, ==, 2);
1078 g_object_disconnect (test,
1080 G_CALLBACK (on_generic_marshaller_int_return_signed_1),
1082 "any-signal::va-marshaller-int-return",
1083 G_CALLBACK (on_generic_marshaller_int_return_signed_2),
1087 g_object_unref (test);
1091 simple_handler1 (GObject *sender,
1094 g_object_unref (target);
1098 simple_handler2 (GObject *sender,
1101 g_object_unref (target);
1105 test_destroy_target_object (void)
1107 Test *sender, *target1, *target2;
1109 sender = g_object_new (test_get_type (), NULL);
1110 target1 = g_object_new (test_get_type (), NULL);
1111 target2 = g_object_new (test_get_type (), NULL);
1112 g_signal_connect_object (sender, "simple", G_CALLBACK (simple_handler1),
1113 target1, G_CONNECT_DEFAULT);
1114 g_signal_connect_object (sender, "simple", G_CALLBACK (simple_handler2),
1115 target2, G_CONNECT_DEFAULT);
1116 g_signal_emit_by_name (sender, "simple");
1117 g_object_unref (sender);
1121 hook_func (GSignalInvocationHint *ihint,
1123 const GValue *params,
1134 hook_func_removal (GSignalInvocationHint *ihint,
1136 const GValue *params,
1147 simple_handler_remove_hook (GObject *sender,
1150 gulong *hook = data;
1152 g_signal_remove_emission_hook (simple_id, *hook);
1156 test_emission_hook (void)
1158 GObject *test1, *test2;
1161 gulong connection_id;
1163 test1 = g_object_new (test_get_type (), NULL);
1164 test2 = g_object_new (test_get_type (), NULL);
1166 hook = g_signal_add_emission_hook (simple_id, 0, hook_func, &count, NULL);
1167 g_assert_cmpint (count, ==, 0);
1168 g_signal_emit_by_name (test1, "simple");
1169 g_assert_cmpint (count, ==, 1);
1170 g_signal_emit_by_name (test2, "simple");
1171 g_assert_cmpint (count, ==, 2);
1172 g_signal_remove_emission_hook (simple_id, hook);
1173 g_signal_emit_by_name (test1, "simple");
1174 g_assert_cmpint (count, ==, 2);
1177 hook = g_signal_add_emission_hook (simple_id, 0, hook_func_removal, &count, NULL);
1178 g_assert_cmpint (count, ==, 0);
1179 g_signal_emit_by_name (test1, "simple");
1180 g_assert_cmpint (count, ==, 1);
1181 g_signal_emit_by_name (test2, "simple");
1182 g_assert_cmpint (count, ==, 1);
1184 g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
1185 "*simple* had no hook * to remove");
1186 g_signal_remove_emission_hook (simple_id, hook);
1187 g_test_assert_expected_messages ();
1190 hook = g_signal_add_emission_hook (simple_id, 0, hook_func, &count, NULL);
1191 connection_id = g_signal_connect (test1, "simple",
1192 G_CALLBACK (simple_handler_remove_hook), &hook);
1193 g_assert_cmpint (count, ==, 0);
1194 g_signal_emit_by_name (test1, "simple");
1195 g_assert_cmpint (count, ==, 1);
1196 g_signal_emit_by_name (test2, "simple");
1197 g_assert_cmpint (count, ==, 1);
1199 g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
1200 "*simple* had no hook * to remove");
1201 g_signal_remove_emission_hook (simple_id, hook);
1202 g_test_assert_expected_messages ();
1204 g_clear_signal_handler (&connection_id, test1);
1209 for (size_t i = 0; i < G_N_ELEMENTS (hooks); ++i)
1210 hooks[i] = g_signal_add_emission_hook (simple_id, 0, hook_func, &count, NULL);
1212 g_assert_cmpint (count, ==, 0);
1213 g_signal_emit_by_name (test1, "simple");
1214 g_assert_cmpint (count, ==, 10);
1215 g_signal_emit_by_name (test2, "simple");
1216 g_assert_cmpint (count, ==, 20);
1218 for (size_t i = 0; i < G_N_ELEMENTS (hooks); ++i)
1219 g_signal_remove_emission_hook (simple_id, hooks[i]);
1221 g_signal_emit_by_name (test1, "simple");
1222 g_assert_cmpint (count, ==, 20);
1226 for (size_t i = 0; i < G_N_ELEMENTS (hooks); ++i)
1227 hooks[i] = g_signal_add_emission_hook (simple_id, 0, hook_func_removal, &count, NULL);
1229 g_assert_cmpint (count, ==, 0);
1230 g_signal_emit_by_name (test1, "simple");
1231 g_assert_cmpint (count, ==, 10);
1232 g_signal_emit_by_name (test2, "simple");
1233 g_assert_cmpint (count, ==, 10);
1235 for (size_t i = 0; i < G_N_ELEMENTS (hooks); ++i)
1237 g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
1238 "*simple* had no hook * to remove");
1239 g_signal_remove_emission_hook (simple_id, hooks[i]);
1240 g_test_assert_expected_messages ();
1243 g_object_unref (test1);
1244 g_object_unref (test2);
1248 simple_cb (gpointer instance, gpointer data)
1250 GSignalInvocationHint *ihint;
1252 ihint = g_signal_get_invocation_hint (instance);
1254 g_assert_cmpstr (g_signal_name (ihint->signal_id), ==, "simple");
1256 g_signal_emit_by_name (instance, "simple-2");
1260 simple2_cb (gpointer instance, gpointer data)
1262 GSignalInvocationHint *ihint;
1264 ihint = g_signal_get_invocation_hint (instance);
1266 g_assert_cmpstr (g_signal_name (ihint->signal_id), ==, "simple-2");
1270 test_invocation_hint (void)
1274 test = g_object_new (test_get_type (), NULL);
1276 g_signal_connect (test, "simple", G_CALLBACK (simple_cb), NULL);
1277 g_signal_connect (test, "simple-2", G_CALLBACK (simple2_cb), NULL);
1278 g_signal_emit_by_name (test, "simple");
1280 g_object_unref (test);
1284 accumulator_sum (GSignalInvocationHint *ihint,
1285 GValue *return_accu,
1286 const GValue *handler_return,
1289 gint acc = g_value_get_int (return_accu);
1290 gint ret = g_value_get_int (handler_return);
1292 g_assert_cmpint (ret, >, 0);
1294 if (ihint->run_type & G_SIGNAL_ACCUMULATOR_FIRST_RUN)
1296 g_assert_cmpint (acc, ==, 0);
1297 g_assert_cmpint (ret, ==, 1);
1298 g_assert_true (ihint->run_type & G_SIGNAL_RUN_FIRST);
1299 g_assert_false (ihint->run_type & G_SIGNAL_RUN_LAST);
1301 else if (ihint->run_type & G_SIGNAL_RUN_FIRST)
1303 /* Only the first signal handler was called so far */
1304 g_assert_cmpint (acc, ==, 1);
1305 g_assert_cmpint (ret, ==, 2);
1306 g_assert_false (ihint->run_type & G_SIGNAL_RUN_LAST);
1308 else if (ihint->run_type & G_SIGNAL_RUN_LAST)
1310 /* Only the first two signal handler were called so far */
1311 g_assert_cmpint (acc, ==, 3);
1312 g_assert_cmpint (ret, ==, 3);
1313 g_assert_false (ihint->run_type & G_SIGNAL_RUN_FIRST);
1317 g_assert_not_reached ();
1320 g_value_set_int (return_accu, acc + ret);
1322 /* Continue with the other signal handlers as long as the sum is < 6,
1323 * i.e. don't run simple_accumulator_4_cb() */
1324 return acc + ret < 6;
1328 simple_accumulator_1_cb (gpointer instance, gpointer data)
1334 simple_accumulator_2_cb (gpointer instance, gpointer data)
1340 simple_accumulator_3_cb (gpointer instance, gpointer data)
1346 simple_accumulator_4_cb (gpointer instance, gpointer data)
1352 test_accumulator (void)
1357 test = g_object_new (test_get_type (), NULL);
1359 /* Connect in reverse order to make sure that LAST signal handlers are
1360 * called after FIRST signal handlers but signal handlers in each "group"
1361 * are called in the order they were registered */
1362 g_signal_connect_after (test, "simple-accumulator", G_CALLBACK (simple_accumulator_3_cb), NULL);
1363 g_signal_connect_after (test, "simple-accumulator", G_CALLBACK (simple_accumulator_4_cb), NULL);
1364 g_signal_connect (test, "simple-accumulator", G_CALLBACK (simple_accumulator_1_cb), NULL);
1365 g_signal_connect (test, "simple-accumulator", G_CALLBACK (simple_accumulator_2_cb), NULL);
1366 g_signal_emit_by_name (test, "simple-accumulator", &ret);
1368 /* simple_accumulator_4_cb() is not run because accumulator is 6 */
1369 g_assert_cmpint (ret, ==, 6);
1371 g_object_unref (test);
1375 accumulator_concat_string (GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer data)
1377 const gchar *acc = g_value_get_string (return_accu);
1378 const gchar *ret = g_value_get_string (handler_return);
1380 g_assert_nonnull (ret);
1383 g_value_set_string (return_accu, ret);
1385 g_value_take_string (return_accu, g_strconcat (acc, ret, NULL));
1391 accumulator_class_before_cb (gpointer instance, gpointer data)
1393 return g_strdup ("before");
1397 accumulator_class_after_cb (gpointer instance, gpointer data)
1399 return g_strdup ("after");
1403 accumulator_class (Test *test)
1405 return g_strdup ("class");
1409 test_accumulator_class (void)
1412 const gchar *signal_name;
1413 const gchar *return_string;
1415 {"accumulator-class-first", "classbeforeafter"},
1416 {"accumulator-class-last", "beforeclassafter"},
1417 {"accumulator-class-cleanup", "beforeafterclass"},
1418 {"accumulator-class-first-last", "classbeforeclassafter"},
1419 {"accumulator-class-first-last-cleanup", "classbeforeclassafterclass"},
1420 {"accumulator-class-last-cleanup", "beforeclassafterclass"},
1424 for (i = 0; i < G_N_ELEMENTS (tests); i++)
1429 g_test_message ("Signal: %s", tests[i].signal_name);
1431 test = g_object_new (test_get_type (), NULL);
1433 g_signal_connect (test, tests[i].signal_name, G_CALLBACK (accumulator_class_before_cb), NULL);
1434 g_signal_connect_after (test, tests[i].signal_name, G_CALLBACK (accumulator_class_after_cb), NULL);
1435 g_signal_emit_by_name (test, tests[i].signal_name, &ret);
1437 g_assert_cmpstr (ret, ==, tests[i].return_string);
1440 g_object_unref (test);
1445 in_set (const gchar *s,
1450 for (i = 0; set[i]; i++)
1452 if (g_strcmp0 (s, set[i]) == 0)
1460 test_introspection (void)
1466 const gchar *names[] = {
1470 "simple-accumulator",
1471 "accumulator-class-first",
1472 "accumulator-class-last",
1473 "accumulator-class-cleanup",
1474 "accumulator-class-first-last",
1475 "accumulator-class-first-last-cleanup",
1476 "accumulator-class-last-cleanup",
1477 "generic-marshaller-1",
1478 "generic-marshaller-2",
1479 "generic-marshaller-enum-return-signed",
1480 "generic-marshaller-enum-return-unsigned",
1481 "generic-marshaller-int-return",
1482 "va-marshaller-int-return",
1483 "generic-marshaller-uint-return",
1484 "generic-marshaller-interface-return",
1485 "va-marshaller-uint-return",
1486 "variant-changed-no-slot",
1490 "all-types-generic",
1493 "custom-marshaller",
1498 ids = g_signal_list_ids (test_get_type (), &n_ids);
1499 g_assert_cmpuint (n_ids, ==, g_strv_length ((gchar**)names));
1501 for (i = 0; i < n_ids; i++)
1503 name = g_signal_name (ids[i]);
1504 g_assert_true (in_set (name, names));
1507 g_signal_query (simple_id, &query);
1508 g_assert_cmpuint (query.signal_id, ==, simple_id);
1509 g_assert_cmpstr (query.signal_name, ==, "simple");
1510 g_assert_true (query.itype == test_get_type ());
1511 g_assert_cmpint (query.signal_flags, ==, G_SIGNAL_RUN_LAST);
1512 g_assert_cmpint (query.return_type, ==, G_TYPE_NONE);
1513 g_assert_cmpuint (query.n_params, ==, 0);
1519 test_handler (gpointer instance, gpointer data)
1527 test_block_handler (void)
1529 GObject *test1, *test2;
1532 gulong handler1, handler;
1534 test1 = g_object_new (test_get_type (), NULL);
1535 test2 = g_object_new (test_get_type (), NULL);
1537 handler1 = g_signal_connect (test1, "simple", G_CALLBACK (test_handler), &count1);
1538 g_signal_connect (test2, "simple", G_CALLBACK (test_handler), &count2);
1540 handler = g_signal_handler_find (test1, G_SIGNAL_MATCH_ID, simple_id, 0, NULL, NULL, NULL);
1542 g_assert_true (handler == handler1);
1544 g_assert_cmpint (count1, ==, 0);
1545 g_assert_cmpint (count2, ==, 0);
1547 g_signal_emit_by_name (test1, "simple");
1548 g_signal_emit_by_name (test2, "simple");
1550 g_assert_cmpint (count1, ==, 1);
1551 g_assert_cmpint (count2, ==, 1);
1553 g_signal_handler_block (test1, handler1);
1555 g_signal_emit_by_name (test1, "simple");
1556 g_signal_emit_by_name (test2, "simple");
1558 g_assert_cmpint (count1, ==, 1);
1559 g_assert_cmpint (count2, ==, 2);
1561 g_signal_handler_unblock (test1, handler1);
1563 g_signal_emit_by_name (test1, "simple");
1564 g_signal_emit_by_name (test2, "simple");
1566 g_assert_cmpint (count1, ==, 2);
1567 g_assert_cmpint (count2, ==, 3);
1569 g_assert_cmpuint (g_signal_handlers_block_matched (test1, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, test_block_handler, NULL), ==, 0);
1570 g_assert_cmpuint (g_signal_handlers_block_matched (test2, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, test_handler, NULL), ==, 1);
1572 g_signal_emit_by_name (test1, "simple");
1573 g_signal_emit_by_name (test2, "simple");
1575 g_assert_cmpint (count1, ==, 3);
1576 g_assert_cmpint (count2, ==, 3);
1578 g_signal_handlers_unblock_matched (test2, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, test_handler, NULL);
1580 /* Test match by signal ID. */
1581 g_assert_cmpuint (g_signal_handlers_block_matched (test1, G_SIGNAL_MATCH_ID, simple_id, 0, NULL, NULL, NULL), ==, 1);
1583 g_signal_emit_by_name (test1, "simple");
1584 g_signal_emit_by_name (test2, "simple");
1586 g_assert_cmpint (count1, ==, 3);
1587 g_assert_cmpint (count2, ==, 4);
1589 g_assert_cmpuint (g_signal_handlers_unblock_matched (test1, G_SIGNAL_MATCH_ID, simple_id, 0, NULL, NULL, NULL), ==, 1);
1591 /* Match types are conjunctive */
1592 g_assert_cmpuint (g_signal_handlers_block_matched (test1, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, test_handler, "will not match"), ==, 0);
1593 g_assert_cmpuint (g_signal_handlers_block_matched (test1, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, test_handler, &count1), ==, 1);
1594 g_assert_cmpuint (g_signal_handlers_unblock_matched (test1, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, test_handler, &count1), ==, 1);
1596 /* Test g_signal_handlers_disconnect_matched for G_SIGNAL_MATCH_ID match */
1597 g_assert_cmpuint (g_signal_handlers_disconnect_matched (test1,
1603 g_assert_cmpuint (g_signal_handler_find (test1,
1610 g_object_unref (test1);
1611 g_object_unref (test2);
1615 stop_emission (gpointer instance, gpointer data)
1617 g_signal_stop_emission (instance, simple_id, 0);
1621 stop_emission_by_name (gpointer instance, gpointer data)
1623 g_signal_stop_emission_by_name (instance, "simple");
1627 dont_reach (gpointer instance, gpointer data)
1629 g_assert_not_reached ();
1633 test_stop_emission (void)
1638 test1 = g_object_new (test_get_type (), NULL);
1639 handler = g_signal_connect (test1, "simple", G_CALLBACK (stop_emission), NULL);
1640 g_signal_connect_after (test1, "simple", G_CALLBACK (dont_reach), NULL);
1642 g_signal_emit_by_name (test1, "simple");
1644 g_signal_handler_disconnect (test1, handler);
1645 g_signal_connect (test1, "simple", G_CALLBACK (stop_emission_by_name), NULL);
1647 g_signal_emit_by_name (test1, "simple");
1649 g_object_unref (test1);
1653 test_signal_disconnect_wrong_object (void)
1655 Test *object, *object2;
1659 object = g_object_new (test_get_type (), NULL);
1660 object2 = g_object_new (test_get_type (), NULL);
1661 object3 = g_object_new (test2_get_type (), NULL);
1663 signal_id = g_signal_connect (object,
1665 G_CALLBACK (simple_handler1),
1668 /* disconnect from the wrong object (same type), should warn */
1669 g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
1670 "*: instance '*' has no handler with id '*'");
1671 g_signal_handler_disconnect (object2, signal_id);
1672 g_test_assert_expected_messages ();
1674 /* and from an object of the wrong type */
1675 g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
1676 "*: instance '*' has no handler with id '*'");
1677 g_signal_handler_disconnect (object3, signal_id);
1678 g_test_assert_expected_messages ();
1680 /* it's still connected */
1681 g_assert_true (g_signal_handler_is_connected (object, signal_id));
1683 g_object_unref (object);
1684 g_object_unref (object2);
1685 g_object_unref (object3);
1689 test_clear_signal_handler (void)
1694 test_obj = g_object_new (test_get_type (), NULL);
1696 handler = g_signal_connect (test_obj, "simple", G_CALLBACK (dont_reach), NULL);
1697 g_assert_cmpuint (handler, >, 0);
1699 g_clear_signal_handler (&handler, test_obj);
1700 g_assert_cmpuint (handler, ==, 0);
1702 g_signal_emit_by_name (test_obj, "simple");
1704 g_clear_signal_handler (&handler, test_obj);
1706 if (g_test_undefined ())
1708 handler = g_random_int_range (0x01, 0xFF);
1709 g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
1710 "*instance '* has no handler with id *'");
1711 g_clear_signal_handler (&handler, test_obj);
1712 g_assert_cmpuint (handler, ==, 0);
1713 g_test_assert_expected_messages ();
1716 g_object_unref (test_obj);
1722 GTypeClass *test_class;
1723 guint signal_id, saved_signal_id;
1725 g_test_summary ("Test that g_signal_lookup() works with a variety of inputs.");
1727 test_class = g_type_class_ref (test_get_type ());
1729 signal_id = g_signal_lookup ("all-types", test_get_type ());
1730 g_assert_cmpint (signal_id, !=, 0);
1732 saved_signal_id = signal_id;
1734 /* Try with a non-canonical name. */
1735 signal_id = g_signal_lookup ("all_types", test_get_type ());
1736 g_assert_cmpint (signal_id, ==, saved_signal_id);
1738 /* Looking up a non-existent signal should return nothing. */
1739 g_assert_cmpint (g_signal_lookup ("nope", test_get_type ()), ==, 0);
1741 g_type_class_unref (test_class);
1745 test_lookup_invalid (void)
1747 g_test_summary ("Test that g_signal_lookup() emits a warning if looking up an invalid signal name.");
1749 if (g_test_subprocess ())
1751 GTypeClass *test_class;
1754 test_class = g_type_class_ref (test_get_type ());
1756 signal_id = g_signal_lookup ("", test_get_type ());
1757 g_assert_cmpint (signal_id, ==, 0);
1759 g_type_class_unref (test_class);
1763 g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT);
1764 g_test_trap_assert_failed ();
1765 g_test_trap_assert_stderr ("*CRITICAL*unable to look up invalid signal name*");
1769 test_parse_name (void)
1771 GTypeClass *test_class;
1772 guint signal_id, saved_signal_id;
1774 GQuark detail, saved_detail;
1776 g_test_summary ("Test that g_signal_parse_name() works with a variety of inputs.");
1778 test_class = g_type_class_ref (test_get_type ());
1781 retval = g_signal_parse_name ("simple-detailed", test_get_type (), &signal_id, &detail, TRUE);
1782 g_assert_true (retval);
1783 g_assert_cmpint (signal_id, !=, 0);
1784 g_assert_cmpint (detail, ==, 0);
1786 saved_signal_id = signal_id;
1788 /* Simple test with detail. */
1789 retval = g_signal_parse_name ("simple-detailed::a-detail", test_get_type (), &signal_id, &detail, TRUE);
1790 g_assert_true (retval);
1791 g_assert_cmpint (signal_id, ==, saved_signal_id);
1792 g_assert_cmpint (detail, !=, 0);
1794 saved_detail = detail;
1796 /* Simple test with the same detail again. */
1797 retval = g_signal_parse_name ("simple-detailed::a-detail", test_get_type (), &signal_id, &detail, FALSE);
1798 g_assert_true (retval);
1799 g_assert_cmpint (signal_id, ==, saved_signal_id);
1800 g_assert_cmpint (detail, ==, saved_detail);
1802 /* Simple test with a new detail. */
1803 retval = g_signal_parse_name ("simple-detailed::another-detail", test_get_type (), &signal_id, &detail, FALSE);
1804 g_assert_true (retval);
1805 g_assert_cmpint (signal_id, ==, saved_signal_id);
1806 g_assert_cmpint (detail, ==, 0); /* we didn’t force the quark */
1808 /* Canonicalisation shouldn’t affect the results. */
1809 retval = g_signal_parse_name ("simple_detailed::a-detail", test_get_type (), &signal_id, &detail, FALSE);
1810 g_assert_true (retval);
1811 g_assert_cmpint (signal_id, ==, saved_signal_id);
1812 g_assert_cmpint (detail, ==, saved_detail);
1814 /* Details don’t have to look like property names. */
1815 retval = g_signal_parse_name ("simple-detailed::hello::world", test_get_type (), &signal_id, &detail, TRUE);
1816 g_assert_true (retval);
1817 g_assert_cmpint (signal_id, ==, saved_signal_id);
1818 g_assert_cmpint (detail, !=, 0);
1820 /* Trying to parse a detail for a signal which isn’t %G_SIGNAL_DETAILED should fail. */
1821 retval = g_signal_parse_name ("all-types::a-detail", test_get_type (), &signal_id, &detail, FALSE);
1822 g_assert_false (retval);
1824 g_type_class_unref (test_class);
1828 test_parse_name_invalid (void)
1830 GTypeClass *test_class;
1834 const gchar *vectors[] =
1839 "simple-detailed::",
1847 g_test_summary ("Test that g_signal_parse_name() ignores a variety of invalid inputs.");
1849 test_class = g_type_class_ref (test_get_type ());
1851 for (i = 0; i < G_N_ELEMENTS (vectors); i++)
1853 g_test_message ("Parser input: %s", vectors[i]);
1854 g_assert_false (g_signal_parse_name (vectors[i], test_get_type (), &signal_id, &detail, TRUE));
1857 g_type_class_unref (test_class);
1861 test_signals_invalid_name (gconstpointer test_data)
1863 const gchar *signal_name = test_data;
1865 g_test_summary ("Check that g_signal_new() rejects invalid signal names.");
1867 if (g_test_subprocess ())
1869 g_signal_new (signal_name,
1871 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE,
1880 g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT);
1881 g_test_trap_assert_failed ();
1882 g_test_trap_assert_stderr ("*CRITICAL*g_signal_is_valid_name (signal_name)*");
1886 test_signal_is_valid_name (void)
1888 const gchar *valid_names[] =
1892 "multiple-segments",
1893 "segment0-SEGMENT1",
1894 "using_underscores",
1896 const gchar *invalid_names[] =
1904 for (i = 0; i < G_N_ELEMENTS (valid_names); i++)
1905 g_assert_true (g_signal_is_valid_name (valid_names[i]));
1907 for (i = 0; i < G_N_ELEMENTS (invalid_names); i++)
1908 g_assert_false (g_signal_is_valid_name (invalid_names[i]));
1916 GValue return_value = G_VALUE_INIT;
1922 test = g_object_new (test_get_type (), NULL);
1924 values = g_array_new (TRUE, TRUE, sizeof (GValue));
1925 g_array_set_clear_func (values, (GDestroyNotify) g_value_unset);
1927 g_array_set_size (values, 1);
1928 g_value_init (&g_array_index (values, GValue, 0), G_TYPE_OBJECT);
1929 g_value_set_object (&g_array_index (values, GValue, 0), test);
1930 hook = g_signal_add_emission_hook (simple_id, 0, hook_func, &count, NULL);
1931 g_assert_cmpint (count, ==, 0);
1932 g_signal_emitv ((GValue *) values->data, simple_id, 0, NULL);
1933 g_assert_cmpint (count, ==, 1);
1934 g_signal_remove_emission_hook (simple_id, hook);
1936 g_array_set_size (values, 20);
1937 g_value_init (&g_array_index (values, GValue, 1), G_TYPE_INT);
1938 g_value_set_int (&g_array_index (values, GValue, 1), 42);
1940 g_value_init (&g_array_index (values, GValue, 2), G_TYPE_BOOLEAN);
1941 g_value_set_boolean (&g_array_index (values, GValue, 2), TRUE);
1943 g_value_init (&g_array_index (values, GValue, 3), G_TYPE_CHAR);
1944 g_value_set_schar (&g_array_index (values, GValue, 3), 17);
1946 g_value_init (&g_array_index (values, GValue, 4), G_TYPE_UCHAR);
1947 g_value_set_uchar (&g_array_index (values, GValue, 4), 140);
1949 g_value_init (&g_array_index (values, GValue, 5), G_TYPE_UINT);
1950 g_value_set_uint (&g_array_index (values, GValue, 5), G_MAXUINT - 42);
1952 g_value_init (&g_array_index (values, GValue, 6), G_TYPE_LONG);
1953 g_value_set_long (&g_array_index (values, GValue, 6), -1117);
1955 g_value_init (&g_array_index (values, GValue, 7), G_TYPE_ULONG);
1956 g_value_set_ulong (&g_array_index (values, GValue, 7), G_MAXULONG - 999);
1958 g_value_init (&g_array_index (values, GValue, 8), enum_type);
1959 g_value_set_enum (&g_array_index (values, GValue, 8), MY_ENUM_VALUE);
1961 g_value_init (&g_array_index (values, GValue, 9), flags_type);
1962 g_value_set_flags (&g_array_index (values, GValue, 9),
1963 MY_FLAGS_FIRST_BIT | MY_FLAGS_THIRD_BIT | MY_FLAGS_LAST_BIT);
1965 g_value_init (&g_array_index (values, GValue, 10), G_TYPE_FLOAT);
1966 g_value_set_float (&g_array_index (values, GValue, 10), 0.25);
1968 g_value_init (&g_array_index (values, GValue, 11), G_TYPE_DOUBLE);
1969 g_value_set_double (&g_array_index (values, GValue, 11), 1.5);
1971 g_value_init (&g_array_index (values, GValue, 12), G_TYPE_STRING);
1972 g_value_set_string (&g_array_index (values, GValue, 12), "Test");
1974 g_value_init (&g_array_index (values, GValue, 13), G_TYPE_PARAM_LONG);
1975 g_value_take_param (&g_array_index (values, GValue, 13),
1976 g_param_spec_long ("param", "nick", "blurb", 0, 10, 4, 0));
1978 g_value_init (&g_array_index (values, GValue, 14), G_TYPE_BYTES);
1979 g_value_take_boxed (&g_array_index (values, GValue, 14),
1980 g_bytes_new_static ("Blah", 5));
1982 g_value_init (&g_array_index (values, GValue, 15), G_TYPE_POINTER);
1983 g_value_set_pointer (&g_array_index (values, GValue, 15), &enum_type);
1985 g_value_init (&g_array_index (values, GValue, 16), test_get_type ());
1986 g_value_set_object (&g_array_index (values, GValue, 16), test);
1988 g_value_init (&g_array_index (values, GValue, 17), G_TYPE_VARIANT);
1989 g_value_take_variant (&g_array_index (values, GValue, 17),
1990 g_variant_ref_sink (g_variant_new_uint16 (99)));
1992 g_value_init (&g_array_index (values, GValue, 18), G_TYPE_INT64);
1993 g_value_set_int64 (&g_array_index (values, GValue, 18), G_MAXINT64 - 1234);
1995 g_value_init (&g_array_index (values, GValue, 19), G_TYPE_UINT64);
1996 g_value_set_uint64 (&g_array_index (values, GValue, 19), G_MAXUINT64 - 123456);
1998 id = g_signal_connect (test, "all-types", G_CALLBACK (all_types_handler_cb), &flags_type);
1999 signal_id = g_signal_lookup ("all-types", test_get_type ());
2000 g_assert_cmpuint (signal_id, >, 0);
2003 hook = g_signal_add_emission_hook (signal_id, 0, hook_func, &count, NULL);
2004 g_assert_cmpint (count, ==, 0);
2005 g_signal_emitv ((GValue *) values->data, signal_id, 0, NULL);
2006 g_assert_cmpint (count, ==, 1);
2007 g_signal_remove_emission_hook (signal_id, hook);
2008 g_clear_signal_handler (&id, test);
2011 signal_id = g_signal_lookup ("generic-marshaller-int-return", test_get_type ());
2012 g_assert_cmpuint (signal_id, >, 0);
2013 g_array_set_size (values, 1);
2015 id = g_signal_connect (test,
2016 "generic-marshaller-int-return",
2017 G_CALLBACK (on_generic_marshaller_int_return_signed_1),
2021 hook = g_signal_add_emission_hook (signal_id, 0, hook_func, &count, NULL);
2022 g_assert_cmpint (count, ==, 0);
2023 g_value_init (&return_value, G_TYPE_INT);
2024 g_signal_emitv ((GValue *) values->data, signal_id, 0, &return_value);
2025 g_assert_cmpint (count, ==, 1);
2026 g_assert_cmpint (g_value_get_int (&return_value), ==, -30);
2027 g_signal_remove_emission_hook (signal_id, hook);
2028 g_clear_signal_handler (&id, test);
2030 #ifdef G_ENABLE_DEBUG
2031 g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
2032 "*return*value*generic-marshaller-int-return*NULL*");
2033 g_signal_emitv ((GValue *) values->data, signal_id, 0, NULL);
2034 g_test_assert_expected_messages ();
2036 g_value_unset (&return_value);
2037 g_value_init (&return_value, G_TYPE_FLOAT);
2038 g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
2039 "*return*value*generic-marshaller-int-return*gfloat*");
2040 g_signal_emitv ((GValue *) values->data, signal_id, 0, &return_value);
2041 g_test_assert_expected_messages ();
2044 g_object_unref (test);
2045 g_array_unref (values);
2054 g_test_init (&argc, &argv, NULL);
2056 g_test_add_func ("/gobject/signals/all-types", test_all_types);
2057 g_test_add_func ("/gobject/signals/variant", test_variant_signal);
2058 g_test_add_func ("/gobject/signals/destroy-target-object", test_destroy_target_object);
2059 g_test_add_func ("/gobject/signals/generic-marshaller-1", test_generic_marshaller_signal_1);
2060 g_test_add_func ("/gobject/signals/generic-marshaller-2", test_generic_marshaller_signal_2);
2061 g_test_add_func ("/gobject/signals/generic-marshaller-enum-return-signed", test_generic_marshaller_signal_enum_return_signed);
2062 g_test_add_func ("/gobject/signals/generic-marshaller-enum-return-unsigned", test_generic_marshaller_signal_enum_return_unsigned);
2063 g_test_add_func ("/gobject/signals/generic-marshaller-int-return", test_generic_marshaller_signal_int_return);
2064 g_test_add_func ("/gobject/signals/generic-marshaller-uint-return", test_generic_marshaller_signal_uint_return);
2065 g_test_add_func ("/gobject/signals/generic-marshaller-interface-return", test_generic_marshaller_signal_interface_return);
2066 g_test_add_func ("/gobject/signals/custom-marshaller", test_custom_marshaller);
2067 g_test_add_func ("/gobject/signals/connect", test_connect);
2068 g_test_add_func ("/gobject/signals/emission-hook", test_emission_hook);
2069 g_test_add_func ("/gobject/signals/emitv", test_emitv);
2070 g_test_add_func ("/gobject/signals/accumulator", test_accumulator);
2071 g_test_add_func ("/gobject/signals/accumulator-class", test_accumulator_class);
2072 g_test_add_func ("/gobject/signals/introspection", test_introspection);
2073 g_test_add_func ("/gobject/signals/block-handler", test_block_handler);
2074 g_test_add_func ("/gobject/signals/stop-emission", test_stop_emission);
2075 g_test_add_func ("/gobject/signals/invocation-hint", test_invocation_hint);
2076 g_test_add_func ("/gobject/signals/test-disconnection-wrong-object", test_signal_disconnect_wrong_object);
2077 g_test_add_func ("/gobject/signals/clear-signal-handler", test_clear_signal_handler);
2078 g_test_add_func ("/gobject/signals/lookup", test_lookup);
2079 g_test_add_func ("/gobject/signals/lookup/invalid", test_lookup_invalid);
2080 g_test_add_func ("/gobject/signals/parse-name", test_parse_name);
2081 g_test_add_func ("/gobject/signals/parse-name/invalid", test_parse_name_invalid);
2082 g_test_add_data_func ("/gobject/signals/invalid-name/colon", "my_int:hello", test_signals_invalid_name);
2083 g_test_add_data_func ("/gobject/signals/invalid-name/first-char", "7zip", test_signals_invalid_name);
2084 g_test_add_data_func ("/gobject/signals/invalid-name/empty", "", test_signals_invalid_name);
2085 g_test_add_func ("/gobject/signals/is-valid-name", test_signal_is_valid_name);
2087 return g_test_run ();