# Copyright 2010-2019 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 } }
    }
}

# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}...
# Run a test named NAME, consisting of multiple lines of input.
# After each input line INPUT, search for result line RESULT.
# Succeed if all results are seen; fail otherwise.

proc gdb_py_test_multiple { name args } {
    global gdb_prompt
    foreach {input result} $args {
	if {[gdb_test_multiple $input "$name - $input" {
	    -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" {
		pass "$name - $input"
	    }
	}]} {
	    return 1
	}
    }
    return 0
}

# 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}
}
