# Copyright 2015-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 foo

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

clean_restart ${testfile}

set bp_location [gdb_get_line_number "BREAK" ${testdir}/foo.adb]
runto "foo.adb:$bp_location"


proc test_menu {expr function menu_entries selection output} {
    set menu [multi_line "Multiple matches for $function" \
                         "\\\[0\\\] cancel" \
                         "$menu_entries" \
                         "> $"]
    set test_name "multiple matches for $function {$expr}"
    gdb_test_multiple "print $expr" "$test_name" \
    {
        -re "$menu" {
            pass "$test_name"
        }
        default {
            fail "$test_name"
        }
    }
    gdb_test "$selection" "$output"
}


# Check that function signatures in overload menus are displayed as expected.

# 1. Test with overloaded functions
with_test_prefix "func" {
    test_menu "f (1, null)" "f" \
	[multi_line \
	     "\\\[1\\\] foo\.f \\(integer; foo\.integer_access\\) return boolean at .*foo.adb:.*" \
	     "\\\[2\\\] foo\.f \\(foo\.new_integer; foo\.integer_access\\) return boolean at .*foo.adb:.*"] \
	"1" "= true"
}

# 2. Test with overloaded procedures
with_test_prefix "proc" {
    test_menu "p (1, null)" "p" \
	[multi_line \
	     "\\\[1\\\] foo\.p \\(integer; foo\.integer_access\\) at .*foo.adb:.*" \
	     "\\\[2\\\] foo\.p \\(foo\.new_integer; foo\.integer_access\\) at .*foo.adb:.*" ] \
	"1" "= (void)"
}

# 3. Test with signatures disabled
gdb_test "set ada print-signatures off" ""
with_test_prefix "signatures disabled" {
    test_menu "f (1, null)" "f" \
	[multi_line \
	     "\\\[1\\\] foo\.f at .*foo.adb:.*" \
	     "\\\[2\\\] foo\.f at .*foo.adb:.*"] \
	"1" "= true"
}
