# Tests for CNI code.

# Compile a single C++ file and produce a .o file.  OPTIONS is a list
# of options to pass to the compiler.  Returns 0 on failure, 1 on
# success.
proc gcj_cni_compile_cxx_to_o {file {options {}}} {
  global srcdir subdir

  set name [file rootname [file tail $file]]
  set oname ${name}.o

  # Find the generated header.
  lappend options "additional_flags=-I. -I.. -I$srcdir/$subdir -fdollars-in-identifiers"
  # Find libgcj headers.
  lappend options "additional_flags=-I$srcdir/.."

  set x [libjava_prune_warnings \
	   [target_compile $file $oname object $options]]
  if {$x != ""} {
    verbose "target_compile failed: $x" 2
    fail "[file tail $file] compilation"
    return 0
  }

  pass "[file tail $file] compilation"
  return 1
}

# Build header files given name of .java file.  Return 0 on failure.
proc gcj_cni_build_headers {file} {
  global libgcj_jar

  set gcjh [find_gcjh]

  # Currently we only build a header file for the main class from the
  # .java file, and then others on an ad hoc basis.
  set list {}
  set main [file rootname [file tail $file]]
  lappend list $main
  # ... for instance, an obvious hack.
  if {$main == "shortfield"} {
    lappend list shortfieldbase
  }

  foreach file $list {
    set cmd "$gcjh -cni -force -classpath .:$libgcj_jar $file"
    verbose $cmd
    set x [string trim [libjava_prune_warnings \
			  [lindex [local_exec $cmd "" "" 300] 1]]]
    if {$x != ""} {
      verbose "local_exec failed: $x" 2
      fail "$main header generation"
      return 0
    }
  }

  pass "$main header generation"
  return 1
}

# Do all the work for a single CNI test.  Return 0 on failure.
proc gcj_cni_test_one {file} {
  global runtests

  # The base name.  We use it for several purposes.
  set main [file rootname [file tail $file]]
  if {! [runtest_file_p $runtests $main]} {
    # Simply skip it.
    return 1
  }

#   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"

#   if {! [gcj_cni_build_headers $file]} {
#     # FIXME
#     return 0
#   }

  set cfile [file join [file dirname $file] nat$main.cc]
  if {! [gcj_cni_compile_cxx_to_o $cfile]} {
    # FIXME
    return 0
  }

  if {! [gcj_link $main $main [list $file nat$main.o]]} {
    # FIXME
    return 0
  }

  if {! [gcj_invoke $main [file rootname $file].out {}]} {
    # FIXME
    return 0
  }

  # When we succeed we remove all our clutter.
  eval gcj_cleanup [glob -nocomplain -- ${main}.*] [list $main nat$main.o]

  return 1
}

# Run the CNI tests.
proc gcj_cni_run {} {
  global srcdir subdir
  global build_triplet host_triplet

  # For now we only test CNI on native builds.
  if {$build_triplet == $host_triplet} {
    catch { lsort [glob -nocomplain ${srcdir}/${subdir}/*.jar] } srcfiles

    foreach x $srcfiles {
      gcj_cni_test_one $x
    }
  } else {
    verbose "CNI tests not run in cross-compilation environment"
  }
}

gcj_cni_run
