|
Packit |
ae235b |
#include <glib-object.h>
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
/* --------------------------------- */
|
|
Packit |
ae235b |
/* test_object_constructor_singleton */
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
typedef GObject MySingletonObject;
|
|
Packit |
ae235b |
typedef GObjectClass MySingletonObjectClass;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
GType my_singleton_object_get_type (void);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
G_DEFINE_TYPE (MySingletonObject, my_singleton_object, G_TYPE_OBJECT)
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static MySingletonObject *singleton;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
my_singleton_object_init (MySingletonObject *obj)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static GObject *
|
|
Packit |
ae235b |
my_singleton_object_constructor (GType type,
|
|
Packit |
ae235b |
guint n_construct_properties,
|
|
Packit |
ae235b |
GObjectConstructParam *construct_params)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GObject *object;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
if (singleton)
|
|
Packit |
ae235b |
return g_object_ref (singleton);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
object = G_OBJECT_CLASS (my_singleton_object_parent_class)->
|
|
Packit |
ae235b |
constructor (type, n_construct_properties, construct_params);
|
|
Packit |
ae235b |
singleton = (MySingletonObject *)object;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
return object;
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
my_singleton_object_finalize (MySingletonObject *obj)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
singleton = NULL;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
G_OBJECT_CLASS (my_singleton_object_parent_class)->finalize (obj);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
my_singleton_object_class_init (MySingletonObjectClass *klass)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
object_class->constructor = my_singleton_object_constructor;
|
|
Packit |
ae235b |
object_class->finalize = my_singleton_object_finalize;
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
test_object_constructor_singleton (void)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
MySingletonObject *one, *two, *three;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
one = g_object_new (my_singleton_object_get_type (), NULL);
|
|
Packit |
ae235b |
g_assert_cmpint (G_OBJECT (one)->ref_count, ==, 1);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
two = g_object_new (my_singleton_object_get_type (), NULL);
|
|
Packit |
ae235b |
g_assert (one == two);
|
|
Packit |
ae235b |
g_assert_cmpint (G_OBJECT (two)->ref_count, ==, 2);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
three = g_object_new (my_singleton_object_get_type (), NULL);
|
|
Packit |
ae235b |
g_assert (one == three);
|
|
Packit |
ae235b |
g_assert_cmpint (G_OBJECT (three)->ref_count, ==, 3);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_object_add_weak_pointer (G_OBJECT (one), (gpointer *)&one);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_object_unref (one);
|
|
Packit |
ae235b |
g_assert (one != NULL);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_object_unref (three);
|
|
Packit |
ae235b |
g_object_unref (two);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_assert (one == NULL);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
/* ----------------------------------- */
|
|
Packit |
ae235b |
/* test_object_constructor_infanticide */
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
typedef GObject MyInfanticideObject;
|
|
Packit |
ae235b |
typedef GObjectClass MyInfanticideObjectClass;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
GType my_infanticide_object_get_type (void);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
G_DEFINE_TYPE (MyInfanticideObject, my_infanticide_object, G_TYPE_OBJECT)
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
my_infanticide_object_init (MyInfanticideObject *obj)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static GObject *
|
|
Packit |
ae235b |
my_infanticide_object_constructor (GType type,
|
|
Packit |
ae235b |
guint n_construct_properties,
|
|
Packit |
ae235b |
GObjectConstructParam *construct_params)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GObject *object;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
object = G_OBJECT_CLASS (my_infanticide_object_parent_class)->
|
|
Packit |
ae235b |
constructor (type, n_construct_properties, construct_params);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_object_unref (object);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
return NULL;
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
my_infanticide_object_class_init (MyInfanticideObjectClass *klass)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
object_class->constructor = my_infanticide_object_constructor;
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
test_object_constructor_infanticide (void)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GObject *obj;
|
|
Packit |
ae235b |
int i;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_test_bug ("661576");
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
for (i = 0; i < 1000; i++)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
|
|
Packit |
ae235b |
"*finalized while still in-construction*");
|
|
Packit |
ae235b |
g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
|
|
Packit |
ae235b |
"*Custom constructor*returned NULL*");
|
|
Packit |
ae235b |
obj = g_object_new (my_infanticide_object_get_type (), NULL);
|
|
Packit |
ae235b |
g_assert_null (obj);
|
|
Packit |
ae235b |
g_test_assert_expected_messages ();
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
/* --------------------------------- */
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
int
|
|
Packit |
ae235b |
main (int argc, char *argv[])
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
g_test_init (&argc, &argv, NULL);
|
|
Packit |
ae235b |
g_test_bug_base ("http://bugzilla.gnome.org/");
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_test_add_func ("/object/constructor/singleton", test_object_constructor_singleton);
|
|
Packit |
ae235b |
g_test_add_func ("/object/constructor/infanticide", test_object_constructor_infanticide);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
return g_test_run ();
|
|
Packit |
ae235b |
}
|