#!/usr/local/bin/tclsh

set rcsId {$Id: runtests,v 1.5 1995/11/06 23:03:22 jfontain Exp $}

# first gather valid files and sort them
set numbers {}
foreach file [glob *.tcl] {
    set number [file rootname $file]
    if {![catch {expr $number+0}]} {
        lappend numbers $number
    }
}

if {[llength [info commands interp]]>0} {
    # for use as a puts emulation when running a slave interpreter
    proc appendWithNewLine {variableName string} {
        upvar $variableName variable
        append variable $string\n
    }
}

foreach number [lsort -integer $numbers] {
    puts -nonewline "test $number ... "
    set testFile $number.tcl
    # store expected output
    set expect ""
    set file [open $testFile]
    while {[gets $file line]>=0} {
        if {[regexp {^## (.+)$} $line dummy line]} {
            append expect $line\n
        }
    }
    close $file

    if {[llength [info commands interp]]==0} {
        set output [exec -keepnewline tclsh < $testFile 2>@ stdout]
    } else {
        # use as a slave interpreter if available for exec may not be available on some platforms
        set output {}
        set interpreter [interp create]
        # alias puts to be able to collect slave stdout data
        $interpreter alias puts appendWithNewLine output
        if {[catch {$interpreter eval source $testFile} error]} {
            # error messages always appear first through exec because stderr is not buffered
            set output $error\n$output
        }
        interp delete $interpreter
    }

    if {[string compare $expect $output]==0} {
        puts passed
    } else {
        puts failed
        puts "### with output:"
        puts $output
        puts "### expected:"
        puts $expect
    }
}


