# Tests for .jar files.

# Compile a single .jar file to an executable.
# Returns 0 on failure.
proc gcj_jar_link {jarfile mainclass} {
}

proc gcj_jar_compile_one {jarfile mainclass} {
  set base [file rootname [file tail $jarfile]]
  set out [file rootname $jarfile].out

  if {! [gcj_link $base $mainclass [list $jarfile]]} {
    return
  }

  gcj_invoke $base $out {}
}

proc gcj_jar_interpret {jarfile} {
  global INTERPRETER srcdir

  set gij [libjava_find_gij]
  # 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 == ""} {
    untested "$jarfile execution - gij test"
    untested "$jarfile output - gij test"
    return
  }

  set opts(_) {}
  set out [file rootname $jarfile].out
  libjava_invoke $jarfile "gij test" opts $gij {} $out \
      "" -jar $jarfile
}

proc gcj_jar_run {} {
  global srcdir subdir env
  foreach jar [lsort [glob -nocomplain ${srcdir}/${subdir}/*.jar]] {
    set xff [file rootname $jar].xfail
    set main {}
    set interp 1
    foreach item [libjava_read_xfail $xff] {
      if {[string match main=* $item]} {
	set main [string range $item 5 end]
	break
      } elseif {$item == "no-interpret"} {
	set interp 0
      }
    }

    gcj_jar_compile_one $jar $main
    if {$interp} {
      gcj_jar_interpret $jar
    }
  }
    # When we succeed we remove all our clutter.
    eval gcj_cleanup [glob -nocomplain -- ${main}.*] [list $main ]

    # Reset CLASSPATH that we do not look into testsuite/libjava.jar for *.jar
    # files which do not belong to the libgcj itself.
    set env(CLASSPATH) ""

    return 1
}

gcj_jar_run
