# Copyright 2004, 2006, 2007, 2008 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"

set testfile "jprint"
set srcfile ${srcdir}/$subdir/${testfile}.java
set binfile ${objdir}/${subdir}/${testfile}
if  { [compile_java_from_source ${srcfile} ${binfile} "-g"] != "" } {
    untested "Couldn't compile ${srcfile}"
    return -1
}

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