# Boost serialization Library utility test Jamfile

#  (C) Copyright Robert Ramey 2002-2004.
#  Use, modification, and distribution are 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)
#

# the file contains Jam rules which are used in both the normal
# boost test, as well as the performance test and comprehensive
# tests.

BOOST_ARCHIVE_LIST = [ modules.peek : BOOST_ARCHIVE_LIST ] ;

# these are used to shorten testing while in development.  It permits
# testing to be applied to just a particular type of archive
if ! $(BOOST_ARCHIVE_LIST) {
    BOOST_ARCHIVE_LIST = 
        "text_archive.hpp" 
        "text_warchive.hpp" 
        "binary_archive.hpp" 
        "xml_archive.hpp" 
        "xml_warchive.hpp" 
    ;
    # enable the tests which don't depend on a particular archive
    BOOST_SERIALIZATION_TEST = true ;
}

rule run-template ( test-name : sources * : requirements * ) {
    return [
        run
            $(sources)
        : # command
        : # input files
        : # requirements
            # toolset warnings
            # <toolset>gcc:<cxxflags>"-Wno-non-virtual-dtor -Wno-ctor-dtor-privacy"
            <toolset>borland:<cxxflags>"-w-8080 -w-8071 -w-8057 -w-8062 -w-8008 -w-0018 -w-8066"
            <toolset>gcc:<warnings>all # ?
            <toolset>gcc:<cxxflags>"-Wno-long-long"
            <toolset>msvc:<warnings>all # == /W4
            <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS
            <toolset>msvc:<define>_SCL_SECURE_NO_DEPRECATE
            <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS
            <toolset>msvc:<define>_CRT_SECURE_NO_DEPRECATE
            <toolset>msvc:<cxxflags>"-wd4996"
            # toolset optimizations
            <toolset>gcc:<cxxflags>"-ftemplate-depth-255"
            <toolset>msvc:<cxxflags>"-Gy"
            $(requirements)
        : # test name
            $(test-name)
    ] ;
}

# Given a name of test, return the 'save' test that must be run
# before the named test, or empty string if there's no such test.
rule dependency-save-test ( test )
{
    local m = [ MATCH (.*)load(.*) : $(test) ] ;
    if $(m)
    {
        return $(m[1])save$(m[2]) ;
    }  
}

# each of the following tests is run with each type of archive
rule run-invoke ( test-name : sources * : requirements * )
{
    local save-test = [ dependency-save-test $(test-name) ] ;

    local tests ;
    tests += [ 
        run-template $(test-name)
        : # sources
            $(sources)
            ../build//boost_serialization
        : # requirements
            $(requirements)
            <define>BOOST_LIB_DIAGNOSTIC=1
            <dependency>$(save-test)
    ] ;
    return $(tests) ;
}

# each of the following tests is run with each type of archive
rule run-winvoke ( test-name : sources * : requirements * )
{
    local save-test = [ dependency-save-test $(test-name) ] ;

    local tests ;
    tests += [ 
        run-template $(test-name)
        : # sources
            $(sources)
            ../build//boost_serialization
            ../build//boost_wserialization
        : # requirements
            $(requirements)
            <define>BOOST_LIB_DIAGNOSTIC=1
            # both stlport and msvc6 define iswspace
            <toolset>msvc,<stdlib>stlport:<linkflags>"-force:multiple"
            <dependency>$(save-test)
            <dependency>../../config/test/all//BOOST_NO_STD_WSTREAMBUF
    ] ;
    return $(tests) ;
}

# for tests which don't use library code - usually just headers
rule test-bsl-run-no-lib  ( test-name : sources * : requirements * )
{
    local tests ;
    tests += [ 
        run-template $(test-name)
        : # sources
            $(test-name).cpp $(sources).cpp
        :
            $(requirements)
    ] ;
    return $(tests) ;
}

# for tests which are run just once rather than for every archive
rule test-bsl-run ( test-name : sources * : libs * : requirements * )
{
    local tests ;
    tests +=  [ 
        run-invoke $(test-name) 
        : # sources
            $(test-name).cpp $(sources).cpp $(libs)
        :
            $(requirements)
    ] ;
    return $(tests) ;
}

rule test-bsl-run_archive ( test-name : archive-name : sources * : libs * : requirements * ) {
    local tests ;
    switch $(archive-name) {
    case "*_warchive" :
        tests +=  [
            run-winvoke $(test-name)_$(archive-name)
            : 
                $(sources).cpp $(libs)
            :
                <define>BOOST_ARCHIVE_TEST=$(archive-name).hpp
                $(requirements)
        ] ;
    case "*" :
        tests +=  [
            run-invoke $(test-name)_$(archive-name)
            : 
                $(sources).cpp $(libs)
            : 
                <define>BOOST_ARCHIVE_TEST=$(archive-name).hpp
                $(requirements)
        ] ;
    }
    return $(tests) ;
}

rule test-bsl-run_files ( test-name : sources * : libs * : requirements * ) {
    local tests ;
    for local defn in $(BOOST_ARCHIVE_LIST) {
        tests += [ 
            test-bsl-run_archive $(test-name) 
            : $(defn:LB) 
            : $(test-name) $(sources) 
            : $(libs)
            : $(requirements)
        ] ;
    }
    return $(tests) ;
}
    
rule test-bsl-run_polymorphic_archive ( test-name : sources * ) {
    local tests ;
    for local defn in $(BOOST_ARCHIVE_LIST) {
        tests += [ 
            test-bsl-run_archive $(test-name)
            : polymorphic_$(defn:LB)  
            : $(test-name) $(sources)
        ] ;
    }
    return $(tests) ;
}


