# 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 the "winheight" command.

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
}

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

Term::command "winheight cmd +5"
Term::check_box "smaller source box" 0 0 80 10

Term::command "winheight cmd -5"
Term::check_box "larger source box" 0 0 80 15

Term::command "winheight src -5"
Term::check_box "smaller source box again" 0 0 80 10

Term::command "winheight src +5"
Term::check_box "larger source box again" 0 0 80 15

# At one point we had a bug where adjusting the winheight would result
# in GDB keeping hold of duplicate window pointers, which it might
# then try to delete when the layout was changed.  Running this test
# under valgrind would expose that bug.
Term::command "layout asm"
Term::check_box "check for asm window" 0 0 80 15

