1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 2001, 2003 Red Hat, Inc.
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, see <http://www.gnu.org/licenses/>.
19 #define G_LOG_DOMAIN "TestIfaceCheck"
21 #undef G_DISABLE_ASSERT
22 #undef G_DISABLE_CHECKS
23 #undef G_DISABLE_CAST_CHECKS
27 #include <glib-object.h>
29 #include "testcommon.h"
31 /* This test tests g_type_add_interface_check_func(), which allows
32 * installing a post-initialization check function.
35 #define TEST_TYPE_IFACE (test_iface_get_type ())
36 #define TEST_IFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE, TestIfaceClass))
37 typedef struct _TestIfaceClass TestIfaceClass
;
39 struct _TestIfaceClass
41 GTypeInterface base_iface
;
46 test_iface_base_init (TestIfaceClass
*iface
)
48 iface
->history
= g_string_new (iface
->history
? iface
->history
->str
: NULL
);
51 static DEFINE_IFACE(TestIface
, test_iface
, test_iface_base_init
, NULL
)
56 #define TEST_TYPE_OBJECT1 (test_object1_get_type ())
57 typedef struct _GObject TestObject1
;
58 typedef struct _GObjectClass TestObject1Class
;
60 static DEFINE_TYPE_FULL (TestObject1
, test_object1
,
63 INTERFACE (NULL
, TEST_TYPE_IFACE
))
68 #define TEST_TYPE_OBJECT2 (test_object2_get_type ())
69 typedef struct _GObject TestObject2
;
70 typedef struct _GObjectClass TestObject2Class
;
72 static DEFINE_TYPE_FULL (TestObject2
, test_object2
,
75 INTERFACE (NULL
, TEST_TYPE_IFACE
))
80 #define TEST_TYPE_OBJECT3 (test_object3_get_type ())
81 typedef struct _GObject TestObject3
;
82 typedef struct _GObjectClass TestObject3Class
;
84 static DEFINE_TYPE_FULL (TestObject3
, test_object3
,
87 INTERFACE (NULL
, TEST_TYPE_IFACE
))
92 #define TEST_TYPE_OBJECT4 (test_object4_get_type ())
93 typedef struct _GObject TestObject4
;
94 typedef struct _GObjectClass TestObject4Class
;
97 static DEFINE_TYPE_FULL (TestObject4
, test_object4
,
102 check_func (gpointer check_data
,
105 TestIfaceClass
*iface
= g_iface
;
107 g_string_append (iface
->history
, check_data
);
114 TestIfaceClass
*iface
;
119 /* Basic check of interfaces added before class_init time
121 g_type_add_interface_check (string1
, check_func
);
123 object
= g_object_new (TEST_TYPE_OBJECT1
, NULL
);
124 iface
= TEST_IFACE_GET_CLASS (object
);
125 g_assert (strcmp (iface
->history
->str
, "A") == 0);
126 g_object_unref (object
);
128 /* Add a second check function
130 g_type_add_interface_check (string2
, check_func
);
132 object
= g_object_new (TEST_TYPE_OBJECT2
, NULL
);
133 iface
= TEST_IFACE_GET_CLASS (object
);
134 g_assert (strcmp (iface
->history
->str
, "AB") == 0);
135 g_object_unref (object
);
137 /* Remove the first check function
139 g_type_remove_interface_check (string1
, check_func
);
141 object
= g_object_new (TEST_TYPE_OBJECT3
, NULL
);
142 iface
= TEST_IFACE_GET_CLASS (object
);
143 g_assert (strcmp (iface
->history
->str
, "B") == 0);
144 g_object_unref (object
);
146 /* Test interfaces added after class_init time
148 g_type_class_ref (TEST_TYPE_OBJECT4
);
150 GInterfaceInfo
const iface
= {
154 g_type_add_interface_static (TEST_TYPE_OBJECT4
, TEST_TYPE_IFACE
, &iface
);
157 object
= g_object_new (TEST_TYPE_OBJECT4
, NULL
);
158 iface
= TEST_IFACE_GET_CLASS (object
);
159 g_assert (strcmp (iface
->history
->str
, "B") == 0);
160 g_object_unref (object
);