# -*- python -*-
#
# Copyright (c) 2016 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 platform
import sys

Import('env')

if sys.platform == 'win32':
    # HACK: This works around a bug in SCons.
    #       subprocess.check_output will complain unless all environment
    #       variables are strings.
    system_root = env['ENV']['SystemRoot']
    env['ENV']['SystemRoot'] = str(system_root)


# libs needed for embedding
ELIBS=env['LIBS'] + env['PYTHONLIBS']

def BPLTest(env, name, sources = None, deps = None):
    run = env.BoostRunPythonScript(name + '.py')
    if sources:
        for source in sources:
            Depends(run,
                    env.PythonExtension(source != name and source or (source + '_ext'), source + '.cpp')
            )
    else:
        Depends(run, env.PythonExtension(name + '_ext', name + '.cpp'))
    if deps:
        Depends(run, deps)
    return run
        
env.AddMethod(BPLTest)

env.AppendENVPath('PYTHONPATH', Dir('.').path)

tests=[]
tests+=env.BPLTest('crossmod_exception', ['crossmod_exception_a', 'crossmod_exception_b'])

for test in [('injected',),
             ('properties',),
             ('return_arg',),
             ('staticmethod',),
             ('boost_shared_ptr',),
             ('enable_shared_from_this',),
             ('andreas_beyer',),
             ('polymorphism',),
             ('polymorphism2',),
             ('wrapper_held_type',),
             ('minimal',),
             ('args',),
             ('raw_ctor',),
             ('exception_translator',),
             ('test_enum', ['enum_ext']),
             ('test_cltree', ['cltree']),
             ('newtest', ['m1', 'm2']),
             ('const_argument',),
             ('keywords_test', ['keywords']),
             ('test_pointer_adoption',),
             ('operators',),
             ('operators_wrapper',),
             ('callbacks',),
             ('defaults',),
             ('object',),
             ('list',),
             ('long',),
             ('dict',),
             ('tuple',),
             ('str',),
             ('slice',),
             ('virtual_functions',),
             ('back_reference',),
             ('implicit',),
             ('data_members',),
             ('ben_scott1',),
             ('bienstman1',),
             ('bienstman2',),
             ('bienstman3',),
             ('multi_arg_constructor',),
             ('iterator', ['iterator', 'input_iterator']),
             ('stl_iterator',),
             ('extract',),
             ('crossmod_opaque', ['crossmod_opaque_a', 'crossmod_opaque_b']),
             ('opaque',),
#             ('voidptr',),
             ('pickle1',),
             ('pickle2',),
             ('pickle3',),
             ('pickle4',),
             ('nested',),
             ('docstring',),
             ('pytype_function',),
             ('vector_indexing_suite',),
             ('pointer_vector',)]:
    tests+=env.BPLTest(*test)

if env['CXX11']:
    for test in [
        ('shared_ptr',),
    ]:
        tests+=env.BPLTest(*test)
else:
    for test in [
        ('polymorphism2_auto_ptr',),
        ('auto_ptr',),
    ]:
        tests+=env.BPLTest(*test)


test = env.BoostRunPythonScript('test_builtin_converters.py')
Depends(
    test,
    env.PythonExtension('builtin_converters_ext', ['test_builtin_converters.cpp'])
    )
tests+=test
test = env.BoostRunPythonScript('map_indexing_suite.py')
Depends(
    test,
    env.PythonExtension('map_indexing_suite_ext', [
        'map_indexing_suite.cpp',
        'int_map_indexing_suite.cpp',
        'a_map_indexing_suite.cpp'])
    )
tests+=test

tests+=env.BoostRunTest('import_', 'import_.cpp', '${SOURCES[0]} ${SOURCES[1]}', 'import_.py', LIBS=ELIBS)

tests+=env.BoostCompileTest('indirect_traits_test')
tests+=env.BoostRunTests(['destroy_test',
                          'pointer_type_id_test',
                          'bases',
                          'if_else',
                          'pointee',
                          'result'], LIBS=ELIBS)

tests+=env.BoostCompileTests(['string_literal',
                              'borrowed',
                              'object_manager',
                              'copy_ctor_mutates_rhs'])

tests+=env.BoostRunTest('upcast', LIBS=ELIBS)
tests+=env.BoostCompileTest('select_holder')
tests+=env.BoostRunTest('select_from_python_test', LIBS=ELIBS)
tests+=env.BoostCompileTest('select_arg_to_python_test')

if platform.system() == 'Windows':
    tests+=env.BPLTest('calling_conventions')
    tests+=env.BPLTest('calling_conventions_mf')

if env['NUMPY']:
    numpy_env = env.Clone()
    numpy_env.BoostUseLib('numpy')
    for test in [('numpy/dtype',),
                 ('numpy/ufunc',),
                 ('numpy/templates',),
                 ('numpy/ndarray',),
                 ('numpy/indexing',),
                 ('numpy/shapes',),]:
        tests+=numpy_env.BPLTest(*test)


env.BoostTestSummary(tests)
AlwaysBuild(tests)
