Blame gobject/tests/object.c

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
}