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

#
# 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











