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

# Check that Watchpoints are deleted after use.

load_lib gdb-python.exp

standard_testfile

if {[prepare_for_testing "failed to prepare" $testfile $srcfile]} {
    return -1
}

require allow_python_tests

if ![runto_main] then {
    return
}

# For remote host testing
set pyfile [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py]

gdb_test_no_output "set can-use-hw-watchpoints 0" "don't use hardware watchpoints"
set for_line_no [gdb_get_line_number "main for"]
gdb_test "break $for_line_no" ".*" "set breakpoint before loop"
gdb_test "continue" ".*" "run until reaching loop"
gdb_test "clear" ".*" "delete the breakpoint before loop"
gdb_test "python print(len(gdb.breakpoints()))" "1" "check default BP count"
gdb_test "source $pyfile" ".*Python script imported.*" \
    "import python scripts"
gdb_test "python print(len(gdb.breakpoints()))" "2" "check modified BP count"
gdb_test "continue" ".*" "run until program stops"
gdb_test "python print(bpt.n)" "5" "check watchpoint hits"
gdb_test "python print(len(gdb.breakpoints()))" "1" "check BP count"
