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

set testfile readline-ask
set executable ${testfile}.x
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${executable}
set inputrc ${srcdir}/${subdir}/${testfile}.inputrc

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {debug}] != "" } {
    untested ${testfile}.exp
    return -1
}

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

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"
