# Tests for class verifier.

global gcj_verify_xfail
set {gcj_verify_xfail(gij verify of call.fail.Static)} 1
set {gcj_verify_xfail(gij verify of simple.fail.dupfield)} 1
set {gcj_verify_xfail(gij verify of simple.fail.dupinterface)} 1
set {gcj_verify_xfail(gij verify of simple.fail.dupmethod)} 1
set {gcj_verify_xfail(gij verify of subr.fail.jsr10)} 1
set {gcj_verify_xfail(gij verify of subr.fail.jsr8)} 1


proc gcj_verify_list_tests {srcdir} {
  set result {}
  if {[file exists $srcdir]} {
    set here [pwd]
    cd $srcdir
    foreach item [lsort [glob -nocomplain */*/*.class]] {
      lappend result [file rootname $item]
    }
    cd $here
  }
  return $result
}

proc gcj_verify_test_gij {gij srcdir test shouldfail} {
  global gcj_verify_xfail

  set testname "gij verify of $test"
  verbose "invoking gij $test  - shouldfail=$shouldfail"
  set result [libjava_load $gij [list --cp $srcdir $test] ""]
  set status [lindex $result 0]
  set output [lindex $result 1]

  if {$shouldfail} {
    # We match the few exceptions that are allowed.  This may need
    # updating from time to time.  We do this rather than check the
    # exit status because we want to catch the case where gij dies in
    # some inappropriate way.
    if {[string match *VerifyError* $output]
	|| [string match *AbstractMethodError* $output]
	|| [string match *IncompatibleClassChangeError* $output]} {
      set cmd pass
    } else {
      set cmd fail
    }
    if {[info exists gcj_verify_xfail($testname)]} {
      setup_xfail *-*-*
    }
  } else {
    if {$status == "pass"} {
      set cmd pass
    } else {
      set cmd fail
    }
  }
  $cmd $testname
}

proc gcj_verify_run {} {
  global INTERPRETER srcdir

  set gij [libjava_find_gij] 
  set interpret 1
  # libjava_find_gij will return "" if it couldn't find the
  # program; in this case we want to skip the test.
  if {$INTERPRETER != "yes" || $gij == ""} {
    set interpret 0
  }

  set testsdir $srcdir/libjava.verify/verify
  foreach test [gcj_verify_list_tests $testsdir] {
    set shouldfail [string match */fail/* $test]

    if {$interpret} {
      regsub -all -- / $test . gijname
      gcj_verify_test_gij $gij $testsdir $gijname $shouldfail
    }

    # FIXME: run gcj --syntax-only here.
  }
}

gcj_verify_run
