1# Copyright David Abrahams 2004. Distributed under the Boost
2# Software License, Version 1.0. (See accompanying
3# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4'''
5>>> from callbacks_ext import *
6
7>>> def double(x):
8...     return x + x
9...
10>>> apply_int_int(double, 42)
1184
12>>> apply_void_int(double, 42)
13
14>>> def identity(x):
15...     return x
16
17Once we have array conversion support, this test will fail. Er,
18succeed<wink>:
19
20>>> try: apply_to_string_literal(identity)
21... except ReferenceError: pass # expected
22... else: print('expected an exception!')
23
24>>> try: apply_X_ref_handle(lambda ignored:X(42), None)
25... except ReferenceError: pass # expected
26... else: print('expected an exception!')
27
28>>> x = X(42)
29>>> x.y = X(7)
30>>> apply_X_ref_handle(lambda z:z.y, x).value()
317
32
33>>> x = apply_X_X(identity, X(42))
34>>> x.value()
3542
36>>> x_count()
371
38>>> del x
39>>> x_count()
400
41
42>>> def increment(x):
43...     x.set(x.value() + 1)
44...
45>>> x = X(42)
46>>> apply_void_X_ref(increment, x)
47>>> x.value()
4843
49
50>>> apply_void_X_cref(increment, x)
51>>> x.value()  # const-ness is not respected, sorry!
5244
53
54>>> last_x = 1
55>>> def decrement(x):
56...     global last_x
57...     last_x = x
58...     if x is not None:
59...         x.set(x.value() - 1)
60
61>>> apply_void_X_ptr(decrement, x)
62>>> x.value()
6343
64>>> last_x.value()
6543
66>>> increment(last_x)
67>>> x.value()
6844
69>>> last_x.value()
7044
71
72>>> apply_void_X_ptr(decrement, None)
73>>> assert last_x is None
74>>> x.value()
7544
76
77>>> last_x = 1
78>>> apply_void_X_deep_ptr(decrement, None)
79>>> assert last_x is None
80>>> x.value()
8144
82
83>>> apply_void_X_deep_ptr(decrement, x)
84>>> x.value()
8544
86>>> last_x.value()
8743
88
89>>> y = apply_X_ref_handle(identity, x)
90>>> assert y.value() == x.value()
91>>> increment(x)
92>>> assert y.value() == x.value()
93
94>>> y = apply_X_ptr_handle_cref(identity, x)
95>>> assert y.value() == x.value()
96>>> increment(x)
97>>> assert y.value() == x.value()
98
99>>> y = apply_X_ptr_handle_cref(identity, None)
100>>> y
101
102>>> def new_x(ignored):
103...     return X(666)
104...
105>>> try: apply_X_ref_handle(new_x, 1)
106... except ReferenceError: pass
107... else: print('no error')
108
109>>> try: apply_X_ptr_handle_cref(new_x, 1)
110... except ReferenceError: pass
111... else: print('no error')
112
113>>> try: apply_cstring_cstring(identity, 'hello')
114... except ReferenceError: pass
115... else: print('no error')
116
117>>> apply_char_char(identity, 'x')
118'x'
119
120>>> apply_cstring_pyobject(identity, 'hello')
121'hello'
122
123>>> apply_cstring_pyobject(identity, None)
124
125
126>>> apply_char_char(identity, 'x')
127'x'
128
129>>> assert apply_to_own_type(identity) is type(identity)
130
131>>> assert apply_object_object(identity, identity) is identity
132'''
133
134def run(args = None):
135    import sys
136    import doctest
137
138    if args is not None:
139        sys.argv = args
140    return doctest.testmod(sys.modules.get(__name__))
141
142if __name__ == '__main__':
143    print("running...")
144    import sys
145    status = run()[0]
146    if (status == 0): print("Done.")
147    sys.exit(status)
148