# Copyright 2004, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# This file was written by Jeff Johnston. (jjohnstn@redhat.com)
#

if $tracelevel then {
	strace $tracelevel
}

load_lib "java.exp"

if { [skip_java_tests] } { continue }

set testfile "jprint"
set srcfile ${srcdir}/$subdir/${testfile}.java
set binfile ${objdir}/${subdir}/${testfile}
if {[compile_java_from_source ${srcfile} ${binfile} "-g"] != ""} {
    continue
}

# Set the current language to java.  This counts as a test.  If it
# fails, then we skip the other tests.

proc set_lang_java {} {
    global gdb_prompt
    global binfile objdir subdir

    verbose "loading file '$binfile'"
    gdb_load $binfile

    send_gdb "set language java\n"
    gdb_expect {
	-re ".*$gdb_prompt $" {}
	timeout { fail "set language java (timeout)" ; return 0 }
    }

    return [gdb_test "show language" ".* source language is \"java\".*" \
	"set language to \"java\""]
}

set prms_id 0
set bug_id 0

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

gdb_test "set print sevenbit-strings" ".*"

if ![set_lang_java] then {
    # Ref PR gdb:java/1565.  Don't use the simpler "break jmisc.main".
    # As of 2004-02-24 it wasn't working and is being tested separatly.
    # Before GCJ 4.1 (approximately) the demangled name did not include
    # a method signature; after that point it does include a trailing
    # signature.
    runto_main
    set function "${testfile}.main(java.lang.String\[\])"
    gdb_breakpoint "\'$function\'" { allow-pending }
    gdb_breakpoint "\'${function}void\'" { allow-pending }
    gdb_continue_to_breakpoint $function

    gdb_test "p jvclass.addprint(4,5,6)" "sum is 15\r\n.*" "unambiguous static call"

    gdb_test "next" ""
    gdb_test "next" ""

    gdb_test "p x.print(44)" "x is 44\r\n.*" "single argument print call"
    gdb_test "p x.print(22,33)" "y is 33\r\n.*" "double argument print call"
    gdb_test "call x.dothat(55)" "new value is 58\r\n.*= 62.*" "virtual fn call"
    gdb_test "p x.addprint(1,2,3)" "sum is 6\r\n.*" "inherited static call"
    gdb_test "call x.addk(44)" "adding k gives 121\r\n.*= 121.*" "inherited virtual fn call"

    # Regression test for a crasher.
    gdb_test "print *jprint.props" " = .*" "print a java.util.Properties"
}
