# Copyright (C) 2010-2012 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"
