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

# Minimal testcase that just checks that the various "layout $foo"
# commands do not cause gdb to crash.

standard_testfile

if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} {
    return -1
}

if {[skip_tui_tests]} {
    return
}

# Test one layout command.  EXECUTION indicates whether to activate
# the layout with or without execution.

proc test_layout {layout execution} {
    global binfile gdb_prompt

    clean_restart $binfile

    if {$execution} {
	if ![runto_main] then {
	    return 0
	}
    }

    set test "layout command"
    gdb_test_multiple "layout $layout" $test {
	-re "$gdb_prompt $" {
	    pass $test
	}
    }
}

foreach_with_prefix execution {0 1} {
    foreach_with_prefix layout {"asm" "reg" "src" "split"} {
	test_layout $layout $execution
    }
}
