# Tests for ClassLoader and native library loader code.

# 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]] $srcdir/$subdir/MyLoader.java $objdir/dummy.o"
  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 $executable $executable "" $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 $objdir/dummy.class"
  set x [libjava_prune_warnings \
	   [libjava_tcompile "$objdir/dummy.class" "$objdir/dummy.o" 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*.java] } srcfiles

  foreach x $srcfiles {
    gcj_loader_test_one $x
  }
}

gcj_loader_run
