Blame gobject/tests/properties.c

Packit ae235b
#include <stdlib.h>
Packit ae235b
#include <gstdio.h>
Packit ae235b
#include <glib-object.h>
Packit ae235b
Packit ae235b
typedef struct _TestObject {
Packit ae235b
  GObject parent_instance;
Packit ae235b
  gint foo;
Packit ae235b
  gboolean bar;
Packit ae235b
  gchar *baz;
Packit ae235b
  gchar *quux;
Packit ae235b
} TestObject;
Packit ae235b
Packit ae235b
typedef struct _TestObjectClass {
Packit ae235b
  GObjectClass parent_class;
Packit ae235b
} TestObjectClass;
Packit ae235b
Packit ae235b
enum { PROP_0, PROP_FOO, PROP_BAR, PROP_BAZ, PROP_QUUX, N_PROPERTIES };
Packit ae235b
Packit ae235b
static GParamSpec *properties[N_PROPERTIES] = { NULL, };
Packit ae235b
Packit ae235b
static GType test_object_get_type (void);
Packit ae235b
G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT)
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_object_set_foo (TestObject *obj,
Packit ae235b
                     gint        foo)
Packit ae235b
{
Packit ae235b
  if (obj->foo != foo)
Packit ae235b
    {
Packit ae235b
      obj->foo = foo;
Packit ae235b
Packit ae235b
      g_assert (properties[PROP_FOO] != NULL);
Packit ae235b
      g_object_notify_by_pspec (G_OBJECT (obj), properties[PROP_FOO]);
Packit ae235b
    }
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_object_set_bar (TestObject *obj,
Packit ae235b
                     gboolean    bar)
Packit ae235b
{
Packit ae235b
  bar = !!bar;
Packit ae235b
Packit ae235b
  if (obj->bar != bar)
Packit ae235b
    {
Packit ae235b
      obj->bar = bar;
Packit ae235b
Packit ae235b
      g_assert (properties[PROP_BAR] != NULL);
Packit ae235b
      g_object_notify_by_pspec (G_OBJECT (obj), properties[PROP_BAR]);
Packit ae235b
    }
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_object_set_baz (TestObject  *obj,
Packit ae235b
                     const gchar *baz)
Packit ae235b
{
Packit ae235b
  if (g_strcmp0 (obj->baz, baz) != 0)
Packit ae235b
    {
Packit ae235b
      g_free (obj->baz);
Packit ae235b
      obj->baz = g_strdup (baz);
Packit ae235b
Packit ae235b
      g_assert (properties[PROP_BAZ] != NULL);
Packit ae235b
      g_object_notify_by_pspec (G_OBJECT (obj), properties[PROP_BAZ]);
Packit ae235b
    }
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_object_set_quux (TestObject  *obj,
Packit ae235b
                      const gchar *quux)
Packit ae235b
{
Packit ae235b
  if (g_strcmp0 (obj->quux, quux) != 0)
Packit ae235b
    {
Packit ae235b
      g_free (obj->quux);
Packit ae235b
      obj->quux = g_strdup (quux);
Packit ae235b
Packit ae235b
      g_assert (properties[PROP_QUUX] != NULL);
Packit ae235b
      g_object_notify_by_pspec (G_OBJECT (obj), properties[PROP_QUUX]);
Packit ae235b
    }
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_object_finalize (GObject *gobject)
Packit ae235b
{
Packit ae235b
  g_free (((TestObject *) gobject)->baz);
Packit ae235b
Packit ae235b
  /* When the ref_count of an object is zero it is still
Packit ae235b
   * possible to notify the property, but it should do
Packit ae235b
   * nothing and silenty quit (bug #705570)
Packit ae235b
   */
Packit ae235b
  g_object_notify (gobject, "foo");
Packit ae235b
  g_object_notify_by_pspec (gobject, properties[PROP_BAR]);
Packit ae235b
Packit ae235b
  G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_object_set_property (GObject *gobject,
Packit ae235b
                          guint prop_id,
Packit ae235b
                          const GValue *value,
Packit ae235b
                          GParamSpec *pspec)
Packit ae235b
{
Packit ae235b
  TestObject *tobj = (TestObject *) gobject;
Packit ae235b
Packit ae235b
  g_assert_cmpint (prop_id, !=, 0);
Packit ae235b
  g_assert_cmpint (prop_id, !=, N_PROPERTIES);
Packit ae235b
  g_assert (pspec == properties[prop_id]);
Packit ae235b
Packit ae235b
  switch (prop_id)
Packit ae235b
    {
Packit ae235b
    case PROP_FOO:
Packit ae235b
      test_object_set_foo (tobj, g_value_get_int (value));
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case PROP_BAR:
Packit ae235b
      test_object_set_bar (tobj, g_value_get_boolean (value));
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case PROP_BAZ:
Packit ae235b
      test_object_set_baz (tobj, g_value_get_string (value));
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case PROP_QUUX:
Packit ae235b
      test_object_set_quux (tobj, g_value_get_string (value));
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    default:
Packit ae235b
      g_assert_not_reached ();
Packit ae235b
    }
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_object_get_property (GObject *gobject,
Packit ae235b
                          guint prop_id,
Packit ae235b
                          GValue *value,
Packit ae235b
                          GParamSpec *pspec)
Packit ae235b
{
Packit ae235b
  TestObject *tobj = (TestObject *) gobject;
Packit ae235b
Packit ae235b
  g_assert_cmpint (prop_id, !=, 0);
Packit ae235b
  g_assert_cmpint (prop_id, !=, N_PROPERTIES);
Packit ae235b
  g_assert (pspec == properties[prop_id]);
Packit ae235b
Packit ae235b
  switch (prop_id)
Packit ae235b
    {
Packit ae235b
    case PROP_FOO:
Packit ae235b
      g_value_set_int (value, tobj->foo);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case PROP_BAR:
Packit ae235b
      g_value_set_boolean (value, tobj->bar);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case PROP_BAZ:
Packit ae235b
      g_value_set_string (value, tobj->baz);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case PROP_QUUX:
Packit ae235b
      g_value_set_string (value, tobj->quux);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    default:
Packit ae235b
      g_assert_not_reached ();
Packit ae235b
    }
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_object_class_init (TestObjectClass *klass)
Packit ae235b
{
Packit ae235b
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
Packit ae235b
Packit ae235b
  properties[PROP_FOO] = g_param_spec_int ("foo", "Foo", "Foo",
Packit ae235b
                                           -1, G_MAXINT,
Packit ae235b
                                           0,
Packit ae235b
                                           G_PARAM_READWRITE);
Packit ae235b
  properties[PROP_BAR] = g_param_spec_boolean ("bar", "Bar", "Bar",
Packit ae235b
                                               FALSE,
Packit ae235b
                                               G_PARAM_READWRITE);
Packit ae235b
  properties[PROP_BAZ] = g_param_spec_string ("baz", "Baz", "Baz",
Packit ae235b
                                              NULL,
Packit ae235b
                                              G_PARAM_READWRITE);
Packit ae235b
  properties[PROP_QUUX] = g_param_spec_string ("quux", "quux", "quux",
Packit ae235b
                                               NULL,
Packit ae235b
                                               G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
Packit ae235b
Packit ae235b
  gobject_class->set_property = test_object_set_property;
Packit ae235b
  gobject_class->get_property = test_object_get_property;
Packit ae235b
  gobject_class->finalize = test_object_finalize;
Packit ae235b
Packit ae235b
  g_object_class_install_properties (gobject_class, N_PROPERTIES, properties);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_object_init (TestObject *self)
Packit ae235b
{
Packit ae235b
  self->foo = 42;
Packit ae235b
  self->bar = TRUE;
Packit ae235b
  self->baz = g_strdup ("Hello");
Packit ae235b
  self->quux = NULL;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
properties_install (void)
Packit ae235b
{
Packit ae235b
  TestObject *obj = g_object_new (test_object_get_type (), NULL);
Packit ae235b
  GParamSpec *pspec;
Packit ae235b
Packit ae235b
  g_assert (properties[PROP_FOO] != NULL);
Packit ae235b
Packit ae235b
  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (obj), "foo");
Packit ae235b
  g_assert (properties[PROP_FOO] == pspec);
Packit ae235b
Packit ae235b
  g_object_unref (obj);
Packit ae235b
}
Packit ae235b
Packit ae235b
typedef struct {
Packit ae235b
  const gchar *name;
Packit ae235b
  GParamSpec *pspec;
Packit ae235b
  gboolean    fired;
Packit ae235b
} TestNotifyClosure;
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_notify (GObject           *gobject,
Packit ae235b
           GParamSpec        *pspec,
Packit ae235b
           TestNotifyClosure *clos)
Packit ae235b
{
Packit ae235b
  g_assert (clos->pspec == pspec);
Packit ae235b
  g_assert_cmpstr (clos->name, ==, pspec->name);
Packit ae235b
  clos->fired = TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
properties_notify (void)
Packit ae235b
{
Packit ae235b
  TestObject *obj = g_object_new (test_object_get_type (), NULL);
Packit ae235b
  TestNotifyClosure clos;
Packit ae235b
Packit ae235b
  g_assert (properties[PROP_FOO] != NULL);
Packit ae235b
  g_assert (properties[PROP_QUUX] != NULL);
Packit ae235b
  g_signal_connect (obj, "notify", G_CALLBACK (on_notify), &clos);
Packit ae235b
Packit ae235b
  clos.name = "foo";
Packit ae235b
  clos.pspec = properties[PROP_FOO];
Packit ae235b
Packit ae235b
  clos.fired = FALSE;
Packit ae235b
  g_object_set (obj, "foo", 47, NULL);
Packit ae235b
  g_assert (clos.fired);
Packit ae235b
Packit ae235b
  clos.name = "baz";
Packit ae235b
  clos.pspec = properties[PROP_BAZ];
Packit ae235b
Packit ae235b
  clos.fired = FALSE;
Packit ae235b
  g_object_set (obj, "baz", "something new", NULL);
Packit ae235b
  g_assert (clos.fired);
Packit ae235b
Packit ae235b
  /* baz lacks explicit notify, so we will see this twice */
Packit ae235b
  clos.fired = FALSE;
Packit ae235b
  g_object_set (obj, "baz", "something new", NULL);
Packit ae235b
  g_assert (clos.fired);
Packit ae235b
Packit ae235b
  /* quux on the other hand, ... */
Packit ae235b
  clos.name = "quux";
Packit ae235b
  clos.pspec = properties[PROP_QUUX];
Packit ae235b
Packit ae235b
  clos.fired = FALSE;
Packit ae235b
  g_object_set (obj, "quux", "something new", NULL);
Packit ae235b
  g_assert (clos.fired);
Packit ae235b
Packit ae235b
  /* no change; no notify */
Packit ae235b
  clos.fired = FALSE;
Packit ae235b
  g_object_set (obj, "quux", "something new", NULL);
Packit ae235b
  g_assert (!clos.fired);
Packit ae235b
Packit ae235b
Packit ae235b
  g_object_unref (obj);
Packit ae235b
}
Packit ae235b
Packit ae235b
typedef struct {
Packit ae235b
  GParamSpec *pspec[3];
Packit ae235b
  gint pos;
Packit ae235b
} Notifys;
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_notify2 (GObject    *gobject,
Packit ae235b
            GParamSpec *pspec,
Packit ae235b
            Notifys    *n)
Packit ae235b
{
Packit ae235b
  g_assert (n->pspec[n->pos] == pspec);
Packit ae235b
  n->pos++;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
properties_notify_queue (void)
Packit ae235b
{
Packit ae235b
  TestObject *obj = g_object_new (test_object_get_type (), NULL);
Packit ae235b
  Notifys n;
Packit ae235b
Packit ae235b
  g_assert (properties[PROP_FOO] != NULL);
Packit ae235b
Packit ae235b
  n.pspec[0] = properties[PROP_BAZ];
Packit ae235b
  n.pspec[1] = properties[PROP_BAR];
Packit ae235b
  n.pspec[2] = properties[PROP_FOO];
Packit ae235b
  n.pos = 0;
Packit ae235b
Packit ae235b
  g_signal_connect (obj, "notify", G_CALLBACK (on_notify2), &n);
Packit ae235b
Packit ae235b
  g_object_freeze_notify (G_OBJECT (obj));
Packit ae235b
  g_object_set (obj, "foo", 47, NULL);
Packit ae235b
  g_object_set (obj, "bar", TRUE, "foo", 42, "baz", "abc", NULL);
Packit ae235b
  g_object_thaw_notify (G_OBJECT (obj));
Packit ae235b
  g_assert (n.pos == 3);
Packit ae235b
Packit ae235b
  g_object_unref (obj);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
properties_construct (void)
Packit ae235b
{
Packit ae235b
  TestObject *obj;
Packit ae235b
  gint val;
Packit ae235b
  gboolean b;
Packit ae235b
  gchar *s;
Packit ae235b
Packit ae235b
  g_test_bug ("630357");
Packit ae235b
Packit ae235b
  /* more than 16 args triggers a realloc in g_object_new_valist() */
Packit ae235b
  obj = g_object_new (test_object_get_type (),
Packit ae235b
                      "foo", 1,
Packit ae235b
                      "foo", 2,
Packit ae235b
                      "foo", 3,
Packit ae235b
                      "foo", 4,
Packit ae235b
                      "foo", 5,
Packit ae235b
                      "bar", FALSE,
Packit ae235b
                      "foo", 6,
Packit ae235b
                      "foo", 7,
Packit ae235b
                      "foo", 8,
Packit ae235b
                      "foo", 9,
Packit ae235b
                      "foo", 10,
Packit ae235b
                      "baz", "boo",
Packit ae235b
                      "foo", 11,
Packit ae235b
                      "foo", 12,
Packit ae235b
                      "foo", 13,
Packit ae235b
                      "foo", 14,
Packit ae235b
                      "foo", 15,
Packit ae235b
                      "foo", 16,
Packit ae235b
                      "foo", 17,
Packit ae235b
                      "foo", 18,
Packit ae235b
                      NULL);
Packit ae235b
Packit ae235b
  g_object_get (obj, "foo", &val, NULL);
Packit ae235b
  g_assert (val == 18);
Packit ae235b
  g_object_get (obj, "bar", &b, NULL);
Packit ae235b
  g_assert (!b);
Packit ae235b
  g_object_get (obj, "baz", &s, NULL);
Packit ae235b
  g_assert_cmpstr (s, ==, "boo");
Packit ae235b
  g_free (s);
Packit ae235b
Packit ae235b
  g_object_unref (obj);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
properties_testv_with_no_properties (void)
Packit ae235b
{
Packit ae235b
  TestObject *test_obj;
Packit ae235b
  const char *prop_names[4] = { "foo", "bar", "baz", "quux" };
Packit ae235b
  GValue values_out[4] = { G_VALUE_INIT };
Packit ae235b
  guint i;
Packit ae235b
Packit ae235b
  /* Test newv_with_properties && getv */
Packit ae235b
  test_obj = (TestObject *) g_object_new_with_properties (
Packit ae235b
      test_object_get_type (), 0, NULL, NULL);
Packit ae235b
  g_object_getv (G_OBJECT (test_obj), 4, prop_names, values_out);
Packit ae235b
Packit ae235b
  /* It should have init values */
Packit ae235b
  g_assert_cmpint (g_value_get_int (&values_out[0]), ==, 42);
Packit ae235b
  g_assert_true (g_value_get_boolean (&values_out[1]));
Packit ae235b
  g_assert_cmpstr (g_value_get_string (&values_out[2]), ==, "Hello");
Packit ae235b
  g_assert_cmpstr (g_value_get_string (&values_out[3]), ==, NULL);
Packit ae235b
Packit ae235b
  for (i = 0; i < 4; i++)
Packit ae235b
    g_value_unset (&values_out[i]);
Packit ae235b
  g_object_unref (test_obj);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
properties_testv_with_valid_properties (void)
Packit ae235b
{
Packit ae235b
  TestObject *test_obj;
Packit ae235b
  const char *prop_names[4] = { "foo", "bar", "baz", "quux" };
Packit ae235b
Packit ae235b
  GValue values_in[4] = { G_VALUE_INIT };
Packit ae235b
  GValue values_out[4] = { G_VALUE_INIT };
Packit ae235b
  guint i;
Packit ae235b
Packit ae235b
  g_value_init (&(values_in[0]), G_TYPE_INT);
Packit ae235b
  g_value_set_int (&(values_in[0]), 100);
Packit ae235b
Packit ae235b
  g_value_init (&(values_in[1]), G_TYPE_BOOLEAN);
Packit ae235b
  g_value_set_boolean (&(values_in[1]), TRUE);
Packit ae235b
Packit ae235b
  g_value_init (&(values_in[2]), G_TYPE_STRING);
Packit ae235b
  g_value_set_string (&(values_in[2]), "pigs");
Packit ae235b
Packit ae235b
  g_value_init (&(values_in[3]), G_TYPE_STRING);
Packit ae235b
  g_value_set_string (&(values_in[3]), "fly");
Packit ae235b
Packit ae235b
  /* Test newv_with_properties && getv */
Packit ae235b
  test_obj = (TestObject *) g_object_new_with_properties (
Packit ae235b
      test_object_get_type (), 4, prop_names, values_in);
Packit ae235b
  g_object_getv (G_OBJECT (test_obj), 4, prop_names, values_out);
Packit ae235b
Packit ae235b
  g_assert_cmpint (g_value_get_int (&values_out[0]), ==, 100);
Packit ae235b
  g_assert_true (g_value_get_boolean (&values_out[1]));
Packit ae235b
  g_assert_cmpstr (g_value_get_string (&values_out[2]), ==, "pigs");
Packit ae235b
  g_assert_cmpstr (g_value_get_string (&values_out[3]), ==, "fly");
Packit ae235b
Packit ae235b
  /* Test newv2 && getv */
Packit ae235b
  g_value_set_string (&(values_in[2]), "Elmo knows");
Packit ae235b
  g_value_set_string (&(values_in[3]), "where you live");
Packit ae235b
  g_object_setv (G_OBJECT (test_obj), 4, prop_names, values_in);
Packit ae235b
Packit ae235b
  g_object_getv (G_OBJECT (test_obj), 4, prop_names, values_out);
Packit ae235b
Packit ae235b
  g_assert_cmpint (g_value_get_int (&values_out[0]), ==, 100);
Packit ae235b
  g_assert_true (g_value_get_boolean (&values_out[1]));
Packit ae235b
Packit ae235b
  g_assert_cmpstr (g_value_get_string (&values_out[2]), ==, "Elmo knows");
Packit ae235b
  g_assert_cmpstr (g_value_get_string (&values_out[3]), ==, "where you live");
Packit ae235b
Packit ae235b
Packit ae235b
  for (i = 0; i < 4; i++)
Packit ae235b
    {
Packit ae235b
      g_value_unset (&values_in[i]);
Packit ae235b
      g_value_unset (&values_out[i]);
Packit ae235b
    }
Packit ae235b
Packit ae235b
  g_object_unref (test_obj);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
properties_testv_with_invalid_property_type (void)
Packit ae235b
{
Packit ae235b
  if (g_test_subprocess ())
Packit ae235b
    {
Packit ae235b
      TestObject *test_obj;
Packit ae235b
      const char *invalid_prop_names[1] = { "foo" };
Packit ae235b
      GValue values_in[1] = { G_VALUE_INIT };
Packit ae235b
Packit ae235b
      g_value_init (&(values_in[0]), G_TYPE_STRING);
Packit ae235b
      g_value_set_string (&(values_in[0]), "fly");
Packit ae235b
Packit ae235b
      test_obj = (TestObject *) g_object_new_with_properties (
Packit ae235b
          test_object_get_type (), 1, invalid_prop_names, values_in);
Packit ae235b
      /* should give a warning */
Packit ae235b
Packit ae235b
      g_object_unref (test_obj);
Packit ae235b
    }
Packit ae235b
  g_test_trap_subprocess (NULL, 0, 0);
Packit ae235b
  g_test_trap_assert_failed ();
Packit ae235b
  g_test_trap_assert_stderr ("*WARNING*foo*gint*gchararray*");
Packit ae235b
}
Packit ae235b
Packit ae235b
Packit ae235b
static void
Packit ae235b
properties_testv_with_invalid_property_names (void)
Packit ae235b
{
Packit ae235b
  if (g_test_subprocess ())
Packit ae235b
    {
Packit ae235b
      TestObject *test_obj;
Packit ae235b
      const char *invalid_prop_names[4] = { "foo", "boo", "moo", "poo" };
Packit ae235b
      GValue values_in[4] = { G_VALUE_INIT };
Packit ae235b
Packit ae235b
      g_value_init (&(values_in[0]), G_TYPE_INT);
Packit ae235b
      g_value_set_int (&(values_in[0]), 100);
Packit ae235b
Packit ae235b
      g_value_init (&(values_in[1]), G_TYPE_BOOLEAN);
Packit ae235b
      g_value_set_boolean (&(values_in[1]), TRUE);
Packit ae235b
Packit ae235b
      g_value_init (&(values_in[2]), G_TYPE_STRING);
Packit ae235b
      g_value_set_string (&(values_in[2]), "pigs");
Packit ae235b
Packit ae235b
      g_value_init (&(values_in[3]), G_TYPE_STRING);
Packit ae235b
      g_value_set_string (&(values_in[3]), "fly");
Packit ae235b
Packit ae235b
      test_obj = (TestObject *) g_object_new_with_properties (
Packit ae235b
          test_object_get_type (), 4, invalid_prop_names, values_in);
Packit ae235b
      /* This call should give 3 Critical warnings. Actually, a critical warning
Packit ae235b
       * shouldn't make g_object_new_with_properties to fail when a bad named
Packit ae235b
       * property is given, because, it will just ignore that property. However,
Packit ae235b
       * for test purposes, it is considered that the test doesn't pass.
Packit ae235b
       */
Packit ae235b
Packit ae235b
      g_object_unref (test_obj);
Packit ae235b
    }
Packit ae235b
Packit ae235b
  g_test_trap_subprocess (NULL, 0, 0);
Packit ae235b
  g_test_trap_assert_failed ();
Packit ae235b
  g_test_trap_assert_stderr ("*CRITICAL*g_object_new_is_valid_property*boo*");
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
properties_testv_getv (void)
Packit ae235b
{
Packit ae235b
  TestObject *test_obj;
Packit ae235b
  const char *prop_names[4] = { "foo", "bar", "baz", "quux" };
Packit ae235b
  GValue values_out_initialized[4] = { G_VALUE_INIT };
Packit ae235b
  GValue values_out_uninitialized[4] = { G_VALUE_INIT };
Packit ae235b
  guint i;
Packit ae235b
Packit ae235b
  g_value_init (&(values_out_initialized[0]), G_TYPE_INT);
Packit ae235b
  g_value_init (&(values_out_initialized[1]), G_TYPE_BOOLEAN);
Packit ae235b
  g_value_init (&(values_out_initialized[2]), G_TYPE_STRING);
Packit ae235b
  g_value_init (&(values_out_initialized[3]), G_TYPE_STRING);
Packit ae235b
Packit ae235b
  test_obj = (TestObject *) g_object_new_with_properties (
Packit ae235b
      test_object_get_type (), 0, NULL, NULL);
Packit ae235b
Packit ae235b
  /* Test g_object_getv for an initialized values array */
Packit ae235b
  g_object_getv (G_OBJECT (test_obj), 4, prop_names, values_out_initialized);
Packit ae235b
  /* It should have init values */
Packit ae235b
  g_assert_cmpint (g_value_get_int (&values_out_initialized[0]), ==, 42);
Packit ae235b
  g_assert_true (g_value_get_boolean (&values_out_initialized[1]));
Packit ae235b
  g_assert_cmpstr (g_value_get_string (&values_out_initialized[2]), ==, "Hello");
Packit ae235b
  g_assert_cmpstr (g_value_get_string (&values_out_initialized[3]), ==, NULL);
Packit ae235b
Packit ae235b
  /* Test g_object_getv for an uninitialized values array */
Packit ae235b
  g_object_getv (G_OBJECT (test_obj), 4, prop_names, values_out_uninitialized);
Packit ae235b
  /* It should have init values */
Packit ae235b
  g_assert_cmpint (g_value_get_int (&values_out_uninitialized[0]), ==, 42);
Packit ae235b
  g_assert_true (g_value_get_boolean (&values_out_uninitialized[1]));
Packit ae235b
  g_assert_cmpstr (g_value_get_string (&values_out_uninitialized[2]), ==, "Hello");
Packit ae235b
  g_assert_cmpstr (g_value_get_string (&values_out_uninitialized[3]), ==, NULL);
Packit ae235b
Packit ae235b
  for (i = 0; i < 4; i++)
Packit ae235b
    {
Packit ae235b
      g_value_unset (&values_out_initialized[i]);
Packit ae235b
      g_value_unset (&values_out_uninitialized[i]);
Packit ae235b
    }
Packit ae235b
  g_object_unref (test_obj);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
properties_testv_notify_queue (void)
Packit ae235b
{
Packit ae235b
  TestObject *test_obj;
Packit ae235b
  const char *prop_names[3] = { "foo", "bar", "baz" };
Packit ae235b
  GValue values_in[3] = { G_VALUE_INIT };
Packit ae235b
  Notifys n;
Packit ae235b
  guint i;
Packit ae235b
Packit ae235b
  g_value_init (&(values_in[0]), G_TYPE_INT);
Packit ae235b
  g_value_set_int (&(values_in[0]), 100);
Packit ae235b
Packit ae235b
  g_value_init (&(values_in[1]), G_TYPE_BOOLEAN);
Packit ae235b
  g_value_set_boolean (&(values_in[1]), TRUE);
Packit ae235b
Packit ae235b
  g_value_init (&(values_in[2]), G_TYPE_STRING);
Packit ae235b
  g_value_set_string (&(values_in[2]), "");
Packit ae235b
Packit ae235b
  /* Test newv_with_properties && getv */
Packit ae235b
  test_obj = (TestObject *) g_object_new_with_properties (
Packit ae235b
      test_object_get_type (), 0, NULL, NULL);
Packit ae235b
Packit ae235b
  g_assert_nonnull (properties[PROP_FOO]);
Packit ae235b
Packit ae235b
  n.pspec[0] = properties[PROP_BAZ];
Packit ae235b
  n.pspec[1] = properties[PROP_BAR];
Packit ae235b
  n.pspec[2] = properties[PROP_FOO];
Packit ae235b
  n.pos = 0;
Packit ae235b
Packit ae235b
  g_signal_connect (test_obj, "notify", G_CALLBACK (on_notify2), &n);
Packit ae235b
Packit ae235b
  g_object_freeze_notify (G_OBJECT (test_obj));
Packit ae235b
  {
Packit ae235b
    g_object_setv (G_OBJECT (test_obj), 3, prop_names, values_in);
Packit ae235b
Packit ae235b
    /* Set "foo" to 70 */
Packit ae235b
    g_value_set_int (&(values_in[0]), 100);
Packit ae235b
    g_object_setv (G_OBJECT (test_obj), 1, prop_names, values_in);
Packit ae235b
  }
Packit ae235b
  g_object_thaw_notify (G_OBJECT (test_obj));
Packit ae235b
  g_assert_cmpint (n.pos, ==, 3);
Packit ae235b
Packit ae235b
  for (i = 0; i < 3; i++)
Packit ae235b
    g_value_unset (&values_in[i]);
Packit ae235b
  g_object_unref (test_obj);
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
Packit ae235b
  g_test_bug_base ("http://bugzilla.gnome.org/");
Packit ae235b
Packit ae235b
  g_test_add_func ("/properties/install", properties_install);
Packit ae235b
  g_test_add_func ("/properties/notify", properties_notify);
Packit ae235b
  g_test_add_func ("/properties/notify-queue", properties_notify_queue);
Packit ae235b
  g_test_add_func ("/properties/construct", properties_construct);
Packit ae235b
Packit ae235b
  g_test_add_func ("/properties/testv_with_no_properties",
Packit ae235b
      properties_testv_with_no_properties);
Packit ae235b
  g_test_add_func ("/properties/testv_with_valid_properties",
Packit ae235b
      properties_testv_with_valid_properties);
Packit ae235b
  g_test_add_func ("/properties/testv_with_invalid_property_type",
Packit ae235b
      properties_testv_with_invalid_property_type);
Packit ae235b
  g_test_add_func ("/properties/testv_with_invalid_property_names",
Packit ae235b
      properties_testv_with_invalid_property_names);
Packit ae235b
  g_test_add_func ("/properties/testv_getv", properties_testv_getv);
Packit ae235b
  g_test_add_func ("/properties/testv_notify_queue",
Packit ae235b
      properties_testv_notify_queue);
Packit ae235b
Packit ae235b
  return g_test_run ();
Packit ae235b
}