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

standard_testfile until.c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     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

    if ![using_clang] { 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
