# Copyright 2018-2021 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"

if { [skip_ada_tests] } { return -1 }

standard_ada_testfile bar

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

foreach_with_prefix scenario {all minimal} {
    set flags [list debug additional_flags=-fgnat-encodings=$scenario]

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

    mi_clean_restart $binfile

    if {[mi_runto_main] < 0} {
	return 0
    }

    set bp_location [gdb_get_line_number "STOP" ${testdir}/bar.adb]
    mi_continue_to_line \
	"bar.adb:$bp_location" \
	"stop at start of main Ada procedure"

    mi_gdb_test "-var-create var1 * Aos" \
	"\\^done,name=\"var1\",numchild=\"2\",.*" \
	"Create var1 varobj"

    mi_gdb_test "-var-list-children 1 var1" \
	"\\^done,numchild=\"2\",children=\\\[child={name=\"var1.1\",exp=\"1\",numchild=\"1\",value=\"$hex\",type=\"bar.string_access\",thread-id=\"$decimal\"},child={name=\"var1.2\",exp=\"2\",numchild=\"1\",value=\"$hex\",type=\"bar.string_access\",thread-id=\"$decimal\"}\\\],has_more=\"0\"" \
	"list var1's children"

    mi_gdb_test "-var-evaluate-expression var1" \
	"\\^done,value=\"\\\[2\\\]\"" \
	"Print var1"

    mi_gdb_test "-var-evaluate-expression var1.1" \
	"\\^done,value=\"$hex\"" \
	"Print var1 first child"

    mi_gdb_test "-var-evaluate-expression var1.2" \
	"\\^done,value=\"$hex\"" \
	"Print var1 second child"
}
