os/ossrv/glib/tsrc/BC/tests/gobject/ifaceinherit.c
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/* GObject - GLib Type, Object, Parameter and Signal Library
sl@0
     2
 * Copyright (C) 2001, 2003 Red Hat, Inc.
sl@0
     3
 * Portion Copyright © 2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
sl@0
     4
 * This library is free software; you can redistribute it and/or
sl@0
     5
 * modify it under the terms of the GNU Lesser General Public
sl@0
     6
 * License as published by the Free Software Foundation; either
sl@0
     7
 * version 2 of the License, or (at your option) any later version.
sl@0
     8
 *
sl@0
     9
 * This library is distributed in the hope that it will be useful,
sl@0
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
sl@0
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
sl@0
    12
 * Lesser General Public License for more details.
sl@0
    13
 *
sl@0
    14
 * You should have received a copy of the GNU Lesser General
sl@0
    15
 * Public License along with this library; if not, write to the
sl@0
    16
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
sl@0
    17
 * Boston, MA 02111-1307, USA.
sl@0
    18
 */
sl@0
    19
sl@0
    20
#undef	G_LOG_DOMAIN
sl@0
    21
#define	G_LOG_DOMAIN "TestIfaceInherit"
sl@0
    22
sl@0
    23
#undef G_DISABLE_ASSERT
sl@0
    24
#undef G_DISABLE_CHECKS
sl@0
    25
#undef G_DISABLE_CAST_CHECKS
sl@0
    26
sl@0
    27
#include <glib-object.h>
sl@0
    28
sl@0
    29
#include "testcommon.h"
sl@0
    30
#include "testmodule.h"
sl@0
    31
sl@0
    32
#ifdef SYMBIAN
sl@0
    33
#include "mrt2_glib2_test.h"
sl@0
    34
#endif // SYMBIAN
sl@0
    35
sl@0
    36
sl@0
    37
/* This test tests inheritance of interface. We two object
sl@0
    38
 * class BaseObject and DerivedObject we add an interface
sl@0
    39
 * to BaseObject:
sl@0
    40
 *
sl@0
    41
 * I1) Before DerivedObject is registered
sl@0
    42
 * I2) After DerivedObject is registered, but before
sl@0
    43
 *     DerivedObject is class initialized
sl@0
    44
 * I3) During DerivedObject's class_init
sl@0
    45
 * I4) After DerivedObject's class init
sl@0
    46
 *
sl@0
    47
 * We also do some tests of overriding.
sl@0
    48
 * 
sl@0
    49
 * I5) We add an interface to BaseObject, then add the same
sl@0
    50
 *     interface to DerivedObject. (Note that this is only legal
sl@0
    51
 *     before DerivedObject's class_init; the results of
sl@0
    52
 *     g_type_interface_peek() are not allowed to change from one
sl@0
    53
 *     non-NULL vtable to another non-NULL vtable)
sl@0
    54
 */
sl@0
    55
   
sl@0
    56
/*
sl@0
    57
 * BaseObject, a parent class for DerivedObject
sl@0
    58
 */
sl@0
    59
#define BASE_TYPE_OBJECT          (base_object_get_type ())
sl@0
    60
typedef struct _BaseObject        BaseObject;
sl@0
    61
typedef struct _BaseObjectClass   BaseObjectClass;
sl@0
    62
sl@0
    63
struct _BaseObject
sl@0
    64
{
sl@0
    65
  GObject parent_instance;
sl@0
    66
};
sl@0
    67
struct _BaseObjectClass
sl@0
    68
{
sl@0
    69
  GObjectClass parent_class;
sl@0
    70
};
sl@0
    71
sl@0
    72
static GType base_object_get_type ();
sl@0
    73
static GType derived_object_get_type ();
sl@0
    74
sl@0
    75
/*
sl@0
    76
 * DerivedObject, the child class of DerivedObject
sl@0
    77
 */
sl@0
    78
#define DERIVED_TYPE_OBJECT          (derived_object_get_type ())
sl@0
    79
typedef struct _DerivedObject        DerivedObject;
sl@0
    80
typedef struct _DerivedObjectClass   DerivedObjectClass;
sl@0
    81
sl@0
    82
struct _DerivedObject
sl@0
    83
{
sl@0
    84
  BaseObject parent_instance;
sl@0
    85
};
sl@0
    86
struct _DerivedObjectClass
sl@0
    87
{
sl@0
    88
  BaseObjectClass parent_class;
sl@0
    89
};
sl@0
    90
sl@0
    91
/*
sl@0
    92
 * The interfaces
sl@0
    93
 */
sl@0
    94
typedef struct _TestIfaceClass TestIfaceClass;
sl@0
    95
typedef struct _TestIfaceClass TestIface1Class;
sl@0
    96
typedef struct _TestIfaceClass TestIface2Class;
sl@0
    97
typedef struct _TestIfaceClass TestIface3Class;
sl@0
    98
typedef struct _TestIfaceClass TestIface4Class;
sl@0
    99
typedef struct _TestIfaceClass TestIface5Class;
sl@0
   100
sl@0
   101
struct _TestIfaceClass
sl@0
   102
{
sl@0
   103
  GTypeInterface base_iface;
sl@0
   104
  guint val;
sl@0
   105
};
sl@0
   106
sl@0
   107
#define TEST_TYPE_IFACE1 (test_iface1_get_type ())
sl@0
   108
#define TEST_TYPE_IFACE2 (test_iface2_get_type ())
sl@0
   109
#define TEST_TYPE_IFACE3 (test_iface3_get_type ())
sl@0
   110
#define TEST_TYPE_IFACE4 (test_iface4_get_type ())
sl@0
   111
#define TEST_TYPE_IFACE5 (test_iface5_get_type ())
sl@0
   112
sl@0
   113
static DEFINE_IFACE (TestIface1, test_iface1,  NULL, NULL)
sl@0
   114
static DEFINE_IFACE (TestIface2, test_iface2,  NULL, NULL)
sl@0
   115
static DEFINE_IFACE (TestIface3, test_iface3,  NULL, NULL)
sl@0
   116
static DEFINE_IFACE (TestIface4, test_iface4,  NULL, NULL)
sl@0
   117
static DEFINE_IFACE (TestIface5, test_iface5,  NULL, NULL)
sl@0
   118
sl@0
   119
static void
sl@0
   120
add_interface (GType              object_type,
sl@0
   121
	       GType              iface_type,
sl@0
   122
	       GInterfaceInitFunc init_func)
sl@0
   123
{
sl@0
   124
  GInterfaceInfo iface_info = {	NULL, NULL, NULL };
sl@0
   125
sl@0
   126
  iface_info.interface_init = init_func;
sl@0
   127
								
sl@0
   128
  g_type_add_interface_static (object_type, iface_type, &iface_info);
sl@0
   129
}
sl@0
   130
sl@0
   131
static void
sl@0
   132
init_base_interface (TestIfaceClass *iface)
sl@0
   133
{
sl@0
   134
  iface->val = 21;
sl@0
   135
}
sl@0
   136
sl@0
   137
static void
sl@0
   138
add_base_interface (GType object_type,
sl@0
   139
		    GType iface_type)
sl@0
   140
{
sl@0
   141
  add_interface (object_type, iface_type,
sl@0
   142
		 (GInterfaceInitFunc)init_base_interface);
sl@0
   143
}
sl@0
   144
sl@0
   145
static gboolean
sl@0
   146
interface_is_base (GType object_type,
sl@0
   147
		   GType iface_type)
sl@0
   148
{
sl@0
   149
  gpointer g_class = g_type_class_peek (object_type);
sl@0
   150
  TestIfaceClass *iface = g_type_interface_peek (g_class, iface_type);
sl@0
   151
  return iface && iface->val == 21;
sl@0
   152
}
sl@0
   153
sl@0
   154
static void
sl@0
   155
init_derived_interface (TestIfaceClass *iface)
sl@0
   156
{
sl@0
   157
  iface->val = 42;
sl@0
   158
}
sl@0
   159
sl@0
   160
static void
sl@0
   161
add_derived_interface (GType object_type,
sl@0
   162
		       GType iface_type)
sl@0
   163
{
sl@0
   164
  add_interface (object_type, iface_type,
sl@0
   165
		 (GInterfaceInitFunc)init_derived_interface);
sl@0
   166
}
sl@0
   167
sl@0
   168
static gboolean
sl@0
   169
interface_is_derived (GType object_type,
sl@0
   170
		      GType iface_type)
sl@0
   171
{
sl@0
   172
  gpointer g_class = g_type_class_peek (object_type);
sl@0
   173
  TestIfaceClass *iface = g_type_interface_peek (g_class, iface_type);
sl@0
   174
  return iface && iface->val == 42;
sl@0
   175
}
sl@0
   176
sl@0
   177
static void
sl@0
   178
derived_object_class_init (BaseObjectClass *class)
sl@0
   179
{
sl@0
   180
  add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE3);
sl@0
   181
}
sl@0
   182
sl@0
   183
static DEFINE_TYPE(BaseObject, base_object,
sl@0
   184
		   NULL, NULL, NULL,
sl@0
   185
		   G_TYPE_OBJECT)
sl@0
   186
static DEFINE_TYPE(DerivedObject, derived_object,
sl@0
   187
		   derived_object_class_init, NULL, NULL,
sl@0
   188
		   BASE_TYPE_OBJECT)
sl@0
   189
sl@0
   190
int
sl@0
   191
main (int   argc,
sl@0
   192
      char *argv[])
sl@0
   193
{
sl@0
   194
sl@0
   195
#ifdef SYMBIAN
sl@0
   196
  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);
sl@0
   197
  g_set_print_handler(mrtPrintHandler);
sl@0
   198
  #endif /*SYMBIAN*/
sl@0
   199
  g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
sl@0
   200
			  G_LOG_LEVEL_WARNING |
sl@0
   201
			  G_LOG_LEVEL_CRITICAL);
sl@0
   202
  g_type_init ();
sl@0
   203
sl@0
   204
  /* Register BaseObject */
sl@0
   205
  BASE_TYPE_OBJECT;
sl@0
   206
  
sl@0
   207
  add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE5);
sl@0
   208
sl@0
   209
  /* Class init BaseObject */
sl@0
   210
  g_type_class_ref (BASE_TYPE_OBJECT);
sl@0
   211
  
sl@0
   212
  add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE1);
sl@0
   213
sl@0
   214
  /* Register DerivedObject */
sl@0
   215
  DERIVED_TYPE_OBJECT;
sl@0
   216
sl@0
   217
  add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE2);
sl@0
   218
  add_derived_interface (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE5);
sl@0
   219
sl@0
   220
  /* Class init DerivedObject */
sl@0
   221
  g_type_class_ref (DERIVED_TYPE_OBJECT);
sl@0
   222
  
sl@0
   223
  add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE4);
sl@0
   224
sl@0
   225
  /* Check that all the non-overridden interfaces were properly inherited
sl@0
   226
   */
sl@0
   227
  g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE1));
sl@0
   228
  g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE2));
sl@0
   229
  g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE3));
sl@0
   230
  g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE4));
sl@0
   231
sl@0
   232
  /* Check that all the overridden interfaces were properly overridden
sl@0
   233
   */
sl@0
   234
  g_assert (interface_is_derived (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE5));
sl@0
   235
sl@0
   236
#ifdef SYMBIAN
sl@0
   237
testResultXml("ifaceinherit");
sl@0
   238
#endif // SYMBIAN
sl@0
   239
  return 0;
sl@0
   240
}