# Copyright 2019-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/>.

# 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

load_lib "tuiterm.exp"

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] } {
    untested "could not run to 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"
}

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"

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