::tcltest::configure {*}$::argv

set output_file "output"
set work_dir "work"

# constraint for tests that should only run on Darwin
::tcltest::testConstraint darwin [expr {"@OS_PLATFORM@" eq "darwin"}]

# constraint indicating whether the platform supports trace mode
::tcltest::testConstraint tracemode_support [expr {@TRACEMODE_SUPPORT@ != 0}]

# Set of procs used for testing.

# Sets $bindir variable from autoconf
proc load_variables {pwd} {
    global bindir datadir portsrc cpwd

    set cpwd [file dirname [file dirname $pwd]]

    set prefix "@prefix@"
    set exec_prefix "@exec_prefix@"
    set bindir "@bindir@"
    set datadir "@datarootdir@"
    set portsrc ${cpwd}/test-macports.conf

}

proc cleanup {} {
    global cpwd

    file delete -force /tmp/macports-tests
    file delete -force ${cpwd}/PortIndex ${cpwd}/PortIndex.quick
}

# Sets initial directories
proc set_dir {} {
    global datadir cpwd

    cleanup

    file mkdir /tmp/macports-tests/ports \
               /tmp/macports-tests/opt/local/etc/macports \
               /tmp/macports-tests/opt/local/share \
               /tmp/macports-tests/opt/local/var/macports/receipts \
               /tmp/macports-tests/opt/local/var/macports/registry \
               /tmp/macports-tests/opt/local/var/macports/build

    file link -symbolic /tmp/macports-tests/opt/local/share/macports $datadir/macports
    file link -symbolic /tmp/macports-tests/ports/test $cpwd/test
}

# Run portindex
proc port_index {} {
    global bindir datadir cpwd

    # Move up 2 level to run portindex.
    set path [pwd]
    cd ../..
    # Avoid warning about ports tree being old
    exec -ignorestderr sh -c {touch */*/Portfile}

    exec -ignorestderr ${bindir}/portindex 2>@1

    file copy ${cpwd}/sources.conf /tmp/macports-tests/opt/local/etc/macports/
    file copy ${cpwd}/PortIndex ${cpwd}/PortIndex.quick /tmp/macports-tests/ports/

    cd $path
}

# Executes port clean.
proc port_clean {pwd} {
    global bindir datadir portsrc

    set back [pwd]
    cd $pwd

    catch {exec -ignorestderr env PORTSRC=${portsrc} ${bindir}/port clean 2>@1}
    cd $back
}

# Runs the portfile.
proc port_run {pwd} {
    global bindir datadir portsrc

    set back [pwd]
    cd $pwd

    set result [catch {exec -ignorestderr env PORTSRC=${portsrc} ${bindir}/port -d -N test >&output} ]
    cd $back
    return $result
}

# Runs port trace.
proc port_trace {pwd} {
    global bindir datadir portsrc

    set back [pwd]
    cd $pwd

    set result [catch {exec -ignorestderr env PORTSRC=${portsrc} ${bindir}/port -d -N -t test >&output 2>@1} ]
    cd $back
    return $result
}

# Installs new portfile.
proc port_install {{name "current"}} {
    global bindir portsrc

    set result [catch {exec -ignorestderr env PORTSRC=${portsrc} ${bindir}/port install $name > output 2>@1} ]
    return $result
}

# Run configure command.
proc port_config {pwd} {
    global path bindir portsrc

    set result [catch {exec -ignorestderr env PORTSRC=${portsrc} ${bindir}/port configure 2>@1} ]
    return $result
}

# Run destroot command.
proc port_destroot {pwd} {
    global path bindir portsrc work_dir output_file

    file copy -force ${path}/statefile ${work_dir}/.macports.statefile-unknown-version.state
    if { [exec -ignorestderr id -u] == 0 } {
        exec -ignorestderr chown macports ${work_dir}/.macports.statefile-unknown-version.state
    }
    set result [catch {exec -ignorestderr env PORTSRC=${portsrc} ${bindir}/port destroot >$output_file 2>@1} ]
    return $result
}

# Uninstalls portfile.
proc port_uninstall {{name "current"}} {
    global bindir portsrc

    set result [catch {exec -ignorestderr env PORTSRC=${portsrc} ${bindir}/port uninstall $name > output 2>@1} ]
    return $result
}

# Returns the line containint a given string
# from a given file, or -1 if nothing is found.
proc get_line {filename lookup} {
    set fp [open $filename r]

    while {[gets $fp line] != -1} {
        set line [string tolower $line]

        if {[string match $lookup $line] != 0} {
            close $fp
            return $line
        }
    }
    return -1
}

# This proc contains all the steps necesary
# to install a port and save the output to a file.
# Needed for the majority of regression tests.
proc initial_setup {} {
    global output_file work_dir path

    makeFile "" $output_file
    makeDirectory $work_dir

    load_variables $path
    set_dir
    port_index
    port_clean $path
    port_run $path
}
