#!/usr/bin/python

#  Copyright (C) Jurko Gospodnetic 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)

# Tests for the Boost Jam builtin SORT rule.

import BoostBuild


################################################################################
#
# testSORTCorrectness()
# ---------------------
#
################################################################################

def testSORTCorrectness():
    """Testing that Boost Jam's SORT builtin rule actually sorts correctly.
    """
    t = BoostBuild.Tester("-f test.jam -d1", pass_toolset=False,
        use_test_config=False)

    t.write("test.jam", """
NOCARE all ;
source-data = 1 8 9 2 7 3 4 7 1 27 27 9 98 98 1 1 4 5 6 2 3 4 8 1 -2 -2 0 0 0 ;
target-data = -2 -2 0 0 0 1 1 1 1 1 2 2 27 27 3 3 4 4 4 5 6 7 7 8 8 9 9 98 98 ;
ECHO "starting up" ;
sorted-data = [ SORT $(source-data) ] ;
ECHO "done" ;
if $(sorted-data) != $(target-data)
{
    ECHO "Source       :" $(source-data) ;
    ECHO "Expected     :" $(target-data) ;
    ECHO "SORT returned:" $(sorted-data) ;
    EXIT "SORT error" : -2 ;
}
""")

    t.run_build_system()
    t.expect_output_line("starting up")
    t.expect_output_line("done")
    t.expect_output_line("SORT error", False)

    t.cleanup()


################################################################################
#
# testSORTDuration()
# ------------------
#
################################################################################

def testSORTDuration():
    """Regression test making sure Boost Jam's SORT builtin rule does not get
    quadratic behaviour again in this use case.
    """
    t = BoostBuild.Tester("-f test.jam -d1", pass_toolset=False,
        use_test_config=False)

    f = open(t.workpath("test.jam"), "w")
    print >> f, "data = "
    for i in range(0, 20000):
        if i % 2 != 0:
            print >> f, '"aaa"'
        else:
            print >> f, '"bbb"'
    print >> f, """;

ECHO "starting up" ;
sorted = [ SORT $(data) ] ;
ECHO "done" ;
NOCARE all ;
"""
    f.close()

    t.run_build_system(expected_duration=1)
    t.expect_output_line("starting up")
    t.expect_output_line("done")

    t.cleanup()


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

testSORTCorrectness()
testSORTDuration()
