# Copyright 2019-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 whether we can load a corefile, enable TUI and then invoke
# "run" without having a segfault.
#
# Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1765117

tuiterm_env

standard_testfile tui-layout.c

set core "${testfile}.core"

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

# Only run on native boards.
if { [use_gdb_stub] || [target_info gdb_protocol] == "extended-remote" } {
    untested "not supported"
    return
}

if { ![runto_main] } {
    return -1
}

if { ![gdb_gcore_cmd "$core" "save a corefile"] } {
    untested "could not generate a corefile"
    return -1
}

Term::clean_restart 24 80 $testfile
if {![Term::enter_tui]} {
    unsupported "TUI not supported"
    return
}

set text [Term::get_all_lines]
gdb_assert {![string match "No Source Available" $text]} \
    "initial source listing"

Term::command "core-file $core"
Term::check_contents "load corefile" "21 *return 0.*$gdb_prompt .*"

Term::command "run"
Term::check_contents "run until the end" \
    "\\\[Inferior $decimal \\\(process $decimal\\\) exited normally\\]"
