# Functional and regression tests in C++ for libstdc++.

# Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  

# libstdc++-v3 testsuite that uses the 'dg.exp' driver.

# Initialization.
dg-init

# Build the support objects.
v3-build_support

set tests [list]

# If there is a "testsuite_files" file, use it.
#
# This is a workaround for problems reported with using:
#
#   runtest normal.exp="`cat testsuite_files`"
#
# See:
#  http://gcc.gnu.org/ml/libstdc++/2005-03/msg00278.html
# for discussion of the problem.
#
# If that worked consistently, we could modify "make check" to
# pass that option, and then remove this code.
if {[info exists blddir]} {
    set tests_file "${blddir}/testsuite/testsuite_files"
}
if {[info exists tests_file] && [file exists $tests_file]} {
    set f [open $tests_file]
    while { ! [eof $f] } {
	set t [gets $f]
	if { [string length "$t"] != 0 } {
	    lappend tests ${srcdir}/${t}
	}
    } 
    close $f
} else {
    # Find directories that might have tests.
    set subdirs [glob "$srcdir/\[0-9\]\[0-9\]*"]
    lappend subdirs "$srcdir/abi"
    lappend subdirs "$srcdir/backward"
    lappend subdirs "$srcdir/ext"
    lappend subdirs "$srcdir/performance"
    lappend subdirs "$srcdir/thread"
    lappend subdirs "$srcdir/tr1"
    verbose "subdirs are $subdirs"

    # Find all the tests.
    foreach s $subdirs {
	set subdir_tests [find $s *.cc]
	set subdir_tests_c [find $s *.c]
	foreach e $subdir_tests_c {
	    lappend subdir_tests $e
	}

	# Filter out tests that should not be run.
	foreach t $subdir_tests {
	    # The DejaGNU "find" procedure sometimes returns a list 
	    # containing an empty string, when it should really return
	    # an empty list.
	    if { $t == "" } {
		continue
	    }
	    # Filter out:
	    # 0. utilities, other parts of the testing infrastructure.
	    # 1. interactive tests.
	    # 2. performance tests.
	    # 3. wchar_t tests, if not supported.
	    # 4. thread tests, if not supported. 
	    if { [string first _xin $t] == -1
		 && [string first performance $t] == -1
		 && (${v3-wchar_t} || [string first wchar_t $t] == -1) 
		 && (${v3-threads} || [string first thread $t] == -1) } {
		lappend tests $t
	    }
	}
    }
}
set tests [lsort $tests]

# Main loop.
global DEFAULT_CXXFLAGS
global PCH_CXXFLAGS
dg-runtest $tests "" "$DEFAULT_CXXFLAGS $PCH_CXXFLAGS"

# All done.
dg-finish
