# 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
# for defining new GDB commands in 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 }

# Test a simple command.

gdb_py_test_multiple "input simple command" \
  "python" "" \
  "class test_cmd (gdb.Command):" "" \
  "  def __init__ (self):" "" \
  "    super (test_cmd, self).__init__ (\"test_cmd\", gdb.COMMAND_OBSCURE)" "" \
  "  def invoke (self, arg, from_tty):" "" \
  "    print \"test_cmd output, arg = %s\" % arg" "" \
  "test_cmd ()" "" \
  "end" ""

gdb_test "test_cmd ugh" "test_cmd output, arg = ugh" "call simple command"

# Test a prefix command, and a subcommand within it.

gdb_py_test_multiple "input prefix command" \
  "python" "" \
  "class prefix_cmd (gdb.Command):" "" \
  "  def __init__ (self):" "" \
  "    super (prefix_cmd, self).__init__ (\"prefix_cmd\", gdb.COMMAND_OBSCURE, gdb.COMPLETE_NONE, True)" "" \
  "  def invoke (self, arg, from_tty):" "" \
  "    print \"prefix_cmd output, arg = %s\" % arg" "" \
  "prefix_cmd ()" "" \
  "end" ""

gdb_test "prefix_cmd ugh" "prefix_cmd output, arg = ugh" "call prefix command"

gdb_py_test_multiple "input subcommand" \
  "python" "" \
  "class subcmd (gdb.Command):" "" \
  "  def __init__ (self):" "" \
  "    super (subcmd, self).__init__ (\"prefix_cmd subcmd\", gdb.COMMAND_OBSCURE)" "" \
  "  def invoke (self, arg, from_tty):" "" \
  "    print \"subcmd output, arg = %s\" % arg" "" \
  "subcmd ()" "" \
  "end" ""

gdb_test "prefix_cmd subcmd ugh" "subcmd output, arg = ugh" "call subcmd"

# Test prefix command using keyword arguments.

gdb_py_test_multiple "input prefix command, keyword arguments" \
  "python" "" \
  "class prefix_cmd2 (gdb.Command):" "" \
  "  def __init__ (self):" "" \
  "    super (prefix_cmd2, self).__init__ (\"prefix_cmd2\", gdb.COMMAND_OBSCURE, prefix = True, completer_class = gdb.COMPLETE_FILENAME)" "" \
  "  def invoke (self, arg, from_tty):" "" \
  "    print \"prefix_cmd2 output, arg = %s\" % arg" "" \
  "prefix_cmd2 ()" "" \
  "end" ""

gdb_test "prefix_cmd2 argh" "prefix_cmd2 output, arg = argh" "call prefix command, keyword arguments"

gdb_py_test_multiple "input subcommand under prefix_cmd2" \
  "python" "" \
  "class subcmd (gdb.Command):" "" \
  "  def __init__ (self):" "" \
  "    super (subcmd, self).__init__ (\"prefix_cmd2 subcmd\", gdb.COMMAND_OBSCURE)" "" \
  "  def invoke (self, arg, from_tty):" "" \
  "    print \"subcmd output, arg = %s\" % arg" "" \
  "subcmd ()" "" \
  "end" ""

gdb_test "prefix_cmd2 subcmd ugh" "subcmd output, arg = ugh" "call subcmd under prefix_cmd2"

# Test a subcommand in an existing GDB prefix.

gdb_py_test_multiple "input new subcommand" \
  "python" "" \
  "class newsubcmd (gdb.Command):" "" \
  "  def __init__ (self):" "" \
  "    super (newsubcmd, self).__init__ (\"info newsubcmd\", gdb.COMMAND_OBSCURE)" "" \
  "  def invoke (self, arg, from_tty):" "" \
  "    print \"newsubcmd output, arg = %s\" % arg" "" \
  "newsubcmd ()" "" \
  "end" ""

gdb_test "info newsubcmd ugh" "newsubcmd output, arg = ugh" "call newsubcmd"

# Test a command that throws gdb.GdbError.

gdb_py_test_multiple "input command to throw error" \
  "python" "" \
  "class test_error_cmd (gdb.Command):" "" \
  "  def __init__ (self):" "" \
  "    super (test_error_cmd, self).__init__ (\"test_error_cmd\", gdb.COMMAND_OBSCURE)" "" \
  "  def invoke (self, arg, from_tty):" "" \
  "    raise gdb.GdbError ('you lose!')" "" \
  "test_error_cmd ()" "" \
  "end" ""

gdb_test "test_error_cmd ugh" "you lose!" "call error command"

# Test gdb.string_to_argv.

gdb_test "python print gdb.string_to_argv (\"1 2 3\")" \
  {\['1', '2', '3'\]} \
  "string_to_argv (\"1 2 3\")"

gdb_test "python print gdb.string_to_argv (\"'1 2' 3\")" \
  {\['1 2', '3'\]} \
  "string_to_argv (\"'1 2' 3\")"

gdb_test "python print gdb.string_to_argv ('\"1 2\" 3')" \
  {\['1 2', '3'\]} \
  "string_to_argv ('\"1 2\" 3')"

gdb_test "python print gdb.string_to_argv ('1\\ 2 3')" \
  {\['1 2', '3'\]} \
    "string_to_argv ('1\\ 2 3')"
