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

# Basic TUI tests.

tuiterm_env

standard_testfile tui-layout.c

if {[build_executable "failed to prepare" ${testfile} ${srcfile}] == -1} {
    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 "list -q main"
Term::check_contents "list -q main" "21 *return 0"

# Get the first source line.
set line [Term::get_line 1]
# Send an up arrow.
send_gdb "\033\[A"
# Wait for a redraw and check that the first line changed.
if {[Term::wait_for [string_to_regexp $line]] \
	&& [Term::get_line 1] != $line\
	&& [Term::get_line 2] == $line} {
    pass "scroll up"
} else {
    fail "scroll up"
}

# Check the horizontal scrolling.  First confirm that 'main ()' is
# where we expect it to be.  This relies on the current way we
# position source code on the screen, which might change in the
# future.  The important part of this test is detecting the left/right
# scrolling, not which line main is actually on.
set line_num 6
set line [Term::get_line $line_num]
gdb_assert {[regexp -- "19\[\\t \]+main \\(\\)" $line]} \
    "check main is where we expect on the screen"
set regexp "19\[\\t \]+ain \\(\\)"
# Send a right arrow.
send_gdb "\033\[C"
if {[Term::wait_for $regexp]} {
    pass "scroll right"
} else {
    fail "scroll right"
}
set line [Term::get_line $line_num]
# Send a down arrow.
send_gdb "\033\[B"
if {[Term::wait_for $regexp] \
	&& [Term::get_line [expr {$line_num - 1}]] == $line} {
    pass "scroll down"
} else {
    fail "scroll down"
}

Term::check_box "source box" 0 0 80 15

Term::command "layout asm"
Term::check_contents "asm window shows main" "$hex <main>"

Term::check_box "asm box" 0 0 80 15

Term::command "layout split"
Term::check_contents "split layout contents" "21 *return 0.*$hex <main>"

Term::check_box "source box in split layout" 0 0 80 7
Term::check_box "asm box in split layout" 0 6 80 9
