# Copyright (C) 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

if $tracelevel then {
    strace $tracelevel
}

#
# test special commands
#
set prms_id 0
set bug_id 0

if { [skip_hp_tests] } then { continue }

set testfile "run"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."

}

if [get_compiler_info ${binfile}] {
    return -1;
}
if { $gcc_compiled } then { continue }


gdb_exit
gdb_start
delete_breakpoints
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}



proc watchpoint_command_test {} {
    global gdb_prompt

    if [target_info exists noargs] { 
        verbose "Skipping watchpoint_command_test because of noargs."
        return
    }

    if { ![runto factorial] } then { gdb_suppress_tests }
    # Don't depend upon argument passing, since most simulators don't currently
    # support it.  Bash value variable to be what we want.
    gdb_test "p value=6" "" "set value to 6 in watchpoint_command_test"
    delete_breakpoints

    # Verify that we can create a watchpoint, and give it a commands
    # list that continues the inferior.  We set the watchpoint on a
    # local variable, too, so that it self-deletes when the watched
    # data goes out of scope.
    #
    # What should happen is: Each time the watchpoint triggers, it
    # continues the inferior.  Eventually, the watchpoint will self-
    # delete, when the watched variable is out of scope.  But by that
    # time, the inferior should have exited.  GDB shouldn't crash or
    # anything untoward as a result of this.
    #
    send_gdb "watch local_var\n"
    gdb_expect {
      -re ".*\[Ww\]atchpoint (\[0-9\]*): local_var.*$gdb_prompt $"\
              { pass "watch local_var"
                set wp_id $expect_out(1,string)
                send_gdb "commands $wp_id\n"
                gdb_expect {
                  -re "Type commands for when breakpoint $wp_id is hit, one per line.*>"\
                          { pass "begin commands on watch"}
                  -re "$gdb_prompt $"\
                          {fail "begin commands on watch"}
                  timeout {fail "(timeout) begin commands on watch"}
                }
              }
    -re "$gdb_prompt $"\
              {fail "watch local_var"}
      timeout {fail "(timeout) watch local_var"}
    }
#    set wp_id $expect_out(1,string)
#    send_gdb "commands $wp_id\n"
#    gdb_expect {
#      -re "Type commands for when breakpoint $wp_id is hit, one per line.*>"\
#              {pass "begin commands on watch"}
#      -re "$gdb_prompt $"\
#              {fail "begin commands on watch"}
#      timeout {fail "(timeout) begin commands on watch"}
#    }
    send_gdb "print value\n"
    gdb_expect {
      -re ">"\
              {pass "add print command to watch"}
      -re "$gdb_prompt $"\
              {fail "add print command to watch"}
      timeout {fail "(timeout) add print command to watch"}
    }
    send_gdb "continue\n"
    gdb_expect {
      -re ">"\
              {pass "add continue command to watch"}
      -re "$gdb_prompt $"\
              {fail "add continue command to watch"}
      timeout {fail "(timeout) add continue command to watch"}
    }
    send_gdb "end\n"
    gdb_expect {
      -re "$gdb_prompt $"\
              {pass "begin commands on watch"}
      timeout {fail "(timeout) begin commands on watch"}
    }
    send_gdb "continue\n"
    gdb_expect {
      -re "Continuing.*\[Ww\]atchpoint $wp_id deleted because the program has left the block in.*which its expression is valid.*in main.*$gdb_prompt $"\
              {pass "continue with watch"}
      -re "$gdb_prompt $"\
              {fail "continue with watch"}
      timeout {fail "(timeout) continue with watch"}
    }
    send_gdb "continue\n"
    gdb_expect {
      -re "Continuing.*$gdb_prompt $"\
              {pass "continue until exit"}
      -re "$gdb_prompt $"\
              {fail "continue until exit"}
      timeout {fail "(timeout) continue until exit"}
    }
}

watchpoint_command_test











