1 /* We are testing some deprecated APIs here */
2 #define GLIB_DISABLE_DEPRECATION_WARNINGS
3
4 #include <glib-object.h>
5
6 typedef struct {
7 GObject parent_instance;
8 } TestObject;
9
10 typedef struct {
11 int dummy_0;
12 float dummy_1;
13 } TestObjectPrivate;
14
15 typedef struct {
16 GObjectClass parent_class;
17 } TestObjectClass;
18
19 GType test_object_get_type (void);
20
G_DEFINE_TYPE_WITH_CODE(TestObject,test_object,G_TYPE_OBJECT,G_ADD_PRIVATE (TestObject))21 G_DEFINE_TYPE_WITH_CODE (TestObject, test_object, G_TYPE_OBJECT,
22 G_ADD_PRIVATE (TestObject))
23
24 static void
25 test_object_class_init (TestObjectClass *klass)
26 {
27 }
28
29 static void
test_object_init(TestObject * self)30 test_object_init (TestObject *self)
31 {
32 TestObjectPrivate *priv = test_object_get_instance_private (self);
33
34 if (g_test_verbose ())
35 g_printerr ("Offset of %sPrivate for type '%s': %d\n",
36 G_OBJECT_TYPE_NAME (self),
37 G_OBJECT_TYPE_NAME (self),
38 TestObject_private_offset);
39
40 priv->dummy_0 = 42;
41 priv->dummy_1 = 3.14159f;
42 }
43
44 static int
test_object_get_dummy_0(TestObject * self)45 test_object_get_dummy_0 (TestObject *self)
46 {
47 TestObjectPrivate *priv = test_object_get_instance_private (self);
48
49 return priv->dummy_0;
50 }
51
52 static float
test_object_get_dummy_1(TestObject * self)53 test_object_get_dummy_1 (TestObject *self)
54 {
55 TestObjectPrivate *priv = test_object_get_instance_private (self);
56
57 return priv->dummy_1;
58 }
59
60 typedef struct {
61 TestObject parent_instance;
62 } TestDerived;
63
64 typedef struct {
65 char *dummy_2;
66 } TestDerivedPrivate;
67
68 typedef struct {
69 TestObjectClass parent_class;
70 } TestDerivedClass;
71
72 GType test_derived_get_type (void);
73
G_DEFINE_TYPE_WITH_CODE(TestDerived,test_derived,test_object_get_type (),G_ADD_PRIVATE (TestDerived))74 G_DEFINE_TYPE_WITH_CODE (TestDerived, test_derived, test_object_get_type (),
75 G_ADD_PRIVATE (TestDerived))
76
77 static void
78 test_derived_finalize (GObject *obj)
79 {
80 TestDerivedPrivate *priv = test_derived_get_instance_private ((TestDerived *) obj);
81
82 g_free (priv->dummy_2);
83
84 G_OBJECT_CLASS (test_derived_parent_class)->finalize (obj);
85 }
86
87 static void
test_derived_class_init(TestDerivedClass * klass)88 test_derived_class_init (TestDerivedClass *klass)
89 {
90 G_OBJECT_CLASS (klass)->finalize = test_derived_finalize;
91 }
92
93 static void
test_derived_init(TestDerived * self)94 test_derived_init (TestDerived *self)
95 {
96 TestDerivedPrivate *priv = test_derived_get_instance_private (self);
97
98 if (g_test_verbose ())
99 g_printerr ("Offset of %sPrivate for type '%s': %d\n",
100 G_OBJECT_TYPE_NAME (self),
101 G_OBJECT_TYPE_NAME (self),
102 TestDerived_private_offset);
103
104 priv->dummy_2 = g_strdup ("Hello");
105 }
106
107 static const char *
test_derived_get_dummy_2(TestDerived * self)108 test_derived_get_dummy_2 (TestDerived *self)
109 {
110 TestDerivedPrivate *priv = test_derived_get_instance_private (self);
111
112 return priv->dummy_2;
113 }
114
115 typedef struct {
116 TestObject parent_instance;
117 } TestMixed;
118
119 typedef struct {
120 gint dummy_3;
121 } TestMixedPrivate;
122
123 typedef struct {
124 TestObjectClass parent_class;
125 } TestMixedClass;
126
127 GType test_mixed_get_type (void);
128
G_DEFINE_TYPE(TestMixed,test_mixed,test_object_get_type ())129 G_DEFINE_TYPE (TestMixed, test_mixed, test_object_get_type ())
130
131 static void
132 test_mixed_class_init (TestMixedClass *klass)
133 {
134 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
135 g_type_class_add_private (klass, sizeof (TestMixedPrivate));
136 G_GNUC_END_IGNORE_DEPRECATIONS
137 }
138
139 static void
test_mixed_init(TestMixed * self)140 test_mixed_init (TestMixed *self)
141 {
142 TestMixedPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, test_mixed_get_type (), TestMixedPrivate);
143
144 if (g_test_verbose ())
145 g_printerr ("Offset of %sPrivate for type '%s': %d\n",
146 G_OBJECT_TYPE_NAME (self),
147 G_OBJECT_TYPE_NAME (self),
148 TestMixed_private_offset);
149
150 priv->dummy_3 = 47;
151 }
152
153 static gint
test_mixed_get_dummy_3(TestMixed * self)154 test_mixed_get_dummy_3 (TestMixed *self)
155 {
156 TestMixedPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, test_mixed_get_type (), TestMixedPrivate);
157
158 return priv->dummy_3;
159 }
160
161 typedef struct {
162 TestMixed parent_instance;
163 } TestMixedDerived;
164
165 typedef struct {
166 gint64 dummy_4;
167 } TestMixedDerivedPrivate;
168
169 typedef struct {
170 TestMixedClass parent_class;
171 } TestMixedDerivedClass;
172
173 GType test_mixed_derived_get_type (void);
174
G_DEFINE_TYPE_WITH_CODE(TestMixedDerived,test_mixed_derived,test_mixed_get_type (),G_ADD_PRIVATE (TestMixedDerived))175 G_DEFINE_TYPE_WITH_CODE (TestMixedDerived, test_mixed_derived, test_mixed_get_type (),
176 G_ADD_PRIVATE (TestMixedDerived))
177
178 static void
179 test_mixed_derived_class_init (TestMixedDerivedClass *klass)
180 {
181 }
182
183 static void
test_mixed_derived_init(TestMixedDerived * self)184 test_mixed_derived_init (TestMixedDerived *self)
185 {
186 TestMixedDerivedPrivate *priv = test_mixed_derived_get_instance_private (self);
187
188 if (g_test_verbose ())
189 g_printerr ("Offset of %sPrivate for type '%s': %d\n",
190 G_OBJECT_TYPE_NAME (self),
191 G_OBJECT_TYPE_NAME (self),
192 TestMixedDerived_private_offset);
193
194 priv->dummy_4 = g_get_monotonic_time ();
195 }
196
197 static gint64
test_mixed_derived_get_dummy_4(TestMixedDerived * self)198 test_mixed_derived_get_dummy_4 (TestMixedDerived *self)
199 {
200 TestMixedDerivedPrivate *priv = test_mixed_derived_get_instance_private (self);
201
202 return priv->dummy_4;
203 }
204
205 static void
private_instance(void)206 private_instance (void)
207 {
208 TestObject *obj = g_object_new (test_object_get_type (), NULL);
209 gpointer class;
210 gint offset;
211
212 g_assert_cmpint (test_object_get_dummy_0 (obj), ==, 42);
213 g_assert_cmpfloat (test_object_get_dummy_1 (obj), ==, 3.14159f);
214
215 class = g_type_class_ref (test_object_get_type ());
216 offset = g_type_class_get_instance_private_offset (class);
217 g_type_class_unref (class);
218
219 g_assert (offset == TestObject_private_offset);
220
221 g_object_unref (obj);
222 }
223
224 static void
private_derived_instance(void)225 private_derived_instance (void)
226 {
227 TestDerived *obj = g_object_new (test_derived_get_type (), NULL);
228
229 g_assert_cmpstr (test_derived_get_dummy_2 (obj), ==, "Hello");
230 g_assert_cmpint (test_object_get_dummy_0 ((TestObject *) obj), ==, 42);
231
232 g_object_unref (obj);
233 }
234
235 static void
private_mixed_derived_instance(void)236 private_mixed_derived_instance (void)
237 {
238 TestMixedDerived *derived = g_object_new (test_mixed_derived_get_type (), NULL);
239 TestMixed *mixed = g_object_new (test_mixed_get_type (), NULL);
240
241 g_assert_cmpint (test_mixed_get_dummy_3 (mixed), ==, 47);
242 g_assert (test_mixed_derived_get_dummy_4 (derived) <= g_get_monotonic_time ());
243
244 g_object_unref (derived);
245 g_object_unref (mixed);
246 }
247
248 int
main(int argc,char * argv[])249 main (int argc,
250 char *argv[])
251 {
252 g_test_init (&argc, &argv, NULL);
253
254 g_test_add_func ("/private/instance", private_instance);
255 g_test_add_func ("/private/derived-instance", private_derived_instance);
256 g_test_add_func ("/private/mixed-derived-instance", private_mixed_derived_instance);
257
258 return g_test_run ();
259 }
260