#==============================================================================
#   Copyright (c) 2002 Joel de Guzman
#   Copyright (c) 2003-2004 Martin Wille
#   http://spirit.sourceforge.net/
#
#   Use, modification and distribution is subject to 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)
#==============================================================================
#
#  Spirit regression test boost-jam file
#  Joel de Guzman [Sept 27, 2002]
#



# VP, 2005/04/14: Inside boost, we inherit proper <include>
# from Jamroot.
# Not sure about standalone Spirit.
# SPIRIT_HEADER_INCLUDE ?= ../../.. ;
# spirit-header-include = <include>$(SPIRIT_HEADER_INCLUDE) ;

rule spirit-run ( sources + : args * : input-files * : requirements * : name ? : default-build * )
{
    name ?= $(sources[1]:D=:S=) ;
    return  
       [ run $(sources) : $(args) : $(input-files) : $(requirements) : $(name)
        : $(default-build) ]
       [ run $(sources) : $(args) : $(input-files) : $(requirements)
          <define>BOOST_SPIRIT_DEBUG=1 : $(name)_debug
        : $(default-build) ]
        ;
}

############################################################

local opt = <toolset>vc-7.0:<optimization>speed
            <toolset>vc-7.0:<inlining>on
            <toolset>cw:<optimization>speed ;

local opt-metrowerks = <toolset>cw:<optimization>speed ;


# VP, 2005/04/14: MT is not available with Como, but this is
# not handled yet.
local multi-threading = <library>/boost/thread//boost_thread 
                        <threading>multi <define>BOOST_ALL_NO_LIB=1 ;

    test-suite "spirit.classic.core.kernel"
        : [ spirit-run match_tests.cpp ]
          [ spirit-run post_skips.cpp ]
        ;

    test-suite "spirit.classic.core.scanner"
        : [ spirit-run scanner_tests.cpp ]
          [ spirit-run scanner_value_type_tests.cpp ]
        ;

    test-suite "spirit.classic.core.primitive"
        : [ spirit-run primitives_tests.cpp ]
          [ spirit-run char_strings_test.cpp ]
          [ compile-fail char_strings_test_fail.cpp ]
          [ spirit-run numerics_tests.cpp : : : $(opt) ]
          [ spirit-run custom_real_parser.cpp ]
        ;

    test-suite "spirit.classic.core.composite"
        : [ spirit-run epsilon_tests.cpp ]
          [ spirit-run negated_eps_p_test.cpp ]
          [ spirit-run operators_tests.cpp ]
          [ spirit-run directives_tests.cpp ]
          [ spirit-run shortest_alternative_tests.cpp ]
        ;

    test-suite "spirit.classic.core.non_terminal"
        : [ spirit-run rule_tests.cpp ]
          [ spirit-run owi_st_tests.cpp ]
          [ spirit-run grammar_tests.cpp : : : $(opt-metrowerks) ]
          [ spirit-run grammar_multi_instance_tst.cpp : : : $(opt-metrowerks) ]
          [ spirit-run subrule_tests.cpp ]
          [        run owi_mt_tests.cpp : : : $(multi-threading) ]
          [        run grammar_mt_tests.cpp : : : $(multi-threading) ]
          [ spirit-run parser_context_test.cpp ]
        ;

    # traverse_tests defines SPIRIT_DEBUG, don't run the tests twice
    test-suite "spirit.classic.meta"
        : [ spirit-run fundamental_tests.cpp ]
          [ spirit-run parser_traits_tests.cpp ]
          [ spirit-run traverse_tests.cpp : : : <toolset>intel:<debug-symbols>off ]
        ;

    test-suite "spirit.classic.attribute"
        : [ spirit-run closure_tests.cpp : : : $(opt-metrowerks) ]
          [        run bug_000008.cpp : : : $(multi-threading) ]
          [ spirit-run parametric_tests.cpp ]
        ;

    test-suite "spirit.classic.error_handling"
        : [ spirit-run exception_tests.cpp ]
        ;

    test-suite "spirit.classic.tree"
        : [ spirit-run ast_calc_tests.cpp ]
          [ spirit-run group_match_bug.cpp ]
          [ spirit-run repeat_ast_tests.cpp ]
          [ spirit-run tree_to_xml.cpp ]
          [ compile mix_and_match_trees.cpp ]
        ;

# temporarily removed from the test suite. tree_tests are not finished, yet.
#         [ spirit-run tree_tests.cpp ]

    test-suite "spirit.classic.dynamic"
        : [ compile if_p_as_parser_tests.cpp ]
          [ compile while_p_as_parser_tests.cpp ]
          [ compile for_p_as_parser_tests.cpp ]
          [ spirit-run if_tests.cpp ]
          [ spirit-run if_p_int_as_condition_test.cpp ]
          [ spirit-run for_tests.cpp ]
          [ spirit-run while_tests.cpp ]
          [ spirit-run lazy_tests.cpp ]
          [ spirit-run switch_tests_eps_default.cpp ]
          [ spirit-run switch_tests_general_def.cpp ]
          [ spirit-run switch_tests_wo_default.cpp ]
          [ spirit-run switch_tests_single.cpp ]
          [ spirit-run switch_problem.cpp ]
          [ spirit-run select_p_with_rule.cpp ]
        ;

    test-suite "spirit.classic.utility.parsers"
        : [ spirit-run chset_tests.cpp ]
          [ spirit-run confix_tests.cpp ]
          [ spirit-run loops_tests.cpp ]
          [ spirit-run symbols_tests.cpp ]
          [ spirit-run symbols_add_null.cpp ]
          [ spirit-run symbols_find_null.cpp ]
          [ spirit-run escape_char_parser_tests.cpp : : : $(opt) ]
          [ spirit-run distinct_tests.cpp ]
          [ spirit-run grammar_def_test.cpp ]
        ;

    test-suite "spirit.classic.utility.support"
        # This test doesn't actually use multiple threads
        : [ spirit-run scoped_lock_tests.cpp : : : $(multi-threading) ]
        ;

    test-suite "spirit.classic.iterator"
        : [ spirit-run fixed_size_queue_tests.cpp ]
          [ compile-fail fixed_size_queue_fail_tests.cpp ]
          [ spirit-run file_iterator_tests.cpp ]
          [ spirit-run multi_pass_tests.cpp : : : $(opt-metrowerks) ]
          [ spirit-run sf_bug_720917.cpp : : : $(opt-metrowerks) ]
          [ spirit-run position_iterator_tests.cpp : : : $(opt-metrowerks) ]
          [ compile multi_pass_compile_tests.cpp ]
        ;

    test-suite "spirit.classic.small_bug_fixes"
        : [ spirit-run bug_fixes.cpp ]
        ;

    actor_test_sources =
        action_tests
        assign_test
        assign_key_test
        clear_test
        decrement_test
        erase_at_test
        increment_test
        insert_key_test
        insert_at_test
        push_back_test
        push_front_test
        swap_test
        ;

    test-suite "spirit.classic.utility.actors"
        : [ spirit-run actor/$(actor_test_sources).cpp ]
        ;

    test-suite "spirit.classic.typeof-support"
        : [ compile typeof_support/typeof_actor.cpp ]
          [ compile typeof_support/typeof_attribute.cpp ]
          [ compile typeof_support/typeof_core.cpp ]
          [ compile typeof_support/typeof_debug.cpp ]
          [ compile typeof_support/typeof_dynamic.cpp ]
          [ compile typeof_support/typeof_error_handling.cpp ]
          [ compile typeof_support/typeof_iterator.cpp ]
          [ compile typeof_support/typeof_symbols.cpp ]
          [ compile typeof_support/typeof_tree.cpp ]
          [ compile typeof_support/typeof_utility.cpp ]
        ; 


