# Copyright 1999, 2000, 2001, 2002, 2004, 2007, 2008
# 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 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}] != "" } {
    untested mi-var-block.exp
    return -1
}

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\",value=\".*\",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\",value=\".*\",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\",value=\".*\",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\",value=\".*\",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
