148 lines
2.9 KiB
Python
148 lines
2.9 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 callbacks_ext import *
|
|
|
|
>>> def double(x):
|
|
... return x + x
|
|
...
|
|
>>> apply_int_int(double, 42)
|
|
84
|
|
>>> apply_void_int(double, 42)
|
|
|
|
>>> def identity(x):
|
|
... return x
|
|
|
|
Once we have array conversion support, this test will fail. Er,
|
|
succeed<wink>:
|
|
|
|
>>> try: apply_to_string_literal(identity)
|
|
... except ReferenceError: pass # expected
|
|
... else: print('expected an exception!')
|
|
|
|
>>> try: apply_X_ref_handle(lambda ignored:X(42), None)
|
|
... except ReferenceError: pass # expected
|
|
... else: print('expected an exception!')
|
|
|
|
>>> x = X(42)
|
|
>>> x.y = X(7)
|
|
>>> apply_X_ref_handle(lambda z:z.y, x).value()
|
|
7
|
|
|
|
>>> x = apply_X_X(identity, X(42))
|
|
>>> x.value()
|
|
42
|
|
>>> x_count()
|
|
1
|
|
>>> del x
|
|
>>> x_count()
|
|
0
|
|
|
|
>>> def increment(x):
|
|
... x.set(x.value() + 1)
|
|
...
|
|
>>> x = X(42)
|
|
>>> apply_void_X_ref(increment, x)
|
|
>>> x.value()
|
|
43
|
|
|
|
>>> apply_void_X_cref(increment, x)
|
|
>>> x.value() # const-ness is not respected, sorry!
|
|
44
|
|
|
|
>>> last_x = 1
|
|
>>> def decrement(x):
|
|
... global last_x
|
|
... last_x = x
|
|
... if x is not None:
|
|
... x.set(x.value() - 1)
|
|
|
|
>>> apply_void_X_ptr(decrement, x)
|
|
>>> x.value()
|
|
43
|
|
>>> last_x.value()
|
|
43
|
|
>>> increment(last_x)
|
|
>>> x.value()
|
|
44
|
|
>>> last_x.value()
|
|
44
|
|
|
|
>>> apply_void_X_ptr(decrement, None)
|
|
>>> assert last_x is None
|
|
>>> x.value()
|
|
44
|
|
|
|
>>> last_x = 1
|
|
>>> apply_void_X_deep_ptr(decrement, None)
|
|
>>> assert last_x is None
|
|
>>> x.value()
|
|
44
|
|
|
|
>>> apply_void_X_deep_ptr(decrement, x)
|
|
>>> x.value()
|
|
44
|
|
>>> last_x.value()
|
|
43
|
|
|
|
>>> y = apply_X_ref_handle(identity, x)
|
|
>>> assert y.value() == x.value()
|
|
>>> increment(x)
|
|
>>> assert y.value() == x.value()
|
|
|
|
>>> y = apply_X_ptr_handle_cref(identity, x)
|
|
>>> assert y.value() == x.value()
|
|
>>> increment(x)
|
|
>>> assert y.value() == x.value()
|
|
|
|
>>> y = apply_X_ptr_handle_cref(identity, None)
|
|
>>> y
|
|
|
|
>>> def new_x(ignored):
|
|
... return X(666)
|
|
...
|
|
>>> try: apply_X_ref_handle(new_x, 1)
|
|
... except ReferenceError: pass
|
|
... else: print('no error')
|
|
|
|
>>> try: apply_X_ptr_handle_cref(new_x, 1)
|
|
... except ReferenceError: pass
|
|
... else: print('no error')
|
|
|
|
>>> try: apply_cstring_cstring(identity, 'hello')
|
|
... except ReferenceError: pass
|
|
... else: print('no error')
|
|
|
|
>>> apply_char_char(identity, 'x')
|
|
'x'
|
|
|
|
>>> apply_cstring_pyobject(identity, 'hello')
|
|
'hello'
|
|
|
|
>>> apply_cstring_pyobject(identity, None)
|
|
|
|
|
|
>>> apply_char_char(identity, 'x')
|
|
'x'
|
|
|
|
>>> assert apply_to_own_type(identity) is type(identity)
|
|
|
|
>>> assert apply_object_object(identity, identity) is identity
|
|
'''
|
|
|
|
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)
|