#   Copyright 1998, 2007, 2008, 2009, 2010 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
}

set prms_id 0
set bug_id 0

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 \]+step count 12 .*" \
	"5.12: confirm stepcount set to $stepcount"

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
.*while-stepping $stepcount.*" \
	"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" "\[Ee\]rror|\[Ww\]arning"
}

# 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.*
.*end.*" \
	"5.16: confirm actions, step without collecting anything"

