# 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 py-symbol.c

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 }

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

global hex decimal

# Setup and get the symbol table.
set line_no [gdb_get_line_number "Block break here."]
gdb_breakpoint $line_no
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 sal = frame.find_sal()" "Get block" 0
gdb_py_test_silent_cmd "python symtab = sal.symtab" "Get block" 0
gdb_py_test_silent_cmd "python global_block = symtab.global_block()" "Get global block" 0
gdb_py_test_silent_cmd "python static_block = symtab.static_block()" "Get static block" 0
gdb_py_test_silent_cmd "python global_symbols = \[\]; static_symbols = \[\]" "Set up symbol name lists" 0
gdb_py_test_silent_cmd "python for sym in global_block: global_symbols.append(sym.name)" "Get global symbol names" 0
gdb_py_test_silent_cmd "python for sym in static_block: static_symbols.append(sym.name)" "Get static symbol names" 0
gdb_py_test_silent_cmd "step" "Step to the next line" 0
gdb_py_test_silent_cmd "python new_pc = gdb.selected_frame().find_sal().pc" "Get new PC" 0

# Test sal.
gdb_test "python print (sal.symtab)" ".*gdb.python/py-symbol.c.*" "Test symtab"
gdb_test "python print (sal.pc)" "${decimal}" "Test sal.pc"
gdb_test "python print (sal.last == (new_pc - 1))" "True" "Test sal.last"
gdb_test "python print (sal.line)" "$line_no" "Test sal.line"
gdb_test "python print (sal.is_valid())" "True" "Test sal.is_valid"

# Test symbol table.
gdb_test "python print (symtab.filename)" ".*gdb.python/py-symbol.c.*" "Test symtab.filename"
gdb_test "python print (symtab.objfile)" "<gdb.Objfile object at ${hex}>" "Test symtab.objfile"
gdb_test "python print (symtab.fullname())" "testsuite/gdb.python/py-symbol.c.*" "Test symtab.fullname"
gdb_test "python print (symtab.is_valid())" "True" "Test symtab.is_valid()"
gdb_test "python print (\"qq\" in global_symbols)" "True" "Test qq in global symbols"
gdb_test "python print (\"func\" in global_symbols)" "True" "Test func in global symbols"
gdb_test "python print (\"main\" in global_symbols)" "True" "Test main in global symbols"
gdb_test "python print (\"int\" in static_symbols)" "True" "Test int in static symbols"
gdb_test "python print (\"char\" in static_symbols)" "True" "Test char in static symbols"
gdb_test "python print (\"simple_struct\" in static_symbols)" "True" "Test simple_struct in static symbols"

# Test is_valid when the objfile is unloaded.  This must be the last
# test as it unloads the object file in GDB.
gdb_unload
gdb_test "python print (sal.is_valid())" "False" "Test sal.is_valid"
gdb_test "python print (symtab.is_valid())" "False" "Test symtab.is_valid()"

gdb_test_no_output "python sal = None" "Test sal destructor"
gdb_test_no_output "python symtab = None" "Test symtab destructor"
