# Copyright 2019-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 that logging does not style.

# Do not run if gdb debug is enabled as it will interfere with log redirect.
if {[gdb_debug_enabled]} {
    untested "debug is enabled"
    return 0
}

if {[is_remote host]} {
    untested "does not work on remote host"
    return 0
}

standard_testfile style.c

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

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

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

    gdb_test_no_output "set style enabled on"

    set log_name [standard_output_file log.txt]
    gdb_test_no_output "set logging file $log_name" \
	"set logging filename"
    gdb_test_no_output "set logging overwrite on"
    gdb_test "set logging on" "Copying output to .*"

    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 "set logging off" "Done logging to .*"

    set fd [open $log_name]
    set data [read -nonewline $fd]
    close $fd

    set testname "log is escape-free"
    if {[regexp "\033" $data]} {
	fail $testname
    } else {
	pass $testname
    }
}
