# Copyright 2016-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 ${testfile}.exp ${binfile} "${srcfile}" {debug}] != 0 } {
    return -1
}

proc switch_to_inferior { num message } {
    gdb_test "inferior ${num}" \
	     "\\\[Switching to inferior ${num} \\\[<null>\\\] \\\(<noexec>\\\)\\\]" \
	     "${message}"
}

proc add_inferior { expected_num message } {
    gdb_test "add-inferior" "Added inferior ${expected_num}( on connection .*)?" "${message}"
}

proc test_remove_inferiors { } {
    global binfile

    clean_restart ${binfile}

    # Add another inferior and switch to it.
    add_inferior 2 "add second inferior"
    switch_to_inferior 2 "switch to second inferior"

    # Test that it is not possible to remove the current inferior.
    gdb_test "remove-inferiors 2" \
	     "warning: Can not remove current inferior 2." \
	     "can't remove current inferior"

    # Test that it is possible to remove a non-active non-current inferior.
    gdb_test_no_output "remove-inferiors 1" "remove non-current inferior"

    # Load binfile and start the inferior.
    set binfile_re [string_to_regexp ${binfile}]
    gdb_test "file ${binfile}" \
	[multi_line "Reading symbols from ${binfile_re}\.\.\.(" \
	     "Expanding full symbols from ${binfile_re}\.\.\.)?" ] \
	"load binary"

    if {![runto_main]} {
	return
    }

    # Add another inferior and switch to it.
    add_inferior 3 "add third inferior"
    switch_to_inferior 3 "switch to third inferior"

    # Test that it is not possible to remove an active non-current inferior.
    gdb_test "remove-inferiors 2" \
	     "warning: Can not remove active inferior 2." \
	     "can't remove active inferior"
}

test_remove_inferiors
