# Copyright (C) 2009-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 mechanism
# exposing values to Python.

load_lib gdb-python.exp

standard_testfile

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

# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }

# The following tests require execution.

if ![runto_main] then {
    fail "can't run to main"
    return 0
}

gdb_breakpoint [gdb_get_line_number "Block break here."]
gdb_continue_to_breakpoint "Block break here."
gdb_py_test_silent_cmd "python bf1 = gdb.selected_frame ()" "get frame" 0

# Test Frame.architecture() method.
gdb_py_test_silent_cmd "python show_arch_str = gdb.execute(\"show architecture\", to_string=True)" "show arch" 0
gdb_test "python print (bf1.architecture().name() in show_arch_str)" "True" "test Frame.architecture()"

# First test that read_var is unaffected by PR 11036 changes.
gdb_test "python print (bf1.read_var(\"i\"))" "\"stuff\"" "test i"
gdb_test "python print (bf1.read_var(\"f\"))" "\"foo\"" "test f"
gdb_test "python print (bf1.read_var(\"b\"))" "\"bar\"" "test b"

# Test the read_var function in another block other than the current
# block (in this case, the super block). Test thar read_var is reading
# the correct variables of i and f but they are the correct value and type.
gdb_py_test_silent_cmd "python sb = bf1.block().superblock" "get superblock" 0
gdb_test "python print (bf1.read_var(\"i\", sb))" "1.1.*" "test i = 1.1"
gdb_test "python print (bf1.read_var(\"i\", sb).type)" "double" "test double i"
gdb_test "python print (bf1.read_var(\"f\", sb))" "2.2.*" "test f = 2.2"
gdb_test "python print (bf1.read_var(\"f\", sb).type)" "double" "test double f"

# And again test another outerblock, this time testing "i" is the
# correct value and type.
gdb_py_test_silent_cmd "python sb = sb.superblock" "get superblock" 0
gdb_test "python print (bf1.read_var(\"i\", sb))" "99" "test i = 99"
gdb_test "python print (bf1.read_var(\"i\", sb).type)" "int" "test int i"

gdb_breakpoint "f2"
gdb_continue_to_breakpoint "breakpoint at f2"
gdb_py_test_silent_cmd "python bframe = gdb.selected_frame()" \
    "get bottommost frame" 0
gdb_test "up" ".*" ""

gdb_py_test_silent_cmd "python f1 = gdb.selected_frame ()" "get second frame" 0
gdb_py_test_silent_cmd "python f0 = f1.newer ()" "get first frame" 0

gdb_test "python print (f1 == gdb.newest_frame())" False \
    "selected frame -vs- newest frame"
gdb_test "python print (bframe == gdb.newest_frame())" True \
    "newest frame -vs- newest frame"

gdb_test "python print ('result = %s' % (f0 == f1))" " = False" "test equality comparison (false)"
gdb_test "python print ('result = %s' % (f0 == f0))" " = True" "test equality comparison (true)"
gdb_test "python print ('result = %s' % (f0 != f1))" " = True" "test inequality comparison (true)"
gdb_test "python print ('result = %s' % (f0 != f0))" " = False" "test inequality comparison (false)"
gdb_test "python print ('result = %s' % f0.is_valid ())" " = True" "test Frame.is_valid"
gdb_test "python print ('result = %s' % f0.name ())" " = f2" "test Frame.name"
gdb_test "python print ('result = %s' % (f0.type () == gdb.NORMAL_FRAME))" " = True" "test Frame.type"
gdb_test "python print ('result = %s' % (f0.unwind_stop_reason () == gdb.FRAME_UNWIND_NO_REASON))" " = True" "test Frame.type"
gdb_test "python print ('result = %s' % gdb.frame_stop_reason_string (gdb.FRAME_UNWIND_INNER_ID))" " = previous frame inner to this frame \\(corrupt stack\\?\\)" "test gdb.frame_stop_reason_string"
gdb_test "python print ('result = %s' % f0.pc ())" " = \[0-9\]+" "test Frame.pc"
gdb_test "python print ('result = %s' % (f0.older () == f1))" " = True" "test Frame.older"
gdb_test "python print ('result = %s' % (f1.newer () == f0))" " = True" "test Frame.newer"
gdb_test "python print ('result = %s' % f0.read_var ('variable_which_surely_doesnt_exist'))" \
  "ValueError: Variable 'variable_which_surely_doesnt_exist' not found.*Error while executing Python code." \
  "test Frame.read_var - error"
gdb_test "python print ('result = %s' % f0.read_var ('a'))" " = 1" "test Frame.read_var - success"

gdb_test "python print ('result = %s' % (gdb.selected_frame () == f1))" " = True" "test gdb.selected_frame"

# Can read SP register.
gdb_test "python print ('result = %s' % (gdb.selected_frame ().read_register ('sp') == gdb.parse_and_eval ('\$sp')))" \
  " = True" \
  "test Frame.read_register(sp)"

# PC value obtained via read_register is as expected.
gdb_test "python print ('result = %s' % (f0.read_register('pc') == f0.pc()))" \
  " = True" \
  "test Frame.read_register(pc)"

# Test arch-specific register name.
set pc ""
if {[is_amd64_regs_target]} {
    set pc "rip"
} elseif {[is_x86_like_target]} {
    set pc "eip"
}
if { $pc != "" } {
    gdb_test "python print ('result = %s' % (f0.read_register('pc') == f0.read_register('$pc')))" \
	" = True" \
	"test Frame.read_register($pc)"
}
