# 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" \
	".*\\^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" \
	".*\\^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=\\\[varobj=\{name=\"foo\",in_scope=\"true\",type_changed=\"false\"\},varobj=\{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
