blob: e7a9e4fec5fbeec754861218e1c3a074ebe8a5ad [file] [log] [blame]
# Copyright (C) 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/>.
# This file is part of the GDB testsuite. It tests gdb.Color and how this
# interacts with GDB's pagination system.
load_lib gdb-python.exp
require allow_python_tests
require {!is_remote host}
standard_testfile
set pyfile [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py]
set str "<[string repeat - 78]>"
# These define all the default attributes for a style: background
# color, intensity, italics, and underlined.
set other_attr ";49;22;23;24;27"
# These colors set the foreground color only. Everything else is the
# default.
set black "(?:\033\\\[30${other_attr}m)"
set red "(?:\033\\\[31${other_attr}m)"
set green "(?:\033\\\[32${other_attr}m)"
set yellow "(?:\033\\\[33${other_attr}m)"
set blue "(?:\033\\\[34${other_attr}m)"
set magenta "(?:\033\\\[35${other_attr}m)"
set cyan "(?:\033\\\[36${other_attr}m)"
set white "(?:\033\\\[37${other_attr}m)"
set any_color "(?:${black}|${red}|${green}|${yellow}|${blue}|${magenta}|${cyan}|${white})"
# Run the command 'TYPE-fill MODE' which fills the screen with output and
# triggers the pagination prompt. Check that styling is applied correctly
# to the output.
proc test_pagination { type mode } {
# Start with a fresh GDB, but enable color support.
with_ansi_styling_terminal {
clean_restart
}
gdb_test_no_output "source $::pyfile" "source the script"
gdb_test_no_output "set width 80"
gdb_test_no_output "set height 15"
set saw_bad_color_handling false
set expected_restore_color ""
set last_color ""
gdb_test_multiple "$type-fill $mode" "" {
-re "^$type-fill $mode\r\n" {
exp_continue
}
-re "^(${::any_color})(${::any_color})$::str" {
# After a continuation prompt GDB will restore the previous
# color, and then we immediately switch to a new color.
set restored_color $expect_out(1,string)
if { $restored_color ne $expected_restore_color } {
set saw_bad_color_handling true
}
set last_color $expect_out(2,string)
exp_continue
}
-re "^(${::any_color})$::str" {
# This pattern matches printing STR in all cases that are not
# immediately after a pagination prompt. In this case there is
# a single escape sequence to set the color.
set last_color $expect_out(1,string)
exp_continue
}
-re "^\033\\\[${::decimal}m$::str" {
# This catches the case where the color's escape sequence has
# not been converted back into a full style. This indicates
# something went wrong in the pager_file::puts function.
set saw_bad_color_handling true
exp_continue
}
-re "^\033\\\[m$::pagination_prompt$" {
# After a pagination prompt we expect GDB to restore the last
# color.
set expected_restore_color $last_color
# Send '\n' to view more output.
send_gdb "\n"
exp_continue
}
-re "^$::pagination_prompt$" {
# After a pagination prompt we expect GDB to restore the last
# color.
set expected_restore_color $last_color
# If we didn't see a color reset sequence before the pagination
# prompt, then the prompt will have been printed in the wrong
# color, this is a GDB bug.
set saw_bad_color_handling true
# Send '\n' to view more output.
send_gdb "\n"
exp_continue
}
-re "^\r\n" {
# The matches the newline sent to the continuation prompt.
exp_continue
}
-re "^\033\\\[m\r\n$::gdb_prompt $" {
gdb_assert { !$saw_bad_color_handling } $gdb_test_name
}
}
}
foreach_with_prefix type { color } {
foreach_with_prefix mode { write print } {
test_pagination $type $mode
}
}