# Copyright (C) 1998, 2007, 2008 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/>.

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}] != "" } {
     untested watch-cmd.exp
     return -1

}

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











