1from __future__ import unicode_literals, print_function 2import pybindgen.typehandlers.base as typehandlers 3from pybindgen.typehandlers import stringtype, ctypeparser 4import pybindgen.typehandlers.codesink as codesink 5from pybindgen import module, cppclass, overloading, utils 6 7 8import unittest 9import doctest 10import re 11import sys 12 13 14class SmartPointerTransformation(typehandlers.TypeTransformation): 15 def __init__(self): 16 self.rx = re.compile(r'(?:::)?MySmartPointer<\s*(\w+)\s*>') 17 18 def get_untransformed_name(self, name): 19 m = self.rx.match(name) 20 if m is None: 21 return None 22 else: 23 return m.group(1)+' *' 24 25 def create_type_handler(self, type_handler, *args, **kwargs): 26 ctype = self.get_untransformed_name(args[0]) 27 handler = type_handler(ctype, *args[1:], **kwargs) 28 handler.has_been_transformed = True 29 return handler 30 31 32typehandlers.param_type_matcher.register_transformation( 33 SmartPointerTransformation()) 34 35class TestParam(typehandlers.Parameter): 36 37 DIRECTIONS = [typehandlers.Parameter.DIRECTION_IN] 38 CTYPES = ['testtype*'] 39 has_been_transformed = False 40 41 def convert_c_to_python(self, wrapper): 42 assert isinstance(wrapper, typehandlers.ReverseWrapperBase) 43 wrapper.build_params.add_parameter('i', [self.name]) 44 45 def convert_python_to_c(self, wrapper): 46 assert isinstance(wrapper, typehandlers.ForwardWrapperBase) 47 name = wrapper.declarations.declare_variable(self.ctype, self.name) 48 wrapper.parse_params.add_parameter('i', ['&'+name], self.name) 49 wrapper.call_params.append(name) 50 51 52class ParamLookupTests(unittest.TestCase): 53 54 def testLookup(self): 55 handler = typehandlers.Parameter.new('testtype*', 'name') 56 self.assertTrue(isinstance(handler, TestParam)) 57 self.assertRaises(typehandlers.TypeLookupError, typehandlers.Parameter.new, 'non_existent_type', 'name') 58 59 def testLookupTransformed(self): 60 transformed = typehandlers.Parameter.new('MySmartPointer<testtype>', 'name') 61 self.assertTrue(isinstance(transformed, TestParam)) 62 self.assertTrue(transformed.has_been_transformed) 63 64 65 66if __name__ == '__main__': 67 suite = unittest.TestSuite() 68 69 # FIXME: due to python 2 to python 3 transition, most of the 70 # doctests are failing for trivial reasons. Don't run these tests 71 # for the time being, until I have time to fix them. 72 if 0: # sys.version_info[0] < 3: # the doctests only work in Python 2 73 for mod in [ 74 typehandlers, 75 codesink, 76 module, 77 cppclass, 78 overloading, 79 #utils, 80 stringtype, 81 ctypeparser, 82 ]: 83 suite.addTest(doctest.DocTestSuite(mod)) 84 85 suite.addTest(doctest.DocTestSuite(ctypeparser)) 86 suite.addTest(unittest.TestLoader().loadTestsFromTestCase(ParamLookupTests)) 87 runner = unittest.TextTestRunner() 88 runner.run(suite) 89 90