#   Copyright 1998, 2007-2012 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";


gdb_exit
gdb_start

standard_testfile actions.c
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"

