# Copyright 1999, 2000, 2001, 2002, 2003, 2004 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.  

#
# Test essential Machine interface (MI) operations
#
# Verify that, using the MI, we can run a simple program and perform basic
# debugging activities like: insert breakpoints, run the program,
# step, next, continue until it ends and, last but not least, quit.
#
# The goal is not to test gdb functionality, which is done by other tests,
# but to verify the correct output response to MI operations.
#

load_lib mi-support.exp
set MIFLAGS "-i=mi2"

gdb_exit
if [mi_gdb_start] {
    continue
}

set testfile "basics"
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."
}

mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}

proc test_watchpoint_creation_and_listing {} {
    global mi_gdb_prompt
    global srcfile
    global hex

    set line_callee4_head [gdb_get_line_number "callee4 ("]
    set line_callee4_body [expr $line_callee4_head + 2]

    # Insert a watchpoint and list
    # Tests:
    # -break-watch C
    # -break-list

    mi_gdb_test "111-break-watch C" \
             "111\\^done,wpt=\{number=\"2\",exp=\"C\"\}" \
             "break-watch operation"

    mi_gdb_test "222-break-list" \
	    "222\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhdr=\"What\".*\\\],body=\\\[bkpt=\{number=\"1\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"$hex\",func=\"callee4\",file=\".*basics.c\",line=\"$line_callee4_body\",times=\"1\"\},bkpt=\{number=\"2\",type=\".*watchpoint\",disp=\"keep\",enabled=\"y\",addr=\"\",what=\"C\",times=\"0\"\}\\\]\}" \
                "list of watchpoints"

}

# UNUSED at the time
proc test_awatch_creation_and_listing {} {
    global mi_gdb_prompt
    global srcfile
    global hex

    set line_main_head [gdb_get_line_number "main ("]
    set line_main_body [expr $line_main_head + 2]

    # Insert an access watchpoint and list it
    # Tests:
    # -break-watch -a A
    # -break-list

    mi_gdb_test "333-break-watch -a A" \
             "333\\^done,bkpt=\{number=\"1\",addr=\"$hex\",file=\".*basics.c\",line=\"$line_main_body\"\}" \
             "break-watch -a operation"

    mi_gdb_test "444-break-list" \
	    "444\\^done,BreakpointTable=\{.*,hdr=\\\[.*\\\],body=\\\[bkpt=\{number=\"3\",type=\"watchpoint\",disp=\"del\",enabled=\"y\",addr=\"$hex\",func=\"main\",file=\".*basics.c\",line=\"$line_main_body\",times=\"0\"\},.*\}\\\]\}" \
                "list of watchpoints awatch"

    mi_gdb_test "777-break-delete 3" \
	    "777\\^done" \
	    "delete access watchpoint"
}

# UNUSED at the time
proc test_rwatch_creation_and_listing {} {
    global mi_gdb_prompt
    global srcfile
    global hex

    set line_main_head [gdb_get_line_number "main ("]
    set line_main_body [expr $line_main_head + 2]

    # Insert a read watchpoint and list it.
    # Tests:
    # -break-insert -r B
    # -break-list

    mi_gdb_test "200-break-watch -r C" \
             "200\\^done,bkpt=\{number=\"5\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"$hex\",func=\"callee4\",file=\".*basics.c\",line=\"$line_main_body\",times=\"0\"\}" \
             "break-insert -r operation"

    mi_gdb_test "300-break-list" \
	    "300\\^done,BreakpointTable=\{.*,hdr=\\\[.*\\\],body=\\\[bkpt=\{number=\"5\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"$hex\",func=\"main\",file=\".*basics.c\",line=\"$line_main_body\",times=\"0\"\},.*\}\\\}\}" \
                "list of breakpoints"

    mi_gdb_test "177-break-delete 4" \
	    "177\\^done" \
	    "delete read watchpoint"
}

proc test_watchpoint_triggering {} {
    global mi_gdb_prompt
    global hex

    set line_callee4_return_0     [gdb_get_line_number "return 0;"]
    set line_callee3_head         [gdb_get_line_number "callee3 ("]
    set line_callee3_close_brace  [expr $line_callee3_head + 3]

    # Continue execution until the watchpoint is reached,  continue again, 
    # to see the watchpoint go out of scope.
    # Does:
    # -exec-continue (Here wp triggers)
    # -exec-continue (Here wp goes out of scope)

    send_gdb "222-exec-continue\n"
    gdb_expect {
      -re "222\\^running\r\n$mi_gdb_prompt" {
        gdb_expect {
	    -re "222\\*stopped,reason=\"watchpoint-trigger\",wpt=\{number=\"2\",exp=\"C\"\},value=\{old=\".*\",new=\"3\"\},thread-id=\"\[01\]\",frame=\{addr=\"$hex\",func=\"callee4\",args=\\\[\\\],file=\".*basics.c\",line=\"$line_callee4_return_0\"\}\r\n$mi_gdb_prompt$" {
            pass "watchpoint trigger"
          }
          -re ".*$mi_gdb_prompt$" {fail "watchpoint trigger (2)"}
          timeout {fail "watchpoint trigger (timeout 2)"}
        }
      }
      -re ".*$mi_gdb_prompt$" {fail "watchpoint trigger (1)"}
      timeout {fail "watchpoint trigger (timeout 1)"}
    }

    send_gdb "223-exec-continue\n"
    gdb_expect {
      -re "223\\^running\r\n$mi_gdb_prompt" {
        gdb_expect {
	    -re "\[\r\n\]*223\\*stopped,reason=\"watchpoint-scope\",wpnum=\"2\",thread-id=\"\[01\]\",frame=\{addr=\"$hex\",func=\"callee3\",args=\\\[.*\\\],file=\".*basics.c\",line=\"$line_callee3_close_brace\"\}\r\n$mi_gdb_prompt$" {
            pass "wp out of scope"
          }
          -re ".*$mi_gdb_prompt$" {fail "wp out of scope (2)"}
          timeout {fail "wp out of scope (timeout 2)"}
        }
      }
      -re ".*$mi_gdb_prompt$" {fail "wp out of scope (1)"}
      timeout {fail "wp out of scope (timeout 1)"}
    }
}

mi_runto callee4
test_watchpoint_creation_and_listing
#test_rwatch_creation_and_listing
#test_awatch_creation_and_listing
test_watchpoint_triggering

mi_gdb_exit
return 0
