# Copyright (C) 2010-2013 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 $testfile.exp $testfile $srcfile debug]} {
    return -1
}

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

# Test looking up a global symbol before we runto_main as this is the
# point where we don't have a current frame, and we don't want to
# require one.
gdb_py_test_silent_cmd "python main_func = gdb.lookup_global_symbol(\"main\")" "Lookup main" 1
gdb_test "python print (main_func.is_function)" "True" "Test main_func.is_function"
gdb_test "python print (gdb.lookup_global_symbol(\"junk\"))" "None" "Test lookup_global_symbol(\"junk\")"

gdb_test "python print (gdb.lookup_global_symbol('main').value())" "$hex .main." \
    "print value of main"

set qq_line [gdb_get_line_number "line of qq"]
gdb_test "python print (gdb.lookup_global_symbol('qq').line)" "$qq_line" \
    "print line number of qq"

gdb_test "python print (gdb.lookup_global_symbol('qq').value())" "72" \
    "print value of qq"

gdb_test "python print (gdb.lookup_global_symbol('qq').needs_frame)" \
    "False" \
    "print whether qq needs a frame"


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

global hex decimal

gdb_breakpoint [gdb_get_line_number "Block break here."]
gdb_continue_to_breakpoint "Block break here."
gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0
gdb_py_test_silent_cmd "python block = frame.block()" "Get block" 0

# Test is_argument attribute.
gdb_py_test_silent_cmd "python arg = gdb.lookup_symbol(\"arg\")" "Get variable a" 0
gdb_test "python print (arg\[0\].is_variable)" "False" "Test arg.is_variable"
gdb_test "python print (arg\[0\].is_constant)" "False" "Test arg.is_constant"
gdb_test "python print (arg\[0\].is_argument)" "True" "Test arg.is_argument"
gdb_test "python print (arg\[0\].is_function)" "False" "Test arg.is_function"

# Test is_function attribute.
gdb_py_test_silent_cmd "python func = frame.block().function" "Get block" 0
gdb_test "python print (func.is_variable)" "False" "Test func.is_variable"
gdb_test "python print (func.is_constant)" "False" "Test func.is_constant"
gdb_test "python print (func.is_argument)" "False" "Test func.is_argument"
gdb_test "python print (func.is_function)" "True" "Test func.is_function"
gdb_test "python print (func.name)" "func" "Test func.name"
gdb_test "python print (func.print_name)" "func" "Test func.print_name"
gdb_test "python print (func.linkage_name)" "func" "Test func.linkage_name"
gdb_test "python print (func.addr_class == gdb.SYMBOL_LOC_BLOCK)" "True" "Test func.addr_class"

gdb_breakpoint [gdb_get_line_number "Break at end."]
gdb_continue_to_breakpoint "Break at end."
gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0

# Test is_variable attribute.
gdb_py_test_silent_cmd "python a = gdb.lookup_symbol(\'a\')" "Get variable a" 0
gdb_test "python print (a\[0\].is_variable)" "True" "Test a.is_variable"
gdb_test "python print (a\[0\].is_constant)" "False" "Test a.is_constant"
gdb_test "python print (a\[0\].is_argument)" "False" "Test a.is_argument"
gdb_test "python print (a\[0\].is_function)" "False" "Test a.is_function"
gdb_test "python print (a\[0\].addr_class == gdb.SYMBOL_LOC_COMPUTED)" "True" "Test a.addr_class"

gdb_test "python print (a\[0\].value())" \
    "symbol requires a frame to compute its value.*"\
    "try to print value of a without a frame"
gdb_test "python print (a\[0\].value(frame))" "0" \
    "print value of a"
gdb_test "python print (a\[0\].needs_frame)" "True" \
    "print whether a needs a frame"

# Test is_constant attribute
gdb_py_test_silent_cmd "python t = gdb.lookup_symbol(\"one\")" "Get variable a" 0
gdb_test "python print (t\[0\].is_variable)" "False" "Test t.is_variable"
gdb_test "python print (t\[0\].is_constant)" "True" "Test t.is_constant"
gdb_test "python print (t\[0\].is_argument)" "False" "Test t.is_argument"
gdb_test "python print (t\[0\].is_function)" "False" "Test t.is_function"
gdb_test "python print (t\[0\].addr_class == gdb.SYMBOL_LOC_CONST)" "True" "Test t.addr_class"

# Test type attribute.
gdb_test "python print (t\[0\].type)" "enum tag" "Get type"

# Test symtab attribute.
gdb_test "python print (t\[0\].symtab)" "gdb.python/py-symbol.c.*" "Get symtab"

# C++ tests
# Recompile binary.
 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}-cxx" executable "debug c++"] != "" } {
     untested "Couldn't compile ${srcfile} in c++ mode"
     return -1
 }

# Start with a fresh gdb.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}-cxx

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

gdb_breakpoint [gdb_get_line_number "Break in class."]
gdb_continue_to_breakpoint "Break in class."

gdb_py_test_silent_cmd "python cplusframe = gdb.selected_frame()" "Get Frame" 0
gdb_py_test_silent_cmd "python cplusfunc = cplusframe.block().function" "Get block" 0
gdb_test "python print (cplusfunc.is_variable)" "False" "Test func.is_variable"
gdb_test "python print (cplusfunc.is_constant)" "False" "Test func.is_constant"
gdb_test "python print (cplusfunc.is_argument)" "False" "Test func.is_argument"
gdb_test "python print (cplusfunc.is_function)" "True" "Test func.is_function"
gdb_test "python print (cplusfunc.name)" "SimpleClass::valueofi().*" "Test func.name"
gdb_test "python print (cplusfunc.print_name)" "SimpleClass::valueofi().*" "Test func.print_name"
gdb_test "python print (cplusfunc.linkage_name)" "SimpleClass::valueofi().*" "Test func.linkage_name"
gdb_test "python print (cplusfunc.addr_class == gdb.SYMBOL_LOC_BLOCK)" "True" "Test func.addr_class"

# Test is_valid when the objfile is unloaded.  This must be the last
# test as it unloads the object file in GDB.
# Start with a fresh gdb.
clean_restart ${testfile}
if ![runto_main] then {
    fail "Cannot run to main."
    return 0
}
gdb_breakpoint [gdb_get_line_number "Break at end."]
gdb_continue_to_breakpoint "Break at end."
gdb_py_test_silent_cmd "python a = gdb.lookup_symbol(\'a\')" "Get variable a" 0
gdb_test "python print (a\[0\].is_valid())" "True" "Test symbol validity"
delete_breakpoints
gdb_unload
gdb_test "python print (a\[0\].is_valid())" "False" "Test symbol validity"
gdb_test_no_output "python a = None" "Test symbol destructor"
