#!/usr/bin/python

# Copyright (C) Pedro Ferreira 2003. Permission to copy, use, modify, sell and
# distribute this software is granted provided this copyright notice appears in
# all copies. This software is provided "as is" without express or implied
# warranty, and with no claim as to its suitability for any purpose.

import BoostBuild


################################################################################
#
# test_folder_with_dot_in_name()
# ------------------------------
#
################################################################################

def test_folder_with_dot_in_name(t):
    """ Regression test: the 'tag' feature did not work in directories that had
    a dot in their name.
    """

    t.write("version-1.32.0/jamroot.jam", """
project test : requirements <tag>@$(__name__).tag ;

rule tag ( name : type ? : property-set )
{
   # Do nothing, just make sure the rule is invoked OK.
   ECHO "The tag rule has been invoked." ;
}
exe a : a.cpp ;
""")
    t.write("version-1.32.0/a.cpp", "int main() {}\n")

    t.run_build_system(subdir="version-1.32.0")
    t.expect_addition("version-1.32.0/bin/$toolset/debug/a.exe")
    t.expect_output_line("The tag rule has been invoked.")


################################################################################
#
# test_tag_property()
# -------------------
#
################################################################################

def test_tag_property(t):
    """Basic tag property test.
    """

    t.write("jamroot.jam", """
import virtual-target ;

rule tag ( name : type ? : property-set )
{
    local tags ;
    switch [ $(property-set).get <variant> ]
    {
        case debug   : tags += d ;
        case release : tags += r ;
    }
    switch [ $(property-set).get <link> ]
    {
        case shared : tags += s ;
        case static : tags += t ;
    }
    if $(tags)
    {
        return [ virtual-target.add-prefix-and-suffix $(name)_$(tags:J="")
            : $(type) : $(property-set) ] ;
    }
}

# Test both fully-qualified and local name of the rule
exe a : a.cpp : <tag>@$(__name__).tag ;
lib b : a.cpp : <tag>@tag ;
stage c : a ;
""")

    t.write("a.cpp", """
int main() {}
#ifdef _MSC_VER
__declspec (dllexport) void x () {}
#endif
""")

    file_list = \
        BoostBuild.List("bin/$toolset/debug/a_ds.exe") + \
        BoostBuild.List("bin/$toolset/debug/b_ds.dll") + \
        BoostBuild.List("c/a_ds.exe") + \
        BoostBuild.List("bin/$toolset/release/a_rs.exe") + \
        BoostBuild.List("bin/$toolset/release/b_rs.dll") + \
        BoostBuild.List("c/a_rs.exe") + \
        BoostBuild.List("bin/$toolset/debug/link-static/a_dt.exe") + \
        BoostBuild.List("bin/$toolset/debug/link-static/b_dt.lib") + \
        BoostBuild.List("c/a_dt.exe") + \
        BoostBuild.List("bin/$toolset/release/link-static/a_rt.exe") + \
        BoostBuild.List("bin/$toolset/release/link-static/b_rt.lib") + \
        BoostBuild.List("c/a_rt.exe")

    variants = "debug release link=static,shared"

    t.run_build_system(variants)
    t.expect_addition(file_list)

    t.run_build_system(variants + " clean")
    t.expect_removal(file_list)


################################################################################
#
# main()
# ------
#
################################################################################

t = BoostBuild.Tester()

test_tag_property(t)
test_folder_with_dot_in_name(t)

t.cleanup()
