diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2011-10-31 14:51:12 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:18:32 -0300 |
commit | 8ff54f682c5dc478d268b9bf6e1e5768fc40428e (patch) | |
tree | a85ddbcac1ed0b576e76a36bb7bb1f89ec67eafa /tests/samplebinding | |
parent | 9584b5a7c220e74c5181d6117f1833ac835cfb21 (diff) |
Added functions to the new converters API to check if a type is value or object.
Comes with unit tests.
Diffstat (limited to 'tests/samplebinding')
-rw-r--r-- | tests/samplebinding/typeconverters_test.py | 35 | ||||
-rw-r--r-- | tests/samplebinding/typesystem_sample.xml | 27 |
2 files changed, 62 insertions, 0 deletions
diff --git a/tests/samplebinding/typeconverters_test.py b/tests/samplebinding/typeconverters_test.py index 5191adf8f..5a3f1d350 100644 --- a/tests/samplebinding/typeconverters_test.py +++ b/tests/samplebinding/typeconverters_test.py @@ -77,5 +77,40 @@ class GetPythonTypeByNameTest(unittest.TestCase): self.assertEqual(pyType, dict) +class CheckValueAndObjectTypeByNameTest(unittest.TestCase): + + '''Uses an added function with inject code that uses the libshiboken + functions that check if a type is Object or Value, based on its converter.''' + + def testErrors(self): + '''not existent type''' + self.assertRaises(ValueError, sample.cppTypeIsValueType, 'NotExistentType') + self.assertRaises(ValueError, sample.cppTypeIsObjectType, 'NotExistentType') + + def testObjectType1(self): + self.assertTrue(sample.cppTypeIsObjectType('ObjectType')) + self.assertFalse(sample.cppTypeIsValueType('ObjectType')) + + def testObjectType2(self): + self.assertTrue(sample.cppTypeIsObjectType('ObjectType*')) + self.assertFalse(sample.cppTypeIsValueType('ObjectType*')) + + def testValueType1(self): + self.assertTrue(sample.cppTypeIsValueType('Point')) + self.assertFalse(sample.cppTypeIsObjectType('Point')) + + def testValueType2(self): + self.assertTrue(sample.cppTypeIsValueType('Point*')) + self.assertFalse(sample.cppTypeIsObjectType('Point*')) + + def testUsersPrimitiveType(self): + self.assertFalse(sample.cppTypeIsValueType('Complex')) + self.assertFalse(sample.cppTypeIsObjectType('Complex')) + + def testContainerType(self): + self.assertFalse(sample.cppTypeIsValueType('std::list<int >')) + self.assertFalse(sample.cppTypeIsObjectType('std::list<int >')) + + if __name__ == '__main__': unittest.main() diff --git a/tests/samplebinding/typesystem_sample.xml b/tests/samplebinding/typesystem_sample.xml index 5b3c9777d..0c5ee7cdd 100644 --- a/tests/samplebinding/typesystem_sample.xml +++ b/tests/samplebinding/typesystem_sample.xml @@ -258,6 +258,33 @@ </inject-code> </add-function> + <template name="cpp_type_is_object_or_value_type"> + SbkConverter* converter = Shiboken::Conversions::getConverter(%1); + if (converter) { + if (Shiboken::Conversions::pythonTypeIs$TYPEType(converter)) + %PYARG_0 = Py_True; + else + %PYARG_0 = Py_False; + Py_INCREF(%PYARG_0); + } else { + PyErr_Format(PyExc_ValueError, "Type '%s' has no converter associated to it", %1); + } + </template> + <add-function signature="cppTypeIsObjectType(const char*)" return-type="bool"> + <inject-code class="target" position="beginning"> + <insert-template name="cpp_type_is_object_or_value_type"> + <replace from="$TYPE" to="Object" /> + </insert-template> + </inject-code> + </add-function> + <add-function signature="cppTypeIsValueType(const char*)" return-type="bool"> + <inject-code class="target" position="beginning"> + <insert-template name="cpp_type_is_object_or_value_type"> + <replace from="$TYPE" to="Value" /> + </insert-template> + </inject-code> + </add-function> + <container-type name="std::pair" type="pair"> <include file-name="utility" location="global"/> <conversion-rule file="pair_conversions.h"> |