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

standard_testfile

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

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

if ![runto_main] {
    return -1
}

set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}.py]

gdb_test_no_output "python exec (open ('${remote_python_file}').read ())"

gdb_breakpoint [gdb_get_line_number "break-here"]
gdb_continue_to_breakpoint "break-here" ".* break-here .*"

# Test all combinations with raw off.

gdb_test_no_output "set print raw frame-arguments off"

gdb_test_no_output "set print frame-arguments none"
gdb_test "frame" ".*foo \\(x=\[.\]{3}, ss=\[.\]{3}\\).*" \
    "frame pretty,none"

gdb_test_no_output "set print frame-arguments scalars"
gdb_test "frame" ".*foo \\(x=42, ss=super struct = {\[.\]{3}}\\).*" \
    "frame pretty,scalars"

gdb_test_no_output "set print frame-arguments all"
gdb_test "frame" \
    ".*foo \\(x=42, ss=super struct = {a = m=<1>, b = m=<2>}\\).*" \
    "frame pretty,all"

# Test all combinations with raw on.

gdb_test_no_output "set print raw frame-arguments on"

gdb_test_no_output "set print frame-arguments none"
gdb_test "frame" ".*foo \\(x=\[.\]{3}, ss=\[.\]{3}\\).*" \
    "frame raw,none"

gdb_test_no_output "set print frame-arguments scalars"
gdb_test "frame" ".*foo \\(x=42, ss=\[.\]{3}\\).*" \
    "frame raw,scalars"

gdb_test_no_output "set print frame-arguments all"
gdb_test "frame" \
    ".*foo \\(x=42, ss={a = {m = 1}, b = {m = 2}}\\).*" \
    "frame raw,all"

remote_file host delete ${remote_python_file}
