# Copyright 2012-2020 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 { [prepare_for_testing "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 {
	fail "can't run to main"
	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"
}
