# Copyright 1999, 2000, 2001, 2002, 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=mi"

# APPLE LOCAL: For now, ignore all non-mi1 tests.
if [istarget "*-apple-darwin*"] then {
  return
  gdb_suppress_entire_file "Not testing non-mi1 on Darwin at this time."
}

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\",func=\"callee3\",args=\\\[.*\\\],file=\".*basics.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$line_callee3_close_brace\"\}\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
