5a396be956511f1f0777d576aaac2aca3b5199e4
[platform/upstream/glib.git] / gobject / tests / reference.c
1 #include <glib-object.h>
2
3 static void
4 test_fundamentals (void)
5 {
6   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_NONE));
7   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_INTERFACE));
8   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_CHAR));
9   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_UCHAR));
10   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_BOOLEAN));
11   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_INT));
12   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_UINT));
13   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_LONG));
14   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_ULONG));
15   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_INT64));
16   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_UINT64));
17   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_ENUM));
18   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_FLAGS));
19   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_FLOAT));
20   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_DOUBLE));
21   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_STRING));
22   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_POINTER));
23   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_BOXED));
24   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_PARAM));
25   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_OBJECT));
26   g_assert (G_TYPE_OBJECT == g_object_get_type ());
27   g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_VARIANT));
28   g_assert (G_TYPE_VARIANT == g_variant_get_gtype ());
29   g_assert (G_TYPE_IS_DERIVED (G_TYPE_INITIALLY_UNOWNED));
30
31   g_assert (g_type_fundamental_next () == G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST));
32 }
33
34 static void
35 test_type_qdata (void)
36 {
37   gchar *data;
38
39   g_type_set_qdata (G_TYPE_ENUM, g_quark_from_string ("bla"), "bla");
40   data = g_type_get_qdata (G_TYPE_ENUM, g_quark_from_string ("bla"));
41   g_assert_cmpstr (data, ==, "bla");
42 }
43
44 static void
45 test_type_query (void)
46 {
47   GTypeQuery query;
48
49   g_type_query (G_TYPE_ENUM, &query);
50   g_assert_cmpint (query.type, ==, G_TYPE_ENUM);
51   g_assert_cmpstr (query.type_name, ==, "GEnum");
52   g_assert_cmpint (query.class_size, ==, sizeof (GEnumClass));
53   g_assert_cmpint (query.instance_size, ==, 0);
54 }
55
56 typedef struct _MyObject MyObject;
57 typedef struct _MyObjectClass MyObjectClass;
58 typedef struct _MyObjectClassPrivate MyObjectClassPrivate;
59
60 struct _MyObject
61 {
62   GObject parent_instance;
63
64   gint count;
65 };
66
67 struct _MyObjectClass
68 {
69   GObjectClass parent_class;
70 };
71
72 struct _MyObjectClassPrivate
73 {
74   gint secret_class_count;
75 };
76
77 static GType my_object_get_type (void);
78 G_DEFINE_TYPE_WITH_CODE (MyObject, my_object, G_TYPE_OBJECT,
79                          g_type_add_class_private (g_define_type_id, sizeof (MyObjectClassPrivate)) );
80
81 static void
82 my_object_init (MyObject *obj)
83 {
84   obj->count = 42;
85 }
86
87 static void
88 my_object_class_init (MyObjectClass *klass)
89 {
90 }
91
92 static void
93 test_class_private (void)
94 {
95   GObject *obj;
96   MyObjectClass *class;
97   MyObjectClassPrivate *priv;
98
99   obj = g_object_new (my_object_get_type (), NULL);
100
101   class = g_type_class_ref (my_object_get_type ());
102   priv = G_TYPE_CLASS_GET_PRIVATE (class, my_object_get_type (), MyObjectClassPrivate);
103   priv->secret_class_count = 13;
104   g_type_class_unref (class);
105
106   g_object_unref (obj);
107
108   g_assert_cmpint (g_type_qname (my_object_get_type ()), ==, g_quark_from_string ("MyObject"));
109 }
110
111 static void
112 test_clear (void)
113 {
114   GObject *o = NULL;
115   GObject *tmp;
116
117   g_clear_object (&o);
118   g_assert (o == NULL);
119
120   tmp = g_object_new (G_TYPE_OBJECT, NULL);
121   g_assert_cmpint (tmp->ref_count, ==, 1);
122   o = g_object_ref (tmp);
123   g_assert (o != NULL);
124
125   g_assert_cmpint (tmp->ref_count, ==, 2);
126   g_clear_object (&o);
127   g_assert_cmpint (tmp->ref_count, ==, 1);
128   g_assert (o == NULL);
129
130   g_object_unref (tmp);
131 }
132
133 static void
134 test_clear_function (void)
135 {
136   volatile GObject *o = NULL;
137   GObject *tmp;
138
139   (g_clear_object) (&o);
140   g_assert (o == NULL);
141
142   tmp = g_object_new (G_TYPE_OBJECT, NULL);
143   g_assert_cmpint (tmp->ref_count, ==, 1);
144   o = g_object_ref (tmp);
145   g_assert (o != NULL);
146
147   g_assert_cmpint (tmp->ref_count, ==, 2);
148   (g_clear_object) (&o);
149   g_assert_cmpint (tmp->ref_count, ==, 1);
150   g_assert (o == NULL);
151
152   g_object_unref (tmp);
153 }
154
155 static void
156 test_object_value (void)
157 {
158   GObject *v;
159   GObject *v2;
160   GValue value = G_VALUE_INIT;
161
162   g_value_init (&value, G_TYPE_OBJECT);
163
164   v = g_object_new (G_TYPE_OBJECT, NULL);
165   g_value_take_object (&value, v);
166
167   v2 = g_value_get_object (&value);
168   g_assert (v2 == v);
169
170   v2 = g_value_dup_object (&value);
171   g_assert (v2 == v);  /* objects use ref/unref for copy/free */
172   g_object_unref (v2);
173
174   g_value_unset (&value);
175 }
176
177 static void
178 test_initially_unowned (void)
179 {
180   GObject *obj;
181
182   obj = g_object_new (G_TYPE_INITIALLY_UNOWNED, NULL);
183   g_assert (g_object_is_floating (obj));
184   g_assert_cmpint (obj->ref_count, ==, 1);
185
186   g_object_ref_sink (obj);
187   g_assert (!g_object_is_floating (obj));
188   g_assert_cmpint (obj->ref_count, ==, 1);
189
190   g_object_ref_sink (obj);
191   g_assert (!g_object_is_floating (obj));
192   g_assert_cmpint (obj->ref_count, ==, 2);
193
194   g_object_unref (obj);
195   g_assert_cmpint (obj->ref_count, ==, 1);
196
197   g_object_force_floating (obj);
198   g_assert (g_object_is_floating (obj));
199   g_assert_cmpint (obj->ref_count, ==, 1);
200
201   g_object_ref_sink (obj);
202   g_object_unref (obj);
203 }
204
205 static void
206 test_weak_pointer (void)
207 {
208   GObject *obj;
209   gpointer weak;
210   gpointer weak2;
211
212   weak = weak2 = obj = g_object_new (G_TYPE_OBJECT, NULL);
213   g_assert_cmpint (obj->ref_count, ==, 1);
214
215   g_object_add_weak_pointer (obj, &weak);
216   g_object_add_weak_pointer (obj, &weak2);
217   g_assert_cmpint (obj->ref_count, ==, 1);
218   g_assert (weak == obj);
219   g_assert (weak2 == obj);
220
221   g_object_remove_weak_pointer (obj, &weak2);
222   g_assert_cmpint (obj->ref_count, ==, 1);
223   g_assert (weak == obj);
224   g_assert (weak2 == obj);
225
226   g_object_unref (obj);
227   g_assert (weak == NULL);
228   g_assert (weak2 == obj);
229 }
230
231 int
232 main (int argc, char **argv)
233 {
234   g_test_init (&argc, &argv, NULL);
235
236   g_type_init ();
237
238   g_test_add_func ("/type/fundamentals", test_fundamentals);
239   g_test_add_func ("/type/qdata", test_type_qdata);
240   g_test_add_func ("/type/query", test_type_query);
241   g_test_add_func ("/type/class-private", test_class_private);
242   g_test_add_func ("/object/clear", test_clear);
243   g_test_add_func ("/object/clear-function", test_clear_function);
244   g_test_add_func ("/object/value", test_object_value);
245   g_test_add_func ("/object/initially-unowned", test_initially_unowned);
246   g_test_add_func ("/object/weak-pointer", test_weak_pointer);
247
248   return g_test_run ();
249 }