# 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

    gdb_test_no_output "set language java"

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


# 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.
    # GCC does not output location information for static class members,
    # so GDB will report these as "optimized out". See gcc/43260.
    setup_xfail *-*-* gcc/43260
    gdb_test "print *jprint.props" " = .*" "print a java.util.Properties"
}
