[gobject-introspection] Add regression tests for GHashTable holding GValue



commit 9406a644ba29c3df59c6493843fe06dea5614c24
Author: Alberto Mardegan <alberto mardegan canonical com>
Date:   Wed Mar 21 19:01:31 2012 +0400

    Add regression tests for GHashTable holding GValue
    
    Add a couple of functions which can be used to test
    marshalling/demarshalling of GHashTables having GValue as keys.
    
    This is related to a python-gobject bug:
    https://bugzilla.gnome.org/show_bug.cgi?id=668903
    
    Signed-off-by: Martin Pitt <martinpitt gnome org>

 tests/scanner/Regress-1.0-expected.gir |   24 ++++++++
 tests/scanner/regress.c                |   92 ++++++++++++++++++++++++++++++++
 tests/scanner/regress.h                |    2 +
 3 files changed, 118 insertions(+), 0 deletions(-)
---
diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
index ae04725..5d806d3 100644
--- a/tests/scanner/Regress-1.0-expected.gir
+++ b/tests/scanner/Regress-1.0-expected.gir
@@ -2201,6 +2201,30 @@ call and can be released on return.</doc>
         </type>
       </return-value>
     </function>
+    <function name="test_ghash_gvalue_in"
+              c:identifier="regress_test_ghash_gvalue_in">
+      <return-value transfer-ownership="none">
+        <type name="none" c:type="void"/>
+      </return-value>
+      <parameters>
+        <parameter name="hash" transfer-ownership="none">
+          <doc xml:whitespace="preserve">the hash table returned by regress_test_ghash_gvalue_return().</doc>
+          <type name="GLib.HashTable" c:type="GHashTable*">
+            <type name="utf8"/>
+            <type name="GObject.Value"/>
+          </type>
+        </parameter>
+      </parameters>
+    </function>
+    <function name="test_ghash_gvalue_return"
+              c:identifier="regress_test_ghash_gvalue_return">
+      <return-value transfer-ownership="none">
+        <type name="GLib.HashTable" c:type="GHashTable*">
+          <type name="utf8"/>
+          <type name="GObject.Value"/>
+        </type>
+      </return-value>
+    </function>
     <function name="test_ghash_nested_everything_return"
               c:identifier="regress_test_ghash_nested_everything_return">
       <doc xml:whitespace="preserve">Specify nested parameterized types directly with the (type ) annotation.</doc>
diff --git a/tests/scanner/regress.c b/tests/scanner/regress.c
index 7e838d3..30029f9 100644
--- a/tests/scanner/regress.c
+++ b/tests/scanner/regress.c
@@ -1205,6 +1205,98 @@ regress_test_ghash_nothing_return2 (void)
   return regress_test_table_ghash_const ();
 }
 
+static GValue *
+g_value_new (GType type)
+{
+  GValue *value = g_slice_new0(GValue);
+  g_value_init(value, type);
+  return value;
+}
+
+static void
+g_value_free (GValue *value)
+{
+  g_value_unset(value);
+  g_slice_free(GValue, value);
+}
+
+static const gchar *string_array[] = {
+  "first",
+  "second",
+  "third",
+  NULL
+};
+
+/**
+ * regress_test_ghash_gvalue_return:
+ *
+ * Return value: (element-type utf8 GValue) (transfer none):
+ */
+GHashTable *
+regress_test_ghash_gvalue_return (void)
+{
+  GHashTable *hash;
+  GValue *value;
+  hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+                               g_free, (GDestroyNotify)g_value_free);
+
+  value = g_value_new(G_TYPE_INT);
+  g_value_set_int(value, 12);
+  g_hash_table_insert(hash, g_strdup("integer"), value);
+
+  value = g_value_new(G_TYPE_BOOLEAN);
+  g_value_set_boolean(value, TRUE);
+  g_hash_table_insert(hash, g_strdup("boolean"), value);
+
+  value = g_value_new(G_TYPE_STRING);
+  g_value_set_string(value, "some text");
+  g_hash_table_insert(hash, g_strdup("string"), value);
+
+  value = g_value_new(G_TYPE_STRV);
+  g_value_set_boxed(value, string_array);
+  g_hash_table_insert(hash, g_strdup("strings"), value);
+
+  return hash;
+}
+
+/**
+ * regress_test_ghash_gvalue_in:
+ * @hash: (element-type utf8 GValue): the hash table returned by
+ * regress_test_ghash_gvalue_return().
+ */
+void
+regress_test_ghash_gvalue_in (GHashTable *hash)
+{
+  GValue *value;
+  const gchar **strings;
+  int i;
+
+  g_assert(hash != NULL);
+
+  value = g_hash_table_lookup(hash, "integer");
+  g_assert(value != NULL);
+  g_assert(G_VALUE_HOLDS_INT(value));
+  g_assert(g_value_get_int(value) == 12);
+
+  value = g_hash_table_lookup(hash, "boolean");
+  g_assert(value != NULL);
+  g_assert(G_VALUE_HOLDS_BOOLEAN(value));
+  g_assert(g_value_get_boolean(value) == TRUE);
+
+  value = g_hash_table_lookup(hash, "string");
+  g_assert(value != NULL);
+  g_assert(G_VALUE_HOLDS_STRING(value));
+  g_assert(strcmp(g_value_get_string(value), "some text") == 0);
+
+  value = g_hash_table_lookup(hash, "strings");
+  g_assert(value != NULL);
+  g_assert(G_VALUE_HOLDS(value, G_TYPE_STRV));
+  strings = g_value_get_boxed(value);
+  g_assert(strings != NULL);
+  for (i = 0; string_array[i] != NULL; i++)
+    g_assert(strcmp(strings[i], string_array[i]) == 0);
+}
+
 /**
  * regress_test_ghash_container_return:
  *
diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h
index 65a158a..6ef3b60 100644
--- a/tests/scanner/regress.h
+++ b/tests/scanner/regress.h
@@ -102,6 +102,8 @@ void regress_test_gslist_null_out(GSList **out_list);
 const GHashTable *regress_test_ghash_null_return (void);
 const GHashTable *regress_test_ghash_nothing_return (void);
 GHashTable *regress_test_ghash_nothing_return2 (void);
+GHashTable *regress_test_ghash_gvalue_return (void);
+void regress_test_ghash_gvalue_in (GHashTable *hash);
 GHashTable *regress_test_ghash_container_return (void);
 GHashTable *regress_test_ghash_everything_return (void);
 void regress_test_ghash_null_in (const GHashTable *in);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]