#   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 infotrace.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 "info tracepoints" command
#

gdb_delete_tracepoints
set c_test_num [gdb_gettpnum gdb_c_test];
set asm_test_num [gdb_gettpnum gdb_asm_test];
if { $c_test_num <= 0 || $asm_test_num <= 0 } then {
    fail "setting tracepoints"
    return;
}

# 2.1 info tracepoints (all)
gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+." \
    "2.1: info tracepoints (all)"

# 2.2 info tracepoint (specific)
gdb_test "info tracepoint $c_test_num" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+." \
    "2.2a: info tracepoint $c_test_num (gdb_c_test)"

gdb_test "info tracepoint $asm_test_num" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+." \
    "2.2b: info tracepoint $asm_test_num (gdb_asm_test)"

# 2.3 info tracepoint (invalid tracepoint number)
gdb_test "info tracepoint [expr $c_test_num + $asm_test_num]" \
    "No tracepoint matching '[expr $c_test_num + $asm_test_num]'." \
    "2.3: info tracepoint (invalid tracepoint number)"

# 2.4 info tracepoints (list of numbers)
gdb_test_multiple "info tracepoints $c_test_num $asm_test_num " \
    "2.4: info trace rejects multiple tracepoint numbers" {
	-re "Num Enb .*$gdb_prompt $" {
	    fail "2.4: info trace rejects multiple tracepoint numbers"
	}
	-re ".*$gdb_prompt $" {
	    pass "2.4: info trace rejects multiple tracepoint numbers"
	}
    }

# 2.5 help info trace
gdb_test "help info tracepoints" \
    "Status of specified tracepoints .all tracepoints if no argument.*" \
    "2.5: help info tracepoints"

