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

require allow_ada_tests

standard_ada_testfile enum_with_gap_main

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

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

    clean_restart ${testfile}-${scenario}

    set bp_location [gdb_get_line_number "BREAK" \
			 ${testdir}/enum_with_gap_main.adb]
    if {![runto "enum_with_gap_main.adb:$bp_location"]} {
	return
    }

    gdb_test "print indexed_by_enum.all" \
	" = \\(lit1 => 1, 43, 42, 41\\)"
    gdb_test "print s.all" \
	" = \"Hello!\""

    gdb_test "print indexed_by_enum'length" \
	" = 4"
    gdb_test "print s'length" \
	" = 6"

    gdb_test "print indexed_by_enum'first" \
	" = lit1"
    gdb_test "print s'first" \
	" = 1"

    gdb_test "print indexed_by_enum'last" \
	" = lit4"
    gdb_test "print s'last" \
	" = 6"

    gdb_test "print indexed_by_enum(lit2..lit4)" \
	" = \\(lit2 => 43, 42, 41\\)"
    gdb_test "print s(2..4)" \
	" = \"ell\""

    gdb_test "print v" " = lit3"
    gdb_test "print enum_subrange'pos(v)" " = 3"
    gdb_test "print enum_subrange'val(3)" " = lit3"

    gdb_test "print indexed_by_enum(lit2)" "43"
    gdb_test "print s(2)" "101 'e'"

    gdb_test "print enum_with_gaps'enum_rep(lit3)" " = 13" \
	"enum_rep"
    gdb_test "print enum_subrange'enum_rep(lit3)" " = 13" \
	"other enum_rep"
    gdb_test "print enum_with_gaps'enum_val(21)" " = lit4" \
	"enum_val"
}
