# Copyright 2018-2020 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/>.

load_lib "ada.exp"

standard_ada_testfile foo_rb20_056

if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } {
  return -1
}

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

gdb_exit
if [mi_gdb_start] {
    continue
}

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

if ![mi_run_to_main] then {
   fail "cannot run to main, testcase aborted"
   return 0
}

# Continue until STOP_1, and create a varobj for variables "A" and "B".

set bp_location [gdb_get_line_number "STOP_1" ${testdir}/foo_rb20_056.adb]
mi_continue_to_line \
    "foo_rb20_056.adb:$bp_location" \
    "stop at STOP_1"

mi_gdb_test "-var-create a * a" \
    "\\^done,name=\"a\",numchild=\"19\",.*" \
    "create varobj for a"

mi_gdb_test "-var-create b * b" \
    "\\^done,name=\"b\",numchild=\"19\",.*" \
    "create varobj for b"

# Continue until STOP_2, and request an update of varobjs a and b.
# One should reported as changed (b), and the other should report
# no change.

set bp_location [gdb_get_line_number "STOP_2" ${testdir}/foo_rb20_056.adb]
mi_continue_to_line \
    "foo_rb20_056.adb:$bp_location" \
    "stop at STOP_2"

mi_gdb_test "-var-update a" \
    "\\^done,changelist=\\\[\\\]" \
    "-var-update a at STOP_2"

mi_gdb_test "-var-update b" \
    "\\^done,changelist=\\\[{name=\"b\".*}\\\]" \
    "-var-update b at STOP_2"
