1#include <glib-object.h>
2
3static void
4test_registration_serial (void)
5{
6 gint serial1, serial2, serial3;
7
8 serial1 = g_type_get_type_registration_serial ();
9 g_pointer_type_register_static (name: "my+pointer");
10 serial2 = g_type_get_type_registration_serial ();
11 g_assert (serial1 != serial2);
12 serial3 = g_type_get_type_registration_serial ();
13 g_assert (serial2 == serial3);
14}
15
16typedef struct {
17 GTypeInterface g_iface;
18} BarInterface;
19
20GType bar_get_type (void);
21
22G_DEFINE_INTERFACE (Bar, bar, G_TYPE_OBJECT)
23
24static void
25bar_default_init (BarInterface *iface)
26{
27}
28
29typedef struct {
30 GTypeInterface g_iface;
31} FooInterface;
32
33GType foo_get_type (void);
34
35G_DEFINE_INTERFACE_WITH_CODE (Foo, foo, G_TYPE_OBJECT,
36 g_type_interface_add_prerequisite (g_define_type_id, bar_get_type ()))
37
38static void
39foo_default_init (FooInterface *iface)
40{
41}
42
43typedef struct {
44 GTypeInterface g_iface;
45} BaaInterface;
46
47GType baa_get_type (void);
48
49G_DEFINE_INTERFACE (Baa, baa, G_TYPE_INVALID)
50
51static void
52baa_default_init (BaaInterface *iface)
53{
54}
55
56typedef struct {
57 GTypeInterface g_iface;
58} BooInterface;
59
60GType boo_get_type (void);
61
62G_DEFINE_INTERFACE_WITH_CODE (Boo, boo, G_TYPE_INVALID,
63 g_type_interface_add_prerequisite (g_define_type_id, baa_get_type ()))
64
65static void
66boo_default_init (BooInterface *iface)
67{
68}
69
70typedef struct {
71 GTypeInterface g_iface;
72} BibiInterface;
73
74GType bibi_get_type (void);
75
76G_DEFINE_INTERFACE (Bibi, bibi, G_TYPE_INITIALLY_UNOWNED)
77
78static void
79bibi_default_init (BibiInterface *iface)
80{
81}
82
83typedef struct {
84 GTypeInterface g_iface;
85} BozoInterface;
86
87GType bozo_get_type (void);
88
89G_DEFINE_INTERFACE_WITH_CODE (Bozo, bozo, G_TYPE_INVALID,
90 g_type_interface_add_prerequisite (g_define_type_id, foo_get_type ());
91 g_type_interface_add_prerequisite (g_define_type_id, bibi_get_type ()))
92
93static void
94bozo_default_init (BozoInterface *iface)
95{
96}
97
98
99
100static void
101test_interface_prerequisite (void)
102{
103 GType *prereqs;
104 guint n_prereqs;
105 gpointer iface;
106 gpointer parent;
107
108 prereqs = g_type_interface_prerequisites (interface_type: foo_get_type (), n_prerequisites: &n_prereqs);
109 g_assert_cmpint (n_prereqs, ==, 2);
110 g_assert (prereqs[0] == bar_get_type ());
111 g_assert (prereqs[1] == G_TYPE_OBJECT);
112 g_assert (g_type_interface_instantiatable_prerequisite (foo_get_type ()) == G_TYPE_OBJECT);
113
114 iface = g_type_default_interface_ref (g_type: foo_get_type ());
115 parent = g_type_interface_peek_parent (g_iface: iface);
116 g_assert (parent == NULL);
117 g_type_default_interface_unref (g_iface: iface);
118
119 g_free (mem: prereqs);
120
121 g_assert_cmpint (g_type_interface_instantiatable_prerequisite (baa_get_type ()), ==, G_TYPE_INVALID);
122 g_assert_cmpint (g_type_interface_instantiatable_prerequisite (boo_get_type ()), ==, G_TYPE_INVALID);
123
124 g_assert_cmpint (g_type_interface_instantiatable_prerequisite (bozo_get_type ()), ==, G_TYPE_INITIALLY_UNOWNED);
125}
126
127typedef struct {
128 GTypeInterface g_iface;
129} BazInterface;
130
131GType baz_get_type (void);
132
133G_DEFINE_INTERFACE (Baz, baz, G_TYPE_OBJECT)
134
135static void
136baz_default_init (BazInterface *iface)
137{
138}
139
140typedef struct {
141 GObject parent;
142} Bazo;
143
144typedef struct {
145 GObjectClass parent_class;
146} BazoClass;
147
148GType bazo_get_type (void);
149static void bazo_iface_init (BazInterface *i);
150
151G_DEFINE_TYPE_WITH_CODE (Bazo, bazo, G_TYPE_INITIALLY_UNOWNED,
152 G_IMPLEMENT_INTERFACE (baz_get_type (),
153 bazo_iface_init);)
154
155static void
156bazo_init (Bazo *b)
157{
158}
159
160static void
161bazo_class_init (BazoClass *c)
162{
163}
164
165static void
166bazo_iface_init (BazInterface *i)
167{
168}
169
170static gint check_called;
171
172static void
173check_func (gpointer check_data,
174 gpointer g_iface)
175{
176 g_assert (check_data == &check_called);
177
178 check_called++;
179}
180
181static void
182test_interface_check (void)
183{
184 GObject *o;
185
186 check_called = 0;
187 g_type_add_interface_check (check_data: &check_called, check_func);
188 o = g_object_new (object_type: bazo_get_type (), NULL);
189 g_object_unref (object: o);
190 g_assert_cmpint (check_called, ==, 1);
191 g_type_remove_interface_check (check_data: &check_called, check_func);
192}
193
194static void
195test_next_base (void)
196{
197 GType type;
198
199 type = g_type_next_base (leaf_type: bazo_get_type (), G_TYPE_OBJECT);
200
201 g_assert (type == G_TYPE_INITIALLY_UNOWNED);
202}
203
204int
205main (int argc, char *argv[])
206{
207 g_test_init (argc: &argc, argv: &argv, NULL);
208
209 g_test_add_func (testpath: "/type/registration-serial", test_func: test_registration_serial);
210 g_test_add_func (testpath: "/type/interface-prerequisite", test_func: test_interface_prerequisite);
211 g_test_add_func (testpath: "/type/interface-check", test_func: test_interface_check);
212 g_test_add_func (testpath: "/type/next-base", test_func: test_next_base);
213
214 return g_test_run ();
215}
216

source code of gtk/subprojects/glib/gobject/tests/type.c