# Copyright 2010-2021 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/>.

# Utilities for python-scripting related tests.

# Run a command in GDB, and report a failure if a Python exception is thrown.
# If report_pass is true, report a pass if no exception is thrown.

proc gdb_py_test_silent_cmd { cmd name report_pass } {
    global gdb_prompt

    gdb_test_multiple $cmd $name {
	-re "Traceback.*$gdb_prompt $" { fail $name }
	-re "$gdb_prompt $"            { if $report_pass { pass $name } }
    }
}

# Return the result of python expression EXPR.  DEFAULT is returned if
# there's an error.  TEST is the test message to use.  It can be
# omitted, in which case a test message is built from EXP.  This is
# modeled after get_integer_valueof.

proc get_python_valueof { exp default {test ""} } {
    global gdb_prompt

    if {$test == ""} {
	set test "get python valueof \"${exp}\""
    }

    set val ${default}
    gdb_test_multiple "python print (\"valueof: %s\" % (${exp}))" "$test" {
	-re "valueof: (\[^\r\n\]*)\[\r\n\]*$gdb_prompt $" {
	    set val $expect_out(1,string)
	    pass "$test"
	}
	timeout {
	    fail "$test (timeout)"
	}
    }
    return ${val}
}
