# Copyright (C) 2008-2022 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/>.

# This file is part of the GDB testsuite.  It tests PR 19743.

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

gdb_exit
if [mi_gdb_start] {
    return
}

standard_testfile
set pyfile ${testfile}-gdb.py

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "failed to compile"
    return -1
}

if { [mi_skip_python_tests] } { return }

set remote_python_file [gdb_remote_download host ${srcdir}/${subdir}/${pyfile}]

mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_test "set auto-load safe-path ${remote_python_file}" \
    {.*\^done} \
    "set safe-path"

if [is_remote host] {
    set filename ${testfile}
    remote_download host ${binfile} ${filename}
} else {
    set filename ${binfile}
}

mi_gdb_test "-file-exec-and-symbols ${filename}"  ".*\\^done" "file-exec-and-symbols operation"
mi_gdb_load ${binfile}
mi_runto_main


# register the python event handlers with test-events command
mi_gdb_test "test-events" \
    ".*~\"Event testers registered.*\\^done" \
    "register events"


set lineno [gdb_get_line_number "i++;"]

# set a breakpoint into the for loop
mi_gdb_test "break ${srcfile}:$lineno" \
    ".*Breakpoint $decimal at 0x\[0-9a-fA-F\]+: file .*${srcfile}.*\\\.*\\^done" \
    "set the breakpoint"


# resume the program
mi_execute_to "exec-continue" "breakpoint-hit" "main" "" ".*$srcfile" "$lineno" { "" "disp=\"keep\"" } "continue"


# test the python event handlers execution. The following checks are performed:
# - python continue handler is executed
# - the continue handler prints "info breakpoints" output in console format
# - breakpoint is hit and python stop handler is executed
# - the stop handler prints "info breakpoints" output in console format

mi_gdb_test "python print (stop_handler_str)" \
".*stop_handler.*Num.*Type.*Disp.*Enb.*Address.*$decimal.*breakpoint.*keep.*y.* 0x\[0-9a-fA-F\]+.*${srcfile}.*" \
"python stop handler ran"

mi_gdb_test "python print (cont_handler_str)" \
".*continue_handler.*Num.*Type.*Disp.*Enb.*Address.*$decimal.*breakpoint.*keep.*y.* 0x\[0-9a-fA-F\]+.*${srcfile}.*" \
"python continue handler ran"

mi_gdb_exit
