#   Copyright 1998-2013 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\]+.
\[\t \]+not installed on target." \
	"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"

