# 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 TUI resizing with empty windows.

tuiterm_env

standard_testfile

Term::clean_restart 24 80

if {![Term::enter_tui]} {
    unsupported "TUI not supported"
    return
}

# Each entry describes a layout.  It has these items:
# 1. Layout name
# 2. Test name
# 3. List of boxes in 80x24 mode
# 4. List of boxes in 90x40 mode
# 5. List of test name and text for the empty window
set layouts {
    {src src {{0 0 80 15}} {{0 0 90 26}}
	{{"no source" "No Source Available"}}}
    {regs src-regs {{0 0 80 7} {0 6 80 9}} {{0 0 90 13} {0 12 90 13}}
	{
	    {"no source" "No Source Available"}
	    {"no regs" "Register Values Unavailable"}
	}}
    {asm asm {{0 0 80 13}} {{0 0 90 26}}
	{
	    {"no asm" "No Assembly Available"}
	}}
    {regs asm-regs {{0 0 80 7} {0 6 80 9}} {{0 0 90 13} {0 12 90 13}}
	{
	    {"no asm" "No Assembly Available"}
	    {"no regs" "Register Values Unavailable"}
	}}
    {split split {{0 0 80 6} {0 5 80 8}} {{0 0 90 13} {0 12 90 13}}
	{
	    {"no source" "No Source Available"}
	    {"no asm" "No Assembly Available"}
	}}
    {regs split-regs {{0 0 80 6} {0 5 80 8}} {{0 0 90 13} {0 12 90 13}}
	{
	    {"no asm" "No Assembly Available"}
	    {"no regs" "Register Values Unavailable"}
	}}
}

# Helper function to verify a list of boxes.
proc check_boxes {boxes} {
    set boxno 1
    foreach box $boxes {
	eval Term::check_box [list "box $boxno"] $box
	incr boxno
    }
}

# Helper function to verify text.
proc check_text {text_list} {
    set text [Term::get_all_lines]
    foreach item $text_list {
	lassign $item testname check
	if {![gdb_assert {[regexp -- $check $text]} $testname]} {
	    Term::dump_screen
	}
    }
}

foreach layout $layouts {
    lassign $layout name testname small_boxes large_boxes text_list

    with_test_prefix $testname {
	Term::command "layout $name"
	with_test_prefix 80x24 {
	    check_boxes $small_boxes
	    check_text $text_list
	}

	Term::resize 40 90
	with_test_prefix 90x40 {
	    check_boxes $large_boxes
	    check_text $text_list
	}
	Term::resize 24 80
    }
}
