tests: Add a some torture test cases for the generic marshaller
[platform/upstream/glib.git] / gobject / tests / signals.c
1 #include <glib-object.h>
2
3 typedef enum {
4   TEST_ENUM_NONE = 0,
5   TEST_ENUM_FOO = 1,
6   TEST_ENUM_BAR = 2
7 } TestEnum;
8
9 typedef enum {
10   TEST_UNSIGNED_ENUM_FOO = 1,
11   TEST_UNSIGNED_ENUM_BAR = 0x80000000
12 } TestUnsignedEnum;
13
14 GType
15 test_enum_get_type (void)
16 {
17   static volatile gsize g_define_type_id__volatile = 0;
18
19   if (g_once_init_enter (&g_define_type_id__volatile))
20     {
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" },
25         { 0, NULL, NULL }
26       };
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);
30     }
31
32   return g_define_type_id__volatile;
33 }
34
35 GType
36 test_unsigned_enum_get_type (void)
37 {
38   static volatile gsize g_define_type_id__volatile = 0;
39
40   if (g_once_init_enter (&g_define_type_id__volatile))
41     {
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" },
45         { 0, NULL, NULL }
46       };
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);
50     }
51
52   return g_define_type_id__volatile;
53 }
54
55
56 typedef struct _Test Test;
57 typedef struct _TestClass TestClass;
58
59 struct _Test
60 {
61   GObject parent_instance;
62 };
63
64 struct _TestClass
65 {
66   GObjectClass parent_class;
67
68   void (* variant_changed) (Test *, GVariant *);
69 };
70
71 static GType test_get_type (void);
72 G_DEFINE_TYPE (Test, test, G_TYPE_OBJECT)
73
74 static void
75 test_init (Test *test)
76 {
77 }
78
79 static void
80 test_class_init (TestClass *klass)
81 {
82   g_signal_new ("generic-marshaller-1",
83                 G_TYPE_FROM_CLASS (klass),
84                 G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
85                 0,
86                 NULL, NULL,
87                 NULL,
88                 G_TYPE_NONE,
89                 7,
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,
94                 0,
95                 NULL, NULL,
96                 NULL,
97                 G_TYPE_NONE,
98                 5,
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,
103                 0,
104                 NULL, NULL,
105                 g_cclosure_marshal_VOID__VARIANT,
106                 G_TYPE_NONE,
107                 1,
108                 G_TYPE_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),
113                 NULL, NULL,
114                 g_cclosure_marshal_VOID__VARIANT,
115                 G_TYPE_NONE,
116                 1,
117                 G_TYPE_VARIANT);
118 }
119
120 static void
121 test_variant_signal (void)
122 {
123   Test *test;
124   GVariant *v;
125
126   /* Tests that the signal emission consumes the variant,
127    * even if there are no handlers connected.
128    */
129
130   test = g_object_new (test_get_type (), NULL);
131
132   v = g_variant_new_boolean (TRUE);
133   g_variant_ref (v);
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));
137   g_variant_unref (v);
138
139   v = g_variant_new_boolean (TRUE);
140   g_variant_ref (v);
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));
144   g_variant_unref (v);
145
146   g_object_unref (test);
147 }
148
149 static void
150 on_generic_marshaller_1 (Test *obj,
151                          gint8 v_schar,
152                          guint8 v_uchar,
153                          gint v_int,
154                          glong v_long,
155                          gpointer v_pointer,
156                          gdouble v_double,
157                          gfloat v_float,
158                          gpointer user_data)
159 {
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);
169 }
170                          
171 static void
172 test_generic_marshaller_signal_1 (void)
173 {
174   Test *test;
175   test = g_object_new (test_get_type (), NULL);
176
177   g_signal_connect (test, "generic-marshaller-1", G_CALLBACK (on_generic_marshaller_1), NULL);
178
179   g_signal_emit_by_name (test, "generic-marshaller-1", 42, 43, 4096, 8192, NULL, 0.5, 5.5);
180
181   g_object_unref (test);
182 }
183
184 static void
185 on_generic_marshaller_2 (Test *obj,
186                          gint        v_int1,
187                          TestEnum    v_enum,
188                          gint        v_int2,
189                          TestUnsignedEnum v_uenum,
190                          gint        v_int3)
191 {
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);
197 }
198
199 static void
200 test_generic_marshaller_signal_2 (void)
201 {
202   Test *test;
203   test = g_object_new (test_get_type (), NULL);
204
205   g_signal_connect (test, "generic-marshaller-2", G_CALLBACK (on_generic_marshaller_2), NULL);
206
207   g_signal_emit_by_name (test, "generic-marshaller-2", 42, TEST_ENUM_BAR, 43, TEST_UNSIGNED_ENUM_BAR, 44);
208
209   g_object_unref (test);
210 }
211
212 /* --- */
213
214 int
215 main (int argc,
216      char *argv[])
217 {
218   g_type_init ();
219
220   g_test_init (&argc, &argv, NULL);
221
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);
225
226   return g_test_run ();
227 }