#   Copyright 1998, 2007, 2008, 2009, 2010, 2011
#   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 was written by Michael Snyder (msnyder@cygnus.com)

load_lib "trace-support.exp";

if $tracelevel then {
    strace $tracelevel
}


gdb_exit
gdb_start

set testfile "actions"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/while-stepping
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested while-stepping.exp
    return -1
}
gdb_reinitialize_dir $srcdir/$subdir

# If testing on a remote host, download the source file.
# remote_download host $srcdir/$subdir/$srcfile

gdb_file_cmd $binfile

#
# test while-stepping command
#

gdb_delete_tracepoints
set trcpt1 [gdb_gettpnum gdb_c_test]
if { $trcpt1 <= 0 } then {
    fail "Could not find gdb_c_test function"
    return;
}

# 5.12 basic while-stepping command (collect regs)

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+" \
	"5.12: set a tracepoint, stepcount is zero"

set stepcount 12

gdb_trace_setactions "5.12: set stepcount to $stepcount" \
	"" \
	"while-stepping $stepcount" "" \
	"collect \$regs" "^$" \
	"end" ""

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[\t \]+while-stepping 12.*" \
	"5.12: info trace shows \"while-stepping\""

# 5.13 step out of context while collecting local variable
#      [deferred to dynamic test section]

proc while_stepping_bogus_arg { bogus msgstring } {
    global gdb_prompt;

    gdb_trace_setactions "$msgstring" \
	    "" \
	    "while-stepping $bogus" ".*while-stepping step count"
}

# 5.14 while-stepping (no argument)

while_stepping_bogus_arg "" "5.14: while-stepping null stepcount"

# 5.15 while-stepping (zero stepcount)

while_stepping_bogus_arg "0" "5.15: while-stepping rejects zero stepcount"

# 5.16 while-stepping without collecting anything
gdb_trace_setactions "5.16: step without collecting anything" \
	"" \
	"while-stepping $stepcount" "^$" \
	"end" ""

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
.*while-stepping $stepcount.*
.*end.*" \
	"5.16: confirm actions, step without collecting anything"

