xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.base/define.exp (revision e89934bbf778a6d6d6894877c4da59d0c7835b0f)
1# Copyright 1998-2015 Free Software Foundation, Inc.
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16# This file was written by Elena Zannoni. (ezannoni@cygnus.com)
17
18
19#
20# test running programs
21#
22
23standard_testfile break.c break1.c
24
25if {[prepare_for_testing ${testfile}.exp ${testfile} \
26	 [list $srcfile $srcfile2] {debug nowarnings}]} {
27    return -1
28}
29
30set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]
31set bp_location11 [gdb_get_line_number "set breakpoint 11 here"]
32
33if ![runto_main] then { fail "define tests suppressed" }
34
35# Verify that GDB allows a user to define their very own commands.
36#
37gdb_test_multiple "define nextwhere" "define user command: nextwhere" {
38    -re "Type commands for definition of \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" {
39	gdb_test "next\nbt\nend" "" \
40	    "define user command: nextwhere"
41    }
42}
43
44# Verify that those commands work as gdb_expected.
45#
46gdb_test "nextwhere" \
47    "$bp_location1\[ \t\]*printf.*#0\[ \t\]*main.*:$bp_location1.*" \
48    "use user command: nextwhere"
49
50# Verify that a user can define a command whose spelling is a
51# proper substring of another user-defined command.
52#
53gdb_test_multiple "define nextwh" "define user command: nextwh" {
54    -re "Type commands for definition of \"nextwh\".\r\nEnd with a line saying just \"end\".\r\n>$" {
55	gdb_test "next 2\nbt\nend" "" \
56	    "define user command: nextwh"
57    }
58}
59
60# Verify that a user can redefine their commands.  (Test both the
61# confirmed and unconfirmed cases.)
62#
63gdb_test "define nextwhere" \
64    "Command \"nextwhere\" not redefined.*" \
65    "redefine user command aborted: nextwhere" \
66    "Redefine command \"nextwhere\".*y or n. $" \
67    "n"
68
69send_gdb "define nextwhere\n"
70gdb_expect {
71  -re "Redefine command \"nextwhere\".*y or n. $"\
72          {send_gdb "y\n"
73           gdb_expect {
74             -re "Type commands for definition of \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$"\
75                     {send_gdb "bt\nnext\nend\n"
76                      gdb_expect {
77                        -re "$gdb_prompt $"\
78                                {pass "redefine user command: nextwhere"}
79                        timeout {fail "(timeout) redefine user command: nextwhere"}
80                      }
81                     }
82             timeout {fail "(timeout) redefine user command: nextwhere"}
83           }
84          }
85  -re "$gdb_prompt $"\
86          {fail "redefine user command: nextwhere"}
87  timeout {fail "(timeout) redefine user command: nextwhere"}
88}
89
90# Verify that GDB gracefully handles an attempt to redefine the
91# help text for a builtin command.
92#
93gdb_test "document step" "Command \"step\" is built-in.*" \
94    "redocumenting builtin command disallowed"
95
96# Verify that a user can document their own commands.  (And redocument
97# them.)
98#
99gdb_test_multiple "document nextwhere" "document user command: nextwhere" {
100    -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" {
101	gdb_test "A next command that first shows you where you're stepping from.\nend" \
102	    "" \
103	    "document user command: nextwhere"
104    }
105}
106
107gdb_test_multiple "document nextwhere" "re-document user command: nextwhere" {
108    -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" {
109	gdb_test "A next command that first shows you where you're stepping from.\nend" \
110	    "" \
111	    "re-document user command: nextwhere"
112    }
113}
114
115gdb_test "help nextwhere" \
116    "A next command that first shows you where you're stepping from.*" \
117    "help user command: nextwhere"
118
119# Verify that the document command preserves whitespace in the beginning of the line.
120#
121gdb_test_multiple "document nextwhere" "set up whitespace in help string" {
122    -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" {
123	gdb_test "   A next command that first shows you where you're stepping from.\nend" \
124	    "" \
125	    "set up whitespace in help string"
126    }
127}
128
129gdb_test "help nextwhere" \
130    "   A next command that first shows you where you're stepping from.*" \
131    "preserve whitespace in help string"
132
133# Verify that the command parser doesn't require a space after an 'if'
134# command in a user defined function.
135#
136gdb_test_multiple "define ifnospace" "define user command: ifnospace" \
137{
138  -re "Type commands for definition of \"ifnospace\".\r\nEnd with a line saying just \"end\".\r\n>$" \
139    {
140      gdb_test_multiple "if(3<4)\nprint \"hi there\\n\"\nend\nend" "send body of ifnospace"  \
141        {
142         -re "$gdb_prompt $"\
143                 {pass "define user command: ifnospace"}
144        }
145    }
146}
147
148gdb_test "ifnospace" ".*hi there.*" "test ifnospace is parsed correctly"
149
150# Verify that the command parser doesn't require a space after an 'while'
151# command in a user defined function.
152#
153gdb_test_multiple "define whilenospace" "define user command: whilenospace" \
154{
155  -re "Type commands for definition of \"whilenospace\".\r\nEnd with a line saying just \"end\".\r\n>$" \
156    {
157      gdb_test_multiple "set \$i=1\nwhile(\$i<2)\nset \$i=2\nprint \"hi there\\n\"\nend\nend" "send body of whilenospace" \
158         {
159           -re "$gdb_prompt $" \
160                   {pass "define user command: whilenospace"}
161         }
162    }
163}
164
165gdb_test "whilenospace" ".*hi there.*" "test whilenospace is parsed correctly"
166
167# Verify that the user can "hook" a builtin command.  We choose to
168# hook the "stop" pseudo command, and we'll define it to use a user-
169# define command.
170#
171gdb_test_multiple "define user-bt" "define user command: user-bt" {
172    -re "Type commands for definition of \"user-bt\".\r\nEnd with a line saying just \"end\".\r\n>$" {
173	gdb_test "bt\nend" \
174	    "" \
175	    "define user command: user-bt"
176    }
177}
178
179gdb_test_multiple "define hook-stop" "define hook-stop command" {
180    -re "Type commands for definition of \"hook-stop\".\r\nEnd with a line saying just \"end\".\r\n>$" {
181	gdb_test "user-b\nend" \
182	    "" \
183	    "define hook-stop command"
184    }
185}
186
187gdb_test "next" "#0\[ \t\]*main.*:$bp_location11.*" \
188    "use hook-stop command"
189
190# Verify that GDB responds gracefully to an attempt to define a "hook
191# command" which doesn't exist.  (Test both the confirmed and unconfirmed
192# cases.)
193#
194gdb_test "define hook-bar" \
195    "Not confirmed.*" \
196    "define hook undefined command aborted: bar" \
197    "warning: Your new `hook-bar' command does not hook any existing command.\r\nProceed.*y or n. $" \
198    "n"
199
200send_gdb "define hook-bar\n"
201gdb_expect {
202  -re "warning: Your new `hook-bar' command does not hook any existing command.\r\nProceed.*y or n. $"\
203          {send_gdb "y\n"
204           gdb_expect {
205             -re "Type commands for definition of \"hook-bar\".\r\nEnd with a line saying just \"end\".\r\n>$"\
206                     {send_gdb "nextwhere\nend\n"
207                      gdb_expect {
208                        -re "$gdb_prompt $"\
209                                {pass "define hook undefined command: bar"}
210                        timeout {fail "(timeout) define hook undefined command: bar"}
211                      }
212                     }
213             -re "$gdb_prompt $"\
214                     {fail "define hook undefined command: bar"}
215             timeout {fail "(timeout) define hook undefined command: bar"}
216           }
217          }
218  -re "$gdb_prompt $"\
219          {fail "define hook undefined command: bar"}
220  timeout {fail "(timeout) define hook undefined command: bar"}
221}
222
223# Test creation of an additional target subcommand.
224gdb_test_multiple "define target testsuite" "" {
225    -re "Type commands for definition of \"target testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" {
226	gdb_test "printf \"hello\\n\"\nend" "" "define target testsuite"
227    }
228}
229gdb_test_multiple "document target testsuite" "" {
230    -re "Type documentation for \"target testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" {
231	gdb_test "A test target.\nend" "" "document target testsuite"
232    }
233}
234
235gdb_test "help target" ".*A test target.*"
236gdb_test "target testsuite" "hello"
237gdb_test "show user target testsuite" "User command \"target testsuite\":\r\n  printf \"hello\\\\n\"\r\n"
238
239# We should even be able to hook subcommands.
240gdb_test_multiple "define target hook-testsuite" "" {
241    -re "Type commands for definition of \"target hook-testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" {
242	gdb_test "printf \"one\\n\"\nend" "" "define target hook-testsuite"
243    }
244}
245
246gdb_test_multiple "define target hookpost-testsuite" "" {
247    -re "Type commands for definition of \"target hookpost-testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" {
248	gdb_test "printf \"two\\n\"\nend" "" "define target hookpost-testsuite"
249    }
250}
251
252gdb_test "target testsuite" "one\r\nhello\r\ntwo" "target testsuite with hooks"
253
254# This is a quasi-define command: Verify that the user can redefine
255# GDB's gdb_prompt.
256#
257gdb_test_multiple "set prompt \\(blah\\) " "set gdb_prompt" {
258    -re "\\(blah\\) $" {
259	pass "set gdb_prompt"
260    }
261}
262
263gdb_test_multiple "set prompt \\(gdb\\) " "reset gdb_prompt" {
264    -re "$gdb_prompt $" {
265	pass "reset gdb_prompt"
266    }
267}
268
269gdb_exit
270return 0
271