# Copyright 2014-2025 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

require allow_cplus_tests allow_python_tests

standard_testfile py-xmethods.cc

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

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 "ptype a1.getarrayind" \
    "There is no member or method named getarrayind\\." \
    "before: ptype a1.getarrayind"

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 "ptype a1.getarrayind" \
  "There is no member or method named getarrayind\\." \
  "after: ptype a1.getarrayind"

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.*" \
  "after: g.mul<char>('a')"
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."

# Verify `max-value-size' obedience with `gdb.Value.const_value'.
gdb_test "p a1.getarray()" \
  "From Python <A_getarray>.* = \\{0, 1, 2, 3, 4, 5, 6, 7, 8, 9\\}" \
  "after: a1.getarray"
gdb_test "p b1.getarray()" \
  "From Python <B_getarray>.* = \\{0, 1, 2, 3, 4, 5, 6, 7, 8, 9\\}" \
  "after: b1.getarray"
gdb_test_no_output "python gdb.set_parameter('max-value-size', 16)"
gdb_test "p a1.getarray()" \
  "From Python <A_getarray>.*value requires $decimal bytes,\
   which is more than max-value-size" \
  "after: a1.getarray, max-value-size"
gdb_test "p b1.getarray()" \
  "From Python <B_getarray>.*value requires $decimal bytes,\
   which is more than max-value-size" \
  "after: b1.getarray, max-value-size"
