# Copyright 2000, 2004, 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 based on jmisc.exp which in turn was written by
# Anthony Green. (green@redhat.com)

if $tracelevel then {
	strace $tracelevel
}

load_lib "java.exp"

if { [skip_java_tests] } { continue }

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


# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

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

# Check that plain old "main" works.  The load should both set the
# language to java and (since --main=jmain), some how set the scope to
# jmain's main.

# Where the breakpoint should always land

set bpmain "Breakpoint .* file .*jmain.java, line 5\."

# Where GCC PR 16439 puts the breakpoint.
set earlybpmain "Breakpoint .* file .*jmain.java, line 4\."

gdb_load "${binfile}"
setup_kfail java/1567 *-*-*
gdb_test "break main" "${bpmain}"

# Check that an unqualified "main" works.

gdb_load "${binfile}"
setup_kfail java/1565 *-*-*
gdb_test "break jmain.main" "${bpmain}"

# Check that a fully qualified "main" works.
gdb_load "${binfile}"
set cmd "break ${testfile}.main(java.lang.String\[\])"
set msg $cmd
gdb_test_multiple $cmd $msg {
    -re "${bpmain}\r\n$gdb_prompt $" {
	pass $msg
    }
    -re "${earlybpmain}\r\n$gdb_prompt $" {
	setup_xfail *-*-* gcc/16439
	fail $msg
    }
    -re "Make breakpoint pending.* \\(y or \\\[n\\\]\\) $" {
	gdb_test "n" "" ""

	# Check again with a method signature at the end.
	set cmd "break ${testfile}.main(java.lang.String\[\])void"
	set msg $cmd
	gdb_test_multiple $cmd $msg {
	    -re "${bpmain}\r\n$gdb_prompt $" {
		pass $msg
	    }
	    -re "${earlybpmain}\r\n$gdb_prompt $" {
		setup_xfail *-*-* gcc/16439
		fail $msg
	    }
	}
    }
}

