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

gdb_test_multiple "python print 'hello, world!'" "verify python support" {
    -re "not supported.*$gdb_prompt $"	{
      unsupported "python support is disabled"
      return -1
    }
    -re "$gdb_prompt $"	{}
}

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"
