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

# Ensure that 'layout asm' can scroll away from the last line of a
# very short program using a page up sized scroll.

tuiterm_env

standard_testfile tui-layout-asm-short-prog.S

if {[build_executable "failed to prepare" ${testfile} ${srcfile} \
	 {debug additional_flags=-nostdlib \
	      additional_flags=-nostartfiles}] == -1} {
    return -1
}

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

# This puts us into TUI mode, and should display the ASM window.
Term::command_no_prompt_prefix "layout asm"
Term::check_box_contents "check asm box contents" 0 0 80 15 "<_start>"

# Record the first line of output, we'll need this later.
set first_line [Term::get_line 1]

# Scroll forward a large amount, this should take us to the last
# instruction in the program.
Term::command "+ 13"
Term::check_box_contents "check asm box contents again" 0 0 80 15 \
    [multi_line \
	 "^ *$hex\[^\r\n\]+" \
	 "\\s+"]

# Now scroll backward again, we should return to the start of the
# program.
Term::command "- 13"
gdb_assert {[string eq "$first_line" [Term::get_line 1]]} \
    "check first line is back"
