# Copyright 1999, 2000, 2001 Cygnus Solutions.

# 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.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

#
# Test essential Machine interface (MI) operations
#
# Verify that, using the MI, we can run a simple program and perform basic
# debugging activities like: insert breakpoints, run the program,
# step, next, continue until it ends and, last but not least, quit.
#
# The goal is not to test gdb functionality, which is done by other tests,
# but to verify the correct output response to MI operations.
#

# This test only works when talking to a target that routes its output
# through GDB.  Check that we're either talking to a simulator or a
# remote target.

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

gdb_exit
if [mi_gdb_start] {
    continue
}

set testfile "mi-console"
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_load ${binfile}

# Halt in main
mi_gdb_test "200-break-insert main" \
	"200\\^done,bkpt=\{number=\"1\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"$hex\",func=\"main\",file=\".*mi-console.c\",line=\"13\",times=\"0\"\}" \
	"break-insert operation"
mi_run_cmd
gdb_expect {
    -re "000\\*stopped,reason=\"breakpoint-hit\",bkptno=\"1\",thread-id=\"\[01\]\",frame=\{addr=\"$hex\",func=\"main\",args=\\\[\\\],file=\".*mi-console.c\",line=\"13\"\}\r\n$mi_gdb_prompt$" {
	    pass "run to main"
    }
    -re ".*$mi_gdb_prompt$" {
	fail "run to main (2)"
    }
    timeout {
	fail "run to main (timeout)"
    }
}

# Next over the hello() call which will produce lots of output
send_gdb "47-exec-next\n"
gdb_expect {
    -re "47\\^running\r\n$mi_gdb_prompt" {
	pass "Started step over hello"
    }
    timeout {
	fail "Started step over hello (timeout)"
    }
}

gdb_expect {
    -re "@\"H\"\r\n.*@\"e\"\r\n.*@\"l\"\r\n.*@\"l\"\r\n.*@\"o\"\r\n.*@\" \"\r\n.*@\"\\\\\\\\\"\r\n.*@\"\\\\\"\"\r\n.*@\"!\"\r\n.*@\"\\\\r\"\r\n.*@\"\\\\n\"\r\n" {
	pass "Hello message"
    }
    -re "Hello" {

	# Probably a native system where GDB doesn't have direct
	# control over the inferior console.
	# For this to work, GDB would need to run the inferior process
	# under a PTY and then use the even-loops ability to wait on
	# multiple event sources to channel the output back through the
	# MI.

	fail "Hello message (known bug)"
    }
    timeout {
	fail "Hello message (timeout)"
    }
}
    
gdb_expect {
    -re "47\\*stopped.*$mi_gdb_prompt$" {
	pass "Finished step over hello"
    }
    timeout {
	fail "Finished step over hello (timeout)"
    }
}

mi_gdb_exit
return 0
