# Copyright (C) 2008-2025 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"

require allow_python_tests

standard_testfile

set pyfile ${testfile}-gdb.py

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

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

if {[mi_clean_restart]} {
    return
}

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
