# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005
# 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Test Machine interface (MI) operations 
# Verify that, using the MI, we can run a simple program and perform
# exec-return.  

# The goal is not to
# test gdb functionality, which is done by other tests, but to verify
# the correct output response to MI operations.  
#

load_lib mi-support.exp
set MIFLAGS "-i=mi2"

gdb_exit
if [mi_gdb_start] {
    continue
}

set testfile "basics"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}


proc test_return_simple {} {
    global mi_gdb_prompt
    global hex fullname_syntax srcfile

    set line_callee3_head         [gdb_get_line_number "callee3 ("]
    set line_callee3_close_brace  [expr $line_callee3_head + 3]

    send_gdb "111-exec-return\n"
    gdb_expect {
	-re "111\\^done,frame=\{level=\"0\",addr=\"$hex\",fp=\"$hex\",func=\"callee3\",optimized=\"0\",args=\\\[.*\\\],file=\".*basics.c\",line=\"$line_callee3_close_brace\",dir=\".*\"\}\r\n$mi_gdb_prompt$" {pass "return from callee4 now"}
	-re ".*\r\n$mi_gdb_prompt$" { fail "return from callee4 now" }
	timeout { fail "return from callee4 now (timeout)"
	}
    }
}

mi_runto callee4

mi_gdb_test "205-break-delete" \
	"205\\^done.*" \
	"delete all breakpoints"

test_return_simple

mi_gdb_exit
return 0
