]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/testsuite] Add gdb.base/color-prompt.exp
authorTom de Vries <tdevries@suse.de>
Fri, 8 Aug 2025 08:51:18 +0000 (10:51 +0200)
committerTom de Vries <tdevries@suse.de>
Fri, 8 Aug 2025 08:51:18 +0000 (10:51 +0200)
After updating the documentation in commit cf03713dd1c ("[gdb/cli] Document
\001 and \002 usage for set prompt"), I started to wonder if I could reproduce
the CLI issue described in PR cli/28887 using the TUI.

That turned out not to be the case, but I noticed handling of the markers in
tui_puts and tui_puts_internal, and no test-case exercising this, so I
decided to add this.

After doing so in gdb.tui/color-prompt.exp, I realized I could use the same
code to test the CLI case.

Add test-case gdb.base/color-prompt.exp that shares code with
gdb.tui/color-prompt.exp in gdb.tui/color-prompt.exp.tcl.

For the CLI case, I was hoping to reproduce the behaviour described in the PR,
but it didn't trigger.

FTR, I manually reproduced the behaviour and used script to record it.  I
observed the following sequence after the C-a:
- ^M (CR)             : go to start of line
- ^[[K (EL)           : erase line
- ^M (CR)             : go to start of line
- ^[[31m(gdb) ^[[0m   : output prompt
- some long command   : output text
- ^M (CR)             : go to start of line
- ^[[C, 15 times (CUF): cursor forward 15 times
giving me:
...
(gdb) some long command
               ^
...

Perhaps we'll trigger this on some other os, or once we start using a
different TERM value.

Tested on x86_64-linux.

gdb/testsuite/gdb.base/color-prompt.exp [new file with mode: 0644]
gdb/testsuite/gdb.tui/color-prompt.exp
gdb/testsuite/gdb.tui/color-prompt.exp.tcl [new file with mode: 0644]
gdb/testsuite/lib/tuiterm.exp

diff --git a/gdb/testsuite/gdb.base/color-prompt.exp b/gdb/testsuite/gdb.base/color-prompt.exp
new file mode 100644 (file)
index 0000000..c037185
--- /dev/null
@@ -0,0 +1,29 @@
+# Copyright 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/>.
+
+# Check using a prompt with color in CLI.
+
+# Using tuiterm requires setting TERM on host.
+require {!is_remote host}
+
+# We use a tuiterm, which allows us to determine cursor position.
+tuiterm_env
+Term::clean_restart 8 80
+
+# We start with an empty screen, to generate a visible prompt.
+Term::gen_prompt
+
+set tui 0
+source $srcdir/$subdir/../gdb.tui/color-prompt.exp.tcl
index a95b24a749bd68e4ca9ba393d5a353749e05f85c..af6e46708e3ea20cad7ca447b1afdd5e6df4c238 100644 (file)
 
 # Check using a prompt with color in TUI.
 
+require allow_tui_tests
+
 tuiterm_env
 
 Term::clean_restart 24 80
 
-# Set colored prompt.
 if {![Term::enter_tui]} {
     unsupported "TUI not supported"
     return
 }
 
-Term::command "set prompt \\033\[31m(gdb) \\033\[0m"
-
-set line [Term::get_line_with_attrs $Term::_cur_row]
-gdb_assert { [regexp "^<fg:red>$gdb_prompt <fg:default> *$" $line] } \
-    "prompt with color"
+set tui 1
+source $srcdir/$subdir/color-prompt.exp.tcl
diff --git a/gdb/testsuite/gdb.tui/color-prompt.exp.tcl b/gdb/testsuite/gdb.tui/color-prompt.exp.tcl
new file mode 100644 (file)
index 0000000..e6f4d3b
--- /dev/null
@@ -0,0 +1,80 @@
+# Copyright 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/>.
+
+# Check using a prompt with color in TUI ($tui == 0) or CLI ($tui == 0).
+
+set csi [string cat {\033} "\["]
+set rl_prompt_start_ignore {\001}
+set rl_prompt_end_ignore {\002}
+
+foreach_with_prefix rl_prompt_start_end_ignore { 0 1 } {
+    set color_on [string cat $csi 31m]
+    set color_off [string cat $csi 0m]
+
+    if { $rl_prompt_start_end_ignore } {
+       set color_on \
+           [string cat \
+                $rl_prompt_start_ignore \
+                $color_on \
+                $rl_prompt_end_ignore]
+       set color_off \
+           [string cat \
+                $rl_prompt_start_ignore \
+                $color_off \
+                $rl_prompt_end_ignore]
+    }
+
+    # Set prompt with color.
+    set prompt "${color_on}(gdb) $color_off"
+    Term::command "set prompt $prompt"
+
+    # Check the color.
+    set line [Term::get_line_with_attrs $Term::_cur_row]
+    gdb_assert { [regexp "^<fg:red>$gdb_prompt <fg:default> *$" $line] } \
+       "prompt with color"
+
+    # Type a string.
+    set cmd "some long command"
+    send_gdb $cmd
+    Term::wait_for_line ^[string_to_regexp "(gdb) $cmd"] 23
+
+    # Send ^A, aka C-a, trigger beginning-of-line.
+    send_gdb "\001"
+    if { $tui || $rl_prompt_start_end_ignore } {
+       Term::wait_for_line ^[string_to_regexp "(gdb) $cmd"] 6
+    } else {
+       # Without the markers, readline may get the cursor position wrong, so
+       # match less strict.
+       Term::wait_for_line ^[string_to_regexp "(gdb) $cmd"]
+    }
+    Term::dump_screen
+
+    # Type something else to flush out the effect of the ^A.
+    set prefix "A"
+    send_gdb $prefix
+    if { $tui || $rl_prompt_start_end_ignore } {
+       Term::wait_for_line ^[string_to_regexp "(gdb) $prefix$cmd"] 7
+    } else {
+       # Without the markers, readline may get the cursor position wrong, so
+       # match less strict.
+       Term::wait_for_line [string_to_regexp "$prefix"]
+    }
+
+    # Abort command line editing, and regenerate prompt.
+    send_gdb "\003"
+
+    # Reset prompt to default prompt.
+    Term::command "set prompt (gdb) "
+}
index b83b8afdcecc5685d993538c56f95b75360c36d7..1e18a7aa9771e4d22a1ba2e333d622bb77746b4d 100644 (file)
@@ -886,6 +886,31 @@ namespace eval Term {
        return 1
     }
 
+    # Accept some output from gdb and update the screen.  Wait for the current
+    # screen line to match REGEXP and cursor position POS, unless POS is empty.
+    # Return 0 on timeout, 1 on success.
+    proc wait_for_line { regexp {pos ""} } {
+       variable _cur_row
+       variable _cur_col
+       variable _cols
+
+       while 1 {
+           if { [accept_gdb_output] == 0 } {
+               return 0
+           }
+
+           if { ![check_region_contents_p 0 $_cur_row $_cols 1 $regexp] } {
+               continue
+           }
+
+           if { $pos == "" || $_cur_col == $pos } {
+               break
+           }
+       }
+
+       return 1
+    }
+
     # Setup the terminal with dimensions ROWSxCOLS, TERM=ansi, and execute
     # BODY.
     proc with_tuiterm {rows cols body} {