1 #include <glib-object.h>
10 TEST_UNSIGNED_ENUM_FOO = 1,
11 TEST_UNSIGNED_ENUM_BAR = 0x80000000
15 test_enum_get_type (void)
17 static volatile gsize g_define_type_id__volatile = 0;
19 if (g_once_init_enter (&g_define_type_id__volatile))
21 static const GFlagsValue values[] = {
22 { TEST_ENUM_NONE, "TEST_ENUM_NONE", "none" },
23 { TEST_ENUM_FOO, "TEST_ENUM_FOO", "foo" },
24 { TEST_ENUM_BAR, "TEST_ENUM_BAR", "bar" },
27 GType g_define_type_id =
28 g_flags_register_static (g_intern_static_string ("TestEnum"), values);
29 g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
32 return g_define_type_id__volatile;
36 test_unsigned_enum_get_type (void)
38 static volatile gsize g_define_type_id__volatile = 0;
40 if (g_once_init_enter (&g_define_type_id__volatile))
42 static const GFlagsValue values[] = {
43 { TEST_UNSIGNED_ENUM_FOO, "TEST_UNSIGNED_ENUM_FOO", "foo" },
44 { TEST_UNSIGNED_ENUM_BAR, "TEST_UNSIGNED_ENUM_BAR", "bar" },
47 GType g_define_type_id =
48 g_flags_register_static (g_intern_static_string ("TestUnsignedEnum"), values);
49 g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
52 return g_define_type_id__volatile;
56 typedef struct _Test Test;
57 typedef struct _TestClass TestClass;
61 GObject parent_instance;
66 GObjectClass parent_class;
68 void (* variant_changed) (Test *, GVariant *);
71 static GType test_get_type (void);
72 G_DEFINE_TYPE (Test, test, G_TYPE_OBJECT)
75 test_init (Test *test)
80 test_class_init (TestClass *klass)
82 g_signal_new ("generic-marshaller-1",
83 G_TYPE_FROM_CLASS (klass),
84 G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
90 G_TYPE_CHAR, G_TYPE_UCHAR, G_TYPE_INT, G_TYPE_LONG, G_TYPE_POINTER, G_TYPE_DOUBLE, G_TYPE_FLOAT);
91 g_signal_new ("generic-marshaller-2",
92 G_TYPE_FROM_CLASS (klass),
93 G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
99 G_TYPE_INT, test_enum_get_type(), G_TYPE_INT, test_unsigned_enum_get_type (), G_TYPE_INT);
100 g_signal_new ("variant-changed-no-slot",
101 G_TYPE_FROM_CLASS (klass),
102 G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
105 g_cclosure_marshal_VOID__VARIANT,
109 g_signal_new ("variant-changed",
110 G_TYPE_FROM_CLASS (klass),
111 G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
112 G_STRUCT_OFFSET (TestClass, variant_changed),
114 g_cclosure_marshal_VOID__VARIANT,
121 test_variant_signal (void)
126 /* Tests that the signal emission consumes the variant,
127 * even if there are no handlers connected.
130 test = g_object_new (test_get_type (), NULL);
132 v = g_variant_new_boolean (TRUE);
134 g_assert (g_variant_is_floating (v));
135 g_signal_emit_by_name (test, "variant-changed-no-slot", v);
136 g_assert (!g_variant_is_floating (v));
139 v = g_variant_new_boolean (TRUE);
141 g_assert (g_variant_is_floating (v));
142 g_signal_emit_by_name (test, "variant-changed", v);
143 g_assert (!g_variant_is_floating (v));
146 g_object_unref (test);
150 on_generic_marshaller_1 (Test *obj,
160 g_assert_cmpint (v_schar, ==, 42);
161 g_assert_cmpint (v_uchar, ==, 43);
162 g_assert_cmpint (v_int, ==, 4096);
163 g_assert_cmpint (v_long, ==, 8192);
164 g_assert (v_pointer == NULL);
165 g_assert_cmpfloat (v_double, >, 0.0);
166 g_assert_cmpfloat (v_double, <, 1.0);
167 g_assert_cmpfloat (v_float, >, 5.0);
168 g_assert_cmpfloat (v_float, <, 6.0);
172 test_generic_marshaller_signal_1 (void)
175 test = g_object_new (test_get_type (), NULL);
177 g_signal_connect (test, "generic-marshaller-1", G_CALLBACK (on_generic_marshaller_1), NULL);
179 g_signal_emit_by_name (test, "generic-marshaller-1", 42, 43, 4096, 8192, NULL, 0.5, 5.5);
181 g_object_unref (test);
185 on_generic_marshaller_2 (Test *obj,
189 TestUnsignedEnum v_uenum,
192 g_assert_cmpint (v_int1, ==, 42);
193 g_assert_cmpint (v_enum, ==, TEST_ENUM_BAR);
194 g_assert_cmpint (v_int2, ==, 43);
195 g_assert_cmpint (v_uenum, ==, TEST_UNSIGNED_ENUM_BAR);
196 g_assert_cmpint (v_int3, ==, 44);
200 test_generic_marshaller_signal_2 (void)
203 test = g_object_new (test_get_type (), NULL);
205 g_signal_connect (test, "generic-marshaller-2", G_CALLBACK (on_generic_marshaller_2), NULL);
207 g_signal_emit_by_name (test, "generic-marshaller-2", 42, TEST_ENUM_BAR, 43, TEST_UNSIGNED_ENUM_BAR, 44);
209 g_object_unref (test);
220 g_test_init (&argc, &argv, NULL);
222 g_test_add_func ("/gobject/signals/variant", test_variant_signal);
223 g_test_add_func ("/gobject/signals/generic-marshaller-1", test_generic_marshaller_signal_1);
224 g_test_add_func ("/gobject/signals/generic-marshaller-2", test_generic_marshaller_signal_2);
226 return g_test_run ();