# Copyright 2010-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 that the logic for displaying the TUI disassembly window
# handles very long lines.

standard_testfile

set ccopts {debug quiet}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "$binfile" \
	  executable $ccopts] != "" } {
    # Maybe the compiler can't handle arbitrarily long identifier names.
    # Try with a shorter version.
    lappend ccopts "additional_flags=-DSHORT_IDENTIFIERS"
    if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "$binfile" \
	      executable $ccopts] != "" } {
	untested "compile"
	return -1
    }
}

clean_restart "$binfile"

if {[skip_tui_tests]} {
    # TUI support is disabled.  Check for error message.
    gdb_test "layout asm" "Undefined command: \"layout\".  Try \"help\"."
    return
}

# Just check the command does not cause gdb to crash.
gdb_test "layout asm"
