#~ 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 ;

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
                                          ;

test-suite preprocessor
   :   
        [ compile arithmetic.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile array.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile comparison.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile control.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile debug.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile facilities.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile iteration.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile list.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile logical.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile punctuation.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile repetition.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile selection.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile seq.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile slot.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile tuple.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
        [ compile variadic.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
  ;

test-suite 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 tuple.cpp : <define>BOOST_PP_VARIADICS=0 : tuple_nvm ]
  ;

test-suite preprocessor_c
   :   
        [ compile arithmetic.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : arithmetic_c 
        ]
        [ compile array.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : array_c 
        ]
        [ compile comparison.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : comparison_c 
        ]
        [ compile control.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : control_c 
        ]
        [ compile debug.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : debug_c 
        ]
        [ compile facilities.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : facilities_c 
        ]
        [ compile list.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : list_c 
        ]
        [ compile logical.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : logical_c 
        ]
        [ compile punctuation.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : punctuation_c 
        ]
        [ compile selection.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : selection_c 
        ]
        [ compile seq.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : seq_c 
        ]
        [ compile slot.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : slot_c 
        ]
        [ compile tuple.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : tuple_c 
        ]
        [ compile variadic.c 
          : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : variadic_c 
        ]
  ;

test-suite preprocessor_c_nvm
   :   
        [ compile arithmetic.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : arithmetic_c_nvm 
        ]
        [ compile array.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : array_c_nvm 
        ]
        [ compile comparison.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : comparison_c_nvm 
        ]
        [ compile control.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : control_c_nvm 
        ]
        [ compile debug.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : debug_c_nvm 
        ]
        [ compile facilities.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : facilities_c_nvm 
        ]
        [ compile list.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : list_c_nvm 
        ]
        [ compile logical.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : logical_c_nvm 
        ]
        [ compile selection.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : selection_c_nvm 
        ]
        [ compile seq.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : seq_c_nvm 
        ]
        [ compile slot.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : slot_c_nvm 
        ]
        [ compile tuple.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : tuple_c_nvm 
        ]
  ;
  
test-suite preprocessor_isempty
  :   
       [ compile isempty.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
       [ compile-fail isempty_variadic_standard_failure.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
       [ compile-fail isempty_variadic_standard_failure2.cpp : <toolset>gcc:<cxxflags>-std=c++0x <toolset>clang:<cxxflags>-std=c++0x ]
 ; 
  
test-suite preprocessor_isempty_nvm
   :   
        [ compile isempty.cpp : <define>BOOST_PP_VARIADICS=0 : isempty_nvm ]
  ;
  
test-suite preprocessor_isempty_c
  :   
       [ compile isempty.c 
         : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
         : isempty_c 
       ]
       [ compile-fail isempty_variadic_standard_failure.c 
         : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
         : isempty_variadic_standard_failure_c 
       ]
       [ compile-fail isempty_variadic_standard_failure2.c 
         : <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
         : isempty_variadic_standard_failure2_c 
       ]
 ;
  
test-suite preprocessor_isempty_c_nvm
   :   
        [ compile isempty.c 
          : <define>BOOST_PP_VARIADICS=0
            <toolset>gcc:<cflags>-std=c99 <toolset>clang:<cflags>-std=c99
          : isempty_c_nvm 
        ]
  ;