# Copyright (C) 2011-2020 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/>.

standard_testfile .c
set inputrc ${srcdir}/${subdir}/${testfile}.inputrc

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {debug}] != "" } {
    untested "failed to compile"
    return -1
}

# INPUTRC gets reset for the next testfile.
setenv INPUTRC $inputrc
clean_restart ${binfile}

if { ![readline_is_used] } {
    unsupported "completion doesn't work when readline isn't used."
    return -1
}

gdb_test_no_output "set width 50"
gdb_test_no_output "set height 3"

set cmd "p symbol_0"
send_gdb "$cmd\t"
set test "bell for more message"
gdb_test_multiple "" $test {
    -re "$cmd\007$" {
	pass $test
    }
}

send_gdb "\t"
set test "more message for 01 and 02"
gdb_test_multiple "" $test {
    -re "^\r\nsymbol_01_length_40_____________________\r\nsymbol_02_length_40_____________________\r\n--More--$" {
	pass $test
    }
    -re "$gdb_prompt " {
	fail $test
    }
}

# There get some VT100 characters printed.

send_gdb "\r"
set test "more message for 03"
gdb_test_multiple "" $test {
    -re "\rsymbol_03_length_40_____________________\r\n--More--$" {
	pass $test
    }
}

# "$gdb_prompt $" will not match as $cmd gets output: $gdb_prompt p symbol_0
# And "$gdb_prompt p symbol_0" cannot be matched as the default "$gdb_prompt $"
# string from gdb_test_multiple could match earlier.

send_gdb "\r"
set test "more finish for 04"
gdb_test_multiple "" $test {
    -re "\rsymbol_04_length_40_____________________\r\n$gdb_prompt " {
	pass $test
    }
}

gdb_test "foo" {No symbol "symbol_0foo" in current context\.} "abort more message"

set cmd "p symbol_"
send_gdb "$cmd\t"
set test "bell for ask message"
gdb_test_multiple "" $test {
    -re "$cmd\007$" {
	pass $test
    }
}

send_gdb "\t"
set test "ask message"
gdb_test_multiple "" $test {
    -re "^\r\nDisplay all 5 possibilities\\? \\(y or n\\)$" {
	pass $test
    }
    -re "$gdb_prompt " {
	fail $test
	return 0
    }
}

send_gdb "y"
set test "ask message for 01 and 02"
gdb_test_multiple "" $test {
    -re "^\r\nsymbol_01_length_40_____________________\r\nsymbol_02_length_40_____________________\r\n--More--$" {
	pass $test
    }
}

# There get some VT100 characters printed.
# See the "$gdb_prompt " match like in "more finish for 04".

send_gdb "n"
set test "ask message no"
gdb_test_multiple "" $test {
    -re "\r$gdb_prompt " {
	pass $test
    }
}

gdb_test "foo" {No symbol "symbol_foo" in current context\.} "abort ask message"
