# Copyright (C) 2009, 2010 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 mechanism
# exposing convenience functions to Python.

if $tracelevel then {
    strace $tracelevel
}

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

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

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

gdb_py_test_multiple "input convenience function" \
  "python" "" \
  "class test_func (gdb.Function):" "" \
  "  def __init__ (self):" "" \
  "    super (test_func, self).__init__ (\"test_func\")" "" \
  "  def invoke (self, arg):" "" \
  "    return \"test_func output, arg = %s\" % arg.string ()" "" \
  "test_func ()" "" \
  "end" ""

gdb_test "print \$test_func (\"ugh\")" "= \"test_func output, arg = ugh\"" "call function"

# Test returning a gdb.Value from the function. This segfaulted GDB at one point.

gdb_py_test_multiple "input value-returning convenience function" \
  "python" "" \
  "class Double (gdb.Function):" "" \
  "  def __init__ (self):" "" \
  "    super (Double, self).__init__ (\"double\")" "" \
  "  def invoke (self, n):" "" \
  "    return n*2" "" \
  "Double ()" "" \
  "end" ""

gdb_test "print \$double (1)" "= 2" "call value-returning function"

gdb_py_test_multiple "input int-returning function" \
  "python" "" \
  "class Yes(gdb.Function):" "" \
  "    def __init__(self):" "" \
  "        gdb.Function.__init__(self, 'yes')" "" \
  "    def invoke(self):" "" \
  "        return 1" "" \
  "Yes ()" "" \
  "end" ""

gdb_test "print \$yes() && \$yes()" " = 1" "call yes with &&"
gdb_test "print \$yes() || \$yes()" " = 1" "call yes with ||"
