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

# Copyright 2018 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
}

clean_restart ${binfile}


if ![runto setup_done] then {
    fail "can't run to setup_done"
    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"
