# Copyright (C) 2016-2022 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/>.

# Test method calls.

load_lib rust-support.exp
if {[skip_rust_tests]} {
    return
}

standard_testfile .rs
if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug rust}]} {
    return -1
}

set line [gdb_get_line_number "set breakpoint 1 here"]
if {![runto ${srcfile}:$line]} {
    untested "could not run to breakpoint"
    return -1
}

gdb_test "print x" " = methods::HasMethods \\{value: 0\\}"

gdb_test "print methods::HasMethods{value: 73}" \
    " = methods::HasMethods \\{value: 73\\}"
gdb_test "print methods::HasMethods{..x}" \
    " = methods::HasMethods \\{value: 0\\}"
gdb_test "print methods::HasMethods{value:19, ..x}" \
    " = methods::HasMethods \\{value: 19\\}"

gdb_test "print x.take()" " = methods::HasMethods \\{value: 0\\}"
gdb_test "print *(x.incr())" " = methods::HasMethods \\{value: 1\\}"
gdb_test "print *((&mut x).incr())" " = methods::HasMethods \\{value: 2\\}"

gdb_test "print a.value()" " = 23"
gdb_test "print (&mut a).value()" " = 23"
# gdb_test "print a.take_value().0" " = 23"
gdb_test "print b.value()" " = 24"

gdb_test "print c.value()" " = 452"

set line [gdb_get_line_number "set breakpoint 2 here"]
gdb_breakpoint ${srcfile}:$line
gdb_continue_to_breakpoint "second breakpoint"

gdb_test "print *self" " = 23"


gdb_test "info functions HasMethods::new" \
    "fn methods::HasMethods::new\\(\\) -> methods::HasMethods;"

