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

# This file is part of the GDB testsuite.
# It tests Guile-based pretty-printing for the CLI.

load_lib gdb-guile.exp

standard_testfile

# Start with a fresh gdb.
gdb_exit
gdb_start

# Skip all tests if Guile scripting is not enabled.
if { [skip_guile_tests] } { continue }

proc run_lang_tests {exefile lang} {
    global srcdir subdir srcfile testfile hex
    if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${exefile}" executable "debug $lang"] != "" } {
	untested "failed to compile in $lang mode"
	return
    }

    set nl "\[\r\n\]+"

    # Start with a fresh gdb.
    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load ${exefile}

    if ![gdb_guile_runto_main] {
	return
    }

    gdb_test_no_output "set print pretty on"

    gdb_test "b [gdb_get_line_number {break to inspect} ${testfile}.c ]" \
	".*Breakpoint.*"
    gdb_test "continue" ".*Breakpoint.*"

    set remote_scheme_file [gdb_remote_download host \
				${srcdir}/${subdir}/${testfile}.scm]

    gdb_scm_load_file ${remote_scheme_file}

    gdb_test "print ss" " = a=<a=<1> b=<$hex>> b=<a=<2> b=<$hex>>"
    gdb_test "print ssa\[1\]" " = a=<a=<5> b=<$hex>> b=<a=<6> b=<$hex>>"
    gdb_test "print ssa" " = {a=<a=<3> b=<$hex>> b=<a=<4> b=<$hex>>, a=<a=<5> b=<$hex>> b=<a=<6> b=<$hex>>}"

    gdb_test "print arraystruct" " = {$nl *y = 7, *$nl *x = {a=<23> b=<$hex>, a=<24> b=<$hex>} *$nl *}"

    if {$lang == "c++"} {
	gdb_test "print cps" "= a=<8> b=<$hex>"
	gdb_test "print cpss" " = {$nl *zss = 9, *$nl *s = a=<10> b=<$hex>$nl}"
	gdb_test "print cpssa\[0\]" " = {$nl *zss = 11, *$nl *s = a=<12> b=<$hex>$nl}"
	gdb_test "print cpssa\[1\]" " = {$nl *zss = 13, *$nl *s = a=<14> b=<$hex>$nl}"
	gdb_test "print cpssa" " = {{$nl *zss = 11, *$nl *s = a=<12> b=<$hex>$nl *}, {$nl *zss = 13, *$nl *s = a=<14> b=<$hex>$nl *}}"
	gdb_test "print sss" "= a=<15> b=<a=<8> b=<$hex>>"
	gdb_test "print ref" "= a=<15> b=<a=<8> b=<$hex>>"
	gdb_test "print derived" \
	    " = \{.*<Vbase1> = pp class name: Vbase1.*<Vbase2> = \{.*<VirtualTest> = pp value variable is: 1,.*members of Vbase2:.*_vptr.Vbase2 = $hex.*<Vbase3> = \{.*members of Vbase3.*members of Derived:.*value = 2.*"
	gdb_test "print ns " "\"embedded\\\\000null\\\\000string\""
	gdb_scm_test_silent_cmd "set print elements 3" "" 1
	gdb_test "print ns" "emb\.\.\.."
	gdb_scm_test_silent_cmd "set print elements 10" "" 1
	gdb_test "print ns" "embedded\\\\000n\.\.\.."
	gdb_scm_test_silent_cmd "set print elements 200" "" 1
    }

    if { ![is_address_zero_readable] } {
	gdb_test "print ns2" "<error reading variable: ERROR: Cannot access memory at address 0x0>"
    }

    gdb_test "print x" " = \"this is x\""
    gdb_test "print cstring" " = \"const string\""

    gdb_test "print estring" " = \"embedded x\\\\201\\\\202\\\\203\\\\204\""

    gdb_test_no_output "guile (set! *pp-ls-encoding* \"UTF-8\")"
    gdb_test "print estring2" "\"embedded \", <incomplete sequence \\\\302>"

    gdb_test_no_output "set guile print-stack full"
    gdb_test "print hint_error" "ERROR: Invalid display hint: 42\r\nhint_error_val"

    gdb_test "print c" " = container \"container\" with 2 elements = {$nl *.0. = 23,$nl *.1. = 72$nl}"

    gdb_test "print nstype" " = {$nl *.0. = 7,$nl *.1. = 42$nl}"

    gdb_test_no_output "set print pretty off"
    gdb_test "print nstype" " = {.0. = 7, .1. = 42}" \
	"print nstype on one line"

    gdb_continue_to_end
}

run_lang_tests "${binfile}" "c"
run_lang_tests "${binfile}-cxx" "c++"

# Run various other tests.

# Start with a fresh gdb.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![gdb_guile_runto_main] {
    return
}

set remote_scheme_file [gdb_remote_download host \
			    ${srcdir}/${subdir}/${testfile}.scm]

gdb_scm_load_file ${remote_scheme_file}

gdb_breakpoint [gdb_get_line_number "eval-break"]
gdb_continue_to_breakpoint "eval-break" ".* eval-break .*"

gdb_test "info locals" "eval9 = eval=<123456789>"

gdb_test "b [gdb_get_line_number {break to inspect} ${testfile}.c ]" \
    ".*Breakpoint.*"
gdb_test "continue" ".*Breakpoint.*"

gdb_test "print ss" " = a=<a=<1> b=<$hex>> b=<a=<2> b=<$hex>>" \
    "print ss enabled #1"

gdb_test_no_output "guile (disable-matcher!)"
gdb_test "print ss" " = {a = {a = 1, b = $hex}, b = {a = 2, b = $hex}}" \
    "print ss disabled"

gdb_test_no_output "guile (enable-matcher!)"
gdb_test "print ss" " = a=<a=<1> b=<$hex>> b=<a=<2> b=<$hex>>" \
    "print ss enabled #2"

gdb_test_no_output "guile (install-progspace-pretty-printers! (current-progspace))"
gdb_test "print ss" \
    " = a=<progspace a=<1> b=<$hex>> b=<progspace a=<2> b=<$hex>>" \
    "print ss via progspace"

gdb_test_no_output "guile (install-objfile-pretty-printers! (current-progspace) \"scm-pretty-print\")"
gdb_test "print ss" \
    " = a=<objfile a=<1> b=<$hex>> b=<objfile a=<2> b=<$hex>>" \
    "print ss via objfile"
