# Copyright (C) 1998 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 Elena Zannoni (ezannoni@cygnus.com)

# This file is part of the gdb testsuite.

#
# tests for command completion
#
# Here are some useful test cases for completion.  
# They should be tested with both M-? and TAB.
#
#   "show output-" "radix"
#   "show output" "-radix"
#   "p" ambiguous (commands starting with p--path, print, printf, etc.)
#   "p "  ambiguous (all symbols)
#   "info t foo" no completions
#   "info t " no completions
#   "info t" ambiguous ("info target", "info terminal", etc.)
#   "info ajksdlfk" no completions
#   "info ajksdlfk " no completions
#   "info" " "
#   "info " ambiguous (all info commands)
#   "p \"a" no completions (string constant)
#   "p 'a" ambiguous (all symbols starting with a)
#   "p b-a" ambiguous (all symbols starting with a)
#   "p b-" ambiguous (all symbols)
#   "file Make" "file" (word break hard to screw up here)
#   "file ../gdb.stabs/we" "ird" (needs to not break word at slash)
#


if $tracelevel then {
        strace $tracelevel
        }


if { ![istarget "hppa*-hp-hpux*"] } {
    #skip all these tests for now (FIXME)
    continue
}

global usestubs

#
# test running programs
#
set prms_id 0
set bug_id 0

set testfile "break"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

if [get_compiler_info ${binfile}] {
    return -1;
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then {
        perror "tests suppressed"
}

set oldtimeout1 $timeout
set timeout 30


send_gdb "hfgfh\t"
sleep 1
gdb_expect  {
        -re "^hfgfh\\\x07$"\
            { send_gdb "\n"
              gdb_expect {
                      -re "Undefined command: \"hfgfh\"\\.  Try \"help\"\\..*$gdb_prompt $"\
                                        { pass "complete 'hfgfh'"}
                      -re ".*$gdb_prompt $" { fail "complete 'hfgfh'"}
                      timeout           {fail "(timeout) complete 'hfgfh'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'hfgfh'" }
        timeout         { fail "(timeout) complete 'hfgfh'" }
        }

#exp_internal 0

send_gdb "show output\t"
sleep 1
gdb_expect  {
        -re "^show output-radix $"\
            { send_gdb "\n"
              gdb_expect {
                      -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\
                                        { pass "complete 'show output'"}
                      -re ".*$gdb_prompt $" { fail "complete 'show output'"}
                      timeout           {fail "(timeout) complete 'show output'"}
                     }
            }
        -re "^show output$"\
            { send_gdb "\n"
               gdb_expect {
                      -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\
                                        { fail "complete 'show output'"}
                      -re ".*$gdb_prompt $" { fail "complete 'show output'"}
                      timeout           { fail "(timeout) complete 'show output'"}
                     }

             }

        -re ".*$gdb_prompt $"       { fail "complete 'show output'" }
        timeout         { fail "(timeout) complete 'show output'" }
        }


send_gdb "show output-\t"
sleep 1
gdb_expect  {
        -re "^show output-radix $"\
            { send_gdb "\n"
              gdb_expect {
                      -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\
                                        { pass "complete 'show output-'"}
                      -re ".*$gdb_prompt $" { fail "complete 'show output-'"}
                      timeout           {fail "(timeout) complete 'show output-'"}
                     }
            }
        -re "^show output-$"\
            { send_gdb "\n"
               gdb_expect {
                      -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\
                                        { fail "complete 'show output-'"}
                      -re ".*$gdb_prompt $" { fail "complete 'show output-'"}
                      timeout           { fail "(timeout) complete 'show output-'"}
                     }

             }

        -re ".*$gdb_prompt $"       { fail "complete 'show output-'" }
        timeout         { fail "(timeout) complete 'show output-'" }
        }

send_gdb "p\t"
sleep 1
gdb_expect  {
        -re "^p\\\x07$"\
            { send_gdb "\n"
	      sleep 1
              gdb_expect {
                      -re "The history is empty\\..*$gdb_prompt $"\
                                        { pass "complete 'p'"}
                      -re ".*$gdb_prompt $" { fail "complete 'p'"}
                      timeout           {fail "(timeout) complete 'p' 2"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'p'" }
        timeout         { fail "(timeout) complete 'p' 1" }
        }

send_gdb "p \t"
sleep 3
gdb_expect  {
        -re "^p \\\x07$"\
            { send_gdb "\n"
	      sleep 1
              gdb_expect {
                      -re "The history is empty\\..*$gdb_prompt $"\
                                        { pass "complete 'p '"}
                      -re ".*$gdb_prompt $" { fail "complete 'p '"}
                      timeout           {fail "(timeout) complete 'p ' 1"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'p '" }
        timeout         { fail "(timeout) complete 'p ' 2" }
        }


send_gdb "info t foo\t"
sleep 1
gdb_expect  {
        -re "^info t foo\\\x07$"\
            { send_gdb "\n"
              gdb_expect {
                      -re "Ambiguous info command \"t foo\": target, terminal, threads, tp, tracepoints, types\\..*$gdb_prompt $"\
                                        { pass "complete 'info t foo'"}
                      -re ".*$gdb_prompt $" { fail "complete 'info t foo'"}
                      timeout           {fail "(timeout) complete 'info t foo'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'info t foo'" }
        timeout         { fail "(timeout) complete 'info t foo'" }
        }

send_gdb "info t\t"
sleep 1
gdb_expect  {
        -re "^info t\\\x07$"\
            { send_gdb "\n"
              gdb_expect {
                      -re "Ambiguous info command \"t\": target, terminal, threads, tp, tracepoints, types\\..
*$gdb_prompt $"\
                                        { pass "complete 'info t'"}
                      -re ".*$gdb_prompt $" { fail "complete 'info t'"}
                      timeout           {fail "(timeout) complete 'info t'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'info t'" }
        timeout         { fail "(timeout) complete 'info t'" }
        }


send_gdb "info t \t"
sleep 1
gdb_expect  {
        -re "^info t \\\x07$"\
            { send_gdb "\n"
              gdb_expect {
                      -re "Ambiguous info command \"t \": target, terminal, threads, tp, tracepoints, types\\..
*$gdb_prompt $"\
                                        { pass "complete 'info t '"}
                      -re ".*$gdb_prompt $" { fail "complete 'info t '"}
                      timeout           {fail "(timeout) complete 'info t '"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'info t '" }
        timeout         { fail "(timeout) complete 'info t '" }
        }


send_gdb "info asdfgh\t"
sleep 1
gdb_expect  {
        -re "^info asdfgh\\\x07$"\
            { send_gdb "\n"
              gdb_expect {
                      -re "Undefined info command: \"asdfgh\".  Try \"help info\"\\..
*$gdb_prompt $"\
                                        { pass "complete 'info asdfgh'"}
                      -re ".*$gdb_prompt $" { fail "complete 'info asdfgh'"}
                      timeout           {fail "(timeout) complete 'info asdfgh'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'info asdfgh'" }
        timeout         { fail "(timeout) complete 'info asdfgh'" }
        }


send_gdb "info asdfgh \t"
sleep 1
gdb_expect  {
        -re "^info asdfgh \\\x07$"\
            { send_gdb "\n"
              gdb_expect {
                      -re "Undefined info command: \"asdfgh \".  Try \"help info\"\\..
*$gdb_prompt $"\
                                        { pass "complete 'info asdfgh '"}
                      -re ".*$gdb_prompt $" { fail "complete 'info asdfgh '"}
                      timeout           {fail "(timeout) complete 'info asdfgh '"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'info asdfgh '" }
        timeout         { fail "(timeout) complete 'info asdfgh '" }
        }

send_gdb "info\t"
sleep 1
gdb_expect  {
        -re "^info $"\
            { send_gdb "\n"
              gdb_expect {
                      -re "\"info\" must be followed by the name of an info command\\.\r\nList of info subcommands:\r\n\r\n.*info address.*info watchpoints.*\r\n\r\nType \"help info\" followed by info subcommand name for full documentation.\r\nCommand name abbreviations are allowed if unambiguous\\..*$gdb_prompt $"\
                                        { pass "complete 'info'"}
                      -re ".*$gdb_prompt $" { fail "complete 'info'"}
                      timeout           {fail "(timeout) complete 'info'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'info'" }
        timeout         { fail "(timeout) complete 'info'" }
        }

send_gdb "info \t"
sleep 1
gdb_expect  {
        -re "^info \\\x07$"\
            { send_gdb "\n"
              gdb_expect {
                      -re "\"info\" must be followed by the name of an info command\\.\r\nList of info subcommands:\r\n\r\n.*info address.*Type \"help info\" followed by info subcommand name for full documentation.\r\nCommand name abbreviations are allowed if unambiguous\\..*$gdb_prompt $"\
                                        { pass "complete 'info '"}
                      -re ".*$gdb_prompt $" { fail "complete 'info '"}
                      timeout           {fail "(timeout) complete 'info '"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'info '" }
        timeout         { fail "(timeout) complete 'info '" }
        }


send_gdb "info \t"
sleep 1
gdb_expect  {
        -re "^info \\\x07$"\
            { send_gdb "\t"
              gdb_expect {
                      -re "address.*types.*$gdb_prompt info $"\
                          { send_gdb "\n"
                            gdb_expect {
                                     -re "\"info\".*unambiguous\\..*$gdb_prompt $"\
                                        { pass "complete (2) 'info '"}
                                     -re ".*$gdb_prompt $" { fail "complete (2) 'info '"}
                                     timeout           {fail "(timeout) complete (2) 'info '"}
                                    }
                           }
                      -re ".*$gdb_prompt $" { fail "complete (2) 'info '"}
                      timeout           {fail "(timeout) complete (2) 'info '"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete (2) 'info '" }
        timeout         { fail "(timeout) complete (2) 'info '" }
        }


send_gdb "p \"a\t"
sleep 1
gdb_expect  {
        -re "^p \"a\\\x07$"\
            { send_gdb "\n"
              gdb_expect {
                      -re "Unterminated string in expression\\..*$gdb_prompt $"\
                                        { pass "complete 'p a'"}
                      -re ".*$gdb_prompt $" { fail "complete 'p a'"}
                      timeout           {fail "(timeout) complete 'p a'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'p \"a'" }
        timeout         { fail "(timeout) complete 'p \"a'" }
        }

send_gdb "p 'a\t"
sleep 1
gdb_expect  {
        -re "^p 'a\\\x07$"\
            { send_gdb "\n"
              gdb_expect {
                      -re "Invalid character constant\\..*$gdb_prompt $"\
                                        { pass "complete 'p \'a'"}
                      -re ".*$gdb_prompt $" { fail "complete 'p \'a'"}
                      timeout           {fail "(timeout) complete 'p \'a'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'p \'a'" }
        timeout         { fail "(timeout) complete 'p \'a'" }
        }

send_gdb "p 'a\t"
sleep 1
gdb_expect {
    -re "^p 'a\\\x07$" {
	send_gdb "\t"
	gdb_expect {
	    -re "a64l.*atol.*$gdb_prompt p .a$" {
		send_gdb "\n"
		gdb_expect {
		    -re "Invalid character constant\\..*$gdb_prompt $" {
			pass "complete (2) 'p \'a'"
		    }
		    -re ".*$gdb_prompt $" { fail "complete (2) 'p \'a'" }
		    timeout { fail "(timeout) complete (2) 'p \'a'" }
		}
	    }
	    -re "(There are $decimal possibilities\\.  Do you really\r\nwish to see them all.|Display all $decimal possibilities.) \\(y or n\\)$" {
		send_gdb "n"
		gdb_expect {
		    -re "\\(gdb\\) p 'a$" {
			send_gdb "\n"
			gdb_expect {
			    -re "Invalid character constant\\..*$gdb_prompt $" {
				pass "complete (2) 'p \'a'"
			    }
			    -re ".*$gdb_prompt $" { 
				fail "complete (2) 'p \'a'"
			    }
			    timeout { fail "(timeout) complete (2) 'p \'a'" }
			}
		    }
		    -re ".*$gdb_prompt $" { fail "complete (2) 'p \'a'" }
		    timeout { fail "(timeout) complete (2) 'p \'a'" }
		}
	    }
	    -re ".*$gdb_prompt $" { fail "complete (2) 'p \'a'" }
	    timeout { fail "(timeout) complete (2) 'p \'a'" }
	}
    }
    -re ".*$gdb_prompt $" { fail "complete (2) 'p \'a'" }
    timeout { fail "(timeout) complete (2) 'p \'a'" }
}


send_gdb "p b-a\t"
sleep 1
gdb_expect  {
        -re "^p b-a\\\x07$"\
            { send_gdb "\n"
              gdb_expect {
                      -re "No symbol \"b\" in current context\\..*$gdb_prompt $"\
                                        { pass "complete 'p b-a'"}
                      -re ".*$gdb_prompt $" { fail "complete 'p b-a'"}
                      timeout           {fail "(timeout) complete 'p b-a'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'p b-a'" }
        timeout         { fail "(timeout) complete 'p b-a'" }
        }

send_gdb "p b-a\t"
sleep 1
gdb_expect {
    -re "^p b-a\\\x07$" {
	send_gdb "\t"
	gdb_expect {
	    -re "a64l.*atol.*$gdb_prompt p b-a$" {
		send_gdb "\n"
		gdb_expect {
		    -re "No symbol \"b\" in current context\\..*$gdb_prompt $" {
			pass "complete (2) 'p b-a'"
		    }
		    -re ".*$gdb_prompt $" { fail "complete (2) 'p b-a'" }
		    timeout { fail "(timeout) complete (2) 'p b-a'" }
		}
	    }
	    -re "(There are $decimal possibilities\\.  Do you really\r\nwish to see them all.|Display all $decimal possibilities.) \\(y or n\\)$" {
		send_gdb "n"
		gdb_expect {
		    -re "\\(gdb\\) p b-a$" {
			send_gdb "\n"
			gdb_expect {
			    -re "No symbol \"b\" in current context\\..*$gdb_prompt $" {
				pass "complete (2) 'p b-a'"
			    }
			    -re ".*$gdb_prompt $" {
				fail "complete (2) 'p b-a'"
			    }
			    timeout { fail "(timeout) complete (2) 'p b-a'" }
			}
		    }
		    -re ".*$gdb_prompt $" { fail "complete (2) 'p b-a'" }
		    timeout { fail "(timeout) complete (2) 'p b-a'" }
		}
	    }
	    -re ".*$gdb_prompt $" { fail "complete (2) 'p b-a'" }
	    timeout { fail "(timeout) complete (2) 'p b-a'" }
        }
    }
    -re ".*$gdb_prompt $" { fail "complete (2) 'p b-a'" }
    timeout { fail "(timeout) complete (2) 'p b-a'" }
}

send_gdb "p b-\t"
sleep 1
gdb_expect  {
    -re "^p b-\\\x07$" {
	send_gdb "\t"
	gdb_expect {
	    -re "(There are $decimal possibilities\\.  Do you really\r\nwish to see them all.|Display all $decimal possibilities.) \\(y or n\\)$" {
		send_gdb "n"
		gdb_expect {
		    -re "\\(gdb\\) p b-$" {
			send_gdb "\n"
			gdb_expect {
			    -re "No symbol \"b\" in current context\\..*$gdb_prompt $" {
				pass "complete (2) 'p b-'"
			    }
			    -re ".*$gdb_prompt $" {
				fail "complete (2) 'p b-'"
			    }
			    timeout { fail "(timeout) complete (2) 'p b-'" }
			}
		    }
		    -re ".*$gdb_prompt $" { fail "complete (2) 'p b-'" }
		    timeout { fail "(timeout) complete (2) 'p b-'" }
		}
	    }
	    -re ".*$gdb_prompt $" { fail "complete (2) 'p b-'" }
	    timeout { fail "(timeout) complete (2) 'p b-'" }
	}
    }
    -re ".*$gdb_prompt $" { fail "complete (2) 'p b-'" }
    timeout { fail "(timeout) complete (2) 'p b-'" }
}

send_gdb "file ${objdir}/Make\t"
sleep 1
gdb_expect  {
        -re "file ${objdir}/Makefile.*$"\
            { send_gdb "\n"
              gdb_expect {
                      -re "\r\nA program is being debugged already\\.  Kill it\\? \\(y or n\\) $"\
                      { send_gdb "n\n"
                        gdb_expect {
                                -re "\r\nProgram not killed\\.\r\n$gdb_prompt $"\
                                        { pass "complete 'file Make'"}
                                -re ".*$gdb_prompt $" { fail "complete 'file Make'"}
                                timeout           {fail "(timeout) complete 'file Make'"}
                               }
                      }
                      -re ".*$gdb_prompt $" { fail "complete 'file Make'"}
                      timeout           {fail "(timeout) complete 'file Make'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'file Make'" }
        timeout         { fail "(timeout) complete 'file Make'" }
        }


send_gdb "file ${srcdir}/gdb.base/self\t"
sleep 1
gdb_expect  {
        -re "^file ${srcdir}/gdb.base/.*'selftest\\.exp' $"\
            { send_gdb "\n"
              gdb_expect {
                      -re "\r\nA program is being debugged already\\.  Kill it\\? \\(y or n\\) $"
\
                      { send_gdb "n\n"
                        gdb_expect {
                                -re "\r\nProgram not killed\\.\r\n$gdb_prompt $"\
                                        { pass "complete 'file gdb.base/self'"}
                                -re ".*$gdb_prompt $" { fail "complete 'file gdb.base/self'"}
                                timeout           {fail "(timeout) complete 'file gdb.base/self'"}
                               }
                      }
                      -re ".*$gdb_prompt $" { fail "complete 'file gdb.base/self'"}
                      timeout           {fail "(timeout) complete 'file gdb.base/self'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'file gdb.base/self'" }
        timeout         { fail "(timeout) complete 'file gdb.base/self'" }
        }


send_gdb "info func mark\t"
sleep 1
gdb_expect  {
        -re "^info func mark.*er$"\
            {
	      send_gdb "\t\t"
              sleep 3
              gdb_expect {
                      -re "marker1.*$gdb_prompt info func marker$"\
                      { send_gdb "\n"
                        gdb_expect {
                                -re "All functions matching regular expression \"marker\":\r\n\r\nFile.*break.c:\r\nint marker1\\(.*\\);\r\nint marker2\\(int\\).*marker3\\(char.*char.*\\).*marker4\\(long\\);\r\n$gdb_prompt $"\
                                                  { pass "complete 'info func mar'"}
                                -re ".*$gdb_prompt $" { fail "complete 'info func mar'"}
                                timeout           {fail "(timeout) complete 'info func mar'"}
                               }
                      }
                      -re ".*$gdb_prompt $" { fail "complete 'info func mar'"}
                      timeout           {fail "(timeout) complete 'info func mar'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'info func mar'" }
        timeout         { fail "(timeout) complete 'info func mar'" }
        }


send_gdb "set follow-fork-mode \t\t"
sleep 1
gdb_expect  {
        -re "ask.*child.*parent.*$gdb_prompt set follow-fork-mode $"\
            { send_gdb "\n"
              gdb_expect {
                      -re "Requires an argument.*parent.*child.*ask.*$gdb_prompt $"\
                                        { pass "complete 'set follow-fork-mode'"}
                      -re "Ambiguous item \"\"\\..*$gdb_prompt $"\
                                        { pass "complete 'set follow-fork-mode'"}
                      -re ".*$gdb_prompt $" { fail "complete 'set follow-fork-mode'"}
                      timeout           {fail "(timeout) complete 'set follow-fork-mode'"}
                     }
            }
        -re ".*$gdb_prompt $"       { fail "complete 'set follow-fork-mode'" }
        timeout         { fail "(timeout) complete 'set follow-fork-mode'" }
        }

set timeout $oldtimeout1
return 0














