# Copyright 2012 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 ${testfile}.exp ${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"
}
