#~ Copyright Rene Rivera 2008
#~ 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 testing ;
import cast ;

project preprocessor_tests : requirements <warnings>on
                                          <toolset>gcc-4.3.0:<warnings>all
                                          <toolset>gcc-4.3.0:<cxxflags>-Wno-variadic-macros
                                          <toolset>gcc-4.4.0:<warnings>all
                                          <toolset>gcc-4.4.0:<cxxflags>-Wno-variadic-macros 
                                          <toolset>gcc-4.5.0:<warnings>all
                                          <toolset>gcc-4.5.0:<cxxflags>-Wno-variadic-macros
                                          <toolset>gcc-4.5.0:<linkflags>"-Wl,--enable-auto-import"
                                          <toolset>gcc-4.5.2:<warnings>all
                                          <toolset>gcc-4.5.2:<cxxflags>-Wno-variadic-macros
                                          <toolset>msvc:<warnings>all
                                          ;

alias preprocessor : : 
        <toolset>gcc
        <toolset-gcc:version>3.4
    ;

alias preprocessor : : 
        <toolset>gcc
        <toolset-gcc:version>4.1
    ;

alias preprocessor : : 
        <toolset>gcc
        <toolset-gcc:version>4.2
    ;

alias preprocessor
   :   
        [ compile arithmetic.cpp ]
        [ compile array.cpp ]
        [ compile comparison.cpp ]
        [ compile control.cpp ]
        [ compile debug.cpp ]
        [ compile facilities.cpp ]
        [ compile iteration.cpp ]
        [ compile list.cpp ]
        [ compile logical.cpp ]
        [ compile punctuation.cpp ]
        [ compile repetition.cpp ]
        [ compile selection.cpp ]
        [ compile seq.cpp ]
        [ compile slot.cpp ]
        [ compile stringize.cpp ]
        [ compile tuple.cpp ]
        [ compile variadic.cpp ]
  ;

alias preprocessor_nvm
   :   
        [ compile arithmetic.cpp : <define>BOOST_PP_VARIADICS=0 : arithmetic_nvm ]
        [ compile array.cpp : <define>BOOST_PP_VARIADICS=0 : array_nvm ]
        [ compile comparison.cpp : <define>BOOST_PP_VARIADICS=0 : comparison_nvm ]
        [ compile control.cpp : <define>BOOST_PP_VARIADICS=0 : control_nvm ]
        [ compile debug.cpp : <define>BOOST_PP_VARIADICS=0 : debug_nvm ]
        [ compile facilities.cpp : <define>BOOST_PP_VARIADICS=0 : facilities_nvm ]
        [ compile iteration.cpp : <define>BOOST_PP_VARIADICS=0 : iteration_nvm ]
        [ compile list.cpp : <define>BOOST_PP_VARIADICS=0 : list_nvm ]
        [ compile logical.cpp : <define>BOOST_PP_VARIADICS=0 : logical_nvm ]
        [ compile repetition.cpp : <define>BOOST_PP_VARIADICS=0 : repetition_nvm ]
        [ compile selection.cpp : <define>BOOST_PP_VARIADICS=0 : selection_nvm ]
        [ compile seq.cpp : <define>BOOST_PP_VARIADICS=0 : seq_nvm ]
        [ compile slot.cpp : <define>BOOST_PP_VARIADICS=0 : slot_nvm ]
        [ compile stringize.cpp : <define>BOOST_PP_VARIADICS=0 : stringize_nvm ]
        [ compile tuple.cpp : <define>BOOST_PP_VARIADICS=0 : tuple_nvm ]
  ;

alias preprocessor_number_512
   :   
        [ compile arithmetic.cpp : <define>BOOST_PP_LIMIT_MAG=512 : arithmetic_num ]
        [ compile array.cpp : <define>BOOST_PP_LIMIT_MAG=512 : array_num ]
        [ compile comparison.cpp : <define>BOOST_PP_LIMIT_MAG=512 : comparison_num ]
        [ compile control.cpp : <define>BOOST_PP_LIMIT_MAG=512 : control_num ]
        [ compile debug.cpp : <define>BOOST_PP_LIMIT_MAG=512 : debug_num ]
        [ compile facilities.cpp : <define>BOOST_PP_LIMIT_MAG=512 : facilities_num ]
        [ compile iteration.cpp : <define>BOOST_PP_LIMIT_MAG=512 : iteration_num ]
        [ compile list.cpp : <define>BOOST_PP_LIMIT_MAG=512 : list_num ]
        [ compile logical.cpp : <define>BOOST_PP_LIMIT_MAG=512 : logical_num ]
        [ compile repetition.cpp : <define>BOOST_PP_LIMIT_MAG=512 : repetition_num ]
        [ compile selection.cpp : <define>BOOST_PP_LIMIT_MAG=512 : selection_num ]
        [ compile seq.cpp : <define>BOOST_PP_LIMIT_MAG=512 : seq_num ]
        [ compile slot.cpp : <define>BOOST_PP_LIMIT_MAG=512 : slot_num ]
        [ compile stringize.cpp : <define>BOOST_PP_LIMIT_MAG=512 : stringize_num ]
        [ compile tuple.cpp : <define>BOOST_PP_LIMIT_MAG=512 : tuple_num ]
        [ compile variadic.cpp : <define>BOOST_PP_LIMIT_MAG=512 : variadic_num ]

  ;

alias preprocessor_v_128
   :   
        [ compile array.cpp : <define>BOOST_PP_LIMIT_TUPLE=128 : array_v_128 ]
        [ compile tuple.cpp : <define>BOOST_PP_LIMIT_TUPLE=128 : tuple_v_128 ]
        [ compile variadic.cpp : <define>BOOST_PP_LIMIT_VARIADIC=128 : variadic_v_128 ]
  ;

alias preprocessor_v_256
   :   
        [ compile array.cpp : <define>BOOST_PP_LIMIT_TUPLE=256 : array_v_256 ]
        [ compile tuple.cpp : <define>BOOST_PP_LIMIT_TUPLE=256 : tuple_v_256 ]
        [ compile variadic.cpp : <define>BOOST_PP_LIMIT_VARIADIC=256 : variadic_v_256 ]
  ;
  
alias preprocessor_v_128_c
   :   
        [ compile array.c : <define>BOOST_PP_LIMIT_TUPLE=128 : array_v_128_c ]
        [ compile tuple.c : <define>BOOST_PP_LIMIT_TUPLE=128 : tuple_v_128_c ]
        [ compile variadic.c : <define>BOOST_PP_LIMIT_VARIADIC=128 : variadic_v_128_c ]
  ;

alias preprocessor_v_256_c
   :   
        [ compile array.c : <define>BOOST_PP_LIMIT_TUPLE=256 : array_v_256_c ]
        [ compile tuple.c : <define>BOOST_PP_LIMIT_TUPLE=256 : tuple_v_256_c ]
        [ compile variadic.c : <define>BOOST_PP_LIMIT_VARIADIC=256 : variadic_v_256_c ]
  ;
  
alias preprocessor_number_nvm_512
   :   
        [ compile arithmetic.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : arithmetic_nvm_num ]
        [ compile array.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : array_nvm_num ]
        [ compile comparison.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : comparison_nvm_num ]
        [ compile control.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : control_nvm_num ]
        [ compile debug.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : debug_nvm_num ]
        [ compile facilities.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : facilities_nvm_num ]
        [ compile iteration.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : iteration_nvm_num ]
        [ compile list.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : list_nvm_num ]
        [ compile logical.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : logical_nvm_num ]
        [ compile repetition.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : repetition_nvm_num ]
        [ compile selection.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : selection_nvm_num ]
        [ compile seq.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : seq_nvm_num ]
        [ compile slot.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : slot_nvm_num ]
        [ compile stringize.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : stringize_nvm_num ]
        [ compile tuple.cpp : <define>BOOST_PP_LIMIT_MAG=512 <define>BOOST_PP_VARIADICS=0 : tuple_nvm_num ]
  ;

alias preprocessor_c
   :   
        [ compile arithmetic.c 
          : 
          : arithmetic_c 
        ]
        [ compile array.c 
          : 
          : array_c 
        ]
        [ compile comparison.c 
          : 
          : comparison_c 
        ]
        [ compile control.c 
          : 
          : control_c 
        ]
        [ compile debug.c 
          : 
          : debug_c 
        ]
        [ compile facilities.c 
          : 
          : facilities_c 
        ]
        [ compile list.c 
          : 
          : list_c 
        ]
        [ compile logical.c 
          : 
          : logical_c 
        ]
        [ compile punctuation.c 
          : 
          : punctuation_c 
        ]
        [ compile selection.c 
          : 
          : selection_c 
        ]
        [ compile seq.c 
          : 
          : seq_c 
        ]
        [ compile slot.c 
          : 
          : slot_c 
        ]
        [ compile stringize.c 
          : 
          : stringize_c 
        ]
        [ compile tuple.c 
          : 
          : tuple_c 
        ]
        [ compile variadic.c 
          : 
          : variadic_c 
        ]
  ;

alias preprocessor_c_number_512
   :   
        [ compile arithmetic.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : arithmetic_c_num
        ]
        [ compile array.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : array_c_num 
        ]
        [ compile comparison.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : comparison_c_num 
        ]
        [ compile control.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : control_c_num 
        ]
        [ compile debug.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : debug_c_num 
        ]
        [ compile facilities.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : facilities_c_num 
        ]
        [ compile list.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : list_c_num 
        ]
        [ compile logical.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : logical_c_num 
        ]
        [ compile punctuation.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : punctuation_c_num 
        ]
        [ compile selection.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : selection_c_num 
        ]
        [ compile seq.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : seq_c_num 
        ]
        [ compile slot.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : slot_c_num 
        ]
        [ compile stringize.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : stringize_c_num 
        ]
        [ compile tuple.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : tuple_c_num 
        ]
        [ compile variadic.c 
          : <define>BOOST_PP_LIMIT_MAG=512
          : variadic_c_num 
        ]
  ;

alias preprocessor_c_nvm
   :   
        [ compile arithmetic.c 
          : <define>BOOST_PP_VARIADICS=0            
          : arithmetic_c_nvm 
        ]
        [ compile array.c 
          : <define>BOOST_PP_VARIADICS=0            
          : array_c_nvm 
        ]
        [ compile comparison.c 
          : <define>BOOST_PP_VARIADICS=0
          : comparison_c_nvm 
        ]
        [ compile control.c 
          : <define>BOOST_PP_VARIADICS=0
          : control_c_nvm 
        ]
        [ compile debug.c 
          : <define>BOOST_PP_VARIADICS=0
          : debug_c_nvm 
        ]
        [ compile facilities.c 
          : <define>BOOST_PP_VARIADICS=0
          : facilities_c_nvm 
        ]
        [ compile list.c 
          : <define>BOOST_PP_VARIADICS=0
          : list_c_nvm 
        ]
        [ compile logical.c 
          : <define>BOOST_PP_VARIADICS=0
          : logical_c_nvm 
        ]
        [ compile selection.c 
          : <define>BOOST_PP_VARIADICS=0
          : selection_c_nvm 
        ]
        [ compile seq.c 
          : <define>BOOST_PP_VARIADICS=0
          : seq_c_nvm 
        ]
        [ compile slot.c 
          : <define>BOOST_PP_VARIADICS=0
          : slot_c_nvm 
        ]
        [ compile stringize.c 
          : <define>BOOST_PP_VARIADICS=0
          : stringize_c_nvm 
        ]
        [ compile tuple.c 
          : <define>BOOST_PP_VARIADICS=0
          : tuple_c_nvm 
        ]
  ;

alias preprocessor_c_nvm_num
   :   
        [ compile arithmetic.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : arithmetic_c_nvm_num 
        ]
        [ compile array.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : array_c_nvm_num 
        ]
        [ compile comparison.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : comparison_c_nvm_num 
        ]
        [ compile control.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : control_c_nvm_num 
        ]
        [ compile debug.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : debug_c_nvm_num 
        ]
        [ compile facilities.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : facilities_c_nvm_num 
        ]
        [ compile list.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : list_c_nvm_num 
        ]
        [ compile logical.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : logical_c_nvm_num 
        ]
        [ compile selection.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : selection_c_nvm_num 
        ]
        [ compile seq.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : seq_c_nvm_num 
        ]
        [ compile slot.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : slot_c_nvm_num 
        ]
        [ compile stringize.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : stringize_c_nvm_num 
        ]
        [ compile tuple.c 
          : <define>BOOST_PP_VARIADICS=0
            <define>BOOST_PP_LIMIT_MAG=512
          : tuple_c_nvm_num 
        ]
  ;

alias preprocessor_isempty : : 
        <toolset>gcc
        <toolset-gcc:version>3.4
    ;

alias preprocessor_isempty : : 
        <toolset>gcc
        <toolset-gcc:version>4.1
    ;

alias preprocessor_isempty : : 
        <toolset>gcc
        <toolset-gcc:version>4.2
    ;

alias preprocessor_isempty
  :   
       [ compile isempty.cpp ]
       [ compile checkempty.cpp ]
       [ compile-fail isempty_variadic_standard_failure.cpp : <define>BOOST_PP_VARIADICS=1 ]
       [ compile-fail isempty_variadic_standard_failure2.cpp : <define>BOOST_PP_VARIADICS=1 ]
       [ compile vaopt.cpp ]
 ; 

alias preprocessor_isempty_nvm
   :   
       [ compile isempty.cpp : <define>BOOST_PP_VARIADICS=0 : isempty_nvm ]
  ;

alias preprocessor_isempty_c
  :   
       [ compile isempty.c 
         : 
         : isempty_c 
       ]
       [ compile-fail isempty_variadic_standard_failure.c 
         : <define>BOOST_PP_VARIADICS=1
         : isempty_variadic_standard_failure_c 
       ]
       [ compile-fail isempty_variadic_standard_failure2.c 
         : <define>BOOST_PP_VARIADICS=1
         : isempty_variadic_standard_failure2_c 
       ]
 ;

alias preprocessor_isempty_c_nvm
   :   
        [ compile isempty.c 
          : <define>BOOST_PP_VARIADICS=0
          : isempty_c_nvm 
        ]
  ;

alias preprocessor_config
   :   
        [ run config_info.cpp ]
  ;

alias test_clang_cuda
   :   
        [ compile [ cast _ cpp : clang_cuda.cu ]
          : <cxxflags>-nocudalib
            <cxxflags>-nocudainc
            <cxxflags>"-x cuda"
          : clang_cuda_cu
        ]
  ;

explicit test_clang_cuda ;

alias test_iso
   :   
        [ run cpp_standard.cpp ]
  ;

explicit test_iso ;

explicit compile quick.cpp ; # "Quick" test (for CI)
