# Copyright (C) 2025-2026 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 the output of gdb.execute can be styled or not depending
# on the value of the third argument passed to gdb.execute.

require allow_python_tests
require {!is_remote host}

load_lib gdb-python.exp

# Use gdb.execute() to run CMD passing different argument values.  The
# output should match either STYLED_RE or UNSTYLED_RE depending on
# whether the 'styling' argument is True or False.
proc do_gdb_execute { cmd styled_re unstyled_re } {
    gdb_test "python gdb.execute('$cmd')" $styled_re

    foreach from_tty { True False } {
	gdb_test \
	    "python gdb.execute('$cmd', $from_tty)" \
	    $styled_re
	gdb_test \
	    "python gdb.execute('$cmd', $from_tty, False)" \
	    $styled_re
	gdb_test \
	    "python gdb.execute('$cmd', $from_tty, False, True)" \
	    $styled_re
	gdb_test \
	    "python gdb.execute('$cmd', $from_tty, False, False)" \
	    $unstyled_re
	gdb_test \
	    "python print(gdb.execute('$cmd', $from_tty, True), end='')" \
	    $unstyled_re
	gdb_test \
	    "python print(gdb.execute('$cmd', $from_tty, True, False), end='')" \
	    $unstyled_re
	gdb_test \
	    "python print(gdb.execute('$cmd', $from_tty, True, True), end='')" \
	    $styled_re
    }
}

# Test that the output from gdb.execute is styled or not based on the
# arguments passed in.
proc test_gdb_execute_styling {} {
    clean_restart

    # Two possible outputs, BASIC_RE, the unstyled output text, or
    # STYLED_RE, the same things, but with styling applied.
    set text "\"version\" style"
    set styled_text [style $text version]
    set basic_re "The $text foreground color is: \[^\r\n\]+"
    set styled_re "The $styled_text foreground color is: \[^\r\n\]+"

    # The command we'll run.  It's output matches the above regexp.
    set show_style_version_cmd "show style version foreground"

    # Another command we'll run.  The output of this command is never
    # styled, but we run this to check that the output doesn't change
    # even when gdb.execute() asks for styled, or unstyled output.
    set show_style_enabled_cmd "show style enabled"

    with_test_prefix "with style enabled on" {
	do_gdb_execute $show_style_version_cmd $styled_re $basic_re

	# This time, print the value of 'show style enabled'.  This
	# output is unstyled, so there's only one regexp.  The
	# interesting thing here is that we don't expect the output to
	# change, even when gdb.execute() is printing unstyled output.
	# The "styling=False" argument to gdb.execute() is separate to
	# the 'set style enabled on|off' setting.
	set re "CLI output styling is enabled\\."
	do_gdb_execute $show_style_enabled_cmd $re $re
    }

    gdb_test_no_output "set style enabled off"

    with_test_prefix "with style enabled off" {
	# With 'set style enabled off' in use, even a request to
	# gdb.execute() to produce styled output should produce
	# unstyled output.  The assumption is that 'set style enabled
	# off' is done by the user, while the gdb.execute() is likely
	# from some Python extension.  The users request for no
	# styling overrules the extensions request for styled output.
	do_gdb_execute $show_style_version_cmd $basic_re $basic_re

	# Now check that even when we request styled output, the 'show
	# style enabled' value is always reported as disabled.
	set re "CLI output styling is disabled\\."
	do_gdb_execute $show_style_enabled_cmd $re $re
    }
}

# Run the tests.
with_ansi_styling_terminal {
    test_gdb_execute_styling
}
