# Copyright (C) 2012-2024 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 values to Python.

require allow_cplus_tests allow_python_tests

standard_testfile .cc

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

if ![runto_main] {
   return -1
}

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

gdb_test "python print (str(gdb.parse_and_eval(\"a\").type))" "const A &"
gdb_test "python print (str(gdb.parse_and_eval(\"a\").referenced_value().type))" "const A"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ref\").type))" "int &"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ref\").referenced_value().type))" "int"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ref\").referenced_value()))" "10"

gdb_test "python print (str(gdb.parse_and_eval(\"int_ptr_ref\").dereference().type))" "int"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ptr_ref\").referenced_value().type))" "int_ptr"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ptr_ref\").referenced_value().dereference()))" "10"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ptr_ref\").referenced_value().referenced_value()))" "10"

# Tests for gdb.Value[gdb.Field]
gdb_test_no_output "python b = gdb.parse_and_eval('b')" "init b"
gdb_test_no_output "python b_fields = b.type.fields()" "init b_fields"
gdb_test_no_output "python b_obj = gdb.parse_and_eval('b_obj')" "init b_obj"
gdb_test_no_output "python b_ref = gdb.parse_and_eval('b_ref')" "init b_ref"
gdb_test_no_output "python b_td = gdb.parse_and_eval('b_td')" "init b_td"
gdb_test_no_output "python u = gdb.parse_and_eval('u')" "init u"
gdb_test_no_output "python u_fields = u.type.fields()" "init u_fields"
gdb_test_no_output "python x = gdb.parse_and_eval('x')" "init x"
gdb_test_no_output "python x_fields = x.type.fields()" "init x_fields"
gdb_test_no_output "python uu = gdb.parse_and_eval('uu')" "init uu"
gdb_test_no_output "python uu_fields = uu.type.fields()" "init uu_fields"
gdb_test_no_output "python x_ptr = gdb.parse_and_eval('x_ptr')" "init x_ptr"
gdb_test_no_output "python xtd = gdb.parse_and_eval('xtd')" "init xtd"

gdb_test "python print(b\[b_fields\[1\]\])" "97 'a'" "b.a via field"
gdb_test "python print(b\[b_fields\[0\]\].type)" "A" \
  "type of b's base class via field"
gdb_test "python print(b\[b_fields\[0\]\]\['a'\])" "10" "b.A::a via field"

gdb_test "python print(b_obj\[b_fields\[1\]\])" "98 'b'" "b_obj->a via field"
gdb_test "python print(b_obj\[b_fields\[0\]\].type.target())" "A" \
  "type of b_obj's base class via field"
gdb_test "python print(b_obj\[b_fields\[0\]\]\['a'\])" "100" \
  "b_obj->A::a via field"

gdb_test "python print(b_ref\[b_fields\[1\]\])" "98 'b'" "b_ref.a via field"
gdb_test "python print(b_ref\[b_fields\[0\]\].type.target())" "A" \
  "type of b_ref's base class via field"
gdb_test "python print(b_ref\[b_fields\[0\]\]\['a'\])" "100" \
  "b_ref.A::a via field"

gdb_test "python print(b_td\[b_fields\[1\]\])" "98 'b'" "b_td.a via field"
gdb_test "python print(b_td\[b_fields\[0\]\].type.target())" "A" \
  "type of b_td's base class via field"
gdb_test "python print(b_td\[b_fields\[0\]\]\['a'\])" "100" \
  "b_td.A::a via field"

gdb_test "python print(hex(u\[u_fields\[0\]\]))" "0x63636363.*" \
    "u's first field via field"
gdb_test "python print(u\[u_fields\[1\]\])" "99.*" "u's second field via field"

gdb_test "python print(len(x_fields))" "2" "number for fields in u"
gdb_test "python print(x\[x_fields\[0\]\]\['x'\])" "101" "x.x via field"
gdb_test "python print(x\[x_fields\[1\]\]\['a'\])" "102" "x.a via field"
gdb_test "python print(x_ptr\[x_fields\[0\]\]\['x'\])" "101" "x_ptr->x via field"
gdb_test "python print(x_ptr\[x_fields\[1\]\]\['a'\])" "102" "x_ptr->a via field"
gdb_test "python print(xtd\[x_fields\[0\]\]\['x'\])" "101" "xtd->x via field"
gdb_test "python print(xtd\[x_fields\[1\]\]\['a'\])" "102" "xtd->a via field"

gdb_test "python print(len(uu_fields))" "2" "number of fields in uu"
gdb_test "python print(uu\[uu_fields\[0\]\]\['x'\])" "1000" "uu.x via field"
gdb_test "python print(uu\[uu_fields\[1\]\]\['a'\])" "1000" "uu.a via field"

# Test overloaded operators.
gdb_test_no_output "python a = gdb.parse_and_eval('a')" "init a"
gdb_test "python print(a + 5)" "10" "a + 5"

# Test inferior function calls of methods.
gdb_test "py print(b_obj\['static_func'\]())" "1111"
gdb_test "py print(b_obj\['arg0_func'\]())" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg0_func'\](b_obj))" "198"
gdb_test "py print(b_obj\['arg1_func'\]())" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg1_func'\](b_obj))" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg1_func'\](b_obj, 3))" "294"
gdb_test "py print(b_obj\['arg2_func'\]())" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg2_func'\](b_obj))" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg2_func'\](b_obj, 4))" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg2_func'\](b_obj, 5, 6))" "496"
