# 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 "\"" version][style "version" version][style "\" style" 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
}
