aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.tui/tui-layout-asm.exp
blob: 333276ecc271ff54dd2257700154a029b5c4b6a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# Copyright 2020-2025 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/>.

# Ensure that 'layout asm' before starting the inferior puts us in the
# asm layout and displays the disassembly for main.

tuiterm_env

standard_testfile tui-layout.c

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

# The wider the window is, the less line truncation happens, so matching
# pre-scroll to post-scroll lines is more accurate.  But 100% accurate line
# matching isn't a goal of the test-case.
set tui_asm_window_width 90

Term::clean_restart 24 ${tui_asm_window_width} $testfile
if {![Term::prepare_for_tui]} {
    unsupported "TUI not supported"
    return
}

# This puts us into TUI mode, and should display the ASM window.
Term::command_no_prompt_prefix "layout asm"
Term::check_box_contents "check asm box contents" 0 0 ${tui_asm_window_width} 15 "<main>"

set re_border [string_to_regexp "|"]

proc drop_borders { line } {
    # Drop left border.
    set line [regsub -- ^$::re_border $line {}]
    # Drop right border.
    set line [regsub -- $::re_border$ $line {}]

    return $line
}

proc lines_match { line1 line2 } {
    set line1 [drop_borders $line1]
    set line2 [drop_borders $line2]

    foreach line [list $line1 $line2] re [list $line2 $line1] {
	# Convert to regexp.
	set re [string_to_regexp $re]

	# Ignore whitespace mismatches.
	regsub -all {\s+} $re {\s+} re

	# Allow a substring match.
	if { [regexp -- $re $line] } {
	    return 1
	}
    }

    return 0
}

# Scroll the ASM window down using the down arrow key.  In an ideal
# world we'd like to use PageDown here, but currently our terminal
# library doesn't support such advanced things.
set testname "scroll to end of assembler"
set down_count 0
while (1) {
    # Grab the second line, this is about to become the first line.
    set line [Term::get_line 2]

    # Except, if the second line is blank then we are at the end of
    # the available asm output.  Pressing down again _shouldn't_
    # change the output, however, if GDB is working, and we press down
    # then the screen won't change, so the call to Term::wait_for
    # below will just timeout.  So for now we avoid testing the edge
    # case.
    if {[regexp -- "^\\| +\\|$" $line]} {
	# Second line is blank, we're at the end of the assembly.
	pass "$testname (end of assembly reached)"
	break
    }

    # Send the down key to GDB.
    send_gdb "\033\[B"
    incr down_count

    # Get address from the line.
    regexp \
	[join \
	     [list \
		  ^ \
		  $re_border \
		  {\s+} \
		  ($hex) \
		  {\s+}] \
	     ""] \
	$line \
	match \
	address

    # Regexp to match line containing address.
    set re_line \
	[join \
	     [list \
		  ^ \
		  $re_border \
		  {\s+} \
		  $address \
		  {\s+} \
		  {[^\r\n]+} \
		  $re_border \
		  $] \
	     ""]

    if {[Term::wait_for $re_line] \
	    && [lines_match $line [Term::get_line 1]]} {
	# We scrolled successfully.
    } else {
	fail "$testname (scroll failed)"
	Term::dump_screen
	break
    }

    if { $down_count > 25 } {
	# We've scrolled enough, we're done.
	pass "$testname (scroll limit reached)"
	break
    }
}