diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index b50340203f..5b4a5181d3 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-08-13 Tom Tromey + + * gdb.base/readline.exp: New file. + 2002-08-01 Andrew Cagney * lib/gdb.exp (gdb_expect_list): Only print one pass, fail, or diff --git a/gdb/testsuite/gdb.base/readline.exp b/gdb/testsuite/gdb.base/readline.exp new file mode 100644 index 0000000000..8edd1333db --- /dev/null +++ b/gdb/testsuite/gdb.base/readline.exp @@ -0,0 +1,190 @@ +# Copyright 2002 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Tom Tromey + +# This file is part of the gdb testsuite. + +# +# Tests for readline operations. +# + +# This function is used to test operate-and-get-next. +# NAME is the name of the test. +# ARGS is a list of alternating commands and expected results. +proc operate_and_get_next {name args} { + global gdb_prompt + + set my_gdb_prompt "($gdb_prompt| >)" + + set reverse {} + foreach {item result} $args { + verbose "sending $item" + sleep 1 + + # We can't use gdb_test here because we might see a " >" prompt. + set status 0 + send_gdb "$item\n" + gdb_expect { + -re "$item" { + # Ok + } + timeout { + set status 1 + } + } + + if {! $status} { + gdb_expect { + -re "$result" { + # Ok. + } + timeout { + set status 1 + } + } + } + + if {$status} { + fail "$name - send $item" + return 0 + } + pass "$name - send $item" + + set reverse [linsert $reverse 0 $item $result] + } + + # Now use C-p to go back to the start. + foreach {item result} $reverse { + # Actually send C-p followed by C-l. This lets us recognize the + # command when gdb prints it again. + send_gdb "\x10\x0c" + set status 0 + gdb_expect { + -re "$item" { + # Ok + } + timeout { + set status 1 + } + } + if {$status} { + fail "$name - C-p to $item" + return 0 + } + pass "$name - C-p to $item" + } + + # Now C-o through the list. Don't send the command, since it is + # already there. Strip off the first command from the list so we + # can see the next command inside the loop. + set count 0 + foreach {item result} $args { + set status 0 + + # If this isn't the first item, make sure we see the command at + # the prompt. + if {$count > 0} { + gdb_expect { + -re ".*$item" { + # Ok + } + timeout { + set status 1 + } + } + } + + if {! $status} { + # For the last item, send a simple \n instead of C-o. + if {$count == [llength $args] - 2} { + send_gdb "\n" + } else { + # 15 is C-o. + send_gdb [format %c 15] + } + set status 0 + gdb_expect { + -re "$result" { + # Ok + } + timeout { + set status 1 + } + } + } + + if {$status} { + fail "$name - C-o for $item" + return 0 + } + pass "$name - C-o for $item" + + set count [expr {$count + 2}] + } + + return 1 +} + + +if $tracelevel { + strace $tracelevel +} + +# Don't let a .inputrc file or an existing setting of INPUTRC mess up +# the test results. Even if /dev/null doesn't exist on the particular +# platform, the readline library will use the default setting just by +# failing to open the file. OTOH, opening /dev/null successfully will +# also result in the default settings being used since nothing will be +# read from this file. +global env +if [info exists env(INPUTRC)] { + set old_inputrc $env(INPUTRC) +} +set env(INPUTRC) "/dev/null" + +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + +set oldtimeout1 $timeout +set timeout 30 + + +# A simple test of operate-and-get-next. +operate_and_get_next "Simple operate-and-get-next" \ + "p 1" ".* = 1" \ + "p 2" ".* = 2"\ + "p 3" ".* = 3" + +# Test operate-and-get-next with a secondary prompt. +operate_and_get_next "operate-and-get-next with secondary prompt" \ + "if 1 > 0" "" \ + "p 5" "" \ + "end" ".* = 5" + + +# Restore globals modified in this test... +if [info exists old_inputrc] { + set env(INPUTRC) $old_inputrc +} else { + unset env(INPUTRC) +} +set timeout $oldtimeout1 + +return 0