# Copyright 1999-2001, 2003, 2005, 2007-2012 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/>.

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

# 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 "until"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } {
     untested mi2-until.exp
     return -1
}

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

proc test_running_to_foo {} {
    global mi_gdb_prompt
    global hex

    mi_create_breakpoint "10" 1 "keep" foo ".*until.c" 10 ".*" \
             "break-insert operation"

    mi_run_cmd
    mi_expect_stop "breakpoint-hit" "foo" "" ".*until.c" 10 \
	{ "" "disp=\"keep\"" } "run to main"

    mi_gdb_test "100-break-delete 1" "100\\^done" "break-delete 1"

}

proc test_until {} {
    global mi_gdb_prompt
    global hex fullname_syntax srcfile

    setup_kfail gdb/2104 "*-*-*"
    mi_execute_to "exec-until" "end-stepping-range" "foo" "" ".*until.c" "12" "" \
        "until after while loop"

    mi_execute_to "exec-until 15" "location-reached" "foo" "" ".*until.c" "15" ""\
        "until line number"

    mi_execute_to "exec-until until.c:17" "location-reached" "foo" "" ".*until.c" "17" ""\
        "until line number:file"

    # This is supposed to NOT stop at line 25. It stops right after foo is over.
    mi_execute_to "exec-until until.c:25" "location-reached" "main" "" ".*until.c" "(23|24)" ""\
        "until after current function"
}

test_running_to_foo
test_until

mi_gdb_exit
return 0
