1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/glib/tests/gobject/override.c Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,428 @@
1.4 +/* GObject - GLib Type, Object, Parameter and Signal Library
1.5 + * override.c: Closure override test program
1.6 + * Copyright (C) 2001, James Henstridge
1.7 + * Copyright (C) 2003, Red Hat, Inc.
1.8 + * Portions copyright (c) 2006-2009 Nokia Corporation. All rights reserved.
1.9 + * This library is free software; you can redistribute it and/or
1.10 + * modify it under the terms of the GNU Lesser General Public
1.11 + * License as published by the Free Software Foundation; either
1.12 + * version 2 of the License, or (at your option) any later version.
1.13 + *
1.14 + * This library is distributed in the hope that it will be useful,
1.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1.17 + * Lesser General Public License for more details.
1.18 + *
1.19 + * You should have received a copy of the GNU Lesser General
1.20 + * Public License along with this library; if not, write to the
1.21 + * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
1.22 + * Boston, MA 02111-1307, USA.
1.23 + */
1.24 +
1.25 +#undef G_LOG_DOMAIN
1.26 +#define G_LOG_DOMAIN "TestOverride"
1.27 +
1.28 +#undef G_DISABLE_ASSERT
1.29 +#undef G_DISABLE_CHECKS
1.30 +#undef G_DISABLE_CAST_CHECKS
1.31 +
1.32 +#undef VERBOSE
1.33 +
1.34 +#include <string.h>
1.35 +
1.36 +#include <glib.h>
1.37 +#include <glib-object.h>
1.38 +
1.39 +#include "testcommon.h"
1.40 +#ifdef __SYMBIAN32__
1.41 + #include "mrt2_glib2_test.h"
1.42 + #endif /*__SYMBIAN32__*/
1.43 +
1.44 +static guint foo_signal_id = 0;
1.45 +static guint bar_signal_id = 0;
1.46 +static guint baz_signal_id = 0;
1.47 +
1.48 +static GType test_i_get_type (void);
1.49 +static GType test_a_get_type (void);
1.50 +static GType test_b_get_type (void);
1.51 +static GType test_c_get_type (void);
1.52 +
1.53 +static void record (const gchar *str);
1.54 +
1.55 +#define TEST_TYPE_I (test_i_get_type ())
1.56 +
1.57 +typedef struct _TestI TestI;
1.58 +typedef struct _TestIClass TestIClass;
1.59 +
1.60 +struct _TestIClass
1.61 +{
1.62 + GTypeInterface base_iface;
1.63 +};
1.64 +
1.65 +static void
1.66 +test_i_foo (TestI *self)
1.67 +{
1.68 + record ("TestI::foo");
1.69 +}
1.70 +
1.71 +static void
1.72 +test_i_default_init (gpointer g_class)
1.73 +{
1.74 + foo_signal_id = g_signal_newv ("foo",
1.75 + TEST_TYPE_I,
1.76 + G_SIGNAL_RUN_LAST,
1.77 + g_cclosure_new(G_CALLBACK(test_i_foo),
1.78 + NULL, NULL),
1.79 + NULL, NULL,
1.80 + g_cclosure_marshal_VOID__VOID,
1.81 + G_TYPE_NONE, 0, NULL);
1.82 +}
1.83 +
1.84 +static DEFINE_IFACE (TestI, test_i, NULL, test_i_default_init)
1.85 +
1.86 +#define TEST_TYPE_A (test_a_get_type())
1.87 +
1.88 + typedef struct _TestA TestA;
1.89 + typedef struct _TestAClass TestAClass;
1.90 +
1.91 +struct _TestA {
1.92 + GObject parent;
1.93 +};
1.94 +struct _TestAClass {
1.95 + GObjectClass parent_class;
1.96 +
1.97 + void (* bar) (TestA *self);
1.98 +};
1.99 +
1.100 +static void
1.101 +test_a_foo (TestI *self)
1.102 +{
1.103 + GValue args[1] = { { 0, } };
1.104 +
1.105 + record ("TestA::foo");
1.106 +
1.107 + g_value_init (&args[0], TEST_TYPE_A);
1.108 + g_value_set_object (&args[0], self);
1.109 +
1.110 + g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
1.111 + g_signal_chain_from_overridden (args, NULL);
1.112 +
1.113 + g_value_unset (&args[0]);
1.114 +}
1.115 +
1.116 +static void
1.117 +test_a_bar (TestA *self)
1.118 +{
1.119 + record ("TestA::bar");
1.120 +}
1.121 +
1.122 +static gchar *
1.123 +test_a_baz (TestA *self,
1.124 + GObject *object,
1.125 + gpointer pointer)
1.126 +{
1.127 + record ("TestA::baz");
1.128 +
1.129 + g_assert (object == G_OBJECT (self));
1.130 + g_assert (GPOINTER_TO_INT (pointer) == 23);
1.131 +
1.132 + return g_strdup ("TestA::baz");
1.133 +}
1.134 +
1.135 +static void
1.136 +test_a_class_init (TestAClass *class)
1.137 +{
1.138 + class->bar = test_a_bar;
1.139 +
1.140 + bar_signal_id = g_signal_new ("bar",
1.141 + TEST_TYPE_A,
1.142 + G_SIGNAL_RUN_LAST,
1.143 + G_STRUCT_OFFSET (TestAClass, bar),
1.144 + NULL, NULL,
1.145 + g_cclosure_marshal_VOID__VOID,
1.146 + G_TYPE_NONE, 0, NULL);
1.147 +
1.148 + baz_signal_id = g_signal_new_class_handler ("baz",
1.149 + TEST_TYPE_A,
1.150 + G_SIGNAL_RUN_LAST,
1.151 + G_CALLBACK (test_a_baz),
1.152 + NULL, NULL,
1.153 + g_cclosure_marshal_STRING__OBJECT_POINTER,
1.154 + G_TYPE_STRING, 2,
1.155 + G_TYPE_OBJECT,
1.156 + G_TYPE_POINTER);
1.157 +}
1.158 +
1.159 +static void
1.160 +test_a_interface_init (TestIClass *iface)
1.161 +{
1.162 + g_signal_override_class_closure (foo_signal_id,
1.163 + TEST_TYPE_A,
1.164 + g_cclosure_new (G_CALLBACK (test_a_foo),
1.165 + NULL, NULL));
1.166 +}
1.167 +
1.168 +static DEFINE_TYPE_FULL (TestA, test_a,
1.169 + test_a_class_init, NULL, NULL,
1.170 + G_TYPE_OBJECT,
1.171 + INTERFACE (test_a_interface_init, TEST_TYPE_I))
1.172 +
1.173 +#define TEST_TYPE_B (test_b_get_type())
1.174 +
1.175 +typedef struct _TestB TestB;
1.176 +typedef struct _TestBClass TestBClass;
1.177 +
1.178 +struct _TestB {
1.179 + TestA parent;
1.180 +};
1.181 +struct _TestBClass {
1.182 + TestAClass parent_class;
1.183 +};
1.184 +
1.185 +static void
1.186 +test_b_foo (TestI *self)
1.187 +{
1.188 + GValue args[1] = { { 0, } };
1.189 +
1.190 + record ("TestB::foo");
1.191 +
1.192 + g_value_init (&args[0], TEST_TYPE_A);
1.193 + g_value_set_object (&args[0], self);
1.194 +
1.195 + g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
1.196 + g_signal_chain_from_overridden (args, NULL);
1.197 +
1.198 + g_value_unset (&args[0]);
1.199 +}
1.200 +
1.201 +static void
1.202 +test_b_bar (TestA *self)
1.203 +{
1.204 + GValue args[1] = { { 0, } };
1.205 +
1.206 + record ("TestB::bar");
1.207 +
1.208 + g_value_init (&args[0], TEST_TYPE_A);
1.209 + g_value_set_object (&args[0], self);
1.210 +
1.211 + g_assert (g_signal_get_invocation_hint (self)->signal_id == bar_signal_id);
1.212 + g_signal_chain_from_overridden (args, NULL);
1.213 +
1.214 + g_value_unset (&args[0]);
1.215 +}
1.216 +
1.217 +static gchar *
1.218 +test_b_baz (TestA *self,
1.219 + GObject *object,
1.220 + gpointer pointer)
1.221 +{
1.222 + gchar *retval = NULL;
1.223 +
1.224 + record ("TestB::baz");
1.225 +
1.226 + g_assert (object == G_OBJECT (self));
1.227 + g_assert (GPOINTER_TO_INT (pointer) == 23);
1.228 +
1.229 + g_signal_chain_from_overridden_handler (self, object, pointer, &retval);
1.230 +
1.231 + if (retval)
1.232 + {
1.233 + gchar *tmp = g_strconcat (retval , ",TestB::baz", NULL);
1.234 + g_free (retval);
1.235 + retval = tmp;
1.236 + }
1.237 +
1.238 + return retval;
1.239 +}
1.240 +
1.241 +static void
1.242 +test_b_class_init (TestBClass *class)
1.243 +{
1.244 + g_signal_override_class_closure (foo_signal_id,
1.245 + TEST_TYPE_B,
1.246 + g_cclosure_new (G_CALLBACK (test_b_foo),
1.247 + NULL, NULL));
1.248 + g_signal_override_class_closure (bar_signal_id,
1.249 + TEST_TYPE_B,
1.250 + g_cclosure_new (G_CALLBACK (test_b_bar),
1.251 + NULL, NULL));
1.252 + g_signal_override_class_handler ("baz",
1.253 + TEST_TYPE_B,
1.254 + G_CALLBACK (test_b_baz));
1.255 +}
1.256 +
1.257 +static DEFINE_TYPE (TestB, test_b,
1.258 + test_b_class_init, NULL, NULL,
1.259 + TEST_TYPE_A)
1.260 +
1.261 +#define TEST_TYPE_C (test_c_get_type())
1.262 +
1.263 +typedef struct _TestC TestC;
1.264 +typedef struct _TestCClass TestCClass;
1.265 +
1.266 +struct _TestC {
1.267 + TestB parent;
1.268 +};
1.269 +struct _TestCClass {
1.270 + TestBClass parent_class;
1.271 +};
1.272 +
1.273 +static void
1.274 +test_c_foo (TestI *self)
1.275 +{
1.276 + GValue args[1] = { { 0, } };
1.277 +
1.278 + record ("TestC::foo");
1.279 +
1.280 + g_value_init (&args[0], TEST_TYPE_A);
1.281 + g_value_set_object (&args[0], self);
1.282 +
1.283 + g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
1.284 + g_signal_chain_from_overridden (args, NULL);
1.285 +
1.286 + g_value_unset (&args[0]);
1.287 +}
1.288 +
1.289 +static void
1.290 +test_c_bar (TestA *self)
1.291 +{
1.292 + GValue args[1] = { { 0, } };
1.293 +
1.294 + record ("TestC::bar");
1.295 +
1.296 + g_value_init (&args[0], TEST_TYPE_A);
1.297 + g_value_set_object (&args[0], self);
1.298 +
1.299 + g_assert (g_signal_get_invocation_hint (self)->signal_id == bar_signal_id);
1.300 + g_signal_chain_from_overridden (args, NULL);
1.301 +
1.302 + g_value_unset (&args[0]);
1.303 +}
1.304 +
1.305 +static gchar *
1.306 +test_c_baz (TestA *self,
1.307 + GObject *object,
1.308 + gpointer pointer)
1.309 +{
1.310 + gchar *retval = NULL;
1.311 +
1.312 + record ("TestC::baz");
1.313 +
1.314 + g_assert (object == G_OBJECT (self));
1.315 + g_assert (GPOINTER_TO_INT (pointer) == 23);
1.316 +
1.317 + g_signal_chain_from_overridden_handler (self, object, pointer, &retval);
1.318 +
1.319 + if (retval)
1.320 + {
1.321 + gchar *tmp = g_strconcat (retval , ",TestC::baz", NULL);
1.322 + g_free (retval);
1.323 + retval = tmp;
1.324 + }
1.325 +
1.326 + return retval;
1.327 +}
1.328 +
1.329 +static void
1.330 +test_c_class_init (TestBClass *class)
1.331 +{
1.332 + g_signal_override_class_closure (foo_signal_id,
1.333 + TEST_TYPE_C,
1.334 + g_cclosure_new (G_CALLBACK (test_c_foo),
1.335 + NULL, NULL));
1.336 + g_signal_override_class_closure (bar_signal_id,
1.337 + TEST_TYPE_C,
1.338 + g_cclosure_new (G_CALLBACK (test_c_bar),
1.339 + NULL, NULL));
1.340 + g_signal_override_class_handler ("baz",
1.341 + TEST_TYPE_C,
1.342 + G_CALLBACK (test_c_baz));
1.343 +}
1.344 +
1.345 +
1.346 +static DEFINE_TYPE (TestC, test_c,
1.347 + test_c_class_init, NULL, NULL,
1.348 + TEST_TYPE_B)
1.349 +
1.350 +static GString *test_string = NULL;
1.351 +gboolean failed = FALSE;
1.352 +
1.353 +static void
1.354 +record (const gchar *str)
1.355 +{
1.356 + if (test_string->len)
1.357 + g_string_append_c (test_string, ',');
1.358 + g_string_append (test_string, str);
1.359 +}
1.360 +
1.361 +static void
1.362 +test (GType type,
1.363 + const gchar *signal,
1.364 + const gchar *expected,
1.365 + const gchar *expected_retval)
1.366 +{
1.367 + GObject *self = g_object_new (type, NULL);
1.368 +
1.369 + test_string = g_string_new (NULL);
1.370 +
1.371 + if (strcmp (signal, "baz"))
1.372 + {
1.373 + g_signal_emit_by_name (self, signal);
1.374 + }
1.375 + else
1.376 + {
1.377 + gchar *ret;
1.378 +
1.379 + g_signal_emit_by_name (self, signal, self, GINT_TO_POINTER (23), &ret);
1.380 +
1.381 + if (strcmp (ret, expected_retval) != 0)
1.382 + failed = TRUE;
1.383 + }
1.384 +
1.385 +#ifndef VERBOSE
1.386 + if (strcmp (test_string->str, expected) != 0)
1.387 +#endif
1.388 + {
1.389 + g_printerr ("*** emitting %s on a %s instance\n"
1.390 + " Expecting: %s\n"
1.391 + " Got: %s\n",
1.392 + signal, g_type_name (type),
1.393 + expected,
1.394 + test_string->str);
1.395 +
1.396 + if (strcmp (test_string->str, expected) != 0)
1.397 + failed = TRUE;
1.398 + }
1.399 +
1.400 + g_string_free (test_string, TRUE);
1.401 +}
1.402 +
1.403 +int
1.404 +main (int argc, char **argv)
1.405 +{
1.406 +#ifdef __SYMBIAN32__
1.407 + 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);
1.408 + g_set_print_handler(mrtPrintHandler);
1.409 + #endif /*__SYMBIAN32__*/
1.410 + g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
1.411 + G_LOG_LEVEL_WARNING |
1.412 + G_LOG_LEVEL_CRITICAL);
1.413 + g_type_init();
1.414 +
1.415 + test (TEST_TYPE_A, "foo", "TestA::foo,TestI::foo", NULL);
1.416 + test (TEST_TYPE_A, "bar", "TestA::bar", NULL);
1.417 + test (TEST_TYPE_A, "baz", "TestA::baz", "TestA::baz");
1.418 +
1.419 + test (TEST_TYPE_B, "foo", "TestB::foo,TestA::foo,TestI::foo", NULL);
1.420 + test (TEST_TYPE_B, "bar", "TestB::bar,TestA::bar", NULL);
1.421 + test (TEST_TYPE_B, "baz", "TestB::baz,TestA::baz", "TestA::baz,TestB::baz");
1.422 +
1.423 + test (TEST_TYPE_C, "foo", "TestC::foo,TestB::foo,TestA::foo,TestI::foo", NULL);
1.424 + test (TEST_TYPE_C, "bar", "TestC::bar,TestB::bar,TestA::bar", NULL);
1.425 + test (TEST_TYPE_C, "baz", "TestC::baz,TestB::baz,TestA::baz", "TestA::baz,TestB::baz,TestC::baz");
1.426 +
1.427 + #ifdef __SYMBIAN32__
1.428 + testResultXml("override");
1.429 + #endif /*__SYMBIAN32__*/
1.430 + return failed ? 1 : 0;
1.431 +}