# Copyright 2020-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"
load_lib "gdb-python.exp"

if { [skip_ada_tests] } { return -1 }

standard_ada_testfile pkg

foreach_with_prefix scenario {none all minimal} {
    set flags {debug}
    if {$scenario != "none"} {
	lappend flags additional_flags=-fgnat-encodings=$scenario
    }

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

    clean_restart ${testfile}

    set bp_location [gdb_get_line_number "STOP" ${testdir}/pkg.adb]
    runto "pkg.adb:$bp_location"

    gdb_test "print r" "= \\(c => 100 'd'\\)"
    gdb_test "print q" " = \\(c => 0 '\\\[\"00\"\\\]', x_first => 27\\)"

    gdb_test "print st1" " = \\(i => -4, one => 1, x => 2\\)"
    gdb_test "print st2" " = \\(i => 99, one => 1, y => 77\\)"

    gdb_test "print nav1" " = \\(one => 0, two => 93, str => \"\"\\)"
    gdb_test "print nav2" \
	" = \\(one => 3, two => 0, str => \"zzz\", onevalue => 33, str2 => \"\"\\)"
    gdb_test "print nav3" \
	" = \\(one => 3, two => 7, str => \"zzz\", onevalue => 33, str2 => \"qqqqqqq\", twovalue => 88\\)"

    # This is only supported for the DWARF encoding.
    if {$scenario == "minimal" && ![skip_python_tests]} {
	gdb_test_no_output \
	    "python t = gdb.lookup_type('nested_and_variable')" \
	    "fetch type for python"
	gdb_test "python print(t.dynamic)" "True"
	gdb_test "python print(t\['onevalue'\].bitpos)" "None"
    }
}
