From c2fdf775230ea9b0d9a6b1af209cd0a99e2a848e Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Mon, 24 Aug 2009 22:47:04 -0300 Subject: added unit tests for stl::pair and stl::list conversions on libsample --- tests/libsample/listuser.h | 6 +++ tests/libsample/pairuser.h | 6 +++ tests/samplebinding/list_test.py | 74 +++++++++++++++++++++++++++++++++++++ tests/samplebinding/pair_test.py | 76 ++++++++++++++++++++++++++++++++++++++ tests/samplebinding/sample_test.py | 13 ++++--- 5 files changed, 169 insertions(+), 6 deletions(-) create mode 100755 tests/samplebinding/list_test.py create mode 100755 tests/samplebinding/pair_test.py diff --git a/tests/libsample/listuser.h b/tests/libsample/listuser.h index c1ea7091e..f2bfe13b4 100644 --- a/tests/libsample/listuser.h +++ b/tests/libsample/listuser.h @@ -17,6 +17,12 @@ public: double sumList(std::list vallist); double sumList(std::list vallist); + + void setList(std::list lst) { m_lst = lst; } + std::list getList() { return m_lst; } + +private: + std::list m_lst; }; #endif // LISTUSER_H diff --git a/tests/libsample/pairuser.h b/tests/libsample/pairuser.h index 27cf76681..109d72189 100644 --- a/tests/libsample/pairuser.h +++ b/tests/libsample/pairuser.h @@ -14,6 +14,12 @@ public: std::pair callCreatePair(); static std::pair createComplexPair(Complex cpx0, Complex cpx1); double sumPair(std::pair pair); + + void setPair(std::pair pair) { m_pair = pair; } + std::pair getPair() { return m_pair; } + +private: + std::pair m_pair; }; #endif // PAIRUSER_H diff --git a/tests/samplebinding/list_test.py b/tests/samplebinding/list_test.py new file mode 100755 index 000000000..e3d5edadd --- /dev/null +++ b/tests/samplebinding/list_test.py @@ -0,0 +1,74 @@ +#!/usr/bin/python + +'''Test cases for std::list container conversions''' + +import sys +import unittest + +from sample import ListUser + +class ExtendedListUser(ListUser): + def __init__(self): + ListUser.__init__(self) + self.create_list_called = False + + def createList(self): + self.create_list_called = True + return [2, 3, 5, 7, 13] + +class ListConversionTest(unittest.TestCase): + '''Test case for std::list container conversions''' + + def testReimplementedVirtualMethodCall(self): + '''Test if a Python override of a virtual method is correctly called from C++.''' + lu = ExtendedListUser() + lst = lu.callCreateList() + self.assert_(lu.create_list_called) + self.assertEqual(type(lst), list) + for item in lst: + self.assertEqual(type(item), int) + + def testPrimitiveConversionInsideContainer(self): + '''Test primitive type conversion inside conversible std::list container.''' + cpx0 = complex(1.2, 3.4) + cpx1 = complex(5.6, 7.8) + lst = ListUser.createComplexList(cpx0, cpx1) + self.assertEqual(type(lst), list) + for item in lst: + self.assertEqual(type(item), complex) + self.assertEqual(lst, [cpx0, cpx1]) + + def testSumListIntegers(self): + '''Test method that sums a list of integer values.''' + lu = ListUser() + lst = [3, 5, 7] + result = lu.sumList(lst) + self.assertEqual(result, sum(lst)) + + def testSumListFloats(self): + '''Test method that sums a list of float values.''' + lu = ListUser() + lst = [3.3, 4.4, 5.5] + result = lu.sumList(lst) + self.assertEqual(result, sum(lst)) + + def testConversionInBothDirections(self): + '''Test converting a list from Python to C++ and back again.''' + lu = ListUser() + lst = [3, 5, 7] + lu.setList(lst) + result = lu.getList() + self.assertEqual(result, lst) + + def testConversionInBothDirectionsWithSimilarContainer(self): + '''Test converting a tuple, instead of the expected list, from Python to C++ and back again.''' + lu = ListUser() + lst = (3, 5, 7) + lu.setList(lst) + result = lu.getList() + self.assertNotEqual(result, lst) + self.assertEqual(result, list(lst)) + +if __name__ == '__main__': + unittest.main() + diff --git a/tests/samplebinding/pair_test.py b/tests/samplebinding/pair_test.py new file mode 100755 index 000000000..212fabfc8 --- /dev/null +++ b/tests/samplebinding/pair_test.py @@ -0,0 +1,76 @@ +#!/usr/bin/python + +'''Test cases for std::pair container conversions''' + +import sys +import unittest + +from sample import PairUser + +class ExtendedPairUser(PairUser): + def __init__(self): + PairUser.__init__(self) + self.create_pair_called = False + + def createPair(self): + self.create_pair_called = True + return (7, 13) + +class PairConversionTest(unittest.TestCase): + '''Test case for std::pair container conversions''' + + def testReimplementedVirtualMethodCall(self): + '''Test if a Python override of a virtual method is correctly called from C++.''' + pu = ExtendedPairUser() + pair = pu.callCreatePair() + self.assert_(pu.create_pair_called) + self.assertEqual(type(pair), tuple) + self.assertEqual(type(pair[0]), int) + self.assertEqual(type(pair[1]), int) + self.assertEqual(pair, (7, 13)) + + def testPrimitiveConversionInsideContainer(self): + '''Test primitive type conversion inside conversible std::pair container.''' + cpx0 = complex(1.2, 3.4) + cpx1 = complex(5.6, 7.8) + cp = PairUser.createComplexPair(cpx0, cpx1) + self.assertEqual(type(cp), tuple) + self.assertEqual(type(cp[0]), complex) + self.assertEqual(type(cp[1]), complex) + self.assertEqual(cp, (cpx0, cpx1)) + + def testSumPair(self): + '''Test method that sums the items of a pair using values of the types expected by C++ (int and double)''' + pu = PairUser() + pair = (3, 7.13) + result = pu.sumPair(pair) + self.assertEqual(result, sum(pair)) + + def testSumPairDifferentTypes(self): + '''Test method that sums the items of a pair using values of types different from the ones expected by C++ (int and double)''' + pu = PairUser() + pair = (3.3, 7) + result = pu.sumPair(pair) + self.assertNotEqual(result, sum(pair)) + self.assertEqual(result, int(pair[0]) + pair[1]) + + def testConversionInBothDirections(self): + '''Test converting a pair from Python to C++ and the other way around.''' + pu = PairUser() + pair = (3, 5) + pu.setPair(pair) + result = pu.getPair() + self.assertEqual(result, pair) + + def testConversionInBothDirectionsWithSimilarContainer(self): + '''Test converting a list, instead of the expected tuple, from Python to C++ and the other way around.''' + pu = PairUser() + pair = [3, 5] + pu.setPair(pair) + result = pu.getPair() + self.assertNotEqual(result, pair) + self.assertEqual(result, list(pair)) + +if __name__ == '__main__': + unittest.main() + diff --git a/tests/samplebinding/sample_test.py b/tests/samplebinding/sample_test.py index 9de201a24..1f7571a14 100755 --- a/tests/samplebinding/sample_test.py +++ b/tests/samplebinding/sample_test.py @@ -12,13 +12,14 @@ class ModuleTest(unittest.TestCase): def testModuleMembers(self): '''Test availability of classes, global functions and other members on binding''' - expected_members = set(['Abstract', 'Derived', 'ListUser', 'PairUser', - 'Point', 'gimmeComplexList', 'gimmeDouble', - 'gimmeInt', 'makeCString', 'multiplyPair', - 'returnCString', 'transmuteComplexIntoPoint', + expected_members = set(['Abstract', 'Derived', 'Point', + 'ListUser', 'PairUser', 'MapUser', + 'gimmeComplexList', 'gimmeDouble', 'gimmeInt', + 'makeCString', 'multiplyPair', 'returnCString', + 'SampleNamespace', 'transmuteComplexIntoPoint', 'transmutePointIntoComplex', 'sumComplexPair', - 'SampleNamespace', 'GlobalEnum', 'NoThing', - 'FirstThing', 'SecondThing', 'ThirdThing']) + 'FirstThing', 'SecondThing', 'ThirdThing', + 'GlobalEnum', 'NoThing']) self.assert_(expected_members.issubset(dir(sample))) def testAbstractPrintFormatEnum(self): -- cgit v1.2.3