# Copyright (C) 2015-2026 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 lazy string support
# not tested by py-prettyprinter.exp.

load_lib gdb-python.exp

require allow_python_tests

standard_testfile

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

if {![runto_main ]} {
    return -1
}

gdb_breakpoint [gdb_get_line_number "break here"]
gdb_continue_to_breakpoint "break here"

gdb_py_test_silent_cmd "python null = gdb.parse_and_eval(\"null\")" "get null value" 1

gdb_py_test_silent_cmd "python nullstr = null.lazy_string(length=0)" "create a null lazy string" 1
gdb_test "python print (nullstr.length)" "0" "null lazy string length"
gdb_test "python print (nullstr.address)" "0" "null lazy string address"
gdb_test "python print (nullstr.type)" "const char \\*" "null lazy string type"
gdb_test "python print(nullstr.value())" \
    "gdb.MemoryError.*: Cannot create a value from NULL.*Error occurred in Python.*" \
    "create value from NULL"
gdb_test "python print(null.lazy_string(length=3).value())" \
    "gdb.MemoryError.*: Cannot create a lazy string with address 0x0, and a non-zero length.*Error occurred in Python.*" \
    "null lazy string with non-zero length"
gdb_test "python print(null.lazy_string(length=-2))" \
    "ValueError.*: Invalid length.*Error occurred in Python.*" \
    "bad length"
gdb_py_test_silent_cmd "python nullstr = null.lazy_string()" \
    "create null lazy string with default length" 1

foreach var_spec { { "ptr" "pointer" "const char \\*" -1 } \
		   { "array" "array" "const char \\[6\\]" 6 } \
		   { "typedef_ptr" "typedef pointer" "pointer" -1 } } {
    set var [lindex $var_spec 0]
    set value [lindex $var_spec 1]
    set type [lindex $var_spec 2]
    set length [lindex $var_spec 3]
    with_test_prefix $var {
	gdb_test "print $var" "\"$value\""
	gdb_py_test_silent_cmd "python $var = gdb.history (0)" "get value from history" 1
	gdb_py_test_silent_cmd "python l$var = $var.lazy_string()" "acquire lazy string" 1
	gdb_test "python print ($var.type)" "$type" "string type name equality"
	gdb_test "python print (l$var.type)" "$type" "lazy-string type name equality"
	gdb_test "python print (l$var.length)" "$length" "lazy string length"
	gdb_test "python print (l$var.value())" "\"$value\"" "lazy string value"
	gdb_py_test_silent_cmd "python l2$var = $var.lazy_string(length=2)" "acquire lazy string, length 2" 1
	gdb_test "python print (l2$var.length)" "2" "lazy string length 2"
	gdb_test "python print (l2$var.value())" "\"[string range $value 0 1]\"" "lazy string length 2 value"
	# This test will have to wait until gdb can handle it. There's no way,
	# currently, to internally specify an array of length zero in the C
	# language support.  PR 20786
	#gdb_test "python print ($var.lazy_string(length=0).value())" "\"\"" "empty lazy string value"
    }
}

gdb_py_test_silent_cmd "python nas = gdb.parse_and_eval('not_a_string')" \
    "get not_a_string" 1
gdb_test "python print(nas.lazy_string())" \
    "Cannot make lazy string from this object"
