# Copyright 2012-2021 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/>.

standard_testfile

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

# Setup for the test, create COUNT breakpoints at the function BREAKPT.
proc test_setup { count } {
    global srcfile
    global binfile

    clean_restart ${binfile}

    if ![runto_main] then {
	return 0
    }

    for {set i 1} {$i <= $count} {incr i} {
	gdb_breakpoint "breakpt"
	gdb_test_no_output "set \$bp_num_${i} = \$bpnum"
    }

    gdb_test "step" \
	"spacer \\(\\) at .*$srcfile:\[0-9\]+.*" \
	"step to place breakpoints"

    return 1
}


# Test 1: Create two breakpoints at BREAKPT.  Delete #1 and expect to stop
# at #2.
with_test_prefix "del_1_stop_2" {
    test_setup 2

    gdb_test_no_output {delete $bp_num_1}

    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
	"delete #1, stop at #2"
}

# Test 2: Create two breakpoints at BREAKPT.  Delete #2 and expect to stop
# at #1.
with_test_prefix "del_2_stop_1" {
    test_setup 2

    gdb_test_no_output {delete $bp_num_2}

    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
	"delete #2, stop at #1"
}

# Test 3: Create three breakpoints at BREAKPT.  Disable #1, delete #2,
# expect to stop at #3.
with_test_prefix "dis_1_del_2_stop_3" {
    test_setup 3

    gdb_test_no_output {disable $bp_num_1}

    gdb_test "step" ".*"

    gdb_test_no_output {delete $bp_num_2}

    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
	"disable #1, delete #2, stop at #3"
}

# Test 4: Create three breakpoints at BREAKPT.  Disable #2, delete #1,
# expect to stop at #3.
with_test_prefix "dis_2_del_1_stop_3" {
    test_setup 3

    gdb_test_no_output {disable $bp_num_2}

    gdb_test "step" ".*"

    gdb_test_no_output {delete $bp_num_1}

    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
	"disable #2, delete #1, stop at #3"
}

# Test 5: Create three breakpoints at BREAKPT.  Disable #1, delete #3,
# expect to stop at #2.
with_test_prefix "dis_1_del_3_stop_1" {
    test_setup 3

    gdb_test_no_output {disable $bp_num_1}

    gdb_test "step" ".*"

    gdb_test_no_output {delete $bp_num_3}

    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
	"disable #1, delete #3, stop at #2"
}

# Test 6: Create three breakpoints at BREAKPT.  Disable #3, delete #1,
# expect to stop at #2
with_test_prefix "dis_3_del_1_stop_2" {
    test_setup 3

    gdb_test_no_output {disable $bp_num_3}

    gdb_test "step" ".*"

    gdb_test_no_output {delete $bp_num_1}

    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
	"disable #3, delete #1, stop at #2"
}

# Test 7: Create three breakpoints at BREAKPT.  Disable #2, delete #3,
# expect to stop at #1.
with_test_prefix "dis_2_del_3_stop_1" {
    test_setup 3

    gdb_test_no_output {disable $bp_num_2}

    gdb_test "step" ".*"

    gdb_test_no_output {delete $bp_num_3}

    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
	"disable #2, delete #3, stop at #1"
}

# Test 8: Create three breakpoints at BREAKPT.  Disable #3, delete #2,
# expect to stop at #1.
with_test_prefix "dis_3_del_2_stop_1" {
    test_setup 3

    gdb_test_no_output {disable $bp_num_3}

    gdb_test "step" ".*"

    gdb_test_no_output {delete $bp_num_2}

    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
	"disable #3, delete #2, stop at #1"
}
