# Copyright (C) 2022-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/>.

# Test related to source code highlighting and Python.  Includes a
# test for using the Pygments module as a fall back to GNU source
# highlight.
#
# This script also includes tests for handling a non-uft-8 character
# with both Pygments highlighting, and with gdb.execute (when using
# the list command).

require allow_python_tests

load_lib gdb-python.exp

standard_testfile

if { [build_executable "failed to build" ${testfile} ${srcfile}] == -1 } {
    return
}

set line_number [gdb_get_line_number "List this line."]

# Helper proc.  Run CMD, which should produce a source listing, and
# check if the source code is styled or not.  EXPECT_STYLED indicates
# if we expect the source listing to be styled or not.
proc check_source_listing_styling { cmd expect_styled { testname "" } } {
    if { $testname eq "" } {
	set testname $cmd
    }

    set seen_style_escape false
    gdb_test_multiple $cmd $testname {
	-re -wrap "Python Exception.*" {
	    fail $gdb_test_name
	    return
	}
	-re "\033" {
	    set seen_style_escape true
	    exp_continue
	}
	-re "$::gdb_prompt $" {
	    gdb_assert { $seen_style_escape == $expect_styled } \
		$gdb_test_name
	}
    }
}

# Check that the Python pygments module can be used for source
# highlighting when GNU source highlight is not available (or is
# disabled, as is done in this test).
proc test_pygments_styling {} {
    clean_restart $::binfile

    # Remote host boards disable styling via GDB's command line.  Turn
    # it back on now.
    if {[is_remote host]} {
	gdb_test "set style enabled on"
    }

    if { ![gdb_py_module_available "pygments"] } {
	unsupported "pygments module not available"
	return
    }

    if ![runto_main] {
	return
    }

    gdb_test_no_output "maint set gnu-source-highlight enabled off"

    gdb_test "maint flush source-cache" "Source cache flushed\\."

    check_source_listing_styling "list $::line_number" true
}

# Use gdb.execute to list source code containing non-utf-8 character.
# Check that initially GDB fails to convert the source code to a
# string, then set the correct host encoding, and try again.  This
# time the conversion should succeed.
proc test_gdb_execute_non_utf8_source {} {
    clean_restart $::binfile

    # The default host charset is utf-8, the source code contains a
    # non-utf-8 character, so this will fail.
    gdb_test \
	"python source = gdb.execute('list $::line_number', True, True)" \
	[multi_line \
	     "Python Exception <class 'UnicodeDecodeError'>: 'ascii' codec can't decode byte 0xc0 in position 250: ordinal not in range\\(128\\)" \
	     "Error occurred in Python: 'ascii' codec can't decode byte 0xc0 in position 250: ordinal not in range\\(128\\)"] \
	"gdb.execute fails to convert result to string"

    # Set the correct host charset, and try the conversion again.
    gdb_test_no_output "set host-charset ISO-8859-1"
    gdb_test_no_output \
	"python source = gdb.execute('list $::line_number', True, True)" \
	"gdb.execute does convert result to string"

    # Check that we captured something that looks like the expected source.
    gdb_test "python print(source)" ".*List this line.*"
}

# Use gdb.execute() to list source code.  Alternate between asking for
# styled, and unstyled source code.  In some cases we ask for the
# output to be returned via a string, and in other cases we ask for
# the output to be sent straight to stdout.
proc_with_prefix test_source_cache_style_tracking {} {
    clean_restart $::binfile

    # Remote host boards disable styling via GDB's command line.  Turn
    # it back on now.
    if {[is_remote host]} {
	gdb_test "set style enabled on"
    }

    gdb_test_no_output "set host-charset ISO-8859-1"

    # Commands which return styled, and non-styled source code mixed
    # together.  This ensures that the source cache will need to keep
    # discarding the entry with the wrong styling mode.  All of these
    # gdb.execute calls send their output via a string.
    check_source_listing_styling \
	"python print(gdb.execute('list $::line_number', to_string=True), end='')" \
	false
    check_source_listing_styling \
	"python print(gdb.execute('list $::line_number', to_string=True, styling=True), end='')" \
	true
    foreach from_tty { True False } {
	check_source_listing_styling \
	    "python print(gdb.execute('list $::line_number', $from_tty, True), end='')" \
	    false
	check_source_listing_styling \
	    "python print(gdb.execute('list $::line_number', $from_tty, True, True), end='')" \
	    true
	check_source_listing_styling \
	    "python print(gdb.execute('list $::line_number', $from_tty, True, False), end='')" \
	    false
    }

    # The same again, but this time the output is sent directly to
    # stdout.
    check_source_listing_styling \
	"python gdb.execute('list $::line_number')" \
	true
    check_source_listing_styling \
	"python gdb.execute('list $::line_number', to_string=False, styling=False)" \
	false
    check_source_listing_styling \
	"python gdb.execute('list $::line_number', to_string=False, styling=True)" \
	true
    foreach from_tty { True False } {
	check_source_listing_styling \
	    "python gdb.execute('list $::line_number', $from_tty, False, False)" \
	    false
	check_source_listing_styling \
	    "python gdb.execute('list $::line_number', $from_tty, False, True)" \
	    true
	check_source_listing_styling \
	    "python gdb.execute('list $::line_number', $from_tty, False)" \
	    true
    }
}

# We need an ANSI-capable terminal to get the output, additionally we
# need to set LC_ALL so GDB knows the terminal is UTF-8 capable,
# otherwise we'll get a UnicodeEncodeError trying to encode the
# output.
with_ansi_styling_terminal {
    test_pygments_styling
    test_gdb_execute_non_utf8_source
    test_source_cache_style_tracking
}
