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

#
# test special commands
#

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] {
    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











