# 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

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

  # Find the generated header.
  lappend options "additional_flags=-I. -I.."
  # 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} {
  set gcjh [find_gcjh]
  set jvscan [find_jvscan]

  set class_out [string trim \
		   [libjava_prune_warnings \
		      [lindex [local_exec "$jvscan --encoding=UTF-8 $file --list-class" "" "" 300] 1]]]
  if {[string match "*parse error*" $class_out]} {
    fail "$file header generation"
    return 0
  }

  foreach file [split $class_out] {
    set x [string trim [libjava_prune_warnings \
			  [lindex [local_exec "$gcjh $file" "" "" 300] 1]]]
    if {$x != ""} {
      verbose "local_exec failed: $x" 2
      fail "$file header generation"
      return 0
    }
  }

  pass "$file 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}/*.java] } srcfiles

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

gcj_cni_run
