# Run the Jacks test suite.
# See http://www-124.ibm.com/developerworks/oss/cvs/jikes/~checkout~/jacks/jacks.html

proc gcj_jacks_setup_xfail {ary} {
  upvar $ary array
  global srcdir

  set fd [open $srcdir/libjava.jacks/jacks.xfail]
  while {! [eof $fd]} {
    set array([gets $fd]) {}
  }
  close $fd
}

proc gcj_jacks_write {filename} {
  global GCJ_UNDER_TEST
  global libgcj_jar
  global libjava_libgcc_s_path
  global original_ld_library_path

  set gcjl [split $GCJ_UNDER_TEST]
  set gcj_cmd [lindex $gcjl 0]
  set rest [join [lreplace $gcjl 0 0]]
  append rest " -C"

  set fd [open $filename w]
  puts $fd "set JAVAC $gcj_cmd"
  puts $fd "set JAVA_CLASSPATH \"$libgcj_jar\""
  puts $fd "set JAVAC_FLAGS [list $rest]"
  puts $fd "set JAVA [list [libjava_find_gij]]"
  puts $fd "set JAVA_FLAGS \"\""
  puts $fd "set JAVAC_ENCODING_FLAG --encoding="
  puts $fd "set tcltest::testConstraints(encoding) 1"
  puts $fd "set tcltest::testConstraints(gcj) 1"
  puts $fd "set tcltest::testConstraints(assert) 1"
  # "Time-consuming JVM limitation tests".
  # puts $fd "set tcltest::testConstraints(jvm) 1"
  close $fd

  setenv LD_LIBRARY_PATH $libjava_libgcc_s_path:$original_ld_library_path
}

proc gcj_jacks_parse {file} {
  if {[catch {open $file} fd]} {
    verbose "couldn't parse Jacks output: $fd"
    return
  }

  verbose "Reading jacks.xfail"
  gcj_jacks_setup_xfail xfails

  while {! [eof $fd]} {
    set line [gets $fd]
    if {[string match RESULT* $line]} {
      set linelist [split $line]
      set test [lindex $linelist 1]
      if {[info exists xfails($test)]} {
	setup_xfail "*-*-*"
      }
      if {[lindex $linelist 2] == "PASSED"} {
	pass $test
      } else {
	fail $test
      }
    }
  }

  close $fd
}

proc gcj_jacks_run {} {
  global srcdir

  if {! [file isdirectory $srcdir/libjava.jacks/jacks]} {
    # No tests.
    verbose "Jacks tests not found"
    return
  }

  # Jacks forces us to do this.  You can't run it from a separate
  # tree.
  verbose "Copying Jacks..."
  catch {system "rm -rf jacks"}
  catch {system "cp -r $srcdir/libjava.jacks/jacks jacks"}

  set here [pwd]
  cd jacks

  verbose "Writing Jacks setup file"
  gcj_jacks_write gcj_setup

  verbose "Running Jacks..."
  # Just ignore error exits from the jacks program.
  # It will always error exit for us, since don't completely pass.
  catch {exec ./jacks gcj} msg

  gcj_jacks_parse logging/gcj.log

  cd $here
}

gcj_jacks_run
