# Copyright (C) 2021 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/>.

# Test gdb.PendingFrame.level method.

load_lib gdb-python.exp

standard_testfile

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } {
    return -1
}

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

if ![runto_main] then {
    return 0
}

set pyfile [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py]

gdb_breakpoint [gdb_get_line_number "Break here"]
gdb_continue_to_breakpoint "stop at test breakpoint"

# An initial look at the stack to ensure it is correct.
gdb_test_sequence "bt"  "Initial backtrace" {
    "\\r\\n#0 \[^\r\n\]* f0 \\(\\) at "
    "\\r\\n#1 \[^\r\n\]* f1 \\(\\) at "
    "\\r\\n#2 \[^\r\n\]* f2 \\(\\) at "
    "\\r\\n#3 \[^\r\n\]* f3 \\(\\) at "
    "\\r\\n#4 \[^\r\n\]* main \\(\\) at "
}

# Load the script containing the unwinder.
gdb_test_no_output "source ${pyfile}"\
    "import python scripts"

# Now look at the stack again, we should see output from the Python
# unwinder mixed in.
gdb_test_sequence "bt"  "Backtrace with extra Python output" {
    "Func f0, Level 0"
    "Func f1, Level 1"
    "\\r\\n#0 \[^\r\n\]* f0 \\(\\) at "
    "\\r\\n#1 \[^\r\n\]* f1 \\(\\) at "
    "Func f2, Level 2"
    "\\r\\n#2 \[^\r\n\]* f2 \\(\\) at "
    "Func f3, Level 3"
    "\\r\\n#3 \[^\r\n\]* f3 \\(\\) at "
    "Func main, Level 4"
    "\\r\\n#4 \[^\r\n\]* main \\(\\) at "
}
