# Copyright 2018-2021 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 CLI output styling.

standard_testfile

# Compile the test executable.
set test_macros 0
set options debug
get_compiler_info
if { [test_compiler_info "gcc-*"] } {
    lappend options additional_flags=-g3
    set test_macros 1
} elseif { [test_compiler_info "clang-*"] } {
    lappend options additional_flags=-fdebug-macro
    set test_macros 1
}

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

# The tests in this file are run multiple times with GDB's styles
# disabled one at a time.  This variable is the style that is
# currently disabled.
set currently_disabled_style ""

# A wrapper around the 'style' function found in gdb-utils.exp,
# filter out requests for the disabled style.
proc limited_style { str style } {
    global currently_disabled_style

    if { $style != $currently_disabled_style } {
	return [style $str $style]
    }

    return $str
}

# A wrapper around 'clean_restart' from gdb.exp, this performs the
# normal clean_restart, but then disables the currently disabled
# style.
proc clean_restart_and_disable { args } {
    global currently_disabled_style

    eval "clean_restart $args"

    if { $currently_disabled_style != "" } {
	set st $currently_disabled_style
	gdb_test_no_output "set style $st background none" ""
	gdb_test_no_output "set style $st foreground none" ""
	gdb_test_no_output "set style $st intensity normal" ""
    }
}

# The core of this test script.  Run some tests of different aspects
# of GDB's styling.
#
# Within this proc always use LIMITED_STYLE instead of STYLE, and
# CLEAN_RESTART_AND_DISABLE instead of CLEAN_RESTART, this ensures
# that the test operates as expected as styles are disabled.
proc run_style_tests { } {
    global testfile srcfile hex binfile test_macros
    global currently_disabled_style decimal hex

    save_vars { env(TERM) } {
	# We need an ANSI-capable terminal to get the output.
	setenv TERM ansi

	# Restart GDB with the correct TERM variable setting, this
	# means that GDB will enable styling.
	clean_restart_and_disable ${binfile}

	set readnow [readnow]

	if {![runto_main]} {
	    return
	}

	# Check that the source highlighter has not stripped away the
	# leading newlines.
	set main_line [gdb_get_line_number "break here"]
	gdb_test "list $main_line,$main_line" "return.*some_called_function.*"

	gdb_test_no_output "set style enabled off"

	set argv ""
	gdb_test_multiple "frame" "frame without styling" {
	    -re -wrap "main \\(argc=.*, (argv=$hex)\\).*style\\.c:\[0-9\].*" {
		set argv $expect_out(1,string)
		pass $gdb_test_name
	    }
	}

	gdb_test_no_output "set style enabled on"

	set main_expr [limited_style main function]
	set base_file_expr [limited_style ".*style\\.c" file]
	set file_expr "$base_file_expr:\[0-9\]+"
	set arg_expr [limited_style "arg." variable]

	gdb_test "frame" \
	    [multi_line \
		 "#0\\s+$main_expr\\s+\\($arg_expr=$decimal,\\s+$arg_expr=$hex\\)\\s+at\\s+$file_expr" \
		 "\[0-9\]+\\s+.*return.* break here .*"]
	gdb_test "info breakpoints" "$main_expr at $file_expr.*"

	gdb_test_no_output "set style sources off"
	gdb_test "frame" \
	    "\r\n\[^\033\]*break here.*" \
	    "frame without sources styling"
	gdb_test_no_output "set style sources on"

	gdb_test "break -q main" "file $base_file_expr.*"

	gdb_test "print &main" " = .* [limited_style $hex address] <$main_expr>"

	# Regression test for a bug where line-wrapping would occur at
	# the wrong spot with styling.  There were different bugs at
	# different widths, so try two.
	foreach width {20 30} {
	    set argv_len [string length $argv]
	    if { $argv_len == 0 } {
		continue
	    }

	    # There was also a bug where the styling could be wrong in
	    # the line listing; this is why the words from the source
	    # code are spelled out in the final result line of the
	    # test.
	    set re1_styled \
		[multi_line \
		     "#0\\s+$main_expr\\s+\\($arg_expr=$decimal,\\s+" \
		     "\\s+$arg_expr=$hex\\)" \
		     "\\s+at\\s+$file_expr" \
		     "\[0-9\]+\\s+.*return.* break here .*"]
	    set re2_styled \
		[multi_line \
		     "#0\\s+$main_expr\\s+\\($arg_expr=.*" \
		     "\\s+$arg_expr=$hex\\)\\s+at\\s+$file_expr" \
		     "\[0-9\]+\\s+.*return.* break here .*"]

	    # The length of the line containing argv containing:
	    # - 4 leading spaces
	    # - argv string
	    # - closing parenthesis
	    set line_len [expr 4 + $argv_len + 1]

	    if { $line_len > $width } {
		# At on the next line.
		set re_styled $re1_styled
	    } else {
		# At on the same line as argv.
		set re_styled $re2_styled
	    }

	    gdb_test_no_output "set width $width"
	    gdb_test "frame" $re_styled "frame when width=$width"
	}

	# Reset width back to 0.
	gdb_test_no_output "set width 0" ""

	if {$test_macros} {
	    set macro_line [gdb_get_line_number "\#define SOME_MACRO"]
	    gdb_test "info macro SOME_MACRO" \
		"Defined at $base_file_expr:$macro_line\r\n#define SOME_MACRO 23"
	}

	gdb_test_no_output "set width 0"

	set main [limited_style main function]
	set func [limited_style some_called_function function]
	# Somewhere should see the call to the function.
	gdb_test "disassemble main" \
	    [concat "Dump of assembler code for function $main:.*" \
		 "[limited_style $hex address].*$func.*"]

	set ifield [limited_style int_field variable]
	set sfield [limited_style string_field variable]
	set efield [limited_style e_field variable]
	set evalue [limited_style VALUE_TWO variable]
	gdb_test "print struct_value" \
	    "\{$ifield = 23,.*$sfield = .*,.*$efield = $evalue.*"

	set ffield [limited_style field variable]
	set cstart [string_to_regexp "/* XXX "]
	set cend [string_to_regexp " */"]
	set p1field [limited_style "$cstart.*$decimal.*-bit.*padding.*$cend" \
			 highlight]
	set p2field [limited_style "$cstart.*$decimal.*-byte.*padding.*$cend" \
			 highlight]

	gdb_test "ptype/o just_bitfield_value" \
	    [multi_line \
		 ".* type = struct just_bitfield {" \
		 ".* unsigned int $ffield : 3;" \
		 "$p1field" \
		 "$p2field" \
		 "" \
		 ".* total size.*: *$decimal *$cend" \
		 " *}.*"]

	set address_style_expr [limited_style ".*\".*address.*\".*style.*" address]
	set color "blue"
	if { $currently_disabled_style == "address" } {
	    set color "none"
	}
	gdb_test "show style address foreground" \
	    "The ${address_style_expr} foreground color is: ${color}" \
	    "style name and style word styled using its own style in show style"

	set aliases_expr [limited_style ".*aliases.*" title]
	set breakpoints_expr [limited_style ".*breakpoints.*" title]
	gdb_test "help" \
	    [multi_line \
		 "List of classes of commands:" \
		 "" \
		 "${aliases_expr} -- User-defined aliases of other commands\." \
		 "${breakpoints_expr} -- Making program stop at certain points\." \
		 ".*" \
		] \
	    "help classes of commands styled with title"

	set taas_expr  [limited_style ".*taas.*" title]
	set tfaas_expr  [limited_style ".*tfaas.*" title]
	set cut_for_thre_expr [limited_style "cut for 'thre" highlight]
	gdb_test "apropos -v cut for 'thre" \
	    [multi_line \
		 "" \
		 "${taas_expr}" \
		 "Apply a command to all .*" \
		 "Usage:.*" \
		 "short${cut_for_thre_expr}ad apply.*" \
		 "" \
		 "${tfaas_expr}" \
		 "Apply a command to all .*" \
		 "Usage:.*" \
		 "short${cut_for_thre_expr}ad apply.*" \
		]

	clean_restart_and_disable

	set quoted [string_to_regexp $binfile]
	set pass_re "Reading symbols from [limited_style $quoted file]\.\.\."
	if { $readnow } {
	    set pass_re \
		[multi_line \
		     $pass_re \
		     "Expanding full symbols from [limited_style $quoted file]\.\.\."]
	}
	gdb_test "file $binfile" \
	    $pass_re \
	    "filename is styled when loading symbol file" \
	    "Are you sure you want to change the file.*" \
	    "y"

	gdb_test "pwd" "Working directory [limited_style .*? file].*"

	gdb_test_no_output "set print repeat 3"
	gdb_test "print {0,0,0,0,0,0,0,0}" \
	    " = \\{0 [limited_style {<repeats.*8.*times>} metadata]\\}"

	gdb_test "show logging file" \
	    "The current logfile is \"[limited_style .*? file]\"\\..*"

	# Check warnings are styled by setting a rubbish data
	# directory.
	gdb_test "set data-directory Makefile" \
	    "warning: [limited_style .*? file] is not a directory\\..*"
	gdb_test "show data-directory" \
	    "GDB's data directory is \"[limited_style .*? file]\"\\..*"

	# Check that deprecation styles command names.
	gdb_test_no_output "maintenance deprecate p \"new_p\"" \
	    "maintenance deprecate p \"new_p\" /1/"
	gdb_test "p 5" \
	    "Warning: '[limited_style p title]', an alias for the command '[limited_style print title]', is deprecated.*Use '[limited_style new_p title]'.*" \
	    "p deprecated warning, with replacement"

	# Check that the version string is styled in the output of 'show
	# version', and that this styling can be disabled.
	set vers [style "GNU gdb.*" version]
	gdb_test "show version" "${vers}.*" \
	    "version is styled in 'show version'"
    }
}

# A separate test from the above as the styled text this checks can't
# currently be disabled (the text is printed too early in GDB's
# startup process).
proc test_startup_version_string { } {
    gdb_exit
    gdb_spawn

    # Deliberate use of base STYLE proc here as the style of the
    # startup version string can't (currently) be controlled.
    set vers [style "GNU gdb.*" version]
    gdb_test "" "${vers}.*" "version is styled at startup"
}


# Run tests with all styles in their default state.
with_test_prefix "all styles enabled" {
    run_style_tests
}

# Now, for each style in turn.  Disable that style only and run the
# test again.  Things in that style should NOT now be styled.
foreach style { title file function highlight variable \
		    address metadata } {
    set currently_disabled_style $style
    with_test_prefix "disable style $style" {
	run_style_tests
    }
}

# Finally, check the styling of the version string during startup.
test_startup_version_string
