#   Copyright 1998 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# 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

if [istarget "m68k-*-elf"] then {
    set srcfile gdb_c_test.c
    set binfile [board_info target d490_binfile];
} else {
    set testfile "actions"
    set srcfile ${testfile}.c
    set binfile $objdir/$subdir/$testfile
    if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	    executable {debug additional_flags=-w}] != "" } {
	gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
    }
}
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 Enb Address\[ \]+PassC StepC What.*$c_test_num\[\t \]+y\[\t \]+0x\[0-9a-fA-F\]+.*in gdb_c_test.*$asm_test_num\[\t \]+y\[\t \]+0x\[0-9a-fA-F\]+.*gdb_asm_test.*" \
    "2.1: info tracepoints (all)"

# 2.2 info tracepoint (specific)
gdb_test "info tracepoint $c_test_num" \
    "$c_test_num\[\t \]+y\[\t \]+0x\[0-9a-fA-F\]+.*in gdb_c_test.*" \
    "2.2a: info tracepoint $c_test_num (gdb_c_test)"

gdb_test "info tracepoint $asm_test_num" \
    "$asm_test_num\[\t \]+y\[\t \]+0x\[0-9a-fA-F\]+.*gdb_asm_test.*" \
    "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 number [expr $c_test_num + $asm_test_num]." \
    "2.3: info tracepoint (invalid tracepoint number)"

# 2.4 info tracepoints (list of numbers)
send_gdb "info tracepoints $c_test_num $asm_test_num \n"
gdb_expect {
    -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 tracepoints, or tracepoint number NUMBER.*" \
    "2.5: help info tracepoints"

