108 lines
2.4 KiB
Python
108 lines
2.4 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 extract_ext import *
|
|
|
|
Just about anything has a truth value in Python
|
|
|
|
>>> assert check_bool(None)
|
|
>>> extract_bool(None)
|
|
0
|
|
|
|
>>> assert check_bool(2)
|
|
>>> extract_bool(2)
|
|
1
|
|
|
|
>>> assert not check_bool('')
|
|
|
|
Check that object manager types work properly. These are a different
|
|
case because they wrap Python objects instead of being wrapped by them.
|
|
|
|
>>> assert not check_list(2)
|
|
>>> try: x = extract_list(2)
|
|
... except TypeError as x:
|
|
... if str(x) != 'Expecting an object of type list; got an object of type int instead':
|
|
... print(x)
|
|
... else:
|
|
... print('expected an exception, got', x, 'instead')
|
|
|
|
Can't extract a list from a tuple. Use list(x) to convert a sequence
|
|
to a list:
|
|
|
|
>>> assert not check_list((1, 2, 3))
|
|
>>> assert check_list([1, 2, 3])
|
|
>>> extract_list([1, 2, 3])
|
|
[1, 2, 3]
|
|
|
|
Can get a char const* from a Python string:
|
|
|
|
>>> assert check_cstring('hello')
|
|
>>> extract_cstring('hello')
|
|
'hello'
|
|
|
|
Can't get a char const* from a Python int:
|
|
|
|
>>> assert not check_cstring(1)
|
|
>>> try: x = extract_cstring(1)
|
|
... except TypeError: pass
|
|
... else:
|
|
... print('expected an exception, got', x, 'instead')
|
|
|
|
Extract an std::string (class) rvalue from a native Python type
|
|
|
|
>>> assert check_string('hello')
|
|
>>> extract_string('hello')
|
|
'hello'
|
|
|
|
Constant references are not treated as rvalues for the purposes of
|
|
extract:
|
|
|
|
>>> assert not check_string_cref('hello')
|
|
|
|
We can extract lvalues where appropriate:
|
|
|
|
>>> x = X(42)
|
|
>>> check_X(x)
|
|
1
|
|
>>> extract_X(x)
|
|
X(42)
|
|
|
|
>>> check_X_ptr(x)
|
|
1
|
|
>>> extract_X_ptr(x)
|
|
X(42)
|
|
>>> extract_X_ref(x)
|
|
X(42)
|
|
|
|
Demonstrate that double-extraction of an rvalue works, and all created
|
|
copies of the object are destroyed:
|
|
|
|
>>> n = count_Xs()
|
|
>>> double_X(333)
|
|
666
|
|
>>> count_Xs() - n
|
|
0
|
|
|
|
General check for cleanliness:
|
|
|
|
>>> del x
|
|
>>> count_Xs()
|
|
0
|
|
'''
|
|
|
|
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)
|