# Copyright David Abrahams 2006. 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 python ;

use-project /boost/python : ../build ;
project /boost/python/test 
  : requirements
    <toolset>gcc:<cxxflags>-Wextra
  ;

local PY = ;
if [ python.configured ]
{
  PY = /python//python ;
}

rule py-run ( sources * : input-file ? )
{
    return [ run $(sources) /boost/python//boost_python $(PY)
      : # args
      : $(input-file)
      : #requirements
        <define>BOOST_PYTHON_SUPPRESS_REGISTRY_INITIALIZATION
 
    ] ;
}

rule py-compile ( sources * )
{
    return [ compile $(sources) /boost/python//boost_python ] ;
}

rule py-compile-fail ( sources * )
{
    return [ compile-fail $(sources) /boost/python//boost_python ] ;
}

rule require-windows ( properties * )
{
    if ! <target-os>windows in $(properties)
    {
        return <build>no ;
    }
}

test-suite python
  :

  [
    run exec.cpp /boost/python//boost_python/<link>static $(PY)
      : # program args
      : exec.py # input files
      : # requirements
      : # target-name
  ]

  [
    run exec.cpp ../build//boost_python/<link>shared /python//python
      : # program args
      : exec.py
      : # requirements
      : exec-dynamic # target-name
  ]

#   [
#     run import_.cpp ../build//boost_python /python//python
#       : # program args
#       : import_.py # input files
#       : # requirements
#       : # target-name
#   ]

[
bpl-test crossmod_exception
  : crossmod_exception.py crossmod_exception_a.cpp crossmod_exception_b.cpp
]

[ bpl-test injected ]
[ bpl-test properties ]
[ bpl-test return_arg ]
[ bpl-test staticmethod ]
[ bpl-test shared_ptr ]
[ bpl-test enable_shared_from_this ]
[ bpl-test andreas_beyer ]
[ bpl-test wrapper_held_type ]

[ bpl-test polymorphism2_auto_ptr 
  : polymorphism2_auto_ptr.py polymorphism2.py polymorphism2_auto_ptr.cpp 
]

[ bpl-test polymorphism ]
[ bpl-test polymorphism2 ]

[ bpl-test auto_ptr ]

[ bpl-test minimal ]
[ bpl-test args ]
[ bpl-test raw_ctor ]
[ bpl-test numpy : printer.py numeric_tests.py numarray_tests.py numpy.py numpy.cpp ]
[ bpl-test enum ]
[ bpl-test exception_translator ]
[ bpl-test pearu1 : test_cltree.py cltree.cpp ]
[ bpl-test try : newtest.py m1.cpp m2.cpp ]
[ bpl-test const_argument ]
[ bpl-test keywords : keywords.cpp keywords_test.py ]
   

[ python-extension builtin_converters_ext : test_builtin_converters.cpp /boost/python//boost_python ]
[ bpl-test builtin_converters : test_builtin_converters.py builtin_converters_ext ]

 [ bpl-test test_pointer_adoption ]
 [ bpl-test operators ]
 [ bpl-test operators_wrapper ]
 [ bpl-test callbacks ]
 [ bpl-test defaults ]

[ bpl-test object ]
[ bpl-test list ]
[ bpl-test long ]
[ bpl-test dict ]
[ bpl-test tuple ]
[ bpl-test str ]
[ bpl-test slice ]

[ bpl-test virtual_functions ]
[ bpl-test back_reference ]
[ bpl-test implicit ]
[ bpl-test data_members ]

[ bpl-test ben_scott1 ]

[ bpl-test bienstman1 ]
[ bpl-test bienstman2 ]
[ bpl-test bienstman3 ]

[ bpl-test multi_arg_constructor
  : # files
  : # requirements
    # A bug in the Win32 intel compilers causes compilation of one of our
    # tests to take forever when debug symbols are enabled. This rule
    # turns them off when added to the requirements section
    <toolset>intel-win:<debug-symbols>off
]

[ bpl-test iterator : iterator.py iterator.cpp input_iterator.cpp ]

[ bpl-test stl_iterator : stl_iterator.py stl_iterator.cpp ]

[ bpl-test extract ]

[
bpl-test crossmod_opaque
  : crossmod_opaque.py crossmod_opaque_a.cpp crossmod_opaque_b.cpp
]
[ bpl-test opaque ]
[ bpl-test voidptr ]

[ bpl-test pickle1 ]
[ bpl-test pickle2 ]
[ bpl-test pickle3 ]
[ bpl-test pickle4 ]

[ bpl-test nested ]

[ bpl-test docstring ]
[ bpl-test pytype_function ]

[ bpl-test vector_indexing_suite ]

[ bpl-test pointer_vector
  : # files
  : # requirements
    # Turn off this test on HP CXX, as the test hangs when executing.
    # Whenever the cause for the failure of the polymorphism test is found
    # and fixed, this should be retested.
    <toolset>hp_cxx:<build>no ]
      
[ python-extension map_indexing_suite_ext
    : map_indexing_suite.cpp int_map_indexing_suite.cpp a_map_indexing_suite.cpp
    /boost/python//boost_python ]
[ bpl-test  
    map_indexing_suite : map_indexing_suite.py map_indexing_suite_ext ]
      
[ run import_.cpp /boost/python//boost_python $(PY) : : import_.py ]

# if $(TEST_BIENSTMAN_NON_BUGS)
# {
#     bpl-test bienstman4 ;
#     bpl-test bienstman5 ;
# }

[ bpl-test calling_conventions : : <conditional>@require-windows ]
[ bpl-test calling_conventions_mf : : <conditional>@require-windows ]

# --- unit tests of library components ---

[ compile indirect_traits_test.cpp ]
[ run destroy_test.cpp ]
[ py-run pointer_type_id_test.cpp ]
[ py-run bases.cpp ]
[ run if_else.cpp ]
[ py-run pointee.cpp ]
[ run result.cpp ]

[ compile string_literal.cpp ]
[ py-compile borrowed.cpp ]
[ py-compile object_manager.cpp ]
[ py-compile copy_ctor_mutates_rhs.cpp ]

[ py-run upcast.cpp ]
  
[ py-compile select_holder.cpp ]
  
[ run select_from_python_test.cpp ../src/converter/type_id.cpp 
  :   
  :
  : <define>BOOST_PYTHON_STATIC_LIB
    <use>$(PY)

]

 [ py-compile select_arg_to_python_test.cpp ]

[ py-compile-fail ./raw_pyobject_fail1.cpp ]
[ py-compile-fail ./raw_pyobject_fail2.cpp ]
[ py-compile-fail ./as_to_python_function.cpp ]
[ py-compile-fail ./object_fail1.cpp ]

  ;
