# 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]
  set errname [dg-trim-dirname $srcdir $jarfile]
  # 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 "$errname execution - gij test"
    untested "$errname output - gij test"
    return
  }

  set opts(_) {}
  set out [file rootname $jarfile].out
  libjava_invoke $errname "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
