summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikkel Kamstrup Erlandsen <mikkel.kamstrup@canonical.com>2011-10-04 12:01:42 +0200
committerMartin Pitt <martin.pitt@ubuntu.com>2011-10-25 08:41:16 +0200
commite05ed0f9c1de597cb6f925505f58cb919a5bf1c4 (patch)
tree6e9277d3b35151027b97f389d4c88ad250251b67
parentd6ab510feb72ac0ff30f0942e874e2d52f3e82f6 (diff)
downloadgobject-introspection-e05ed0f9c1de597cb6f925505f58cb919a5bf1c4.tar.gz
fixes and more tests for marshalling of arrays of gvariants
Fix return type annotation for gi_marshalling_tests_array_gvariant_in() Add function variations of gi_marshalling_tests_array_gvariant_i() with different transfer modes. Make gi_marshalling_tests_array_gvariant_none_in() actually respect the transfer none annotation on the return value. https://bugzilla.gnome.org/show_bug.cgi?id=638915 Signed-off-by: Martin Pitt <martin.pitt@ubuntu.com>
-rw-r--r--tests/gimarshallingtests.c65
-rw-r--r--tests/gimarshallingtests.h6
2 files changed, 67 insertions, 4 deletions
diff --git a/tests/gimarshallingtests.c b/tests/gimarshallingtests.c
index 637c7d50..073d153a 100644
--- a/tests/gimarshallingtests.c
+++ b/tests/gimarshallingtests.c
@@ -1578,18 +1578,77 @@ gi_marshalling_tests_array_zero_terminated_inout (gchar ***utf8s)
}
/**
- * gi_marshalling_tests_array_gvariant_in:
+ * gi_marshalling_tests_array_gvariant_none_in:
* @variants: (array zero-terminated=1) (transfer none):
+ * Returns: (array zero-terminated=1) (transfer none):
+ */
+GVariant **
+gi_marshalling_tests_array_gvariant_none_in (GVariant **variants)
+{
+ /* Use a static container to detect if someone tries to free it */
+ static GVariant *private_container[3] = { NULL, NULL, NULL };
+
+ if (private_container[0] == NULL) {
+ private_container[0] = g_variant_new_int32 (27);
+ private_container[1] = g_variant_new_string ("Hello");
+ }
+
+ g_assert (variants != NULL);
+ g_assert_cmpint (g_variant_get_int32 (variants[0]), ==, 27);
+ g_assert_cmpstr (g_variant_get_string (variants[1], NULL), ==, "Hello");
+ g_assert (variants[2] == NULL);
+
+ return private_container;
+}
+
+/**
+ * gi_marshalling_tests_array_gvariant_container_in:
+ * @variants: (array zero-terminated=1) (transfer container):
+ * Returns: (array zero-terminated=1) (transfer container):
*/
GVariant **
-gi_marshalling_tests_array_gvariant_in (GVariant **variants)
+gi_marshalling_tests_array_gvariant_container_in (GVariant **variants)
{
+ GVariant **container;
+
g_assert (variants != NULL);
g_assert_cmpint (g_variant_get_int32 (variants[0]), ==, 27);
g_assert_cmpstr (g_variant_get_string (variants[1], NULL), ==, "Hello");
g_assert (variants[2] == NULL);
+
+ container = g_new0 (GVariant*, 3);
+ container[0] = variants[0];
+ container[1] = variants[1];
+ g_free (variants);
+
+ return container;
+}
+
+/**
+ * gi_marshalling_tests_array_gvariant_full_in:
+ * @variants: (array zero-terminated=1) (transfer full):
+ * Returns: (array zero-terminated=1) (transfer full):
+ */
+GVariant **
+gi_marshalling_tests_array_gvariant_full_in (GVariant **variants)
+{
+ GVariant **container;
- return variants;
+ g_assert (variants != NULL);
+ g_assert_cmpint (g_variant_get_int32 (variants[0]), ==, 27);
+ g_assert_cmpstr (g_variant_get_string (variants[1], NULL), ==, "Hello");
+ g_assert (variants[2] == NULL);
+
+ /* To catch different behaviors we reconstruct one variant from scratch,
+ * while leaving the other untouched. Both approaches are legal with full
+ * transfer in and out */
+ container = g_new0 (GVariant*, 3);
+ container[0] = g_variant_new_int32 (g_variant_get_int32 (variants[0]));
+ g_variant_unref (variants[0]);
+ container[1] = variants[1];
+ g_free (variants);
+
+ return container;
}
/**
diff --git a/tests/gimarshallingtests.h b/tests/gimarshallingtests.h
index 81c3a50a..388ee051 100644
--- a/tests/gimarshallingtests.h
+++ b/tests/gimarshallingtests.h
@@ -403,7 +403,11 @@ void gi_marshalling_tests_array_zero_terminated_out (gchar ***utf8s);
void gi_marshalling_tests_array_zero_terminated_inout (gchar ***utf8s);
-GVariant **gi_marshalling_tests_array_gvariant_in (GVariant **variants);
+GVariant **gi_marshalling_tests_array_gvariant_none_in (GVariant **variants);
+
+GVariant **gi_marshalling_tests_array_gvariant_container_in (GVariant **variants);
+
+GVariant **gi_marshalling_tests_array_gvariant_full_in (GVariant **variants);
/* GArray */