mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-13 15:56:23 +01:00
Add tests for toggle reference and qdata
This commit is contained in:
parent
8b618eb7f1
commit
e62102dbc5
@ -151,16 +151,27 @@ test_clear_function (void)
|
|||||||
g_object_unref (tmp);
|
g_object_unref (tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
toggle_cb (gpointer data, GObject *obj, gboolean is_last)
|
||||||
|
{
|
||||||
|
gboolean *b = data;
|
||||||
|
|
||||||
|
*b = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
test_object_value (void)
|
test_object_value (void)
|
||||||
{
|
{
|
||||||
GObject *v;
|
GObject *v;
|
||||||
GObject *v2;
|
GObject *v2;
|
||||||
GValue value = G_VALUE_INIT;
|
GValue value = G_VALUE_INIT;
|
||||||
|
gboolean toggled = FALSE;
|
||||||
|
|
||||||
g_value_init (&value, G_TYPE_OBJECT);
|
g_value_init (&value, G_TYPE_OBJECT);
|
||||||
|
|
||||||
v = g_object_new (G_TYPE_OBJECT, NULL);
|
v = g_object_new (G_TYPE_OBJECT, NULL);
|
||||||
|
g_object_add_toggle_ref (v, toggle_cb, &toggled);
|
||||||
|
|
||||||
g_value_take_object (&value, v);
|
g_value_take_object (&value, v);
|
||||||
|
|
||||||
v2 = g_value_get_object (&value);
|
v2 = g_value_get_object (&value);
|
||||||
@ -170,7 +181,24 @@ test_object_value (void)
|
|||||||
g_assert (v2 == v); /* objects use ref/unref for copy/free */
|
g_assert (v2 == v); /* objects use ref/unref for copy/free */
|
||||||
g_object_unref (v2);
|
g_object_unref (v2);
|
||||||
|
|
||||||
|
g_assert (!toggled);
|
||||||
g_value_unset (&value);
|
g_value_unset (&value);
|
||||||
|
g_assert (toggled);
|
||||||
|
|
||||||
|
/* test the deprecated variant too */
|
||||||
|
g_value_init (&value, G_TYPE_OBJECT);
|
||||||
|
/* get a new reference */
|
||||||
|
g_object_ref (v);
|
||||||
|
|
||||||
|
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
||||||
|
g_value_set_object_take_ownership (&value, v);
|
||||||
|
G_GNUC_END_IGNORE_DEPRECATIONS
|
||||||
|
|
||||||
|
toggled = FALSE;
|
||||||
|
g_value_unset (&value);
|
||||||
|
g_assert (toggled);
|
||||||
|
|
||||||
|
g_object_remove_toggle_ref (v, toggle_cb, &toggled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -327,6 +355,124 @@ test_weak_ref (void)
|
|||||||
g_free (dynamic_weak);
|
g_free (dynamic_weak);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
gboolean should_be_last;
|
||||||
|
gint count;
|
||||||
|
} Count;
|
||||||
|
|
||||||
|
static void
|
||||||
|
toggle_notify (gpointer data,
|
||||||
|
GObject *obj,
|
||||||
|
gboolean is_last)
|
||||||
|
{
|
||||||
|
Count *c = data;
|
||||||
|
|
||||||
|
g_assert (is_last == c->should_be_last);
|
||||||
|
|
||||||
|
c->count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_toggle_ref (void)
|
||||||
|
{
|
||||||
|
GObject *obj;
|
||||||
|
Count c, c2;
|
||||||
|
|
||||||
|
obj = g_object_new (G_TYPE_OBJECT, NULL);
|
||||||
|
|
||||||
|
g_object_add_toggle_ref (obj, toggle_notify, &c);
|
||||||
|
g_object_add_toggle_ref (obj, toggle_notify, &c2);
|
||||||
|
|
||||||
|
c.should_be_last = c2.should_be_last = TRUE;
|
||||||
|
c.count = c2.count = 0;
|
||||||
|
|
||||||
|
g_object_unref (obj);
|
||||||
|
|
||||||
|
g_assert_cmpint (c.count, ==, 0);
|
||||||
|
g_assert_cmpint (c2.count, ==, 0);
|
||||||
|
|
||||||
|
g_object_ref (obj);
|
||||||
|
|
||||||
|
g_assert_cmpint (c.count, ==, 0);
|
||||||
|
g_assert_cmpint (c2.count, ==, 0);
|
||||||
|
|
||||||
|
g_object_remove_toggle_ref (obj, toggle_notify, &c2);
|
||||||
|
|
||||||
|
g_object_unref (obj);
|
||||||
|
|
||||||
|
g_assert_cmpint (c.count, ==, 1);
|
||||||
|
|
||||||
|
c.should_be_last = FALSE;
|
||||||
|
|
||||||
|
g_object_ref (obj);
|
||||||
|
|
||||||
|
g_assert_cmpint (c.count, ==, 2);
|
||||||
|
|
||||||
|
c.should_be_last = TRUE;
|
||||||
|
|
||||||
|
g_object_unref (obj);
|
||||||
|
|
||||||
|
g_assert_cmpint (c.count, ==, 3);
|
||||||
|
|
||||||
|
g_object_remove_toggle_ref (obj, toggle_notify, &c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean destroyed;
|
||||||
|
static gint value;
|
||||||
|
|
||||||
|
static void
|
||||||
|
data_destroy (gpointer data)
|
||||||
|
{
|
||||||
|
g_assert_cmpint (GPOINTER_TO_INT (data), ==, value);
|
||||||
|
|
||||||
|
destroyed = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_object_qdata (void)
|
||||||
|
{
|
||||||
|
GObject *obj;
|
||||||
|
gpointer v;
|
||||||
|
GQuark quark;
|
||||||
|
|
||||||
|
obj = g_object_new (G_TYPE_OBJECT, NULL);
|
||||||
|
|
||||||
|
value = 1;
|
||||||
|
destroyed = FALSE;
|
||||||
|
g_object_set_data_full (obj, "test", GINT_TO_POINTER (1), data_destroy);
|
||||||
|
v = g_object_get_data (obj, "test");
|
||||||
|
g_assert_cmpint (GPOINTER_TO_INT (v), ==, 1);
|
||||||
|
g_object_set_data_full (obj, "test", GINT_TO_POINTER (2), data_destroy);
|
||||||
|
g_assert (destroyed);
|
||||||
|
value = 2;
|
||||||
|
destroyed = FALSE;
|
||||||
|
v = g_object_steal_data (obj, "test");
|
||||||
|
g_assert_cmpint (GPOINTER_TO_INT (v), ==, 2);
|
||||||
|
g_assert (!destroyed);
|
||||||
|
|
||||||
|
value = 1;
|
||||||
|
destroyed = FALSE;
|
||||||
|
quark = g_quark_from_string ("test");
|
||||||
|
g_object_set_qdata_full (obj, quark, GINT_TO_POINTER (1), data_destroy);
|
||||||
|
v = g_object_get_qdata (obj, quark);
|
||||||
|
g_assert_cmpint (GPOINTER_TO_INT (v), ==, 1);
|
||||||
|
g_object_set_qdata_full (obj, quark, GINT_TO_POINTER (2), data_destroy);
|
||||||
|
g_assert (destroyed);
|
||||||
|
value = 2;
|
||||||
|
destroyed = FALSE;
|
||||||
|
v = g_object_steal_qdata (obj, quark);
|
||||||
|
g_assert_cmpint (GPOINTER_TO_INT (v), ==, 2);
|
||||||
|
g_assert (!destroyed);
|
||||||
|
|
||||||
|
g_object_set_qdata_full (obj, quark, GINT_TO_POINTER (3), data_destroy);
|
||||||
|
value = 3;
|
||||||
|
destroyed = FALSE;
|
||||||
|
g_object_unref (obj);
|
||||||
|
|
||||||
|
g_assert (destroyed);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -344,6 +490,8 @@ main (int argc, char **argv)
|
|||||||
g_test_add_func ("/object/initially-unowned", test_initially_unowned);
|
g_test_add_func ("/object/initially-unowned", test_initially_unowned);
|
||||||
g_test_add_func ("/object/weak-pointer", test_weak_pointer);
|
g_test_add_func ("/object/weak-pointer", test_weak_pointer);
|
||||||
g_test_add_func ("/object/weak-ref", test_weak_ref);
|
g_test_add_func ("/object/weak-ref", test_weak_ref);
|
||||||
|
g_test_add_func ("/object/toggle-ref", test_toggle_ref);
|
||||||
|
g_test_add_func ("/object/qdata", test_object_qdata);
|
||||||
|
|
||||||
return g_test_run ();
|
return g_test_run ();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user