# Copyright 2014-2020 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 debug methods
# feature in the Python extension language.

load_lib gdb-python.exp

if { [skip_cplus_tests] } {
    untested "skipping C++ tests"
    return
}

standard_testfile py-xmethods.cc

if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} {
    return -1
}

# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } {
    untested "skipping Python tests"
    return
}

if ![runto_main] {
   return -1
}

set xmethods_script [gdb_remote_download host \
		     ${srcdir}/${subdir}/${testfile}.py]

gdb_breakpoint [gdb_get_line_number "Break here."]
gdb_continue_to_breakpoint "Break here" ".*Break here.*"

# Tests before loading the debug methods.
gdb_test "p a1 + a2" ".* = 15" "before: a1 + a2"
gdb_test "p a_plus_a" ".* = 1" "before: a_plus_a 1"

gdb_test "p a2 - a1" ".* = 5" "before: a2 - a1"
gdb_test "p a_minus_a" ".* = 1" "before: a_minus_a 1"

gdb_test "p b1 - a1" ".* = 25" "before: b1 - a1"
gdb_test "p a_minus_a" ".* = 2" "before: a_minus_a 2"

gdb_test "p a1.geta()" ".* = 5" "before: a1.geta()"
gdb_test "p a_geta" ".* = 1" "before: a_geta 1"

gdb_test "p ++a1" "No symbol.*" "before: ++a1"
gdb_test "p a1.getarrayind(5)" "Couldn't find method.*" \
  "before: a1.getarrayind(5)"

gdb_test "p a_ptr->geta()" ".* = 60" "before: a_ptr->geta()"
gdb_test "p b_geta" ".* = 1" "before: b_geta 1"

gdb_test "p e.geta()" ".* = 100" "before: e.geta()"
gdb_test "p a_geta" ".* = 2" "before: a_geta 2"

# Since g.size_diff operates of sizes of int and float, do not check for
# actual result value as it could be different on different platforms.
gdb_test "p g.size_diff<float>()" ".*" "before: call g.size_diff<float>()"
gdb_test "p g_size_diff" ".* = 2" "before: g_size_diff 2"

gdb_test "p g.size_diff<unsigned long>()" "Couldn't find method.*" \
  "before: g.size_diff<unsigned long>()"

gdb_test "p g.size_mul<2>()" ".*" "before: g.size_mul<2>()"
gdb_test "p g_size_mul" ".* = 2" "before: g_size_mul 2"

gdb_test "p g.size_mul<5>()" "Couldn't find method.*" \
  "before: g.size_mul<5>()"

gdb_test "p g.mul<double>(2.0)" ".* = 10" "before: g.mul<double>(2.0)"
gdb_test "p g_mul" ".* = 2" "before: g_mul 2"

gdb_test "p g.mul<char>('a')" "Couldn't find method.*" \
  "before: g.mul<char>('a')"

# Load the script which adds the debug methods.
gdb_test_no_output "source ${xmethods_script}" "load the script file"

# Tests after loading debug methods.
gdb_test "p a1 + a2" "From Python <A_plus_A>.*15" "after: a1 + a2"

gdb_test "p a2 - a1" ".* = 5" "after: a2 - a1"
gdb_test "p a_minus_a" ".* = 3" "after: a_minus_a 3"

gdb_test "p b1 + a1" "From Python <A_plus_A>.*35" "after: b1 + a1"

gdb_test "p b1 - a1" ".* = 25" "after: b1 - a1"
gdb_test "p a_minus_a" ".* = 4" "after: a_minus_a 4"

gdb_test "p a1.geta()" "From Python <A_geta>.*5" "after: a1.geta()"
gdb_test "p ++a1" "From Python <plus_plus_A>.*6" "after: ++a1"
gdb_test "p a1.getarrayind(5)" "From Python <A_getarrayind>.*5" \
  "after: a1.getarrayind(5)"
gdb_test "p a1\[6\]" ".*int &.*6" "after a1\[\]"
gdb_test "p b1\[7\]" ".*const int &.*7" "after b1\[\]"
# Note the following test.  Xmethods on dynamc types are not looked up
# currently.  Hence, even though a_ptr points to a B object, the xmethod
# defined for A objects is invoked.
gdb_test "p a_ptr->geta()" "From Python <A_geta>.*30" "after: a_ptr->geta()"
gdb_test "p e.geta()" "From Python <A_geta>.*100" "after: e.geta()"
gdb_test "p e_ptr->geta()" "From Python <A_geta>.*100" "after: e_ptr->geta()"
gdb_test "p e_ref.geta()" "From Python <A_geta>.*100" "after: e_ref.geta()"
gdb_test "p e.method(10)" "From Python <E_method_int>.* = void" \
  "after: e.method(10)"
gdb_test "p e.method('a')" "From Python <E_method_char>.* = void" \
  "after: e.method('a')"
gdb_test "p g.size_diff<float>  ()" "From Python G<>::size_diff.*" \
  "after: g.size_diff<float>()"
gdb_test "p g.size_diff<  unsigned long  >()" "From Python G<>::size_diff.*" \
  "after: g.size_diff<unsigned long>()"
gdb_test "p g.size_mul<2>()" "From Python G<>::size_mul.*" \
  "after: g.size_mul<2>()"
gdb_test "p g.size_mul<  5  >()" "From Python G<>::size_mul.*" \
  "after: g.size_mul<  5  >()"
gdb_test "p g.mul<double>(2.0)" "From Python G<>::mul.*" \
  "after: g.mul<double>(2.0)"
gdb_test "p g.mul<char>('a')" "From Python G<>::mul.*" \
gdb_test "p g_ptr->mul<char>('a')" "From Python G<>::mul.*" \
  "after: g_ptr->mul<char>('a')"

# Tests for 'disable/enable xmethod' command.
gdb_test_no_output "disable xmethod progspace G_methods" \
  "disable G_methods"
gdb_test "p g.mul<char>('a')" "Couldn't find method.*" \
  "g.mul<char>('a') after disabling G_methods"
gdb_test_no_output "enable xmethod progspace G_methods" \
  "dnable G_methods"
gdb_test "p g.mul<char>('a')" "From Python G<>::mul.*" \
  "after enabling G_methods"
gdb_test_no_output "disable xmethod progspace G_methods;mul" \
  "disable G_methods;mul"
gdb_test "p g.mul<char>('a')" "Couldn't find method.*" \
  "g.mul<char>('a') after disabling G_methods;mul"
gdb_test_no_output "enable xmethod progspace G_methods;mul" \
  "enable G_methods;mul"
gdb_test "p g.mul<char>('a')" "From Python G<>::mul.*" \
  "after enabling G_methods;mul"

# Test for 'info xmethods' command
gdb_test "info xmethod global plus" "global.*plus_plus_A" \
  "info xmethod global plus 1"
gdb_test_no_output "disable xmethod progspace E_methods;method_int" \
  "disable xmethod progspace E_methods;method_int"
gdb_test "info xmethod progspace E_methods;method_int" ".* \\\[disabled\\\]" \
  "info xmethod xmethods E_methods;method_int"
gdb_test_no_output "disable xmethod progspace G_methods" "disable G_methods 2"
gdb_test "info xmethod progspace" ".*G_methods \\\[disabled\\\].*"

# PR 18285
# First make sure both are enabled.
gdb_test_no_output "enable xmethod progspace E_methods;method_char"
gdb_test_no_output "enable xmethod progspace E_methods;method_int"
gdb_test "pt e.method('a')" "type = void"
gdb_test "pt e.method(10)" \
    "NotImplementedError.*Error while fetching result type of an xmethod worker defined in Python."
