# Copyright 2018-2020 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

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

    set test_macros 0
    set options debug
    get_compiler_info
    if { [test_compiler_info "gcc-*"] || [test_compiler_info "clang-*"] } {
	lappend options additional_flags=-g3
	set test_macros 1
    }

    if {[prepare_for_testing "failed to prepare" $testfile $srcfile \
	     $options]} {
	return -1
    }

    if {![runto_main]} {
	fail "style tests failed"
	return
    }

    gdb_test_no_output "set style enabled on"

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

    gdb_test "frame" \
	"$main_expr.*$arg_expr.*$arg_expr.*$file_expr.*"
    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 styling"
    gdb_test_no_output "set style sources on"

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

    gdb_test "print &main" " = .* [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} {
	gdb_test_no_output "set width $width"
	# 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.
	gdb_test "frame" \
	    [multi_line \
		 "#0 *$main_expr.*$arg_expr.*" \
		 ".*$arg_expr.*" \
		 ".* at .*$file_expr.*" \
		 "\[0-9\]+.*return.* break here .*"
	    ] \
	    "frame when width=$width"
    }

    if {$test_macros} {
	gdb_test "info macro SOME_MACRO" \
	    "Defined at $base_file_expr:16\r\n#define SOME_MACRO 23"
    }

    set func [style some_called_function function]
    # Somewhere should see the call to the function.
    gdb_test "disassemble main" "[style $hex address].*$func.*"

    gdb_exit
    gdb_spawn

    set vers [style "GNU gdb.*" "35;1"]
    gdb_test "" "${vers}.*" \
	"version is styled"

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

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

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

    set quoted [string_to_regexp $binfile]
    gdb_test "file $binfile" \
	"Reading symbols from [style $quoted file]..." \
	"filename is styled when loading symbol file"

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

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

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