[pygobject/gsoc2009: 49/160] Refactore pygi_g_argument_to_py_object



commit 4d98a471cb77018ef6605d906d6b1ec29ace80ee
Author: Simon van der Linden <svdlinden src gnome org>
Date:   Tue Jul 21 18:56:13 2009 +0200

    Refactore pygi_g_argument_to_py_object
    
    Refactore pygi_g_argument_to_py_object.
    Get rid of pyg_array_to_pyobject.

 gi/pygargument.c           |  401 +++++++++++++++++++++-----------------------
 gi/pygargument.h           |   12 +-
 gi/pygiinfo.c              |   99 ++++++++---
 tests/test_girepository.py |   24 ++--
 4 files changed, 278 insertions(+), 258 deletions(-)
---
diff --git a/gi/pygargument.c b/gi/pygargument.c
index 8322598..d14851a 100644
--- a/gi/pygargument.c
+++ b/gi/pygargument.c
@@ -393,7 +393,6 @@ check_number_clean:
     return retval;
 }
 
-static
 gsize
 pygi_gi_type_tag_get_size(GITypeTag type_tag)
 {
@@ -713,7 +712,7 @@ glist_to_pyobject(GITypeTag list_tag, GITypeInfo *type_info, GList *list, GSList
         for ( ; list != NULL; list = list->next) {
             arg.v_pointer = list->data;
 
-            child_obj = pyg_argument_to_pyobject(&arg, type_info);
+            child_obj = pygi_g_argument_to_py_object(arg, type_info);
 
             if (child_obj == NULL) {
                 g_list_free(list);
@@ -729,7 +728,7 @@ glist_to_pyobject(GITypeTag list_tag, GITypeInfo *type_info, GList *list, GSList
         for ( ; slist != NULL; slist = slist->next) {
             arg.v_pointer = slist->data;
 
-            child_obj = pyg_argument_to_pyobject(&arg, type_info);
+            child_obj = pygi_g_argument_to_py_object(arg, type_info);
 
             if (child_obj == NULL) {
                 g_list_free(list);
@@ -747,250 +746,226 @@ glist_to_pyobject(GITypeTag list_tag, GITypeInfo *type_info, GList *list, GSList
 }
 
 PyObject *
-pyg_array_to_pyobject(gpointer items, gsize length, GITypeInfo *type_info)
+pygi_g_argument_to_py_object(GArgument arg, GITypeInfo *type_info)
 {
-    PyObject *py_items;
-    gsize item_size;
-    GITypeInfo *item_type_info;
     GITypeTag type_tag;
-    gsize i;
-    gpointer current_item;
-
-    if (g_type_info_is_zero_terminated(type_info)) {
-        length = g_strv_length(items);
-    }
-
-    py_items = PyTuple_New(length);
-    if (py_items == NULL) {
-        return NULL;
-    }
-
-    item_type_info = g_type_info_get_param_type (type_info, 0);
-    type_tag = g_type_info_get_tag(item_type_info);
-    item_size = pygi_gi_type_tag_get_size(type_tag);
-
-    current_item = items;
-    for(i = 0; i < length; i++) {
-        PyObject *item;
-        int retval;
+    PyObject *object;
 
-        item = pyg_argument_to_pyobject((GArgument *)current_item, item_type_info);
-        if (item == NULL) {
-            g_base_info_unref((GIBaseInfo *)item_type_info);
-            Py_DECREF(py_items);
-            return NULL;
-        }
-
-        retval = PyTuple_SetItem(py_items, i, item);
-        if (retval) {
-            g_base_info_unref((GIBaseInfo *)item_type_info);
-            Py_DECREF(py_items);
-            return NULL;
-        }
-
-        current_item += item_size;
-    }
+    type_tag = g_type_info_get_tag(type_info);
 
-    return py_items;
-}
+    object = NULL;
 
-PyObject *
-pyg_argument_to_pyobject(GArgument *arg, GITypeInfo *type_info)
-{
-    GITypeTag type_tag;
-    PyObject *obj;
-    GITypeInfo *param_info;
+    switch (type_tag) {
+        case GI_TYPE_TAG_VOID:
+            Py_INCREF(Py_None);
+            object = Py_None;
+            break;
+        case GI_TYPE_TAG_BOOLEAN:
+            object = PyBool_FromLong(arg.v_boolean);
+            break;
+        case GI_TYPE_TAG_UINT8:
+            object = PyInt_FromLong(arg.v_uint8);
+            break;
+        case GI_TYPE_TAG_UINT16:
+            object = PyInt_FromLong(arg.v_uint16);
+            break;
+        case GI_TYPE_TAG_UINT32:
+            object = PyLong_FromLongLong(arg.v_uint32);
+            break;
+        case GI_TYPE_TAG_UINT64:
+            object = PyLong_FromUnsignedLongLong(arg.v_uint64);
+            break;
+        case GI_TYPE_TAG_USHORT:
+            object = PyInt_FromLong(arg.v_ushort);
+            break;
+        case GI_TYPE_TAG_UINT:
+            object = PyLong_FromLongLong(arg.v_uint);
+            break;
+        case GI_TYPE_TAG_ULONG:
+            object = PyLong_FromUnsignedLongLong(arg.v_ulong);
+            break;
+        case GI_TYPE_TAG_SIZE:
+            object = PyLong_FromUnsignedLongLong(arg.v_size);
+            break;
+        case GI_TYPE_TAG_INT8:
+            object = PyInt_FromLong(arg.v_int8);
+            break;
+        case GI_TYPE_TAG_INT16:
+            object = PyInt_FromLong(arg.v_int16);
+            break;
+        case GI_TYPE_TAG_INT32:
+            object = PyInt_FromLong(arg.v_int32);
+            break;
+        case GI_TYPE_TAG_INT64:
+            object = PyLong_FromLongLong(arg.v_int64);
+            break;
+        case GI_TYPE_TAG_SHORT:
+            object = PyInt_FromLong(arg.v_short);
+            break;
+        case GI_TYPE_TAG_INT:
+            object = PyInt_FromLong(arg.v_int);
+            break;
+        case GI_TYPE_TAG_SSIZE:
+            object = PyInt_FromLong(arg.v_ssize);
+            break;
+        case GI_TYPE_TAG_LONG:
+            object = PyInt_FromLong(arg.v_long);
+            break;
+        case GI_TYPE_TAG_FLOAT:
+            object = PyFloat_FromDouble(arg.v_float);
+            break;
+        case GI_TYPE_TAG_DOUBLE:
+            object = PyFloat_FromDouble(arg.v_double);
+            break;
+        case GI_TYPE_TAG_FILENAME:
+        case GI_TYPE_TAG_UTF8:
+            object = PyString_FromString(arg.v_string);
+            break;
+        case GI_TYPE_TAG_INTERFACE:
+        {
+            GIBaseInfo *info;
+            GIInfoType info_type;
 
-    g_return_val_if_fail(type_info != NULL, NULL);
-    type_tag = g_type_info_get_tag(type_info);
+            info = g_type_info_get_interface(type_info);
+            info_type = g_base_info_get_type(info);
 
-    obj = NULL;
+            switch (info_type) {
+                case GI_INFO_TYPE_ENUM:
+                    object = PyInt_FromLong(arg.v_int);
+                    break;
+                case GI_INFO_TYPE_STRUCT:
+                {
+                    GType type;
+                    PyObject *py_type = NULL;
+                    gsize size;
+                    PyObject *buffer = NULL;
 
-    switch (type_tag) {
-    case GI_TYPE_TAG_VOID:
-        // TODO: Should we take this as a buffer?
-        g_warning("pybank doesn't know what to do with void types");
-        obj = Py_None;
-        break;
-    case GI_TYPE_TAG_GLIST:
-    case GI_TYPE_TAG_GSLIST:
-        param_info = g_type_info_get_param_type(type_info, 0);
-        g_assert(param_info != NULL);
-        obj = glist_to_pyobject(type_tag,
-                                param_info,
-                                type_tag == GI_TYPE_TAG_GLIST ? arg->v_pointer : NULL,
-                                type_tag == GI_TYPE_TAG_GSLIST ? arg->v_pointer : NULL);
-        break;
-    case GI_TYPE_TAG_BOOLEAN:
-        obj = PyBool_FromLong(arg->v_boolean);
-        break;
-    case GI_TYPE_TAG_USHORT:
-        obj = PyInt_FromLong(arg->v_ushort);
-        break;
-    case GI_TYPE_TAG_UINT8:
-        obj = PyInt_FromLong(arg->v_uint8);
-        break;
-    case GI_TYPE_TAG_UINT:
-        obj = PyInt_FromLong(arg->v_uint);
-        break;
-    case GI_TYPE_TAG_UINT16:
-        obj = PyInt_FromLong(arg->v_uint16);
-        break;
-    case GI_TYPE_TAG_UINT32:
-        obj = PyLong_FromLongLong(arg->v_uint32);
-        break;
-    case GI_TYPE_TAG_UINT64:
-        obj = PyLong_FromUnsignedLongLong(arg->v_uint64);
-        break;
-    case GI_TYPE_TAG_SHORT:
-        obj = PyInt_FromLong(arg->v_short);
-        break;
-    case GI_TYPE_TAG_INT:
-        obj = PyInt_FromLong(arg->v_int);
-        break;
-    case GI_TYPE_TAG_LONG:
-        obj = PyInt_FromLong(arg->v_long);
-        break;
-    case GI_TYPE_TAG_ULONG:
-        obj = PyInt_FromLong(arg->v_ulong);
-        break;
-    case GI_TYPE_TAG_SSIZE:
-        obj = PyInt_FromLong(arg->v_ssize);
-        break;
-    case GI_TYPE_TAG_SIZE:
-        obj = PyInt_FromLong(arg->v_size);
-        break;
-    case GI_TYPE_TAG_INT8:
-        obj = PyInt_FromLong(arg->v_int8);
-        break;
-    case GI_TYPE_TAG_INT16:
-        obj = PyInt_FromLong(arg->v_int16);
-        break;
-    case GI_TYPE_TAG_INT32:
-        obj = PyInt_FromLong(arg->v_int32);
-        break;
-    case GI_TYPE_TAG_INT64:
-        obj = PyLong_FromLongLong(arg->v_int64);
-        break;
-    case GI_TYPE_TAG_FLOAT:
-        obj = PyFloat_FromDouble(arg->v_float);
-        break;
-    case GI_TYPE_TAG_DOUBLE:
-        obj = PyFloat_FromDouble(arg->v_double);
-        break;
-    case GI_TYPE_TAG_FILENAME:
-    case GI_TYPE_TAG_UTF8:
-        if (arg->v_string == NULL)
-            obj = Py_None;
-        else
-            obj = PyString_FromString(arg->v_string);
-        break;
-    case GI_TYPE_TAG_INTERFACE:
-    {
-        GIBaseInfo* interface_info;
-        GIInfoType interface_info_type;
+                    /* Handle special cases first. */
+                    type = g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)info);
+                    if (g_type_is_a(type, G_TYPE_VALUE)) {
+                        object = pyg_value_as_pyobject(arg.v_pointer, FALSE);
+                        g_value_unset(arg.v_pointer);
+                        break;
+                    }
 
-        interface_info = g_type_info_get_interface(type_info);
-        interface_info_type = g_base_info_get_type(interface_info);
+                    /* Create a Python buffer. */
+                    size = g_struct_info_get_size((GIStructInfo *)info);
+                    buffer = PyBuffer_FromReadWriteMemory(arg.v_pointer, size);
+                    if (buffer == NULL) {
+                        goto struct_error_clean;
+                    }
 
-        if (arg->v_pointer == NULL) {
-            obj = Py_None;
-        }
+                    /* Wrap the structure. */
+                    py_type = pygi_py_type_find_by_gi_info(info);
+                    if (py_type == NULL) {
+                        goto struct_error_clean;
+                    }
 
-        switch (interface_info_type) {
-            case GI_INFO_TYPE_ENUM:
-               obj = PyInt_FromLong(arg->v_int);
-                break;
-            case GI_INFO_TYPE_STRUCT:
-            {
-                GType gtype;
-                PyObject *py_type;
-                gsize size;
-                PyObject *buffer;
-                PyObject **dict;
-                int retval;
+                    object = PyObject_CallFunction(py_type, "O", buffer);
+                    if (object == NULL) {
+                        goto struct_error_clean;
+                    }
 
-                gtype = g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)interface_info);
+                    Py_DECREF(buffer);
+                    Py_DECREF(py_type);
 
-                if (g_type_is_a(gtype, G_TYPE_VALUE)) {
-                    obj = pyg_value_as_pyobject(arg->v_pointer, FALSE);
-                    g_value_unset(arg->v_pointer);
                     break;
-                }
 
-                /* Create a Python buffer. */
-                size = g_struct_info_get_size ((GIStructInfo *)interface_info);
-                buffer = PyBuffer_FromReadWriteMemory(arg->v_pointer, size);
-                if (buffer == NULL) {
+struct_error_clean:
+                    Py_XDECREF(buffer);
+                    Py_XDECREF(py_type);
+                    Py_XDECREF(object);
+                    object = NULL;
                     break;
                 }
+                case GI_INFO_TYPE_OBJECT:
+                {
+                    PyObject *py_type;
 
-                /* Wrap the structure. */
-                py_type = pygi_py_type_find_by_gi_info((GIBaseInfo *)interface_info);
-                g_assert(py_type != NULL);
+                    /* Make sure the class is initialized. */
+                    py_type = pygi_py_type_find_by_gi_info(info);
+                    if (py_type == NULL) {
+                        break;
+                    }
 
-                obj = PyObject_GC_New(PyObject, (PyTypeObject *)py_type);
+                    object = pygobject_new(arg.v_pointer);
 
-                Py_DECREF(py_type);
+                    Py_DECREF(py_type);
 
-                if (obj == NULL) {
-                    Py_DECREF(buffer);
                     break;
                 }
+                default:
+                    /* TODO: To complete with other types. */
+                    g_assert_not_reached();
+            }
 
-                /* FIXME: Any better way to initialize the dict pointer? */
-                dict = (PyObject **)((char *)obj + ((PyTypeObject *)py_type)->tp_dictoffset);
-                *dict = NULL;
+            g_base_info_unref(info);
 
-                retval = PyObject_SetAttrString(obj, "__buffer__", buffer);
-                if (retval < 0) {
-                    Py_DECREF(obj);
-                    obj = NULL;
-                }
+            break;
+        }
+        case GI_TYPE_TAG_ARRAY:
+        {
+            GArray *array;
+            GITypeInfo *item_type_info;
+            GITypeTag item_type_tag;
+            gsize item_size;
+            gsize i;
 
+            array = arg.v_pointer;
+
+            object = PyTuple_New(array->len);
+            if (object == NULL) {
                 break;
             }
-            case GI_INFO_TYPE_OBJECT:
-            {
-                PyObject *py_type;
 
-                /* Make sure the class is initialized. */
-                py_type = pygi_py_type_find_by_gi_info((GIBaseInfo *)interface_info);
-                g_assert(py_type != NULL);
-                Py_DECREF(py_type);
+            item_type_info = g_type_info_get_param_type(type_info, 0);
+            item_type_tag = g_type_info_get_tag(item_type_info);
+            item_size = pygi_gi_type_tag_get_size(item_type_tag);
 
-                obj = pygobject_new(arg->v_pointer);
+            for(i = 0; i < array->len; i++) {
+                GArgument item;
+                PyObject *py_item;
+                int retval;
 
-                break;
-            }
-            default:
-                /* TODO: To complete with other types. */
-                g_assert_not_reached();
-        }
+                item = *(GArgument *)(array->data + item_size * i);
+                py_item = pygi_g_argument_to_py_object(item, item_type_info);
+                if (py_item == NULL) {
+                    /* TODO */
+                    break;
+                }
 
-        g_base_info_unref((GIBaseInfo *)interface_info);
+                retval = PyTuple_SetItem(object, i, py_item);
+                if (retval < 0) {
+                    /* TODO */
+                    break;
+                }
+            }
 
-        break;
-    }
-    case GI_TYPE_TAG_ARRAY:
-        g_warning("pyg_argument_to_pyobject: use pyarray_to_pyobject instead for arrays");
-        obj = Py_None;
-        break;
-    case GI_TYPE_TAG_GTYPE:
-    {
-        GType gtype;
-        gtype = arg->v_int;
-        obj = pyg_type_wrapper_new(gtype);
-        break;
-    }
-    default:
-        g_print("<GArg->PyO> GITypeTag %s is unhandled\n",
-                g_type_tag_to_string(type_tag));
-        obj = PyString_FromString("<unhandled return value!>"); /*  */
-        break;
+            g_base_info_unref((GIBaseInfo *)item_type_info);
+            break;
+        }
+        case GI_TYPE_TAG_GLIST:
+        case GI_TYPE_TAG_GSLIST:
+        {
+            GITypeInfo *param_info;
+            param_info = g_type_info_get_param_type(type_info, 0);
+            g_assert(param_info != NULL);
+            object = glist_to_pyobject(type_tag,
+                                       param_info,
+                                       type_tag == GI_TYPE_TAG_GLIST ? arg.v_pointer : NULL,
+                                       type_tag == GI_TYPE_TAG_GSLIST ? arg.v_pointer : NULL);
+            break;
+        }
+        case GI_TYPE_TAG_GTYPE:
+        {
+            object = pyg_type_wrapper_new(arg.v_long);
+            break;
+        }
+        default:
+            /* TODO */
+            g_assert_not_reached();
     }
 
-    Py_XINCREF(obj);
-    return obj;
+    return object;
 }
 
diff --git a/gi/pygargument.h b/gi/pygargument.h
index 580ab16..800ef83 100644
--- a/gi/pygargument.h
+++ b/gi/pygargument.h
@@ -28,17 +28,15 @@
 
 G_BEGIN_DECLS
 
+gsize pygi_gi_type_tag_get_size(GITypeTag type_tag);
+
 gint pygi_gi_type_info_check_py_object(GITypeInfo *type_info,
                                        PyObject *object);
 
 GArgument pygi_g_argument_from_py_object(PyObject *object,
-				                         GITypeInfo *type_info);
-
-PyObject*  pyg_argument_to_pyobject(GArgument *arg,
-				    GITypeInfo *info);
-
-PyObject* pyg_array_to_pyobject(gpointer items, gsize length, GITypeInfo *info);
-gpointer pyg_array_from_pyobject(PyObject *object, GITypeInfo *type_info, gsize *length);
+                                         GITypeInfo *type_info);
+PyObject * pygi_g_argument_to_py_object(GArgument arg,
+                                        GITypeInfo *type_info);
 
 G_END_DECLS
 
diff --git a/gi/pygiinfo.c b/gi/pygiinfo.c
index b28bad0..f43c21e 100644
--- a/gi/pygiinfo.c
+++ b/gi/pygiinfo.c
@@ -878,28 +878,52 @@ _wrap_g_function_info_invoke(PyGIBaseInfo *self, PyObject *args)
         n_return_values += 1;
 
         if (!is_constructor) {
-            /* Convert the return value. */
             if (return_tag == GI_TYPE_TAG_ARRAY) {
+                /* Create a GArray. */
+                GITypeInfo *item_type_info;
+                GITypeTag item_type_tag;
+                gsize item_size;
                 gssize length;
-                length = g_type_info_get_array_fixed_size(return_info);
-                if (length < 0) {
-                    gint length_arg_pos;
-                    GArgument *length_arg;
+                gboolean is_zero_terminated;
+                GArray *array;
+
+                item_type_info = g_type_info_get_param_type(return_info, 0);
+                item_type_tag = g_type_info_get_tag(item_type_info);
+                item_size = pygi_gi_type_tag_get_size(item_type_tag);
+                is_zero_terminated = g_type_info_is_zero_terminated(return_info);
+
+                if (is_zero_terminated) {
+                    length = g_strv_length(return_arg.v_pointer);
+                } else {
+                    length = g_type_info_get_array_fixed_size(return_info);
+                    if (length < 0) {
+                        gint length_arg_pos;
+                        GArgument *length_arg;
 
-                    length_arg_pos = g_type_info_get_array_length(return_info);
+                        length_arg_pos = g_type_info_get_array_length(return_info);
+                        g_assert(length_arg_pos >= 0);
 
-                    if (length_arg_pos >= 0) {
                         length_arg = aux_args[length_arg_pos];
                         g_assert(length_arg != NULL);
+
+                        /* FIXME: Take into account the type of the argument. */
                         length = length_arg->v_int;
                     }
                 }
-                if (length < 0) {
-                    g_assert(g_type_info_is_zero_terminated(return_info));
-                }
-                return_value = pyg_array_to_pyobject(return_arg.v_pointer, length, return_info);
-            } else {
-                return_value = pyg_argument_to_pyobject(&return_arg, return_info);
+                
+                array = g_array_new(is_zero_terminated, FALSE, item_size);
+                array->data = return_arg.v_pointer;
+                array->len = length;
+                
+                return_arg.v_pointer = array;
+
+                g_base_info_unref((GIBaseInfo *)item_type_info);
+            }
+
+            return_value = pygi_g_argument_to_py_object(return_arg, return_info);
+
+            if (return_tag == GI_TYPE_TAG_ARRAY) {
+                return_arg.v_pointer = g_array_free((GArray *)return_arg.v_pointer, FALSE);
             }
 
             g_assert(return_value != NULL);
@@ -1009,28 +1033,51 @@ _wrap_g_function_info_invoke(PyGIBaseInfo *self, PyObject *args)
                 type_tag = g_type_info_get_tag(arg_type_info);
 
                 if (type_tag == GI_TYPE_TAG_ARRAY) {
+                    /* Create a GArray. */
+                    GITypeInfo *item_type_info;
+                    GITypeTag item_type_tag;
+                    gsize item_size;
                     gssize length;
+                    gboolean is_zero_terminated;
+                    GArray *array;
 
-                    length = g_type_info_get_array_fixed_size(arg_type_info);
-                    if (length < 0) {
-                        gint length_arg_pos;
-                        GArgument *length_arg;
+                    item_type_info = g_type_info_get_param_type(arg_type_info, 0);
+                    item_type_tag = g_type_info_get_tag(item_type_info);
+                    item_size = pygi_gi_type_tag_get_size(item_type_tag);
+                    is_zero_terminated = g_type_info_is_zero_terminated(arg_type_info);
+
+                    if (is_zero_terminated) {
+                        length = g_strv_length(arg->v_pointer);
+                    } else {
+                        length = g_type_info_get_array_fixed_size(arg_type_info);
+                        if (length < 0) {
+                            gint length_arg_pos;
+                            GArgument *length_arg;
 
-                        length_arg_pos = g_type_info_get_array_length(arg_type_info);
+                            length_arg_pos = g_type_info_get_array_length(arg_type_info);
+                            g_assert(length_arg_pos >= 0);
 
-                        if (length_arg_pos >= 0) {
                             length_arg = aux_args[length_arg_pos];
                             g_assert(length_arg != NULL);
+
+                            /* FIXME: Take into account the type of the argument. */
                             length = length_arg->v_int;
                         }
                     }
-                    if (length < 0) {
-                        g_assert(g_type_info_is_zero_terminated(arg_type_info));
-                    }
 
-                    obj = pyg_array_to_pyobject(arg->v_pointer, length, arg_type_info);
-                } else {
-                    obj = pyg_argument_to_pyobject(arg, arg_type_info);
+                    array = g_array_new(is_zero_terminated, FALSE, item_size);
+                    array->data = arg->v_pointer;
+                    array->len = length;
+
+                    arg->v_pointer = array;
+
+                    g_base_info_unref((GIBaseInfo *)item_type_info);
+                }
+
+                obj = pygi_g_argument_to_py_object(*arg, arg_type_info);
+
+                if (type_tag == GI_TYPE_TAG_ARRAY) {
+                    arg->v_pointer = g_array_free((GArray *)arg->v_pointer, FALSE);
                 }
 
                 g_assert(obj != NULL);
@@ -1545,7 +1592,7 @@ _wrap_g_field_info_get_value(PyGIBaseInfo *self, PyObject *args)
     }
 
 g_argument_to_py_object:
-    retval = pyg_argument_to_pyobject(&value, field_type_info);
+    retval = pygi_g_argument_to_py_object(value, field_type_info);
 
 return_:
     g_base_info_unref((GIBaseInfo *)field_type_info);
diff --git a/tests/test_girepository.py b/tests/test_girepository.py
index 50b9de1..945491c 100644
--- a/tests/test_girepository.py
+++ b/tests/test_girepository.py
@@ -26,6 +26,8 @@ UINT64_MAX = 18446744073709551615L
 utf8_const = 'const \xe2\x99\xa5 utf8'
 utf8_nonconst = 'nonconst \xe2\x99\xa5 utf8'
 
+test_sequence = ('1', '2', '3')
+
 def createStructA():
     a = Everything.TestStructA()
     a.some_int = 3
@@ -346,7 +348,7 @@ class TestGIEverything(unittest.TestCase):
         self.assertRaises(ValueError, Everything.test_array_gint64_in, (INT64_MIN-1,))
 
     def testStrvIn(self):
-        self.assertTrue(Everything.test_strv_in(('1', '2', '3')))
+        self.assertTrue(Everything.test_strv_in(test_sequence))
         self.assertFalse(Everything.test_strv_in(('1', '2')))
         self.assertFalse(Everything.test_strv_in(('1', '2', '3', '4')))
 
@@ -375,21 +377,19 @@ class TestGIEverything(unittest.TestCase):
 
 
 # Interface
-# GSList
+# GList
 
     def testGList(self):
-        retval = Everything.test_glist_nothing_return()
-        self.assertTrue(isinstance(retval, list))
-        self.assertEquals(retval[0], '1')
-        self.assertEquals(retval[1], '2')
-        self.assertEquals(retval[2], '3')
+        self.assertEqual(list(test_sequence), Everything.test_glist_nothing_return())
+
+
+# GSList
 
     def testGSList(self):
-        retval = Everything.test_gslist_nothing_return()
-        self.assertTrue(isinstance(retval, list))
-        self.assertEquals(retval[0], '1')
-        self.assertEquals(retval[1], '2')
-        self.assertEquals(retval[2], '3')
+        self.assertEqual(list(test_sequence), Everything.test_gslist_nothing_return())
+
+
+# closure
 
     def testClosure(self):
         self.assertEquals(3, Everything.test_closure(lambda: 3))



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