# Tests for ClassLoader and native library loader code.

# Compute the correct name for an object file.
# This is an awful hack.
proc gcj_object_file_name {compiler base} {
  verbose "OBJECT: compiler = $compiler"
  if {[string match *libtool* $compiler]} {
    return $base.lo
  }
  return $base.o
}

# Do all the work for a single JNI test.  Return 0 on failure.
proc gcj_loader_test_one {srcfile} {
  global objdir srcdir subdir

  set resfile $srcdir/$subdir/[file rootname [file tail $srcfile]].out

  regsub "^.*/(\[^/.\]+)\[.\]\[^/]*$" "$srcfile" "\\1" out
  set executable "${objdir}/$out.exe"

  set errname [file rootname [file tail $srcfile]]
  set args [libjava_arguments link]
  lappend args "additional_flags=--main=[file rootname [file tail $srcfile]] [gcj_object_file_name $args dummy]"
  set x [libjava_prune_warnings \
	     [libjava_tcompile $srcfile "$executable" executable $args]]

    if { $x != "" } {
	verbose "target_compile failed: $x" 2

	fail "$errname compilation from source"
	untested "$errname execution from source compiled test"
	return
    }
    pass "$errname compilation from source"

    libjava_invoke $errname "source compiled test" "" $executable "" $resfile ""

  return 1
}

# Run the bytecode loader tests.
proc gcj_loader_run {} {
  global srcdir subdir objdir
  global build_triplet host_triplet
  global GCJ_UNDER_TEST

#   set file "${srcdir}/${subdir}/dummy.java"
#   if {! [bytecompile_file $file [pwd]]} {
#     fail "bytecompile $file"
#     # FIXME - should use `untested' on all remaining tests.
#     # But that is hard.
#     return 0
#   }
#   pass "bytecompile $file"

  set args [libjava_arguments compile]
  lappend args "additional_flags=--resource $srcdir/$subdir/dummy.class"
  set x [libjava_prune_warnings \
	   [libjava_tcompile "$srcdir/$subdir/dummy.class" "$objdir/[gcj_object_file_name $args dummy]" object $args]]

    if { $x != "" } {
	verbose "resource compilation failed: $x" 2

	fail "resource compilation dummy.class"
	return 0;
    }
  pass "resource compilation: dummy.class"

  catch { lsort [glob -nocomplain ${srcdir}/${subdir}/Test*.jar] } srcfiles

  foreach x $srcfiles {
    gcj_loader_test_one $x
  }
}

gcj_loader_run
