# Copyright (C) 2003 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. 

# This file was written by Rob Savoye. (rob@cygnus.com)
# Modified and maintained by Jeffrey Wheat (cassidy@cygnus.com)

#
# These tests come from many different contributors.
#

if $tracelevel then {
    strace $tracelevel
}

# load support procs
load_lib fortran-torture.exp

foreach testcase [lsort [glob -nocomplain $srcdir/$subdir/*.f]] {
    # If we're only testing specific files and this isn't one of them, skip it.
    if ![runtest_file_p $runtests $testcase] then {
	continue
    }
    fortran-torture-execute $testcase
}

foreach testcase [lsort [glob -nocomplain $srcdir/$subdir/*.F]] {
    if ![runtest_file_p $runtests $testcase] then {
	continue
    }
    fortran-torture-execute $testcase
}

foreach testcase [lsort [glob -nocomplain $srcdir/$subdir/*.f90]] {
    if ![runtest_file_p $runtests $testcase] then {
	continue
    }
    fortran-torture-execute $testcase
}

foreach testcase [lsort [glob -nocomplain $srcdir/$subdir/*.f95]] {
    if ![runtest_file_p $runtests $testcase] then {
	continue
    }
    fortran-torture-execute $testcase
}

foreach testcase [lsort [glob -nocomplain $srcdir/$subdir/*.f03]] {
    if ![runtest_file_p $runtests $testcase] then {
	continue
    }
    fortran-torture-execute $testcase
}
