# Copyright 2005, 2007, 2009-2012 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

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

clean_restart ${testfile}

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

set eol "\[\r\n\]*"

# A convenience function that verifies that the "complete EXPR" command
# returns the EXPECTED_OUTPUT.

proc test_gdb_complete { expr expected_output } {
    gdb_test "complete p $expr" \
             "$expected_output" \
             "complete p $expr"
}

# A convenience function that verifies that the "complete EXPR" command
# does not genearte any output.

proc test_gdb_no_completion { expr } {
    # FIXME: brobecker/2007-12-27: How do you verify that the command
    # output is actually really empty???  For now, the following does
    # not verify this at all:
    test_gdb_complete "$expr" ""
}

# A convenience function that joins all the arguments together,
# with a regexp that matches zero-or-more end of lines in between
# each argument.  This function is ideal to write the expected output
# of a GDB command that generates more than a couple of lines, as
# this allows us to write each line as a separate string, which is
# easier to read by a human being.

proc multi_line { args } {
    return [join $args "\[\r\n\]*"]
}
# Try a global variable, only one match should be found:

test_gdb_complete "my_glob" \
                  "p my_global_variable"

# A global variable, inside a nested package:

test_gdb_complete "insi" \
                  "p inside_variable"

# A global variable inside a nested package, but only giving part of
# the fully qualified name (top level package name missing):

test_gdb_no_completion "inner.insi"

# An incomplete nested package name, were lies a single symbol:
test_gdb_complete "pck.inne" \
                  "p pck.inner.inside_variable"

# A fully qualified symbol name, mangled...
test_gdb_complete "pck__inner__ins" \
                  "p pck__inner__inside_variable"

# A fully qualified symbol name...
test_gdb_complete "pck.inner.ins" \
                  "p pck.inner.inside_variable"

# Make sure that "inside" is not returned as a possible completion
# for "side"...
test_gdb_no_completion "side"

# Verify that "Exported_Capitalized" is not returned as a match for
# "exported", since its symbol name contains capital letters.
test_gdb_no_completion "exported"

# check the "<...>" notation.
test_gdb_complete "<Exported" \
                  "p <Exported_Capitalized>"

# A global symbol, created by the binder, that starts with __gnat...
test_gdb_complete "__gnat_ada_main_progra" \
                  "p __gnat_ada_main_program_name"

# A global symbol, created by the binder, that starts with __gnat,
# and using the '<' notation.
test_gdb_complete "<__gnat_ada_main_prog" \
                  "p <__gnat_ada_main_program_name>"

# A local variable
test_gdb_complete "some" \
                  "p some_local_variable"

# A local variable variable, but in a different procedure. No match
# should be returned.
test_gdb_no_completion "not_in_sco"

# A fully qualified variable name that doesn't exist...
test_gdb_no_completion "pck.ins"

# A fully qualified variable name that does exist...
test_gdb_complete "pck.my" \
                  "p pck.my_global_variable"

# A fully qualified package name
test_gdb_complete "pck.inne" \
                  "p pck.inner.inside_variable"

# A fully qualified package name, with a dot at the end
test_gdb_complete "pck.inner." \
                  "p pck.inner.inside_variable"

# Two matches, from the global scope:
test_gdb_complete "local_ident" \
                  [multi_line "p local_identical_one" \
                              "p local_identical_two" ]

# Two matches, from the global scope, but using fully qualified names:
test_gdb_complete "pck.local_ident" \
                  [multi_line "p pck.local_identical_one" \
                              "p pck.local_identical_two" ]

# Two matches, from the global scope, but using mangled fully qualified
# names:
test_gdb_complete "pck__local_ident" \
                  [multi_line "p pck__local_identical_one" \
                              "p pck__local_identical_two" ]

# Two matches, one from the global scope, the other from the local scope:
test_gdb_complete "external_ident" \
                  [multi_line "p external_identical_one" \
                              "p external_identical_two" ]

# Complete on the name of package. 
test_gdb_complete "pck" \
                  [multi_line "(p pck\\.ad\[sb\])?" \
                              "(p pck\\.ad\[sb\])?" \
                              "p pck.external_identical_one" \
                              "p pck.inner.inside_variable" \
                              "p pck.local_identical_one" \
                              "p pck.local_identical_two" \
                              "p pck.my_global_variable" \
                              "p pck.proc" ]

# Complete on the name of a package followed by a dot:
test_gdb_complete "pck." \
                  [multi_line "(p pck\\.ad\[sb\])?" \
                              "(p pck\\.ad\[sb\])?" \
                              "p pck.external_identical_one" \
                              "p pck.inner.inside_variable" \
                              "p pck.local_identical_one" \
                              "p pck.local_identical_two" \
                              "p pck.my_global_variable" \
                              "p pck.proc" ]

# Complete a mangled symbol name, but using the '<...>' notation.
test_gdb_complete "<pck__my" \
                  "p <pck__my_global_variable>"


