# 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 create, update, delete variables.
#


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

gdb_exit
if [mi_gdb_start] {
    continue
}

set testfile "var-cmd"
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}

mi_runto do_block_tests

# Test: c_variable-3.2
# Desc: create cb and foo
mi_gdb_test "-var-create cb * cb" \
	"\\^done,name=\"cb\",numchild=\"0\",type=\"int\"" \
	"create local variable cb"

mi_gdb_test "-var-create foo * foo" \
	"&\"mi_cmd_var_create: unable to create variable object\\\\n\".*\\^error,msg=\"mi_cmd_var_create: unable to create variable object\"" \
	"create local variable foo"

# step to "foo = 123;"
mi_step_to "do_block_tests" "" "var-cmd.c" \
    [gdb_get_line_number "foo = 123;"] \
    "step at do_block_test"


# Be paranoid and assume 3.2 created foo
mi_gdb_test "-var-delete foo" \
	"&\"Variable object not found\\\\n\".*\\^error,msg=\"Variable object not found\"" \
	"delete var foo"


# Test: c_variable-3.3
# Desc: create foo
mi_gdb_test "-var-create foo * foo" \
	"\\^done,name=\"foo\",numchild=\"0\",type=\"int\"" \
	"create local variable foo"

# step to "foo2 = 123;"
mi_step_to "do_block_tests" "" "var-cmd.c" \
    [gdb_get_line_number "foo2 = 123;"] \
    "step at do_block_test"

# Test: c_variable-3.4
# Desc: check foo, cb changed
mi_gdb_test "-var-update *" \
	"\\^done,changelist=\\\[\{name=\"foo\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"cb\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
	"update all vars: cb foo changed"

# step to "foo = 321;"
mi_step_to "do_block_tests" "" "var-cmd.c" \
    [gdb_get_line_number "foo = 321;"] \
    "step at do_block_test"

# Test: c_variable-3.5
# Desc: create inner block foo
mi_gdb_test "-var-create inner_foo * foo" \
	"\\^done,name=\"inner_foo\",numchild=\"0\",type=\"int\"" \
	"create local variable inner_foo"

# step to "foo2 = 0;"
mi_step_to "do_block_tests" "" "var-cmd.c" \
    [gdb_get_line_number "foo2 = 0;"] \
    "step at do_block_test"

# Test: c_variable-3.6
# Desc: create foo2
mi_gdb_test "-var-create foo2 * foo2" \
	"\\^done,name=\"foo2\",numchild=\"0\",type=\"int\"" \
	"create local variable foo2"

# Test: c_variable-3.7
# Desc: check that outer foo in scope and inner foo out of scope
# Note: also a known gdb problem
setup_xfail *-*-*
mi_gdb_test "-var-update inner_foo" \
	"\\^done,changelist=\{FIXME\}" \
	"update inner_foo: should be out of scope: KNOWN PROBLEM"
clear_xfail *-*-*

setup_xfail *-*-*
mi_gdb_test "-var-evaluate-expression inner_foo" \
	"\\^done,value=\{FIXME\}" \
	"evaluate inner_foo: should be out of scope: KNOWN PROBLEM"
clear_xfail *-*-*

mi_gdb_test "-var-update foo" \
	"\\^done,changelist=\\\[\\\]" \
	"update foo: did not change"

mi_gdb_test "-var-delete inner_foo" \
	"\\^done,ndeleted=\"1\"" \
	"delete var inner_foo"

# step to "foo = 0;"
mi_step_to "do_block_tests" "" "var-cmd.c" \
    [gdb_get_line_number "foo = 0;"] \
    "step at do_block_test"

# Test: c_variable-3.8
# Desc: check that foo2 out of scope (known gdb problem)
setup_xfail *-*-*
mi_gdb_test "-var-update foo2" \
	"\\^done,changelist=\{FIXME\}" \
	"update foo2: should be out of scope: KNOWN PROBLEM"
clear_xfail *-*-*

# step to "cb = 21;"
mi_step_to "do_block_tests" "" "var-cmd.c" \
    [gdb_get_line_number "cb = 21;"] \
    "step at do_block_test"

# Test: c_variable-3.9
# Desc: check that only cb is in scope (known gdb problem)
setup_xfail *-*-*
mi_gdb_test "-var-update foo2" \
	"\\^done,changelist=\\\[FIXME\\\]" \
	"update foo2 should be out of scope: KNOWN PROBLEM"
clear_xfail *-*-*
setup_xfail *-*-*
mi_gdb_test "-var-update foo" \
	"\\^done,changelist=\{FIXME\}" \
	"update foo should be out of scope: KNOWN PROBLEM"
clear_xfail *-*-*
mi_gdb_test "-var-update cb" \
	"\\^done,changelist=\\\[\\\]" \
	"update cb"

# Test: c_variable-3.10
# Desc: names of editable variables
#gdbtk_test c_variable-3.10 {names of editable variables} {
#  editable_variables
#} {{foo cb foo2} {}}

# Done with block tests
mi_gdb_test "-var-delete foo" \
	"\\^done,ndeleted=\"1\"" \
	"delete var foo"

mi_gdb_test "-var-delete foo2" \
	"\\^done,ndeleted=\"1\"" \
	"delete var foo2"

mi_gdb_test "-var-delete cb" \
	"\\^done,ndeleted=\"1\"" \
	"delete var cb"

mi_gdb_exit
return 0
