# Copyright (C) 1999, 2000, 2002 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.

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# 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=mi"

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" "158" "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" "161" "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" "164" "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" "166" "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" "168" "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" "171" "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
