Update contrib.
1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 2001, 2003 Red Hat, Inc.
3 * Portion Copyright © 2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General
15 * Public License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #define G_LOG_DOMAIN "TestDefaultIface"
23 #undef G_DISABLE_ASSERT
24 #undef G_DISABLE_CHECKS
25 #undef G_DISABLE_CAST_CHECKS
27 #include <glib-object.h>
29 #include "testcommon.h"
30 #include "testmodule.h"
35 #include "mrt2_glib2_test.h"
38 static GType test_dynamic_iface_type;
39 static GType registered_inteface;
40 static GType registered_enum;
41 static GType registered_flag;
43 static gboolean dynamic_iface_init = FALSE;
47 /* This test tests getting the default vtable for an interface
48 * and the initialization and finalization of such default
51 * We test this both for static and for dynamic interfaces.
54 /**********************************************************************
55 * Static interface tests
56 **********************************************************************/
58 typedef struct _TestStaticIfaceClass TestStaticIfaceClass;
60 struct _TestStaticIfaceClass
62 GTypeInterface base_iface;
66 #define TEST_TYPE_STATIC_IFACE (test_static_iface_get_type ())
69 test_static_iface_default_init (TestStaticIfaceClass *iface)
74 DEFINE_IFACE (TestStaticIface, test_static_iface,
75 NULL, test_static_iface_default_init)
78 test_static_iface (void)
80 TestStaticIfaceClass *static_iface;
82 /* Not loaded until we call ref for the first time */
83 static_iface = g_type_default_interface_peek (TEST_TYPE_STATIC_IFACE);
84 g_assert (static_iface == NULL);
87 static_iface = g_type_default_interface_ref (TEST_TYPE_STATIC_IFACE);
88 g_assert (static_iface && static_iface->val == 42);
91 static_iface = g_type_default_interface_peek (TEST_TYPE_STATIC_IFACE);
92 g_assert (static_iface && static_iface->val == 42);
94 /* Unref does nothing */
95 g_type_default_interface_unref (static_iface);
97 /* And peek still works */
98 static_iface = g_type_default_interface_peek (TEST_TYPE_STATIC_IFACE);
99 g_assert (static_iface && static_iface->val == 42);
102 /**********************************************************************
103 * Dynamic interface tests
104 **********************************************************************/
106 typedef struct _TestDynamicIfaceClass TestDynamicIfaceClass;
108 struct _TestDynamicIfaceClass
110 GTypeInterface base_iface;
115 #define TEST_TYPE_DYNAMIC_IFACE (test_dynamic_iface_type)
118 test_dynamic_iface_default_init (TestStaticIfaceClass *iface)
120 dynamic_iface_init = TRUE;
125 test_dynamic_iface_default_finalize (TestStaticIfaceClass *iface)
127 dynamic_iface_init = FALSE;
131 test_dynamic_iface_register (GTypeModule *module)
133 static const GTypeInfo iface_info =
135 sizeof (TestDynamicIfaceClass),
136 (GBaseInitFunc) NULL,
137 (GBaseFinalizeFunc) NULL,
138 (GClassInitFunc) test_dynamic_iface_default_init,
139 (GClassFinalizeFunc) test_dynamic_iface_default_finalize
142 test_dynamic_iface_type = g_type_module_register_type (module, G_TYPE_INTERFACE,
143 "TestDynamicIface", &iface_info, 0);
146 static void test_module_add_interface(GTypeModule* module)
148 static const GTypeInfo info = {
149 sizeof (MamanBazClass),
150 NULL, /* base_init */
151 NULL, /* base_finalize */
152 NULL, /* class_init */
153 NULL, /* class_finalize */
154 NULL, /* class_data */
157 baz_instance_init /* instance_init */
159 static const GInterfaceInfo ibaz_info = {
160 (GInterfaceInitFunc) baz_interface_init, /* interface_init */
161 NULL, /* interface_finalize */
162 NULL /* interface_data */
164 baz_type = g_type_module_register_type (module, G_TYPE_OBJECT,
168 g_type_module_add_interface (module,baz_type,MAMAN_TYPE_IBAZ, &ibaz_info);
173 static void test_g_type_module_register_flags(GTypeModule* module)
175 static GFlagsValue flags_array[] =
179 { 4, "EFour", "Four"},
183 registered_flag = g_type_module_register_flags(module, "egFlag",flags_array);
187 static void test_g_type_module_register_enum(GTypeModule* module)
189 static GEnumValue enum_array[] =
193 { 4, "EFour", "Four"},
197 registered_enum = g_type_module_register_enum(module, "egEnum", enum_array);
203 module_register (GTypeModule *module)
205 test_dynamic_iface_register (module);
206 test_module_add_interface(module);
207 test_g_type_module_register_flags(module);
208 test_g_type_module_register_enum(module);
212 test_dynamic_iface (void)
215 TestDynamicIfaceClass *dynamic_iface;
217 module = test_module_new (module_register);
219 /* Not loaded until we call ref for the first time */
220 dynamic_iface = g_type_default_interface_peek (TEST_TYPE_DYNAMIC_IFACE);
221 g_assert (dynamic_iface == NULL);
224 dynamic_iface = g_type_default_interface_ref (TEST_TYPE_DYNAMIC_IFACE);
225 g_assert (dynamic_iface_init);
226 g_assert (dynamic_iface && dynamic_iface->val == 42);
228 /* Peek then works */
229 dynamic_iface = g_type_default_interface_peek (TEST_TYPE_DYNAMIC_IFACE);
230 g_assert (dynamic_iface && dynamic_iface->val == 42);
232 /* Unref causes finalize */
233 g_type_default_interface_unref (dynamic_iface);
234 g_assert (!dynamic_iface_init);
236 /* Peek returns NULL */
237 dynamic_iface = g_type_default_interface_peek (TEST_TYPE_DYNAMIC_IFACE);
238 g_assert (dynamic_iface == NULL);
241 dynamic_iface = g_type_default_interface_ref (TEST_TYPE_DYNAMIC_IFACE);
242 g_assert (dynamic_iface_init);
243 g_assert (dynamic_iface && dynamic_iface->val == 42);
245 /* And Unref causes finalize once more*/
246 g_type_default_interface_unref (dynamic_iface);
247 g_assert (!dynamic_iface_init);
253 GFlagsValue* retrievedValue;
254 GFlagsClass* pPointer = g_type_class_ref(registered_flag);
257 retrievedValue = g_flags_get_value_by_name(pPointer,"EOne");
258 g_assert(retrievedValue && retrievedValue->value == 1);
259 retrievedValue = g_flags_get_value_by_name(pPointer,"EFive");
260 g_assert(retrievedValue == NULL);
261 g_type_class_unref(pPointer);
267 GEnumValue* retrievedValue;
268 GEnumClass* pPointer = g_type_class_ref(registered_enum);
271 retrievedValue = g_enum_get_value_by_name(pPointer,"EOne");
272 g_assert(retrievedValue && retrievedValue->value == 1);
273 retrievedValue = g_enum_get_value_by_name(pPointer,"EFive");
274 g_assert(retrievedValue == NULL);
275 g_type_class_unref(pPointer);
279 void test_interface()
281 MamanBaz* pPointer = g_object_new(baz_type,NULL);
284 g_assert(0xdeadbeaf == pPointer->instance_member);
285 maman_ibaz_do_action (MAMAN_IBAZ(pPointer));
286 g_assert(10 == pPointer->instance_member);
287 g_object_unref(pPointer);
293 gboolean my_cache_func(gpointer cache_data, GTypeClass *g_class)
295 if(MAMAN_IS_BAZ_CLASS(g_class))
297 g_assert(strcmp("hello",(char*) cache_data) == 0);
298 g_type_class_ref(baz_type);
300 g_type_class_unref_uncached (g_class);
315 g_log_set_handler (NULL, G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL);
316 g_set_print_handler(mrtPrintHandler);
319 g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
320 G_LOG_LEVEL_WARNING |
321 G_LOG_LEVEL_CRITICAL);
324 data = (char*) malloc(6);
325 strcpy(data,"hello");
327 g_type_add_class_cache_func(data, my_cache_func);
329 test_static_iface ();
330 test_dynamic_iface ();
336 testResultXml("defaultiface");