207 lines
3.6 KiB
Python
207 lines
3.6 KiB
Python
# Copyright David Abrahams 2004. Distributed under the Boost
|
|
# Software License, Version 1.0. (See accompanying
|
|
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
"""
|
|
>>> from m1 import *
|
|
|
|
>>> from m2 import *
|
|
|
|
Prove that we get an appropriate error from trying to return a type
|
|
for which we have no registered to_python converter
|
|
|
|
>>> def check_unregistered(f, msgprefix):
|
|
... try:
|
|
... f(1)
|
|
... except TypeError as x:
|
|
... if not str(x).startswith(msgprefix):
|
|
... print(str(x))
|
|
... else:
|
|
... print('expected a TypeError')
|
|
...
|
|
>>> check_unregistered(make_unregistered, 'No to_python (by-value) converter found for C++ type')
|
|
>>> check_unregistered(make_unregistered2, 'No Python class registered for C++ class')
|
|
|
|
>>> n = new_noddy()
|
|
>>> s = new_simple()
|
|
>>> unwrap_int(n)
|
|
42
|
|
>>> unwrap_int_ref(n)
|
|
42
|
|
>>> unwrap_int_const_ref(n)
|
|
42
|
|
>>> unwrap_simple(s)
|
|
'hello, world'
|
|
>>> unwrap_simple_ref(s)
|
|
'hello, world'
|
|
>>> unwrap_simple_const_ref(s)
|
|
'hello, world'
|
|
>>> unwrap_int(5)
|
|
5
|
|
|
|
Can't get a non-const reference to a built-in integer object
|
|
>>> try:
|
|
... unwrap_int_ref(7)
|
|
... except: pass
|
|
... else: print('no exception')
|
|
|
|
>>> unwrap_int_const_ref(9)
|
|
9
|
|
|
|
>>> wrap_int(n)
|
|
42
|
|
|
|
try: wrap_int_ref(n)
|
|
... except: pass
|
|
... else: print('no exception')
|
|
|
|
>>> wrap_int_const_ref(n)
|
|
42
|
|
|
|
>>> unwrap_simple_ref(wrap_simple(s))
|
|
'hello, world'
|
|
|
|
>>> unwrap_simple_ref(wrap_simple_ref(s))
|
|
'hello, world'
|
|
|
|
>>> unwrap_simple_ref(wrap_simple_const_ref(s))
|
|
'hello, world'
|
|
|
|
>>> f(s)
|
|
12
|
|
|
|
>>> unwrap_simple(g(s))
|
|
'hello, world'
|
|
|
|
>>> f(g(s))
|
|
12
|
|
|
|
>>> f_mutable_ref(g(s))
|
|
12
|
|
|
|
>>> f_const_ptr(g(s))
|
|
12
|
|
|
|
>>> f_mutable_ptr(g(s))
|
|
12
|
|
|
|
>>> f2(g(s))
|
|
12
|
|
|
|
Create an extension class which wraps "complicated" (init1 and get_n)
|
|
are a complicated constructor and member function, respectively.
|
|
|
|
>>> c1 = complicated(s, 99)
|
|
>>> c1.get_n()
|
|
99
|
|
>>> c2 = complicated(s)
|
|
>>> c2.get_n()
|
|
0
|
|
|
|
a quick regression test for a bug where None could be converted
|
|
to the target of any member function. To see it, we need to
|
|
access the __dict__ directly, to bypass the type check supplied
|
|
by the Method property which wraps the method when accessed as an
|
|
attribute.
|
|
|
|
>>> try: A.__dict__['name'](None)
|
|
... except TypeError: pass
|
|
... else: print('expected an exception!')
|
|
|
|
|
|
>>> a = A()
|
|
>>> b = B()
|
|
>>> c = C()
|
|
>>> d = D()
|
|
|
|
|
|
>>> take_a(a).name()
|
|
'A'
|
|
|
|
>>> try:
|
|
... take_b(a)
|
|
... except: pass
|
|
... else: print('no exception')
|
|
|
|
>>> try:
|
|
... take_c(a)
|
|
... except: pass
|
|
... else: print('no exception')
|
|
|
|
>>> try:
|
|
... take_d(a)
|
|
... except: pass
|
|
... else: print('no exception')
|
|
|
|
------
|
|
>>> take_a(b).name()
|
|
'A'
|
|
|
|
>>> take_b(b).name()
|
|
'B'
|
|
|
|
>>> try:
|
|
... take_c(b)
|
|
... except: pass
|
|
... else: print('no exception')
|
|
|
|
>>> try:
|
|
... take_d(b)
|
|
... except: pass
|
|
... else: print('no exception')
|
|
|
|
-------
|
|
>>> take_a(c).name()
|
|
'A'
|
|
|
|
>>> try:
|
|
... take_b(c)
|
|
... except: pass
|
|
... else: print('no exception')
|
|
|
|
>>> take_c(c).name()
|
|
'C'
|
|
|
|
>>> try:
|
|
... take_d(c)
|
|
... except: pass
|
|
... else: print('no exception')
|
|
|
|
-------
|
|
>>> take_a(d).name()
|
|
'A'
|
|
>>> take_b(d).name()
|
|
'B'
|
|
>>> take_c(d).name()
|
|
'C'
|
|
>>> take_d(d).name()
|
|
'D'
|
|
|
|
>>> take_d_shared_ptr(d).name()
|
|
'D'
|
|
|
|
>>> d_as_a = d_factory()
|
|
>>> dd = take_d(d_as_a)
|
|
>>> dd.name()
|
|
'D'
|
|
>>> print(g.__doc__.splitlines()[1])
|
|
g( (Simple)arg1) -> Simple :
|
|
|
|
"""
|
|
|
|
def run(args = None):
|
|
|
|
import sys
|
|
import doctest
|
|
|
|
if args is not None:
|
|
sys.argv = args
|
|
|
|
return doctest.testmod(sys.modules.get(__name__))
|
|
|
|
if __name__ == '__main__':
|
|
print("running...")
|
|
import sys
|
|
status = run()[0]
|
|
if (status == 0): print("Done.")
|
|
sys.exit(status)
|