# Copyright (C) 2017 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-rbreak.c py-rbreak-func2.c

if {[prepare_for_testing "failed to prepare" ${testfile} [list $srcfile $srcfile2]] } {
    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
}

gdb_py_test_silent_cmd "py sl = gdb.rbreak(\"\",minsyms=False)" \
    "get all function breakpoints" 0
gdb_test "py print(len(sl))" "11" \
    "check number of returned breakpoints is 11"
gdb_py_test_silent_cmd "py sl = gdb.rbreak(\"main\.\*\",minsyms=False)" \
    "get main function breakpoint" 0
gdb_test "py print(len(sl))" "1" \
    "check number of returned breakpoints is 1"
gdb_py_test_silent_cmd "py sl = gdb.rbreak(\"func\.\*\",minsyms=False,throttle=10)" \
    "get functions matching func.*" 0
gdb_test "py print(len(sl))" "9" \
    "check number of returned breakpoints is 9"
gdb_test "py gdb.rbreak(\"func\.\*\",minsyms=False,throttle=5)" \
    "Number of breakpoints exceeds throttled maximum.*" \
    "check throttle errors on too many breakpoints"
gdb_py_test_silent_cmd "py sl = gdb.rbreak(\"func1\",minsyms=True)" \
    "including minimal symbols, get functions matching func.*" 0
gdb_test "py print(len(sl))" "2" \
    "check number of returned breakpoints is 2"
gdb_py_test_silent_cmd "python sym = gdb.lookup_symbol(\"efunc1\")" \
    "find a symbol in objfile" 1
gdb_py_test_silent_cmd "python symtab = sym\[0\].symtab" \
    "get backing symbol table" 1
gdb_py_test_silent_cmd "py sl = gdb.rbreak(\"func\.\*\",minsyms=False,throttle=10,symtabs=\[symtab\])" \
    "get functions matching func.* in one symtab only" 0
gdb_test "py print(len(sl))" "3" \
    "check number of returned breakpoints is 3"
