# Copyright 2017-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/>.

# This file is part of the gdb testsuite.

load_lib completion-support.exp

gdb_exit
gdb_start

# Tests below are about tab-completion, which doesn't work if readline
# library isn't used.  Check it first.

if { ![readline_is_used] } {
    untested "no tab completion support without readline"
    return -1
}

# Start of tests.

# Test TAB with no input.
proc_with_prefix empty-input-line {} {
    # Set max-completions to 1 to avoid having to hardcode a set of
    # command names.
    gdb_test_no_output "set max-completions 1"

    # Given the completion limit, this completes to the command with
    # the lowest alphanumeric sort, which is, and is likely to remain,
    # "!".
    test_gdb_complete_unique "" "!" " " 1

    # Same, but with some leading whitespace.
    test_gdb_complete_unique "   " "   !" " " 1
}

proc test_driver {} {
    empty-input-line
}

test_driver
