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

# Test "save breakpoints" + "break -qualified".

standard_testfile .cc

if { [build_executable "failed to prepare" ${testfile} $srcfile {debug c++}] } {
    return -1
}

proc restart {} {
    global testfile

    clean_restart $testfile

    if ![runto_main] {
	return 0
    }
    # Delete all breakpoints so that the "runto_main" breakpoint above
    # does not interfere with our testing.
    delete_breakpoints

    return 1
}

with_test_prefix "save" {
    if ![restart] {
	return -1
    }

    gdb_breakpoint "function" qualified
    gdb_breakpoint "function"

    # Save the breakpoints into a file.
    if {[is_remote host]} {
	set bps bps
    } else {
	set bps [standard_output_file bps]
    }
    remote_file host delete "$bps"
    gdb_test "save breakpoint $bps" "" "save breakpoint bps"
}

with_test_prefix "restore" {
    if ![restart] {
	return -1
    }

    # Restore the breakpoints.
    gdb_test "source $bps" "" "source bps"

    # Verify that all breakpoints have been created correctly.
    gdb_test "info break" [multi_line \
      "Num +Type +Disp +Enb +Address +What" \
      "$decimal +breakpoint +keep +y +$hex +in function\\(\\) at \[^\r\n\]*$srcfile:$decimal" \
      "$decimal +breakpoint +keep +y +<MULTIPLE> +" \
      "$decimal.$decimal +y +$hex +in S::function\\(\\) at \[^\r\n\]*$srcfile:$decimal" \
      "$decimal.$decimal +y +$hex +in function\\(\\) at \[^\r\n\]*$srcfile:$decimal" \
    ]
}
