diff --git a/.appveyor.yml b/.appveyor.yml index 05d2480d..c8205eae 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -4,7 +4,6 @@ environment: # /E:ON and /V:ON options are not enabled in the batch script intepreter # See: http://stackoverflow.com/a/13751649/163740 CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\ci\\run_with_env.cmd" - BOOST_PREFIX: C:\Libraries\boost_1_66_0 matrix: @@ -12,24 +11,28 @@ environment: # a later point release. # See: http://www.appveyor.com/docs/installed-software#python - - PYTHON: "C:\\Python27" - PYTHON_VERSION: "2.7.x" # currently 2.7.9 - PYTHON_ARCH: "32" - MSVC: "14.0" - ARCH: x86 - - - PYTHON: "C:\\Python36-x64" - PYTHON_VERSION: "3.6.x" - PYTHON_ARCH: "64" - MSVC: "12.0" + - PYTHON: C:\\Python36-x64 + PYTHON_VERSION: 3.6.x + PYTHON_ARCH: 64 + MSVC: 12.0 ARCH: x86_64 + BOOST_PREFIX: C:\Libraries\boost_1_66_0 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - PYTHON: "C:\\Python36-x64" - PYTHON_VERSION: "3.6.x" - PYTHON_ARCH: "64" - MSVC: "14.13.26128" + PYTHON: C:\\Python36-x64 + PYTHON_VERSION: 3.6.x + PYTHON_ARCH: 64 + MSVC: 15.9.19 ARCH: x86_64 + BOOST_PREFIX: C:\Libraries\boost_1_69_0 + + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 + PYTHON: C:\\Python36-x64 + PYTHON_VERSION: 3.6.x + PYTHON_ARCH: 64 + MSVC: 16.6.5 + ARCH: x86_64 + BOOST_PREFIX: C:\Libraries\boost_1_73_0 install: # If there is a newer build queued for the same PR, cancel this one. @@ -64,28 +67,33 @@ install: # Upgrade to the latest version of pip to avoid it displaying warnings # about it being out of date. - - "pip install --disable-pip-version-check --user --upgrade pip" + - "python -m pip install --disable-pip-version-check --user --upgrade pip" # Install the build dependencies of the project. If some dependencies contain # compiled extensions and are not provided as pre-built wheel packages, # pip will build them from source using the MSVC compiler matching the # target Python version and architecture - - | - curl -LfsS -o faber.tar.gz https://github.com/stefanseefeld/faber/archive/snapshot/2018-04-08.tar.gz - tar xf faber.tar.gz - CD faber-snapshot-2018-04-08 - python setup.py install - CD .. + + - curl -LfsS -o vswhere.exe https://github.com/Microsoft/vswhere/releases/download/2.8.4/vswhere.exe + #- | + # curl -LfsS -o faber.tar.gz https://github.com/stefanseefeld/faber/archive/snapshot/2020-08-01.tar.gz + # tar xf faber.tar.gz + # CD faber-snapshot-2020-08-01 + # python setup.py install + # CD .. + - python -m pip install faber # report the available MSVC compilers - - faber --info=tools cxx + - faber --log=tools --info=tools cxx - easy_install sphinx - - pip install numpy + - python -m pip install numpy + - set FARGS=--log=summary --log=output --log=actions --log=commands --with-boost-include=%BOOST_PREFIX% target.arch=%ARCH% cxx.name=msvc cxx.version=%MSVC% build_script: - - faber --with-boost-include=%BOOST_PREFIX% target.arch=%ARCH% msvc.version=%MSVC% + - faber %FARGS% config || type config.log + - faber %FARGS% -j8 test_script: - - faber --with-boost-include=%BOOST_PREFIX% test.report target.arch=%ARCH% msvc.version=%MSVC% + - faber %FARGS% -j8 test.report after_test: # If tests are successful, create binary packages for the project. diff --git a/.travis.yml b/.travis.yml index 5d37070b..ef7828c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,8 +6,7 @@ # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -sudo: required -dist: trusty +dist: bionic language: cpp @@ -15,7 +14,7 @@ env: global: - secure: BRNUkxN3p8f+uYKWC3Hr0VPqZA0PxbWr1DJlcI4hbiZtzKhMCWjDmd9UW9CzzexqeOxpd+9s0G87qvOur+wMSVxugDxtTesZrh1czXHeSVxgQrYD783XJtQJ9aYypbChkiboRD6Xpmbq7itwMuHBJMFtCuDxMynpU1jWwkyTf2Y= -matrix: +jobs: include: - os: linux env: CXX=g++ PYTHON=python CXXFLAGS=-std=c++98 @@ -40,9 +39,10 @@ addons: sources: - ubuntu-toolchain-r-test packages: - - gcc-4.8 - - g++-4.8 + - gcc + - g++ - clang + - python3-pip - python-numpy - python-sphinx - python3-dev @@ -57,12 +57,6 @@ cache: directories: - $HOME/Boost -before_install: - # The Trusty image has several Python versions pre-installed compiled with - # conflicting UCS2 and UCS4 unicode. Modify the PATH to skip the TravisCI python. - # See https://github.com/travis-ci/travis-ci/issues/4948 for details. - - export PATH=$(echo $PATH | tr ':' "\n" | sed '/\/opt\/python/d' | tr "\n" ":" | sed "s|::|:|g") - install: # Install our own version of Boost (the subset we need) as the system version is # too old (for C++11 support). @@ -83,15 +77,14 @@ install: echo "using cached Boost prerequisites." fi # Install Faber, the build tool. - date=2018-04-08 - wget https://github.com/stefanseefeld/faber/archive/snapshot/$date.tar.gz - tar xf $date.tar.gz - pushd faber-snapshot-$date - #wget https://github.com/stefanseefeld/faber/archive/release/0.2.tar.gz - #tar xf 0.2.tar.gz - #pushd faber-release-0.2 - sudo python setup.py install - popd + python3 -m pip install setuptools + python3 -m pip install faber + #date=2020-08-01 + #wget https://github.com/stefanseefeld/faber/archive/snapshot/$date.tar.gz + #tar xf $date.tar.gz + #pushd faber-snapshot-$date + #sudo python3 setup.py install + #popd before_script: - sed -e "s/\$PYTHON/$PYTHON/g" .ci/faber > ~/.faber @@ -104,7 +97,7 @@ script: if [ "$DOC" ]; then BOOST_ROOT=$HOME/Boost faber --builddir=build doc.html else - faber --with-boost-include=$HOME/Boost --builddir=build test.report cxx.name=$CXX cxxflags=$CXXFLAGS + faber --with-boost-include=$HOME/Boost --builddir=build test.report cxx.name=$CXX cxxflags=$CXXFLAGS -j8 fi after_success: diff --git a/Jamfile b/Jamfile deleted file mode 100644 index 32e87d80..00000000 --- a/Jamfile +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright (c) 2018 Stefan Seefeld -# All rights reserved. -# -# 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) - -import option ; -import regex ; -import python ; - -# -# The `version-suffix` rule really belongs into python.jam, and -# should be moved there. `split-version` is only duplicated here -# as a prerequisite. (See https://github.com/boostorg/build/pull/290) -# - - -# Validate the version string and extract the major/minor part we care about. -# -local rule split-version ( version ) -{ - local major-minor = [ MATCH "^([0-9]+)\.([0-9]+)(.*)$" : $(version) : 1 2 3 ] ; - if ! $(major-minor[2]) || $(major-minor[3]) - { - ECHO "Warning: \"using python\" expects a two part (major, minor) version number; got" $(version) instead ; - - # Add a zero to account for the missing digit if necessary. - major-minor += 0 ; - } - - return $(major-minor[1]) $(major-minor[2]) ; -} - -# Define a version suffix for libraries depending on Python. -# For example, Boost.Python built for Python 2.7 uses the suffix "27" -rule version-suffix ( version ) -{ - local major-minor = [ split-version $(version) ] ; - local suffix = $(major-minor:J="") ; - return $(suffix) ; -} - - -# Python build id (for Python libraries only). -python-id = [ option.get "python-buildid" ] ; -if $(python-id) -{ - PYTHON_ID = [ regex.replace $(python-id) "[*\\/:.\"\']" _ ] ; -} - -rule python-tag ( name : type ? : property-set ) -{ - local result = $(name) ; - if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB - { - local version = [ $(property-set).get ] ; - local lib-suffix = [ version-suffix $(version) ] ; - result = $(result)$(lib-suffix) ; - } - if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB && $(PYTHON_ID) - { - result = $(result)-$(PYTHON_ID) ; - } - - # forward to the boost tagging rule - return [ tag $(result) : $(type) : $(property-set) ] ; -} diff --git a/build/Jamfile b/build/Jamfile index 34f99dde..dbc9fb20 100644 --- a/build/Jamfile +++ b/build/Jamfile @@ -30,8 +30,6 @@ else ; } -if [ python.configured ] -{ project boost/python : source-location ../src ; @@ -95,7 +93,7 @@ lib boost_python config-warning on:BOOST_DEBUG_PYTHON -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag - @$(__name__).python-tag + @python-tag @python.require-py : # default build @@ -123,7 +121,7 @@ lib boost_numpy boost_python on:BOOST_DEBUG_PYTHON -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag - @$(__name__).python-tag + @python-tag @python.require-py : # default build @@ -142,8 +140,16 @@ lib boost_numpy # `install` installs the two libraries and their dependencies and is similar # to issuing `b2 --with-python install` from top level -boost-install boost_python boost_numpy ; - +if [ python.configured ] +{ + if [ python.numpy ] + { + boost-install boost_python boost_numpy ; + } + else + { + boost-install boost_python ; + } } else { diff --git a/fabscript b/fabscript index 054ed90e..8188779f 100644 --- a/fabscript +++ b/fabscript @@ -75,8 +75,8 @@ checks = [cxx_checks.has_cxx11(features, define('HAS_CXX11')), has_numpy(features)] config = report('config', checks) -src = module('src', features=config.use) -test = module('test', features=config.use) -doc = module('doc', features=config.use) +src = module('src', features=features|config.use) +test = module('test', features=features|config.use) +doc = module('doc', features=features|config.use) default = src.default diff --git a/include/boost/python/def_visitor.hpp b/include/boost/python/def_visitor.hpp index 9c8907cd..18dd9286 100644 --- a/include/boost/python/def_visitor.hpp +++ b/include/boost/python/def_visitor.hpp @@ -16,7 +16,7 @@ template class class_; class def_visitor_access { # if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) \ - || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) + || BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x551)) // Tasteless as this may seem, making all members public allows member templates // to work in the absence of member template friends. public: @@ -52,7 +52,7 @@ class def_visitor friend class def_visitor_access; # if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) \ - || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) + || BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x551)) // Tasteless as this may seem, making all members public allows member templates // to work in the absence of member template friends. public: diff --git a/include/boost/python/detail/caller.hpp b/include/boost/python/detail/caller.hpp index 557359f5..2834d6da 100644 --- a/include/boost/python/detail/caller.hpp +++ b/include/boost/python/detail/caller.hpp @@ -124,7 +124,7 @@ template const signature_element* get_ret() }; return &ret; -}; +} #endif diff --git a/include/boost/python/detail/wrap_python.hpp b/include/boost/python/detail/wrap_python.hpp index 13679dbb..9d5f5422 100644 --- a/include/boost/python/detail/wrap_python.hpp +++ b/include/boost/python/detail/wrap_python.hpp @@ -146,7 +146,7 @@ typedef int pid_t; # undef hypot // undo the evil #define left by Python. -# elif defined(__BORLANDC__) +# elif defined(__BORLANDC__) && !defined(__clang__) # undef HAVE_HYPOT # define HAVE_HYPOT 1 # endif diff --git a/include/boost/python/long.hpp b/include/boost/python/long.hpp index 129c61f9..c15604c9 100644 --- a/include/boost/python/long.hpp +++ b/include/boost/python/long.hpp @@ -24,8 +24,8 @@ namespace detail BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(long_base, object) private: - static detail::new_non_null_reference call(object const&); - static detail::new_non_null_reference call(object const&, object const&); + static detail::new_reference call(object const&); + static detail::new_reference call(object const&, object const&); }; } diff --git a/include/boost/python/object/iterator.hpp b/include/boost/python/object/iterator.hpp index e2f65721..87495036 100644 --- a/include/boost/python/object/iterator.hpp +++ b/include/boost/python/object/iterator.hpp @@ -25,7 +25,7 @@ # include -# include +# include namespace boost { namespace python { namespace objects { @@ -42,7 +42,7 @@ struct iterator_range { iterator_range(object sequence, Iterator start, Iterator finish); - typedef boost::detail::iterator_traits traits_t; + typedef std::iterator_traits traits_t; struct next { diff --git a/src/long.cpp b/src/long.cpp index 1ec8ebc0..6aa2965e 100644 --- a/src/long.cpp +++ b/src/long.cpp @@ -6,16 +6,16 @@ namespace boost { namespace python { namespace detail { -new_non_null_reference long_base::call(object const& arg_) +new_reference long_base::call(object const& arg_) { - return (detail::new_non_null_reference)PyObject_CallFunction( + return (detail::new_reference)PyObject_CallFunction( (PyObject*)&PyLong_Type, const_cast("(O)"), arg_.ptr()); } -new_non_null_reference long_base::call(object const& arg_, object const& base) +new_reference long_base::call(object const& arg_, object const& base) { - return (detail::new_non_null_reference)PyObject_CallFunction( + return (detail::new_reference)PyObject_CallFunction( (PyObject*)&PyLong_Type, const_cast("(OO)"), arg_.ptr(), base.ptr()); } diff --git a/test/args.py b/test/args.py index e884c06b..5d899214 100644 --- a/test/args.py +++ b/test/args.py @@ -1,15 +1,19 @@ # 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 __future__ import print_function """ >>> from args_ext import * ->>> raw(3, 4, foo = 'bar', baz = 42) -((3, 4), {'foo': 'bar', 'baz': 42}) +>>> args, kwargs = raw(3, 4, foo = 'bar', baz = 42) +>>> args +(3, 4) +>>> kwargs['foo'] +'bar' +>>> kwargs['baz'] +42 Prove that we can handle empty keywords and non-keywords - + >>> raw(3, 4) ((3, 4), {}) @@ -76,7 +80,7 @@ from __future__ import print_function ... else: print('expected an exception: unknown keyword') Exercise member functions using default stubs - + >>> q.f1(z = 'nix', y = .125, x = 2) (2, 0.125, 'nix') >>> q.f1(y = .125, x = 2) @@ -123,10 +127,16 @@ from __future__ import print_function 1 >>> y = Y(value = 33) ->>> y.raw(this = 1, that = 'the other')[1] -{'this': 1, 'that': 'the other'} +>>> _, kwargs = y.raw(this = 1, that = 'the other') +>>> kwargs['this'] +1 +>>> kwargs['that'] +'the other' """ + +from __future__ import print_function + def run(args = None): import sys import doctest @@ -143,6 +153,3 @@ if __name__ == '__main__': import args_ext help(args_ext) sys.exit(status) - - - diff --git a/test/dict.cpp b/test/dict.cpp index 375905d6..4f3490a4 100644 --- a/test/dict.cpp +++ b/test/dict.cpp @@ -21,11 +21,13 @@ object new_dict() object data_dict() { dict tmp1; - tmp1["key1"] = "value1"; dict tmp2; tmp2["key2"] = "value2"; tmp1[1] = tmp2; + + tmp1["key1"] = "value1"; + return tmp1; } @@ -60,22 +62,20 @@ void work_with_dict(dict data1, dict data2) void test_templates(object print) { std::string key = "key"; - + dict tmp; - tmp[1] = "a test string"; - print(tmp.get(1)); - //print(tmp[1]); tmp[1.5] = 13; print(tmp.get(1.5)); + tmp[1] = "a test string"; + print(tmp.get(1)); print(tmp.get(44)); print(tmp); print(tmp.get(2,"default")); print(tmp.setdefault(3,"default")); BOOST_ASSERT(!tmp.has_key(key)); - //print(tmp[3]); } - + BOOST_PYTHON_MODULE(dict_ext) { def("new_dict", new_dict); diff --git a/test/dict.py b/test/dict.py index 72c37d99..9b1149ae 100644 --- a/test/dict.py +++ b/test/dict.py @@ -1,7 +1,6 @@ # 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 __future__ import print_function """ >>> from dict_ext import * >>> def printer(*args): @@ -22,14 +21,16 @@ from __future__ import print_function >>> print(dict_from_sequence([(1,1),(2,2),(3,3)])) {1: 1, 2: 2, 3: 3} >>> test_templates(printer) #doctest: +NORMALIZE_WHITESPACE -a test string 13 +a test string None {1.5: 13, 1: 'a test string'} default default """ +from __future__ import print_function + def run(args = None): import sys import doctest @@ -37,7 +38,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/fabscript b/test/fabscript index 1989cc0d..03e4c6f9 100644 --- a/test/fabscript +++ b/test/fabscript @@ -21,14 +21,14 @@ src = module('..src') python_libs=python.instance().libs features |= runpath(src.bpl.path, base='') -def extension_test(name, ext=[], script=None, np=False, +def extension_test(name, exts=[], script=None, numpy=False, features=features, condition=None): """Create a Python extension test `name`. Arguments: * name: the name of the test. - * ext: extensions to be compiled, if none are given. + * exts: extensions to be compiled, if none are given. * script: the test script to execute, .py if none is given. - * np: if true, add boost_numpy to sources + * numpy: if true, add boost_numpy to sources * features: pre-defined features * condition: any condition under which to run the test Return: @@ -36,17 +36,17 @@ def extension_test(name, ext=[], script=None, np=False, features=features.copy() extensions = [] - libs = [src.bnl, src.bpl] if np else [src.bpl] - for e in ext or [name]: - if type(e) is str: # build from a single source file - n = e if e != name else e + '_ext' - s = [e + '.cpp'] + libs = [src.bnl, src.bpl] if numpy else [src.bpl] + for ext in exts or [name]: + if type(ext) is str: # build from a single source file + ext_name = ext if ext != name else ext + '_ext' + sources = [ext + '.cpp'] else: # build from a list of source files - n = e[0] if e[0] != name else e[0] + '_ext' - s = [n + '.cpp' for n in e] - e = extension(n, s + libs, features=features) - features |= pythonpath(e.path, base='') - extensions.append(e) + ext_name = ext[0] if ext[0] != name else ext[0] + '_ext' + sources = [source + '.cpp' for source in ext] + ext = extension(ext_name, sources + libs, features=features) + features |= pythonpath(ext.path, base='') + extensions.append(ext) if not script: script = name+'.py' return test(name, script, run=python.run, dependencies=extensions, @@ -123,9 +123,9 @@ tests.append(extension_test('auto_ptr', import_ = binary('import_', ['import_.cpp', src.bpl], features=features|python_libs) if platform.os == 'Windows': command = """set PATH=$(runpath);%PATH% -$(>[1]) $(>[2])""" +$(>[0]) $(>[1])""" else: - command = 'LD_LIBRARY_PATH=$(runpath) $(>[1]) $(>[2])' + command = 'LD_LIBRARY_PATH=$(runpath) $(>[0]) $(>[1])' tests.append(test('import', [import_, 'import_.py'], run=action('run', command), @@ -167,7 +167,7 @@ for t in ['numpy/dtype', 'numpy/ndarray', 'numpy/indexing', 'numpy/shapes']: - tests.append(extension_test(t, np=True, + tests.append(extension_test(t, numpy=True, condition=set.define.contains('HAS_NUMPY'))) default = report('report', tests, fail_on_failures=True) diff --git a/test/iterator.py b/test/iterator.py index 314a3567..0d75100a 100644 --- a/test/iterator.py +++ b/test/iterator.py @@ -1,7 +1,6 @@ # 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 __future__ import print_function ''' >>> from iterator_ext import * >>> from input_iterator import * @@ -25,7 +24,7 @@ from __future__ import print_function Range2 wraps a transform_iterator which doubles the elements it traverses. This proves we can wrap input iterators - + >>> z2 = range2(x) >>> for y in z2: ... print(y) @@ -56,12 +55,15 @@ from __future__ import print_function >>> ll.push_back(x) >>> for a in ll: #doctest: +NORMALIZE_WHITESPACE ... for b in a: -... print(b, end='') +... print(b, end=' ') ... print('') ... 1 3 5 1 3 5 7 ''' + +from __future__ import print_function + def run(args = None): import sys import doctest @@ -69,7 +71,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/list.py b/test/list.py index 913032db..f6cf8709 100644 --- a/test/list.py +++ b/test/list.py @@ -1,7 +1,6 @@ # 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 __future__ import print_function ''' >>> from list_ext import * @@ -41,7 +40,7 @@ X(22) ['h', 'e', 'l', 'l', 'o', '.'] tuples do not automatically convert to lists when passed as arguments - + >>> try: append_list(letters, (1,2)) ... except TypeError: pass ... else: print('expected an exception') @@ -51,7 +50,7 @@ X(22) ['h', 'e', 'l', 'l', 'o', '.', [1, 2]] Check that subclass functions are properly called - + >>> class mylist(list): ... def append(self, o): ... list.append(self, o) @@ -103,6 +102,8 @@ reverse sorted: ['y', 'x', 'o', 'l', 'l', 'h', 'e', '.'] ''' +from __future__ import print_function + def run(args = None): import sys import doctest @@ -110,7 +111,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/long.py b/test/long.py index f6392363..157dc57a 100644 --- a/test/long.py +++ b/test/long.py @@ -1,9 +1,6 @@ # 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) -import sys -if (sys.version_info.major >= 3): - long = int ''' >>> from long_ext import * >>> print(new_long()) @@ -20,6 +17,10 @@ if (sys.version_info.major >= 3): >>> x = Y(long(4294967295)) ''' +import sys +if (sys.version_info.major >= 3): + long = int + def run(args = None): import sys import doctest diff --git a/test/map_indexing_suite.py b/test/map_indexing_suite.py index a5750a83..e772bb53 100644 --- a/test/map_indexing_suite.py +++ b/test/map_indexing_suite.py @@ -1,7 +1,6 @@ # Copyright Joel de Guzman 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 __future__ import print_function ''' ##################################################################### @@ -25,7 +24,7 @@ foo # test that a string is implicitly convertible # to an X ->>> x_value('bochi bochi') +>>> x_value('bochi bochi') 'gotya bochi bochi' ##################################################################### @@ -33,9 +32,9 @@ foo ##################################################################### >>> def print_xmap(xmap): ... s = '[ ' -... for x in xmap: +... for x in xmap: ... s += repr(x) -... s += ' ' +... s += ' ' ... s += ']' ... print(s) @@ -135,7 +134,7 @@ foo >>> assert not 12345 in xm ##################################################################### -# Some references to the container elements +# Some references to the container elements ##################################################################### >>> z0 = xm['joel'] @@ -156,7 +155,7 @@ banana kiwi ##################################################################### -# Delete some container element +# Delete some container element ##################################################################### >>> del xm['tenji'] @@ -168,7 +167,7 @@ kiwi [ (joel, apple) (kim, kiwi) (mariel, grape) ] ##################################################################### -# Show that the references are still valid +# Show that the references are still valid ##################################################################### >>> z0 # proxy apple @@ -199,7 +198,7 @@ kiwi >>> print_xmap(tm) [ (joel, aaa) (kimpo, bbb) ] >>> for el in tm: #doctest: +NORMALIZE_WHITESPACE -... print(el.key(), end='') +... print(el.key(), end=' ') ... dom = el.data() joel kimpo @@ -216,11 +215,12 @@ joel kimpo 4 ##################################################################### -# END.... +# END.... ##################################################################### ''' +from __future__ import print_function def run(args = None): import sys @@ -236,8 +236,3 @@ if __name__ == '__main__': status = run()[0] if (status == 0): print("Done.") sys.exit(status) - - - - - diff --git a/test/object.py b/test/object.py index 67a46d93..cf6c2de0 100644 --- a/test/object.py +++ b/test/object.py @@ -1,7 +1,6 @@ # 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 __future__ import print_function ''' >>> from object_ext import * @@ -130,14 +129,14 @@ from __future__ import print_function 1 Slices - + >>> assert check_string_slice() Operators ->>> def print_args(*args, **kwds): +>>> def print_args(*args, **kwds): ... print(args, kwds) ->>> test_call(print_args, (0, 1, 2, 3), {'a':'A'}) +>>> test_call(print_args, (0, 1, 2, 3), {'a':'A'}) (0, 1, 2, 3) {'a': 'A'} @@ -149,7 +148,7 @@ from __future__ import print_function Now make sure that object is actually managing reference counts - + >>> import weakref >>> class Z: pass ... @@ -164,6 +163,8 @@ from __future__ import print_function death ''' +from __future__ import print_function + def run(args = None): import sys import doctest @@ -171,7 +172,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/pickle2.py b/test/pickle2.py index f4788d3b..4c11ef3a 100644 --- a/test/pickle2.py +++ b/test/pickle2.py @@ -1,7 +1,6 @@ # 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 __future__ import print_function r'''>>> import pickle2_ext >>> import pickle >>> pickle2_ext.world.__module__ @@ -35,6 +34,8 @@ r'''>>> import pickle2_ext Incomplete pickle support (__getstate_manages_dict__ not set) ''' +from __future__ import print_function + def run(args = None): import sys import doctest @@ -42,7 +43,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/pickle3.py b/test/pickle3.py index 932e30f3..391e3d00 100644 --- a/test/pickle3.py +++ b/test/pickle3.py @@ -1,7 +1,6 @@ # 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 __future__ import print_function r'''>>> import pickle3_ext >>> import pickle >>> pickle3_ext.world.__module__ @@ -30,6 +29,8 @@ r'''>>> import pickle3_ext Hello from California! 0 84 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 126.0 ''' +from __future__ import print_function + def run(args = None): import sys import doctest @@ -37,7 +38,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/str.py b/test/str.py index 4eba0e87..bfb49949 100644 --- a/test/str.py +++ b/test/str.py @@ -1,11 +1,10 @@ # 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 __future__ import print_function """ >>> from str_ext import * >>> def printer(*args): -... for x in args: print(x, end='') +... for x in args: print(x, end=' ') ... print('') ... >>> work_with_string(printer) #doctest: +NORMALIZE_WHITESPACE @@ -38,6 +37,8 @@ this is a blabla string aaaaaaaaaaaaaaaaaaaaa """ +from __future__ import print_function + def run(args = None): import sys import doctest @@ -45,7 +46,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/test_builtin_converters.py b/test/test_builtin_converters.py index e612ed23..0f1b4ded 100644 --- a/test/test_builtin_converters.py +++ b/test/test_builtin_converters.py @@ -1,9 +1,7 @@ +# -*- coding: utf-8 -*- # 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) -import sys -if (sys.version_info.major >= 3): - long = int r""" >>> from builtin_converters_ext import * @@ -17,7 +15,7 @@ r""" # Wrappers to simplify tests >>> def should_pass(method, values): -... result = map(method, values[0]) +... result = list(map(method, values[0])) ... if result != values[0]: ... print("Got %s but expected %s" % (result, values[0])) >>> def test_overflow(method, values): @@ -136,9 +134,6 @@ True >>> print(rewrap_value_wstring(u'yo, wassup?')) yo, wassup? ->>> print(rewrap_value_wstring(u'\U0001f4a9')) -\U0001f4a9 - test that overloading on unicode works: >>> print(rewrap_value_string(u'yo, wassup?')) diff --git a/test/test_class.hpp b/test/test_class.hpp index 5404fdba..a9324e9c 100644 --- a/test/test_class.hpp +++ b/test/test_class.hpp @@ -4,17 +4,17 @@ // http://www.boost.org/LICENSE_1_0.txt) #ifndef TEST_CLASS_DWA2002326_HPP # define TEST_CLASS_DWA2002326_HPP -# include +# include template struct test_class { explicit test_class(int x) : x(x), magic(7654321 + n) { ++counter; } test_class(test_class const& rhs) : x(rhs.x), magic(7654321 + n) { ++counter; } - virtual ~test_class() { BOOST_TEST(magic == 7654321 + n); magic = 6666666; x = 9999; --counter; } + virtual ~test_class() { BOOST_ASSERT(magic == 7654321 + n); magic = 6666666; x = 9999; --counter; } - void set(int _x) { BOOST_TEST(magic == 7654321 + n); this->x = _x; } - int value() const { BOOST_TEST(magic == 7654321 + n); return x; } + void set(int _x) { BOOST_ASSERT(magic == 7654321 + n); this->x = _x; } + int value() const { BOOST_ASSERT(magic == 7654321 + n); return x; } operator int() const { return x; } static int count() { return counter; } diff --git a/test/tuple.py b/test/tuple.py index 1aec5fde..e2cd5eb1 100644 --- a/test/tuple.py +++ b/test/tuple.py @@ -1,7 +1,6 @@ # 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 __future__ import print_function """ >>> from tuple_ext import * >>> def printer(*args): @@ -22,6 +21,8 @@ from __future__ import print_function ('hello', 42) """ +from __future__ import print_function + def run(args = None): import sys import doctest @@ -29,7 +30,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys