# Copyright (C) 2012-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 the convenience
# functions in strfns.py.

load_lib gdb-python.exp

require allow_python_tests

standard_testfile

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

if {![runto_main]} {
    return 0
}

proc test_all_strfns { } {
    gdb_test "p \$_streq (str1, str2)" " = 1"
    gdb_test "p \$_streq (str1, str3)" " = 0"

    gdb_test "p \$_strlen (str1)" " = 6"
    gdb_test "p \$_strlen (buf1)" " = 0"

    gdb_test "p \$_memeq (buf1, buf2, 4)" " = 1"
    gdb_test "p \$_memeq (buf1, buf3, 4)" " = 0"

    gdb_test {p $_regex (str1, "Hello")} " = 1"
    gdb_test {p $_regex (str1, "Help")} " = 0"
    gdb_test {p $_regex (str1, "^Hello")} " = 1"
    gdb_test {p $_regex (str1, "^Hello.$")} " = 1"
}

test_all_strfns

# Verify use in a conditional breakpoint.

gdb_breakpoint [gdb_get_line_number "Break func here."]
gdb_test_no_output "condition \$bpnum \$_streq (arg, \"Goodbye.\")"
gdb_continue_to_breakpoint "Break func here."
gdb_test "p arg" "= $hex <str3> \"Goodbye.\""

gdb_breakpoint [gdb_get_line_number "Break bfunc here."]
gdb_test_no_output "condition \$bpnum \$_memeq (arg, buf3, 4)"
gdb_continue_to_breakpoint "Break bfunc here."
gdb_test "p /d {char\[4\]} arg" "= \\{0, 1, 2, 4\\}"

# Verify use on a core file.

proc test_strfns_core_file { } {
    global gdb_prompt testfile

    set filename [standard_output_file py-strfns.core]

    if {![gdb_gcore_cmd "$filename" "save a corefile"]} {
	# No use proceeding from here.
	return
    }

    clean_restart $testfile

    gdb_test_multiple "core $filename" \
	"re-load generated corefile" \
	{
	    -re "Core was generated by .*$gdb_prompt $" {
		pass "re-load generated corefile"
	    }
	    -re ".*$gdb_prompt $" {
		fail "re-load generated corefile"
		# No use proceeding from here.
		return
	    }
	}

    with_test_prefix "for corefile" {
	test_all_strfns
    }
}

test_strfns_core_file
