# Copyright 2005, 2007, 2009, 2010, 2011 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/>.

if $tracelevel then {
    strace $tracelevel
}

load_lib "ada.exp"

set testdir "complete"
set testfile "${testdir}/foo"
set srcfile ${srcdir}/${subdir}/${testfile}.adb
set binfile ${objdir}/${subdir}/${testfile}

file mkdir ${objdir}/${subdir}/${testdir}
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>"


