# Copyright (C) 2022-2024 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 checks for memory leaks
# associated with allocating and deallocation gdb.Inferior objects.

load_lib gdb-python.exp

standard_testfile

with_ansi_styling_terminal {
    # 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.
    if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } {
	return -1
    }

    if { ![allow_python_tests] } { continue }

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

    if ![runto_main] {
	return
    }

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

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

    set seen_style_escape false
    set line_number [gdb_get_line_number "List this line."]
    gdb_test_multiple "list ${line_number}" "" {
	-re "Python Exception.*" {
	    fail $gdb_test_name
	}
	-re "\033" {
	    set seen_style_escape true
	    exp_continue
	}
	-re "$gdb_prompt $" {
	    gdb_assert { $seen_style_escape }
	    pass $gdb_test_name
	}
    }
}
