# Copyright (C) 2012-2016 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 convenience
# functions in caller_is.py.

load_lib gdb-python.exp

standard_testfile

if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
    return -1
}

if ![runto_main] {
    return 0
}

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

gdb_breakpoint "bottom_func"
gdb_continue_to_breakpoint "bottom_func"

proc test_all_caller_is_fns { } {
    gdb_test "p \$_caller_is (\"bottom_func\", 0)" " = 1"
    gdb_test "p \$_caller_is (\"middle_func\")" " = 1"
    gdb_test "p \$_caller_is (\"top_func\")" " = 0"
    gdb_test "p \$_caller_is (\"middle_func\", 2)" " = 0"
    gdb_test "p \$_caller_is (\"top_func\", 2)" " = 1"
    gdb_test "p \$_caller_is (\"foo\", 100)" " = 0"
    gdb_test "p \$_caller_is (\"foo\", -1)" "nframes must be >= 0"

    gdb_test "p \$_caller_matches (\"^bottom\", 0)" " = 1"
    gdb_test "p \$_caller_matches (\"^middle_\")" " = 1"
    gdb_test "p \$_caller_matches (\"^top_\")" " = 0"
    gdb_test "p \$_caller_matches (\"^middle_\", 2)" " = 0"
    gdb_test "p \$_caller_matches (\"^top_f\", 2)" " = 1"
    gdb_test "p \$_caller_matches (\"foo\", 100)" " = 0"
    gdb_test "p \$_caller_matches (\"foo\", -1)" "nframes must be >= 0"

    gdb_test "p \$_any_caller_is (\"bottom_func\", 0)" " = 1"
    gdb_test "p \$_any_caller_is (\"middle_func\")" " = 1"
    gdb_test "p \$_any_caller_is (\"top_func\")" " = 0"
    gdb_test "p \$_any_caller_is (\"middle_func\", 2)" " = 1"
    gdb_test "p \$_any_caller_is (\"top_func\", 2)" " = 1"
    gdb_test "p \$_any_caller_is (\"main\", 100)" " = 1"
    gdb_test "p \$_any_caller_is (\"foo\", 100)" " = 0"
    gdb_test "p \$_any_caller_is (\"foo\", -1)" "nframes must be >= 0"

    gdb_test "p \$_any_caller_matches (\"^bottom\", 0)" " = 1"
    gdb_test "p \$_any_caller_matches (\"^middle_\")" " = 1"
    gdb_test "p \$_any_caller_matches (\"^top_\")" " = 0"
    gdb_test "p \$_any_caller_matches (\"^middle_\", 2)" " = 1"
    gdb_test "p \$_any_caller_matches (\"^top_f\", 2)" " = 1"
    gdb_test "p \$_any_caller_matches (\"^main\", 100)" " = 1"
    gdb_test "p \$_any_caller_matches (\"foo\", 100)" " = 0"
    gdb_test "p \$_any_caller_matches (\"foo\", -1)" "nframes must be >= 0"
}

test_all_caller_is_fns
