# Copyright 2016-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 { [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}" "${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]} {
	fail "couldn't run to 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
