]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/testsuite] Add Term::dump_box in lib/tuiterm.exp
authorTom de Vries <tdevries@suse.de>
Tue, 5 Oct 2021 23:27:58 +0000 (01:27 +0200)
committerTom de Vries <tdevries@suse.de>
Tue, 5 Oct 2021 23:27:58 +0000 (01:27 +0200)
Factor out new proc Term::get_region and use it to implement a
new proc Term::dump_box, similar to Term::dump_screen.

Tested on x86_64-linux.

gdb/testsuite/lib/tuiterm.exp

index 222583f291fb53b3a566111c3a42df89efb68c3f..a0197402b1fff66543471e9aca55cb66a9162ddf 100644 (file)
@@ -772,28 +772,38 @@ namespace eval Term {
        }
     }
 
-    # Check that the region of the screen described by X, Y, WIDTH,
-    # and HEIGHT match REGEXP.  This is like check_contents except
-    # only part of the screen is checked.  This can be used to check
-    # the contents within a box (though check_box_contents is a better
-    # choice for boxes with a border).
-    proc check_region_contents { test_name x y width height regexp } {
+    # Get the region of the screen described by X, Y, WIDTH,
+    # and HEIGHT, and separate the lines using SEP.
+    proc get_region { x y width height sep } {
        variable _chars
 
-       # Now grab the contents of the box, join each line together
-       # with a '\r\n' sequence and match against REGEXP.
+       # Grab the contents of the box, join each line together
+       # using $sep.
        set result ""
        for {set yy $y} {$yy < [expr {$y + $height}]} {incr yy} {
            if {$yy > $y} {
                # Add the end of line sequence only if this isn't the
                # first line.
-               append result "\r\n"
+               append result $sep
            }
            for {set xx $x} {$xx < [expr {$x + $width}]} {incr xx} {
                append result [lindex $_chars($xx,$yy) 0]
            }
        }
+       return $result
+    }
+
+    # Check that the region of the screen described by X, Y, WIDTH,
+    # and HEIGHT match REGEXP.  This is like check_contents except
+    # only part of the screen is checked.  This can be used to check
+    # the contents within a box (though check_box_contents is a better
+    # choice for boxes with a border).
+    proc check_region_contents { test_name x y width height regexp } {
+       variable _chars
 
+       # Now grab the contents of the box, join each line together
+       # with a '\r\n' sequence and match against REGEXP.
+       set result [get_region $x $y $width $height "\r\n"]
        if {![gdb_assert {[regexp -- $regexp $result]} $test_name]} {
            dump_screen
        }
@@ -831,6 +841,20 @@ namespace eval Term {
        }
     }
 
+    # A debugging function to dump a box from the current screen, with line
+    # numbers.
+    proc dump_box { x y width height } {
+       verbose -log "Box Dump ($width x $height) @ ($x, $y):"
+       set region [get_region $x $y $width $height "\n"]
+       set lines [split $region "\n"]
+       set nr $y
+       foreach line $lines {
+           set fmt [format %5d $nr]
+           verbose -log "$fmt $line"
+           incr nr
+       }
+    }
+
     # Resize the terminal.
     proc _do_resize {rows cols} {
        variable _chars