# This testcase is part of GDB, the GNU debugger.

# Copyright 2018-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 'frame apply [all | COUNT | -COUNT | level LEVEL...] [FLAG]... COMMAND'.

standard_testfile

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

if ![runto setup_done] then {
    return 0
}

set any "\[^\r\n\]*"
set ws "\[ \t\]\+"
set number "\[0-9]\+"


# Check all | COUNT | -COUNT | level LEVEL... with a simple command.
with_test_prefix "simple command" {
    foreach_with_prefix frame_apply_args {
	"all"
	"6"
	"-6"
	"level 0-5"
	"level 0-3 4-5"
	"level 0 1-2 3-5"
	"level 0 1 2 3 4 5"
	"level 0-0 1-1 2-2 3-3 4-4 5-5" } {
	    set cmd "frame apply $frame_apply_args p /x 20"
	    gdb_test $cmd \
		[multi_line \
		     "#0${ws}setup_done ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		     "#1${ws}${any} f1 ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		     "#2${ws}${any} f2 ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		     "#3${ws}${any} f3 ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		     "#4${ws}${any} f4 ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		     "#5${ws}${any} main ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		    ] \
		"run a simple command on all frames"
	}
}

# Check frame apply on 3 innermost frames.
with_test_prefix "innermost 3" {
    foreach_with_prefix frame_apply_args {
	"3"
	"level 0-2" } {
	    set cmd "frame apply $frame_apply_args p /x 20"
	    gdb_test $cmd \
		[multi_line \
		     "#0${ws}setup_done ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		     "#1${ws}${any} f1 ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		     "#2${ws}${any} f2 ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		    ] \
		"run a simple command on the 3 innermost frames"
	}
}

# Check frame apply on 3 outermost frames.
with_test_prefix "outermost 3" {
    foreach_with_prefix frame_apply_args {
	"-3" } {
	    set cmd "frame apply $frame_apply_args p /x 20"
	    gdb_test $cmd \
		[multi_line \
		     "#3${ws}${any} f3 ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		     "#4${ws}${any} f4 ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		     "#5${ws}${any} main ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		    ] \
		"run a simple command on the 3 outermost frames"
	}
}

# Check -c (continue) and -s (silently continue) flags.
with_test_prefix "!cont !silent flags" {
    foreach_with_prefix frame_apply_args {
	"all"
	"level 0-5"
    } {
	set cmd "frame apply $frame_apply_args p f3arg"
	gdb_test $cmd \
	    [multi_line \
		 "#0${ws}setup_done ${any}" \
		 "No symbol \\\"f3arg\\\" in current context." \
		] \
	    "run a failing command that aborts frame apply"
    }
}

with_test_prefix "cont !silent flags" {
    foreach_with_prefix frame_apply_args {
	"all -c"
	"level 0-5 -c"} {
	    set cmd "frame apply $frame_apply_args p f3arg"
	    gdb_test $cmd \
		[multi_line \
		     "#0${ws}setup_done ${any}" \
		     "No symbol \\\"f3arg\\\" in current context." \
		     "#1${ws}${any} f1 ${any}" \
		     "No symbol \\\"f3arg\\\" in current context." \
		     "#2${ws}${any} f2 ${any}" \
		     "No symbol \\\"f3arg\\\" in current context." \
		     "#3${ws}${any} f3 ${any}" \
		     "\\\$\[0-9]+ = 3${any}" \
		     "#4${ws}${any} f4 ${any}" \
		     "No symbol \\\"f3arg\\\" in current context." \
		     "#5${ws}${any} main ${any}" \
		     "No symbol \\\"f3arg\\\" in current context." \
		    ] \
		"run a command failing in all frames except #3, -c to continue"
	}
}

with_test_prefix "!cont silent flags" {
    foreach_with_prefix cmd_and_args {
	"frame apply all -s"
	"faas"
	"frame apply level 0-5 -s"} {
	    set cmd "$cmd_and_args p f3arg"
	    gdb_test $cmd \
		[multi_line \
		     "#3${ws}${any} f3 ${any}" \
		     "\\\$\[0-9]+ = 3${any}" \
		    ] \
		"run a command failing in all frames except #3, -s to silently continue"
	}
}

# Check quietness.
with_test_prefix "!quiet flag" {
    foreach_with_prefix frame_apply_args {
	"2"
	"level 0-1"} {
	    set cmd "frame apply $frame_apply_args p /x 20"
	    gdb_test $cmd \
		[multi_line \
		     "#0${ws}setup_done ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		     "#1${ws}${any} f1 ${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		    ] \
		"run a command, printing location"
	}
}

with_test_prefix "quiet flag" {
    foreach_with_prefix frame_apply_args {
	"2 -q"
	"level 0-1 -q"} {
	    set cmd "frame apply $frame_apply_args p /x 20"
	    gdb_test $cmd \
		[multi_line \
		     "\\\$\[0-9]+ = 0x14${any}" \
		     "\\\$\[0-9]+ = 0x14${any}" \
		    ] \
		"run a command with -q quiet flag, printing only command results"
	}
}

# Check multiple flags together.
with_test_prefix "quiet silent flags" {
    foreach_with_prefix frame_apply_args {
	"all -q -s -q"
	"level 0-5 -q -s -q"} {
	    set cmd "frame apply $frame_apply_args p f3arg"
	    gdb_test $cmd \
		"\\\$\[0-9]+ = 3${any}" \
		"run a command failing in all frames except #3, -s to silently continue, quiet"
	}
}

# Check invalid flag combinations.
gdb_test "frame apply all -c -s p f3arg" \
    "frame apply all: -c and -s are mutually exclusive" \
    "check -c and -s cannot be used simultaneously"

# Check some cases of missing or wrong args.
gdb_test "frame apply" "Missing COUNT argument." "missing COUNT"
gdb_test "frame apply -c" "Invalid COUNT argument." "invalid COUNT arg"
gdb_test "frame apply level 4-2 p 1" "inverted range" "inverted range"
gdb_test "frame apply level 0-3" \
    "Please specify a command to apply on the selected frames" \
    "missing command"
gdb_test "faas" "Please specify a command to apply on all frames" \
    "missing command for faas"
