Update contrib.
1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * override.c: Closure override test program
3 * Copyright (C) 2001, James Henstridge
4 * Copyright (C) 2003, Red Hat, Inc.
5 * Portions copyright (c) 2006-2009 Nokia Corporation. All rights reserved.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General
17 * Public License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 * Boston, MA 02111-1307, USA.
23 #define G_LOG_DOMAIN "TestOverride"
25 #undef G_DISABLE_ASSERT
26 #undef G_DISABLE_CHECKS
27 #undef G_DISABLE_CAST_CHECKS
34 #include <glib-object.h>
36 #include "testcommon.h"
38 #include "mrt2_glib2_test.h"
39 #endif /*__SYMBIAN32__*/
41 static guint foo_signal_id = 0;
42 static guint bar_signal_id = 0;
43 static guint baz_signal_id = 0;
45 static GType test_i_get_type (void);
46 static GType test_a_get_type (void);
47 static GType test_b_get_type (void);
48 static GType test_c_get_type (void);
50 static void record (const gchar *str);
52 #define TEST_TYPE_I (test_i_get_type ())
54 typedef struct _TestI TestI;
55 typedef struct _TestIClass TestIClass;
59 GTypeInterface base_iface;
63 test_i_foo (TestI *self)
65 record ("TestI::foo");
69 test_i_default_init (gpointer g_class)
71 foo_signal_id = g_signal_newv ("foo",
74 g_cclosure_new(G_CALLBACK(test_i_foo),
77 g_cclosure_marshal_VOID__VOID,
78 G_TYPE_NONE, 0, NULL);
81 static DEFINE_IFACE (TestI, test_i, NULL, test_i_default_init)
83 #define TEST_TYPE_A (test_a_get_type())
85 typedef struct _TestA TestA;
86 typedef struct _TestAClass TestAClass;
92 GObjectClass parent_class;
94 void (* bar) (TestA *self);
98 test_a_foo (TestI *self)
100 GValue args[1] = { { 0, } };
102 record ("TestA::foo");
104 g_value_init (&args[0], TEST_TYPE_A);
105 g_value_set_object (&args[0], self);
107 g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
108 g_signal_chain_from_overridden (args, NULL);
110 g_value_unset (&args[0]);
114 test_a_bar (TestA *self)
116 record ("TestA::bar");
120 test_a_baz (TestA *self,
124 record ("TestA::baz");
126 g_assert (object == G_OBJECT (self));
127 g_assert (GPOINTER_TO_INT (pointer) == 23);
129 return g_strdup ("TestA::baz");
133 test_a_class_init (TestAClass *class)
135 class->bar = test_a_bar;
137 bar_signal_id = g_signal_new ("bar",
140 G_STRUCT_OFFSET (TestAClass, bar),
142 g_cclosure_marshal_VOID__VOID,
143 G_TYPE_NONE, 0, NULL);
145 baz_signal_id = g_signal_new_class_handler ("baz",
148 G_CALLBACK (test_a_baz),
150 g_cclosure_marshal_STRING__OBJECT_POINTER,
157 test_a_interface_init (TestIClass *iface)
159 g_signal_override_class_closure (foo_signal_id,
161 g_cclosure_new (G_CALLBACK (test_a_foo),
165 static DEFINE_TYPE_FULL (TestA, test_a,
166 test_a_class_init, NULL, NULL,
168 INTERFACE (test_a_interface_init, TEST_TYPE_I))
170 #define TEST_TYPE_B (test_b_get_type())
172 typedef struct _TestB TestB;
173 typedef struct _TestBClass TestBClass;
179 TestAClass parent_class;
183 test_b_foo (TestI *self)
185 GValue args[1] = { { 0, } };
187 record ("TestB::foo");
189 g_value_init (&args[0], TEST_TYPE_A);
190 g_value_set_object (&args[0], self);
192 g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
193 g_signal_chain_from_overridden (args, NULL);
195 g_value_unset (&args[0]);
199 test_b_bar (TestA *self)
201 GValue args[1] = { { 0, } };
203 record ("TestB::bar");
205 g_value_init (&args[0], TEST_TYPE_A);
206 g_value_set_object (&args[0], self);
208 g_assert (g_signal_get_invocation_hint (self)->signal_id == bar_signal_id);
209 g_signal_chain_from_overridden (args, NULL);
211 g_value_unset (&args[0]);
215 test_b_baz (TestA *self,
219 gchar *retval = NULL;
221 record ("TestB::baz");
223 g_assert (object == G_OBJECT (self));
224 g_assert (GPOINTER_TO_INT (pointer) == 23);
226 g_signal_chain_from_overridden_handler (self, object, pointer, &retval);
230 gchar *tmp = g_strconcat (retval , ",TestB::baz", NULL);
239 test_b_class_init (TestBClass *class)
241 g_signal_override_class_closure (foo_signal_id,
243 g_cclosure_new (G_CALLBACK (test_b_foo),
245 g_signal_override_class_closure (bar_signal_id,
247 g_cclosure_new (G_CALLBACK (test_b_bar),
249 g_signal_override_class_handler ("baz",
251 G_CALLBACK (test_b_baz));
254 static DEFINE_TYPE (TestB, test_b,
255 test_b_class_init, NULL, NULL,
258 #define TEST_TYPE_C (test_c_get_type())
260 typedef struct _TestC TestC;
261 typedef struct _TestCClass TestCClass;
267 TestBClass parent_class;
271 test_c_foo (TestI *self)
273 GValue args[1] = { { 0, } };
275 record ("TestC::foo");
277 g_value_init (&args[0], TEST_TYPE_A);
278 g_value_set_object (&args[0], self);
280 g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
281 g_signal_chain_from_overridden (args, NULL);
283 g_value_unset (&args[0]);
287 test_c_bar (TestA *self)
289 GValue args[1] = { { 0, } };
291 record ("TestC::bar");
293 g_value_init (&args[0], TEST_TYPE_A);
294 g_value_set_object (&args[0], self);
296 g_assert (g_signal_get_invocation_hint (self)->signal_id == bar_signal_id);
297 g_signal_chain_from_overridden (args, NULL);
299 g_value_unset (&args[0]);
303 test_c_baz (TestA *self,
307 gchar *retval = NULL;
309 record ("TestC::baz");
311 g_assert (object == G_OBJECT (self));
312 g_assert (GPOINTER_TO_INT (pointer) == 23);
314 g_signal_chain_from_overridden_handler (self, object, pointer, &retval);
318 gchar *tmp = g_strconcat (retval , ",TestC::baz", NULL);
327 test_c_class_init (TestBClass *class)
329 g_signal_override_class_closure (foo_signal_id,
331 g_cclosure_new (G_CALLBACK (test_c_foo),
333 g_signal_override_class_closure (bar_signal_id,
335 g_cclosure_new (G_CALLBACK (test_c_bar),
337 g_signal_override_class_handler ("baz",
339 G_CALLBACK (test_c_baz));
343 static DEFINE_TYPE (TestC, test_c,
344 test_c_class_init, NULL, NULL,
347 static GString *test_string = NULL;
348 gboolean failed = FALSE;
351 record (const gchar *str)
353 if (test_string->len)
354 g_string_append_c (test_string, ',');
355 g_string_append (test_string, str);
361 const gchar *expected,
362 const gchar *expected_retval)
364 GObject *self = g_object_new (type, NULL);
366 test_string = g_string_new (NULL);
368 if (strcmp (signal, "baz"))
370 g_signal_emit_by_name (self, signal);
376 g_signal_emit_by_name (self, signal, self, GINT_TO_POINTER (23), &ret);
378 if (strcmp (ret, expected_retval) != 0)
383 if (strcmp (test_string->str, expected) != 0)
386 g_printerr ("*** emitting %s on a %s instance\n"
389 signal, g_type_name (type),
393 if (strcmp (test_string->str, expected) != 0)
397 g_string_free (test_string, TRUE);
401 main (int argc, char **argv)
404 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);
405 g_set_print_handler(mrtPrintHandler);
406 #endif /*__SYMBIAN32__*/
407 g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
408 G_LOG_LEVEL_WARNING |
409 G_LOG_LEVEL_CRITICAL);
412 test (TEST_TYPE_A, "foo", "TestA::foo,TestI::foo", NULL);
413 test (TEST_TYPE_A, "bar", "TestA::bar", NULL);
414 test (TEST_TYPE_A, "baz", "TestA::baz", "TestA::baz");
416 test (TEST_TYPE_B, "foo", "TestB::foo,TestA::foo,TestI::foo", NULL);
417 test (TEST_TYPE_B, "bar", "TestB::bar,TestA::bar", NULL);
418 test (TEST_TYPE_B, "baz", "TestB::baz,TestA::baz", "TestA::baz,TestB::baz");
420 test (TEST_TYPE_C, "foo", "TestC::foo,TestB::foo,TestA::foo,TestI::foo", NULL);
421 test (TEST_TYPE_C, "bar", "TestC::bar,TestB::bar,TestA::bar", NULL);
422 test (TEST_TYPE_C, "baz", "TestC::baz,TestB::baz,TestA::baz", "TestA::baz,TestB::baz,TestC::baz");
425 testResultXml("override");
426 #endif /*__SYMBIAN32__*/
427 return failed ? 1 : 0;