#!/usr/bin/python

# Copyright 2002-2005 Dave Abrahams.
# Copyright 2002-2006 Vladimir Prus.
# 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 os
import sys
import string
import BoostBuild

xml = "--xml" in sys.argv
toolset = BoostBuild.get_toolset()


# Clear environment for testing.
#
for s in ('BOOST_ROOT', 'BOOST_BUILD_PATH', 'JAM_TOOLSET', 'BCCROOT', 'MSVCDir',
    'MSVC', 'MSVCNT', 'MINGW', 'watcom' ):
    try:
        del os.environ[s]
    except:
        pass

BoostBuild.set_defer_annotations(1)


def run_tests(critical_tests, other_tests):
    """Runs first critical tests and then other_tests.

       Stops on first error, and write the name of failed test to
       test_results.txt. Critical tests are run in the specified order, other
       tests are run starting with the one that failed the last time.
    """
    last_failed = last_failed_test()
    other_tests = reorder_tests(other_tests, last_failed)
    all_tests = critical_tests + other_tests

    invocation_dir = os.getcwd()

    pass_count = 0
    failures_count = 0

    for i in all_tests:
        passed = 1
        if not xml:
            print ("%-25s : " %(i)),
        try:
            __import__(i)
        except SystemExit:
            passed = 0;
            if failures_count == 0:
                f = open(os.path.join(invocation_dir, 'test_results.txt'), 'w')
                f.write(i)
                f.close()
            failures_count = failures_count + 1
            # Restore the current directory, which might be changed by the test.
            os.chdir(invocation_dir)

        if not xml:
            if passed:
                print "PASSED"
            else:
                print "FAILED"
        else:
            rs = "succeed"
            if not passed:
                rs = "fail"
            print """
<test-log library="build" test-name="%s" test-type="run" toolset="%s" test-program="%s" target-directory="%s">
<run result="%s">""" % (i, toolset, "tools/build/v2/test/" + i + ".py",
                        "boost/bin.v2/boost.build.tests/" + toolset + "/" + i, rs)

            if not passed:
                BoostBuild.flush_annotations(1)

            print """
</run>
</test-log>
"""
        if passed:
            pass_count = pass_count + 1
        sys.stdout.flush()  # Makes testing under emacs more entertaining.

    # Erase the file on success.
    if failures_count == 0:
        open('test_results.txt', 'w')

    if not xml:
        print """
        === Test summary ===
        PASS: %d
        FAIL: %d
        """ % (pass_count, failures_count)


def last_failed_test():
    "Returns the name of last failed test or None"
    try:
        f = open("test_results.txt")
        s = string.strip(f.read())
        return s
    except:
        return None


def reorder_tests(tests, first_test):
    try:
        n = tests.index(first_test)
        return [first_test] + tests[:n] + tests[n+1:]
    except ValueError:
        return tests


critical_tests = ["unit_tests", "module_actions", "startup_v1", "startup_v2"]

critical_tests += ["core_d12", "core_typecheck", "core_delete_module",
                   "core_varnames", "core_import_module"]

tests = [ "absolute_sources",
          "alias",
          "alternatives",
          "bad_dirname",
          "build_dir",
          "build_file",
          "build_no",
          "c_file",
          "chain",
          "clean",
          "composite",
          "conditionals",
          "conditionals2",
          "conditionals3",
          "conditionals_multiple",
          "configuration",
          "copy_time",
          "custom_generator",
          "default_build",
          "default_features",
# This test is known to be broken itself.
#          "default_toolset",
          "dependency_property",
          "dependency_test",
          "disambiguation",
          "dll_path",
          "double_loading",
          "duplicate",
          "example_libraries",
          "example_make",
          "expansion",
          "explicit",
          "file_name_handling",
          "free_features_request",
          "generator_selection",
          "generators_test",
          "implicit_dependency",
          "indirect_conditional",
          "inherit_toolset",
          "inherited_dependency",
          "inline",
          "lib_source_property",
          "library_chain",
          "library_property",
          "load_order",
          "loop",
          "make_rule",
          "ndebug",
          "no_type",
          "notfile",
          "ordered_include",
          "out_of_tree",
          "path_features",
          "prebuilt",
          "print",
          "project_dependencies",
          "project_glob",
          "project_root_constants",
          "project_root_rule",
          "project_test3",
          "project_test4",
          "property_expansion",
          "rebuilds",
          "regression",
          "relative_sources",
          "remove_requirement",
          "resolution",
          "searched_lib",
          "skipping",
          "sort_rule",
          "source_locations",
          "stage",
          "standalone",
          "suffix",
          "tag",
          "test_result_dumping",
          "testing_support",
          "timedata",
          "unit_test",
          "use_requirements",
          "using",
          "wrapper",
          "wrong_project",
          "exit_status",
          ]

if os.name == 'posix':
    tests.append("symlink")
    # On windows, library order is not important, so skip this test. Besides, it
    # fails ;-). Further, the test relies on the fact that on Linux, one can
    # build a shared library with unresolved symbols. This is not true on
    # Windows (even with cygwin gcc).
    if string.find(os.uname()[0], "CYGWIN") == -1:
        tests.append("library_order")

if string.find(BoostBuild.get_toolset(), 'gcc') == 0:
    tests.append("gcc_runtime")

if ( string.find(BoostBuild.get_toolset(), 'gcc') == 0 )or  \
    ( string.find(BoostBuild.get_toolset(), 'msvc') == 0 ):
    tests.append("pch")

if "--extras" in sys.argv:
    tests.append("boostbook")
    tests.append("qt4")
    tests.append("example_qt4")
    # Requires ./whatever.py to work, so is not guaranted to work everywhere.
    tests.append("example_customization")
    # Requires gettext tools.
    tests.append("example_gettext")

elif not xml:
    print 'Note: skipping extra tests'

run_tests(critical_tests, tests)
