[pygobject/gsoc2009: 49/160] Refactore pygi_g_argument_to_py_object
- From: Simon van der Linden <svdlinden src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [pygobject/gsoc2009: 49/160] Refactore pygi_g_argument_to_py_object
- Date: Fri, 14 Aug 2009 21:26:12 +0000 (UTC)
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]