• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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