[glib/wip/threadsafe-qdata: 3/5] Add some tests for new object data api
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/threadsafe-qdata: 3/5] Add some tests for new object data api
- Date: Sat, 1 Sep 2012 03:09:00 +0000 (UTC)
commit 8b416cf9895b663e4be4017b28e4881556aa0d10
Author: Matthias Clasen <mclasen redhat com>
Date: Tue Aug 28 23:56:01 2012 -0400
Add some tests for new object data api
These are non-threaded, but the do test dup and destroy somewhat.
https://bugzilla.gnome.org/show_bug.cgi?id=682849
gobject/tests/reference.c | 121 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 121 insertions(+), 0 deletions(-)
---
diff --git a/gobject/tests/reference.c b/gobject/tests/reference.c
index 2086e71..0724ae9 100644
--- a/gobject/tests/reference.c
+++ b/gobject/tests/reference.c
@@ -473,6 +473,126 @@ test_object_qdata (void)
g_assert (destroyed);
}
+typedef struct {
+ const gchar *value;
+ gint refcount;
+} Value;
+
+static gpointer
+ref_value (gpointer value, gpointer user_data)
+{
+ Value *v = value;
+ Value **old_value_p = user_data;
+
+ if (old_value_p)
+ *old_value_p = v;
+
+ if (v)
+ v->refcount += 1;
+
+ return value;
+}
+
+static void
+unref_value (gpointer value)
+{
+ Value *v = value;
+
+ v->refcount -= 1;
+ if (v->refcount == 0)
+ g_free (value);
+}
+
+static
+Value *
+new_value (const gchar *s)
+{
+ Value *v;
+
+ v = g_new (Value, 1);
+ v->value = s;
+ v->refcount = 1;
+
+ return v;
+}
+
+static void
+test_object_qdata2 (void)
+{
+ GObject *obj;
+ Value *v, *v1, *v2, *v3, *old_val;
+ GDestroyNotify old_destroy;
+ gboolean res;
+
+ obj = g_object_new (G_TYPE_OBJECT, NULL);
+
+ v1 = new_value ("bla");
+
+ g_object_set_data_full (obj, "test", v1, unref_value);
+
+ v = g_object_get_data (obj, "test");
+ g_assert_cmpstr (v->value, ==, "bla");
+ g_assert_cmpint (v->refcount, ==, 1);
+
+ v = g_object_dup_data (obj, "test", ref_value, &old_val);
+ g_assert (old_val == v1);
+ g_assert_cmpstr (v->value, ==, "bla");
+ g_assert_cmpint (v->refcount, ==, 2);
+ unref_value (v);
+
+ v = g_object_dup_data (obj, "nono", ref_value, &old_val);
+ g_assert (old_val == NULL);
+ g_assert (v == NULL);
+
+ v2 = new_value ("not");
+
+ res = g_object_replace_data (obj, "test", v1, v2, unref_value, &old_destroy);
+ g_assert (res == TRUE);
+ g_assert (old_destroy == unref_value);
+ g_assert_cmpstr (v1->value, ==, "bla");
+ g_assert_cmpint (v1->refcount, ==, 1);
+
+ v = g_object_get_data (obj, "test");
+ g_assert_cmpstr (v->value, ==, "not");
+ g_assert_cmpint (v->refcount, ==, 1);
+
+ v3 = new_value ("xyz");
+ res = g_object_replace_data (obj, "test", v1, v3, unref_value, &old_destroy);
+ g_assert (res == FALSE);
+ g_assert_cmpstr (v2->value, ==, "not");
+ g_assert_cmpint (v2->refcount, ==, 1);
+
+ unref_value (v1);
+
+ res = g_object_replace_data (obj, "test", NULL, v3, unref_value, &old_destroy);
+ g_assert (res == FALSE);
+ g_assert_cmpstr (v2->value, ==, "not");
+ g_assert_cmpint (v2->refcount, ==, 1);
+
+ res = g_object_replace_data (obj, "test", v2, NULL, unref_value, &old_destroy);
+ g_assert (res == TRUE);
+ g_assert (old_destroy == unref_value);
+ g_assert_cmpstr (v2->value, ==, "not");
+ g_assert_cmpint (v2->refcount, ==, 1);
+
+ unref_value (v2);
+
+ v = g_object_get_data (obj, "test");
+ g_assert (v == NULL);
+
+ res = g_object_replace_data (obj, "test", NULL, v3, unref_value, &old_destroy);
+ g_assert (res == TRUE);
+
+ v = g_object_get_data (obj, "test");
+ g_assert (v == v3);
+
+ ref_value (v3, NULL);
+ g_assert_cmpint (v3->refcount, ==, 2);
+ g_object_unref (obj);
+ g_assert_cmpint (v3->refcount, ==, 1);
+ unref_value (v3);
+}
+
int
main (int argc, char **argv)
{
@@ -492,6 +612,7 @@ main (int argc, char **argv)
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);
+ g_test_add_func ("/object/qdata2", test_object_qdata2);
return g_test_run ();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]