# Copyright 1999-2013 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=mi"

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile until.c

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