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