# Copyright 2024-2025 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 printing of string-like objects larger than the maximum value
# size.

require allow_dap_tests

load_lib dap-support.exp

standard_testfile

if {[build_executable ${testfile}.exp $testfile] == -1} {
    return
}

save_vars GDBFLAGS {
    append GDBFLAGS " -iex \"set max-value-size 16\""

    if {[dap_initialize] == ""} {
	return
    }
}

set launch_id [dap_launch $testfile]

set line [gdb_get_line_number "STOP"]
set obj [dap_check_request_and_response "set breakpoint by line number" \
	     setBreakpoints \
	     [format {o source [o path [%s]] breakpoints [a [o line [i %d]]]} \
		  [list s $srcfile] $line]]
set line_bpno [dap_get_breakpoint_number $obj]

dap_check_request_and_response "configurationDone" configurationDone

dap_check_response "launch response" launch $launch_id

dap_wait_for_event_and_check "stopped at line breakpoint" stopped \
    "body reason" breakpoint \
    "body hitBreakpointIds" $line_bpno

set bt [lindex [dap_check_request_and_response "backtrace" stackTrace \
		    {o threadId [i 1]}] \
	    0]
set frame_id [dict get [lindex [dict get $bt body stackFrames] 0] id]

set scopes [dap_check_request_and_response "get scopes" scopes \
		[format {o frameId [i %d]} $frame_id]]
set scopes [dict get [lindex $scopes 0] body scopes]

lassign $scopes scope reg_scope
gdb_assert {[dict get $scope name] == "Locals"} "scope is locals"
gdb_assert {[dict get $scope namedVariables] == 1} "one var in scope"

set num [dict get $scope variablesReference]
set refs [lindex [dap_check_request_and_response "fetch variable" \
		      "variables" \
		      [format {o variablesReference [i %d] count [i 1]} \
			   $num]] \
	      0]

foreach var [dict get $refs body variables] {
    gdb_assert {[dict get $var name] == "the_string"} "variable name"
    # The result looks strange here, but only because TON does not
    # handle the backslash-quote sequence properly when decoding the
    # JSON.  The actual JSON is: "value": "\"DEI\"".
    gdb_assert {[dict get $var value] == "\\\"this is a string longer than 16 bytes\\\""} \
	"variable value"
}

dap_shutdown
