# Copyright (C) 2012-2013 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

standard_testfile

if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
    return -1
}

if ![runto_main] {
    return 0
}

# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }

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 objdir subdir gdb_prompt testfile

    set filename "${objdir}/${subdir}/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
	    }
	}

    test_all_strfns
}

test_strfns_core_file
