#!/usr/local/bin/expect --

set timeout 30

set failures 0
set successes 0
set tested 0

# Results expected from specific test programs.

set result(001) "Successful."
set result(002) "Successful. i = 1, j = 2"
set result(003) "Successful. i = 1, j = 12"
set result(004) "Successful. i = 2"
set result(005) "Successful. i = 2, j = 3"
set result(006) "Successful. i = 2, j = 3"
set result(007) "Successful. i = 2, j = 3"
set result(008) "Successful. i = 5, j = 3"
set result(009) "Successful. i = 12, j = 3"
set result(010) "Successful. i = 1, j = 2, k = 3"
set result(100) "Successful. i = 55"
set result(101) "Successful. i = 55"
set result(102) "Successful. i = 75"
set result(103) "Successful. i = 1079"

proc pass { test } {
    global result_file
    global successes
    global tested

    puts $result_file "$test succeeded."
    incr successes
    incr tested
}


proc fail { test } {
    global result_file
    global failures
    global tested

    puts $result_file "$test failed."
    incr failures
    incr tested
}

proc done {} {
    global result_file
    global successes
    global failures
    global tested

    puts $result_file
    puts $result_file "$tested tests completed."
    puts $result_file "$successes tests passed."
    puts $result_file "$failures tests failed."
}


proc run_test { prefixstr target target_dir test nthreads } {
    global result

    cd test${test}.$target_dir
    set pid [eval spawn "$prefixstr test$test -n $nthreads"]
    expect {
	-re $result($test)  { pass "Test$test.$target ($nthreads)" }
	default { fail "Test$test.$target ($nthreads)" }
    }
    exec kill $pid
    close
    wait
    cd ..
}


set result_file [open "tests.out" w]

if 1 {
foreach target {Unified} {
    set target_dir [string tolower $target]
    foreach test [array names result] {
	foreach threads {1 2 4} {
	    puts "Spawning test$test"
	    run_test "" $target $target_dir $test $threads
	}
    }
}
}

if 0 {
set target MPI
set target_dir [string tolower $target]
foreach test [array names result] {
    foreach nprocs {1 2 3 4} {
	foreach threads {1} {
	    puts "Spawning test$test"
	    run_test "mpirun -np $nprocs --" $target $target_dir $test $threads
	}
    }
}
}


if 0 {
set target PVM
set target_dir [string tolower $target]
foreach test [array names result] {
    puts "Spawning test$test"
    run_test "" $target $target_dir $test 1
}
}

done
close $result_file
if { [expr $failures > 0] } {
    exit 1
} else {
    exit 0
}
