Automatic Copyright Year update after running gdb/copyright.py
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.base / options.exp
CommitLineData
9d0faba9
PA
1# This testcase is part of GDB, the GNU debugger.
2
88b9d363 3# Copyright 2019-2022 Free Software Foundation, Inc.
9d0faba9
PA
4
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; either version 3 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18# Test the gdb::option framework.
19
20# The test uses the "maintenance test-options" subcommands to exercise
21# TAB-completion and option processing.
7d8062de 22#
d4c16835
PA
23# It also tests option integration in various commands, including:
24#
25# - print
26# - compile print
27# - backtrace
5d707134
PA
28# - frame apply
29# - faas
30# - tfaas
6665660a
PA
31# - thread apply
32# - taas
9d0faba9
PA
33
34load_lib completion-support.exp
35
7d8062de
PA
36standard_testfile .c
37
38if {[build_executable "failed to prepare" $testfile $srcfile debug]} {
39 return -1
40}
41
9d0faba9
PA
42clean_restart
43
44if { ![readline_is_used] } {
45 untested "no tab completion support without readline"
46 return -1
47}
48
49# Check the completion result, as returned by the "maintenance show
50# test-options-completion-result" command. TEST is used as test name.
51proc check_completion_result {expected test} {
52 gdb_test "maintenance show test-options-completion-result" \
53 "$expected" \
54 "$test: res=$expected"
55}
56
57# Like test_gdb_complete_unique, but the expected output is expected
58# to be the input line. I.e., the line is already complete. We're
59# just checking whether GDB recognizes the option and auto-appends a
60# space.
61proc test_completer_recognizes {res input_line} {
62 set expected_re [string_to_regexp $input_line]
63 test_gdb_complete_unique $input_line $expected_re
64 check_completion_result $res $input_line
65}
66
67# Wrapper around test_gdb_complete_multiple that also checks the
68# completion result is RES.
69proc res_test_gdb_complete_multiple {res cmd_prefix completion_word args} {
70 test_gdb_complete_multiple $cmd_prefix $completion_word {*}$args
71 check_completion_result $res "$cmd_prefix$completion_word"
72}
73
74# Wrapper around test_gdb_complete_none that also checks the
75# completion result is RES.
76proc res_test_gdb_complete_none { res input_line } {
77 test_gdb_complete_none $input_line
78 check_completion_result $res "$input_line"
79}
80
81# Wrapper around test_gdb_complete_unique that also checks the
82# completion result is RES.
83proc res_test_gdb_complete_unique { res input_line args} {
84 test_gdb_complete_unique $input_line {*}$args
85 check_completion_result $res "$input_line"
86}
87
88# Make a full command name from VARIANT. VARIANT is either
89# "require-delimiter", "unknown-is-error" or "unknown-is-operand".
90proc make_cmd {variant} {
91 return "maint test-options $variant"
92}
93
94# Return a string for the expected result of running "maint
95# test-options xxx", with no flag/option set. OPERAND is the expected
96# operand.
97proc expect_none {operand} {
3d9be6f5 98 return "-flag 0 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint 0 -zuint-unl 0 -string '' -- $operand"
9d0faba9
PA
99}
100
101# Return a string for the expected result of running "maint
102# test-options xxx", with -flag set. OPERAND is the expected operand.
103proc expect_flag {operand} {
3d9be6f5 104 return "-flag 1 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint 0 -zuint-unl 0 -string '' -- $operand"
9d0faba9
PA
105}
106
107# Return a string for the expected result of running "maint
108# test-options xxx", with -bool set. OPERAND is the expected operand.
109proc expect_bool {operand} {
3d9be6f5 110 return "-flag 0 -xx1 0 -xx2 0 -bool 1 -enum xxx -uint 0 -zuint-unl 0 -string '' -- $operand"
9d0faba9
PA
111}
112
113# Return a string for the expected result of running "maint
114# test-options xxx", with one of the integer options set to $VAL.
115# OPTION determines which option to expect set. OPERAND is the
116# expected operand.
117proc expect_integer {option val operand} {
118 if {$option == "uinteger"} {
3d9be6f5 119 return "-flag 0 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint $val -zuint-unl 0 -string '' -- $operand"
9d0faba9 120 } elseif {$option == "zuinteger-unlimited"} {
3d9be6f5 121 return "-flag 0 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint 0 -zuint-unl $val -string '' -- $operand"
9d0faba9
PA
122 } else {
123 error "unsupported option: $option"
124 }
125}
126
3d9be6f5
PA
127# Return a string for the expected result of running "maint
128# test-options xxx", with -string set to $STR. OPERAND is the
129# expected operand.
130proc expect_string {str operand} {
021d8588
AB
131 # Dequote the string in the expected output.
132 if { ( [string range $str 0 0] == "\""
133 && [string range $str end end] == "\"")
134 || ([string range $str 0 0] == "'"
135 && [string range $str end end] == "'")} {
136 set str [string range $str 1 end-1]
137 }
3d9be6f5
PA
138 return "-flag 0 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint 0 -zuint-unl 0 -string '$str' -- $operand"
139}
140
9d0faba9
PA
141set all_options {
142 "-bool"
143 "-enum"
144 "-flag"
3d9be6f5 145 "-string"
9d0faba9
PA
146 "-uinteger"
147 "-xx1"
148 "-xx2"
149 "-zuinteger-unlimited"
150}
151
7d8062de
PA
152# Basic option-machinery + "print" command integration tests.
153proc_with_prefix test-print {{prefix ""}} {
154 clean_restart
155
156 # Completing "print" with no argument completes on symbols only,
157 # no options are offered. Since we haven't loaded any symbols,
158 # the match list should be empty.
159 test_gdb_complete_none "${prefix}print "
160
161 # OTOH, completing at "-" should list all options.
162 test_gdb_complete_multiple "${prefix}print " "-" "" {
163 "-address"
164 "-array"
165 "-array-indexes"
166 "-elements"
167 "-max-depth"
bef382e6 168 "-memory-tag-violations"
7d8062de
PA
169 "-null-stop"
170 "-object"
171 "-pretty"
d8edc8b7 172 "-raw-values"
7d8062de
PA
173 "-repeats"
174 "-static-members"
175 "-symbol"
176 "-union"
177 "-vtbl"
178 }
179
180 global binfile
181 clean_restart $binfile
182
183 if ![runto_main] {
184 fail "cannot run to main"
185 return
186 }
187
188 # Mix options and format.
189 gdb_test "${prefix}print -pretty -- /x 1" " = 0x1"
190
191 # Smoke test that options actually work.
192 gdb_test "${prefix}print -pretty -- g_s" \
193 [multi_line \
194 " = {" \
195 " a = 1," \
196 " b = 2," \
197 " c = 3" \
198 "}"]
199
200 test_gdb_complete_unique \
201 "${prefix}print xxx" \
202 "${prefix}print xxx1"
203 test_gdb_complete_unique \
204 "${prefix}print -- xxx" \
205 "${prefix}print -- xxx1"
206
207 # Error messages when testing with "compile" are different from
208 # the error messages gdb's internal parser throws. This procedure
209 # hides the difference. EXPECTED_RE is only considered when not
210 # testing with "compile".
211 proc test_invalid_expression {cmd expected_re} {
212 upvar prefix prefix
213
214 if {$prefix != "compile "} {
215 gdb_test $cmd $expected_re
216 } else {
217 # Error messages depend on compiler version, so we just
218 # look for the last line indicating a failure.
219 gdb_test $cmd "Compilation failed\\."
220 }
221 }
222
223 # Check that '-XXX' without a "--" is handled as an
224 # expression.
225 gdb_test "${prefix}print -1" " = -1"
226 test_invalid_expression \
227 "${prefix}print --1" \
228 "Left operand of assignment is not an lvalue\\."
229 test_invalid_expression \
230 "${prefix}print -object" \
231 "No symbol \"object\".*"
232
233 # Test printing with options and no expression.
234 set test "${prefix}print -object --"
235 if {$prefix != "compile "} {
236 # Regular "print" repeats the last history value.
237 gdb_test $test " = -1"
238 } else {
239 # "compile print" starts a multiline expression.
240 gdb_test_multiple $test $test {
241 -re ">$" {
242 gdb_test "-1\nend" " = -1" \
243 $test
244 }
245 }
246 }
247
248 # Check that everything after "-- " is treated as an
249 # expression, not confused with an option.
250 test_invalid_expression \
251 "${prefix}print -- -address" \
252 "No symbol.*"
253 gdb_test "${prefix}print -- -1" " = -1"
254 test_invalid_expression \
255 "${prefix}print -- --1" \
256 "Left operand of assignment is not an lvalue\\."
257}
258
d4c16835
PA
259# Basic option-machinery + "backtrace" command integration tests.
260proc_with_prefix test-backtrace {} {
261 clean_restart
262
263 test_gdb_complete_unique "backtrace" "backtrace"
264 test_gdb_complete_none "backtrace "
265
266 gdb_test "backtrace -" "Ambiguous option at: -"
267 gdb_test "backtrace --" "No stack\\."
268 gdb_test "backtrace -- -" "No stack\\."
269
270 test_gdb_complete_multiple "backtrace " "-" "" {
271 "-entry-values"
272 "-frame-arguments"
c7e4c0a6 273 "-frame-info"
d4c16835
PA
274 "-full"
275 "-hide"
276 "-no-filters"
277 "-past-entry"
278 "-past-main"
279 "-raw-frame-arguments"
280 }
281
90a1ef87
PA
282 # Test that we complete the qualifiers, if there's any.
283 test_gdb_complete_unique \
284 "backtrace ful" \
285 "backtrace full"
286 test_gdb_complete_unique \
287 "backtrace hid" \
288 "backtrace hide"
289 test_gdb_complete_unique \
290 "backtrace no-fil" \
291 "backtrace no-filters"
292
d4c16835
PA
293 global binfile
294 clean_restart $binfile
295
296 if ![runto_main] {
297 fail "cannot run to main"
298 return
299 }
300
301 # COUNT in "backtrace COUNT" is parsed as an expression. Check
302 # that we complete expressions.
303
304 test_gdb_complete_unique \
305 "backtrace xxx" \
306 "backtrace xxx1"
307
308 test_gdb_complete_unique \
309 "backtrace -xxx" \
310 "backtrace -xxx1"
311
312 test_gdb_complete_unique \
313 "backtrace 1 + xxx" \
314 "backtrace 1 + xxx1"
315
316 test_gdb_complete_unique \
317 "backtrace (1 + xxx" \
318 "backtrace (1 + xxx1"
319}
320
5d707134
PA
321# Basic option-machinery + "frame apply" command integration tests.
322proc_with_prefix test-frame-apply {} {
323 test_gdb_complete_unique "frame apply all" "frame apply all"
324
325 gdb_test "frame apply level 0-" \
326 "Please specify a command to apply on the selected frames"
327 test_gdb_complete_none "frame apply level 0-"
328
329 foreach cmd {
330 "frame apply all"
331 "frame apply 1"
332 "frame apply level 0"
333 "faas"
334 "tfaas"
335 } {
336 test_gdb_completion_offers_commands "$cmd "
337
338 # tfaas is silent on command error by design. This procedure
339 # hides that aspect. EXPECTED_RE is only considered when not
340 # testing with "faas"/"tfaas".
341 proc test_error_cmd {cmd arg expected_re} {
342 if {$cmd == "tfaas"} {
343 gdb_test_no_output "$cmd$arg"
344 } else {
345 gdb_test "$cmd$arg" $expected_re
346 }
347 }
348 # Same, but for tests where both "faas" and "tfaas" are
349 # expected to be silent.
350 proc test_error_cmd2 {cmd arg expected_re} {
351 if {$cmd == "tfaas" || $cmd == "faas"} {
352 gdb_test_no_output "$cmd$arg"
353 } else {
354 gdb_test "$cmd$arg" $expected_re
355 }
356 }
357
358 test_error_cmd $cmd " -" "Ambiguous option at: -"
359 test_gdb_complete_multiple "$cmd " "-" "" {
360 "-c"
361 "-past-entry"
362 "-past-main"
363 "-q"
364 "-s"
365 }
366
367 with_test_prefix "no-trailing-space" {
368 test_error_cmd $cmd " --" \
369 "Please specify a command to apply on the selected frames"
370 test_gdb_complete_unique "$cmd --" "$cmd --"
371 }
372
373 with_test_prefix "trailing-space" {
374 test_error_cmd $cmd " -- " \
375 "Please specify a command to apply on the selected frames"
376 test_gdb_completion_offers_commands "$cmd -- "
377 }
378
379 # '-' is a valid TUI command.
380 test_error_cmd2 $cmd " -- -" \
381 "Cannot enable the TUI when output is not a terminal"
382 test_gdb_complete_unique \
383 "$cmd -- -" \
384 "$cmd -- -"
385
386 test_error_cmd2 $cmd " -foo" \
387 "Undefined command: \"-foo\". Try \"help\"\\."
388 test_gdb_complete_none "$cmd -foo"
389
390 test_gdb_completion_offers_commands "$cmd -s "
391 }
392}
393
6665660a
PA
394# Basic option-machinery + "thread apply" command integration tests.
395proc_with_prefix test-thread-apply {} {
396
397 test_gdb_complete_unique "thread apply all" "thread apply all"
398 test_gdb_complete_unique "taas" "taas"
399
400 gdb_test "thread apply 1-" \
401 "inverted range"
402 test_gdb_complete_none "frame apply level 1-"
403
404 foreach cmd {
405 "thread apply all"
406 "thread apply 1"
407 "taas"
408 } {
409 test_gdb_completion_offers_commands "$cmd "
410
411 # taas is silent on command error by design. This procedure
412 # hides the difference. EXPECTED_RE is only considered when
413 # not testing with "taas".
414 proc test_invalid_cmd {cmd arg expected_re} {
415 if {$cmd != "taas"} {
416 gdb_test "$cmd$arg" $expected_re
417 } else {
418 gdb_test_no_output "$cmd$arg"
419 }
420 }
421
422 gdb_test "$cmd -" "Ambiguous option at: -"
423
424 if {$cmd != "thread apply 1"} {
425 test_gdb_complete_multiple "$cmd " "-" "" {
426 "-ascending"
427 "-c"
428 "-q"
429 "-s"
430 }
431 } else {
432 # "-ascending" only works with "all".
433 test_gdb_complete_multiple "$cmd " "-" "" {
434 "-c"
435 "-q"
436 "-s"
437 }
438 }
439
440 if {$cmd == "thread apply all" || $cmd == "taas"} {
441 set errmsg \
442 "Please specify a command at the end of 'thread apply all'"
443 } elseif {$cmd == "thread apply 1"} {
444 set errmsg \
445 "Please specify a command following the thread ID list"
446 } else {
447 error "unexpected cmd: $cmd"
448 }
449
450 with_test_prefix "no-trailing-space" {
451 gdb_test "$cmd --" $errmsg
452 test_gdb_complete_unique "$cmd --" "$cmd --"
453 }
454
455 with_test_prefix "trailing-space" {
456 gdb_test "$cmd -- " $errmsg
457 test_gdb_completion_offers_commands "$cmd -- "
458 }
459
460 # '-' is a valid TUI command.
461 test_invalid_cmd "$cmd" " -- -" \
462 "Cannot enable the TUI when output is not a terminal"
463 test_gdb_complete_unique \
464 "$cmd -- -" \
465 "$cmd -- -"
466
467 test_invalid_cmd $cmd " -foo" \
468 "Undefined command: \"-foo\". Try \"help\"\\."
469 test_gdb_complete_none "$cmd -foo"
470
471 test_gdb_completion_offers_commands "$cmd -c "
472 }
473}
474
54d66006
PA
475# Basic option-machinery + "info threads" command integration tests.
476proc_with_prefix test-info-threads {} {
477 test_gdb_complete_multiple "info threads " "" "" {
478 "-gid"
479 "ID"
480 }
481
482 test_gdb_complete_unique \
483 "info threads -" \
484 "info threads -gid"
485
486 # "ID" isn't really something the user can type.
487 test_gdb_complete_none "info threads I"
488}
489
9d0faba9
PA
490# Miscellaneous tests.
491proc_with_prefix test-misc {variant} {
492 global all_options
493
494 set cmd [make_cmd $variant]
495
496 # Call test command with no arguments at all.
497 gdb_test "$cmd" [expect_none ""]
498
499 # Now with a single dash.
500 if {$variant == "require-delimiter"} {
501 gdb_test "$cmd -" [expect_none "-"]
502 } else {
503 gdb_test "$cmd -" "Ambiguous option at: -"
504 }
505
506 # Completing at "-" should list all options.
41fc454c
PA
507 res_test_gdb_complete_multiple \
508 "1 [expect_none "-"]" \
509 "$cmd " "-" "" $all_options
9d0faba9
PA
510
511 # Now with a double dash.
512 gdb_test "$cmd --" [expect_none ""]
513
514 # "--" is recognized by options completer, gdb auto-appends a
515 # space.
41fc454c
PA
516 test_completer_recognizes \
517 "1 [expect_none "--"]" \
518 "$cmd --"
9d0faba9
PA
519
520 # Now with a double dash, plus a dash as operand.
521 gdb_test "$cmd -- -" [expect_none "-"]
522 res_test_gdb_complete_none "0 -" "$cmd -- -"
523
524 # Completing an unambiguous option just appends an empty space.
41fc454c
PA
525 test_completer_recognizes \
526 "1 [expect_none "-flag"]" \
527 "$cmd -flag"
9d0faba9
PA
528
529 # Try running an ambiguous option.
530 if {$variant == "require-delimiter"} {
531 gdb_test "$cmd -xx" [expect_none "-xx"]
532 } else {
533 gdb_test "$cmd -xx" "Ambiguous option at: -xx"
534 }
535
536 # Check that options are not case insensitive.
537 gdb_test "$cmd -flag --" [expect_flag ""]
538
539 # Check how the different modes behave on unknown option, with a
540 # delimiter.
541 gdb_test "$cmd -FLAG --" \
542 "Unrecognized option at: -FLAG --"
543
544 # Check how the different modes behave on unknown option, without
545 # a delimiter.
546 if {$variant == "unknown-is-error"} {
547 gdb_test "$cmd -FLAG" \
548 "Unrecognized option at: -FLAG"
549 } else {
550 gdb_test "$cmd -FLAG" [expect_none "-FLAG"]
551 }
552
553 # Test parsing stops at a negative integer.
554 gdb_test "$cmd -1 --" \
555 "Unrecognized option at: -1 --"
556 gdb_test "$cmd -2 --" \
557 "Unrecognized option at: -2 --"
558}
559
560# Flag option tests.
561proc_with_prefix test-flag {variant} {
562 global all_options
563
564 set cmd [make_cmd $variant]
565
566 # Completing a flag just appends a space.
41fc454c
PA
567 test_completer_recognizes \
568 "1 [expect_none "-flag"]" \
569 "$cmd -flag"
9d0faba9
PA
570
571 # Add a dash, and all options should be shown.
41fc454c
PA
572 res_test_gdb_complete_multiple \
573 "1 [expect_flag "-"]" \
574 "$cmd -flag " "-" "" $all_options
9d0faba9
PA
575
576 # Basic smoke tests of accepted / not accepted values.
577
578 # Check all the different variants a bool option may be specified.
579 if {$variant == "require-delimiter"} {
580 gdb_test "$cmd -flag 999" [expect_none "-flag 999"]
581 } else {
582 gdb_test "$cmd -flag 999" [expect_flag "999"]
583 }
584 gdb_test "$cmd -flag -- 999" [expect_flag "999"]
585
586 # If the "--" separator is present, then GDB errors out if the
587 # flag option is passed some value -- check that too.
588 gdb_test "$cmd -flag xxx 999 --" "Unrecognized option at: xxx 999 --"
589 gdb_test "$cmd -flag o 999 --" "Unrecognized option at: o 999 --"
590 gdb_test "$cmd -flag 1 999 --" "Unrecognized option at: 1 999 --"
591
592 # Extract twice the same flag, separated by one space.
593 gdb_test "$cmd -flag -flag -- non flags args" \
594 [expect_flag "non flags args"]
595
596 # Extract twice the same flag, separated by one space.
597 gdb_test "$cmd -xx1 -xx2 -xx1 -xx2 -xx1 -- non flags args" \
3d9be6f5 598 "-flag 0 -xx1 1 -xx2 1 -bool 0 -enum xxx -uint 0 -zuint-unl 0 -string '' -- non flags args"
9d0faba9
PA
599
600 # Extract 2 known flags in front of unknown flags.
601 gdb_test "$cmd -xx1 -xx2 -a -b -c -xx1 --" \
602 "Unrecognized option at: -a -b -c -xx1 --"
603
604 # Check that combined flags are not recognised.
605 gdb_test "$cmd -xx1 -xx1xx2 -xx1 --" \
606 "Unrecognized option at: -xx1xx2 -xx1 --"
607
608 # Make sure the completer don't confuse a flag option with a
609 # boolean option. Specifically, "o" should not complete to
610 # "on/off".
611
612 if {$variant == "require-delimiter"} {
41fc454c
PA
613 res_test_gdb_complete_none \
614 "1 [expect_flag "o"]" \
615 "$cmd -flag o"
9d0faba9
PA
616
617 gdb_test "$cmd -flag o" [expect_none "-flag o"]
618 } else {
619 res_test_gdb_complete_none "0 o" "$cmd -flag o"
620
621 gdb_test "$cmd -flag o" [expect_flag "o"]
622 }
623}
624
625# Boolean option tests.
626proc_with_prefix test-boolean {variant} {
627 global all_options
628
629 set cmd [make_cmd $variant]
630
631 # Boolean option's values are optional -- "on" is implied. Check
632 # that:
633 #
634 # - For require-delimiter commands, completing after a boolean
635 # option lists all other options, plus "on/off". This is
636 # because operands won't be processed until we see a "--"
637 # delimiter.
638 #
639 # - For !require-delimiter commands, completing after a boolean
640 # option completes as an operand, since that will tend to be
641 # more common than typing "on/off".
642 # E.g., "frame apply all -past-main COMMAND".
643
644 if {$variant == "require-delimiter"} {
3d9be6f5
PA
645 set match_list $all_options
646 lappend match_list "off" "on"
41fc454c
PA
647 res_test_gdb_complete_multiple \
648 "1 [expect_none ""]" \
3d9be6f5 649 "$cmd -bool " "" "" $match_list
9d0faba9
PA
650 } else {
651 res_test_gdb_complete_none "0 " "$cmd -bool "
652 }
653
654 # Add another dash, and "on/off" are no longer offered:
41fc454c
PA
655 res_test_gdb_complete_multiple \
656 "1 [expect_bool "-"]" \
657 "$cmd -bool " "-" "" $all_options
9d0faba9
PA
658
659 # Basic smoke tests of accepted / not accepted values.
660
661 # The command accepts all of "1/0/enable/disable/yes/no" too, even
662 # though like the "set" command, we don't offer those as
663 # completion candidates if you complete right after the boolean
664 # command's name, like:
665 #
666 # (gdb) maint test-options require-delimiter -bool [TAB]
667 # off on
668 #
669 # However, the completer does recognize them if you start typing
670 # the boolean value.
671 foreach value {"0" "1"} {
41fc454c
PA
672 test_completer_recognizes \
673 "1 [expect_none ""]" \
674 "$cmd -bool $value"
9d0faba9
PA
675 }
676 foreach value {"of" "off"} {
41fc454c
PA
677 res_test_gdb_complete_unique \
678 "1 [expect_none ""]" \
9d0faba9
PA
679 "$cmd -bool $value" \
680 "$cmd -bool off"
681 }
682 foreach value {"y" "ye" "yes"} {
41fc454c
PA
683 res_test_gdb_complete_unique \
684 "1 [expect_none ""]" \
9d0faba9
PA
685 "$cmd -bool $value" \
686 "$cmd -bool yes"
687 }
688 foreach value {"n" "no"} {
41fc454c
PA
689 res_test_gdb_complete_unique \
690 "1 [expect_none ""]" \
9d0faba9
PA
691 "$cmd -bool $value" \
692 "$cmd -bool no"
693 }
694 foreach value {
695 "e"
696 "en"
697 "ena"
698 "enab"
699 "enabl"
700 "enable"
701 } {
41fc454c
PA
702 res_test_gdb_complete_unique \
703 "1 [expect_none ""]" \
9d0faba9
PA
704 "$cmd -bool $value" \
705 "$cmd -bool enable"
706 }
707 foreach value {
708 "d"
709 "di"
710 "dis"
711 "disa"
712 "disab"
713 "disabl"
714 "disable"
715 } {
41fc454c
PA
716 res_test_gdb_complete_unique \
717 "1 [expect_none ""]" \
9d0faba9
PA
718 "$cmd -bool $value" \
719 "$cmd -bool disable"
720 }
721
722 if {$variant == "require-delimiter"} {
41fc454c
PA
723 res_test_gdb_complete_none \
724 "1 [expect_none "xxx"]" \
725 "$cmd -bool xxx"
9d0faba9
PA
726 } else {
727 res_test_gdb_complete_none "0 xxx" "$cmd -bool xxx"
728 }
729
730 # The command accepts abbreviations of "enable/disable/yes/no",
731 # even though we don't offer those for completion.
732 foreach value {
733 "1"
734 "y" "ye" "yes"
735 "e"
736 "en"
737 "ena"
738 "enab"
739 "enabl"
740 "enable"} {
741 gdb_test "$cmd -bool $value --" [expect_bool ""]
742 }
743 foreach value {
744 "0"
745 "of" "off"
746 "n" "no"
747 "d"
748 "di"
749 "dis"
750 "disa"
751 "disab"
752 "disabl"
753 "disable"} {
754 gdb_test "$cmd -bool $value --" [expect_none ""]
755 }
756
757 if {$variant == "require-delimiter"} {
758 gdb_test "$cmd -bool 999" [expect_none "-bool 999"]
759 } else {
760 gdb_test "$cmd -bool 999" [expect_bool "999"]
761 }
762 gdb_test "$cmd -bool -- 999" [expect_bool "999"]
763
764 # Since "on" is implied after a boolean option, for
765 # !require-delimiter commands, anything that is not
766 # yes/no/1/0/on/off/enable/disable should be considered as the raw
767 # input after the last option. Also check "o", which might look
768 # like "on" or "off", but it's treated the same.
769
770 foreach arg {"xxx" "o"} {
771 if {$variant == "require-delimiter"} {
772 gdb_test "$cmd -bool $arg" [expect_none "-bool $arg"]
773 } else {
774 gdb_test "$cmd -bool $arg" [expect_bool "$arg"]
775 }
776 }
777 # Also try -1. "unknown-is-error" commands error out saying that
778 # that's not a valid option.
779 if {$variant == "require-delimiter"} {
780 gdb_test "$cmd -bool -1" \
781 [expect_none "-bool -1"]
782 } elseif {$variant == "unknown-is-error"} {
783 gdb_test "$cmd -bool -1" \
784 "Unrecognized option at: -1"
785 } else {
786 gdb_test "$cmd -bool -1" [expect_bool "-1"]
787 }
788
789 # OTOH, if the "--" separator is present, then GDB errors out if
790 # the boolean option is passed an invalid value -- check that too.
791 gdb_test "$cmd -bool -1 999 --" \
792 "Unrecognized option at: -1 999 --"
793 gdb_test "$cmd -bool xxx 999 --" \
794 "Value given for `-bool' is not a boolean: xxx"
795 gdb_test "$cmd -bool o 999 --" \
796 "Value given for `-bool' is not a boolean: o"
797
798 # Completing after a boolean option + "o" does list "on/off",
799 # though.
800 if {$variant == "require-delimiter"} {
41fc454c
PA
801 res_test_gdb_complete_multiple \
802 "1 [expect_none "o"]" \
803 "$cmd -bool " "o" "" {
9d0faba9
PA
804 "off"
805 "on"
806 }
807 } else {
808 res_test_gdb_complete_multiple "0 o" "$cmd -bool " "o" "" {
809 "off"
810 "on"
811 }
812 }
813}
814
815# Uinteger option tests. OPTION is which integer option we're
816# testing. Can be "uinteger" or "zuinteger-unlimited".
817proc_with_prefix test-uinteger {variant option} {
818 global all_options
819
820 set cmd "[make_cmd $variant] -$option"
821
822 # Test completing a uinteger option:
41fc454c
PA
823 res_test_gdb_complete_multiple \
824 "1 [expect_none ""]" \
825 "$cmd " "" "" {
9d0faba9
PA
826 "NUMBER"
827 "unlimited"
828 }
829
830 # NUMBER above is just a placeholder, make sure we don't complete
831 # it as a valid option.
41fc454c
PA
832 res_test_gdb_complete_none \
833 "1 [expect_none "NU"]" \
834 "$cmd NU"
9d0faba9
PA
835
836 # "unlimited" is valid though.
41fc454c
PA
837 res_test_gdb_complete_unique \
838 "1 [expect_none "u"]" \
9d0faba9
PA
839 "$cmd u" \
840 "$cmd unlimited"
841
842 # Basic smoke test of accepted / not accepted values.
843 gdb_test "$cmd 1 -- 999" [expect_integer $option "1" "999"]
844 gdb_test "$cmd unlimited -- 999" \
845 [expect_integer $option "unlimited" "999"]
846 if {$option == "zuinteger-unlimited"} {
847 gdb_test "$cmd -1 --" [expect_integer $option "unlimited" ""]
848 gdb_test "$cmd 0 --" [expect_integer $option "0" ""]
849 } else {
850 gdb_test "$cmd -1 --" "integer -1 out of range"
851 gdb_test "$cmd 0 --" [expect_integer $option "unlimited" ""]
852 }
853 gdb_test "$cmd xxx --" \
854 "Expected integer at: xxx --"
855 gdb_test "$cmd unlimitedx --" \
856 "Expected integer at: unlimitedx --"
857
858 # Don't offer completions until we're past the
859 # -uinteger/-zuinteger-unlimited argument.
41fc454c
PA
860 res_test_gdb_complete_none \
861 "1 [expect_none ""]" \
862 "$cmd 1"
9d0faba9
PA
863
864 # A number of invalid values.
865 foreach value {"x" "x " "1a" "1a " "1-" "1- " "unlimitedx"} {
41fc454c
PA
866 res_test_gdb_complete_none \
867 "1 [expect_none $value]" \
868 "$cmd $value"
9d0faba9
PA
869 }
870
871 # Try "-1".
872 if {$option == "uinteger"} {
873 # -1 is invalid uinteger.
874 foreach value {"-1" "-1 "} {
41fc454c
PA
875 res_test_gdb_complete_none \
876 "1 [expect_none ""]" \
877 "$cmd $value"
9d0faba9
PA
878 }
879 } else {
880 # -1 is valid for zuinteger-unlimited.
41fc454c
PA
881 res_test_gdb_complete_none \
882 "1 [expect_none ""]" \
883 "$cmd -1"
9d0faba9 884 if {$variant == "require-delimiter"} {
41fc454c
PA
885 res_test_gdb_complete_multiple \
886 "1 [expect_integer $option "unlimited" ""]" \
887 "$cmd -1 " "" "-" $all_options
9d0faba9
PA
888 } else {
889 res_test_gdb_complete_none "0 " "$cmd -1 "
890 }
891 }
892
893 # Check that after a fully parsed option:
894 #
895 # - for require-delimiter commands, completion offers all
896 # options.
897 #
898 # - for !require-delimiter commands, completion offers nothing
899 # and returns false.
900 if {$variant == "require-delimiter"} {
41fc454c
PA
901 res_test_gdb_complete_multiple \
902 "1 [expect_integer $option 1 ""]" \
903 "$cmd 1 " "" "-" $all_options
9d0faba9
PA
904 } else {
905 res_test_gdb_complete_none "0 " "$cmd 1 "
906 }
907
908 # Test completing non-option arguments after "-uinteger 1 ".
909 foreach operand {"x" "x " "1a" "1a " "1-" "1- "} {
910 if {$variant == "require-delimiter"} {
41fc454c
PA
911 res_test_gdb_complete_none \
912 "1 [expect_integer $option 1 $operand]" \
913 "$cmd 1 $operand"
9d0faba9
PA
914 } else {
915 res_test_gdb_complete_none "0 $operand" "$cmd 1 $operand"
916 }
917 }
918 # These look like options, but they aren't.
919 foreach operand {"-1" "-1 "} {
920 if {$variant == "unknown-is-operand"} {
921 res_test_gdb_complete_none "0 $operand" "$cmd 1 $operand"
922 } else {
41fc454c
PA
923 res_test_gdb_complete_none \
924 "1 [expect_integer $option 1 $operand]" \
925 "$cmd 1 $operand"
9d0faba9
PA
926 }
927 }
928}
929
930# Enum option tests.
931proc_with_prefix test-enum {variant} {
932 set cmd [make_cmd $variant]
933
41fc454c
PA
934 res_test_gdb_complete_multiple \
935 "1 [expect_none ""]" \
936 "$cmd -enum " "" "" {
9d0faba9
PA
937 "xxx"
938 "yyy"
939 "zzz"
940 }
941
942 # Check that "-" where a value is expected does not show the
943 # command's options. I.e., an enum's value is not optional.
944 # Check both completion and running the command.
41fc454c
PA
945 res_test_gdb_complete_none \
946 "1 [expect_none "-"]" \
947 "$cmd -enum -"
9d0faba9
PA
948 gdb_test "$cmd -enum --"\
949 "Requires an argument. Valid arguments are xxx, yyy, zzz\\."
950
951 # Try passing an undefined item to an enum option.
952 gdb_test "$cmd -enum www --" "Undefined item: \"www\"."
953}
954
3d9be6f5
PA
955# String option tests.
956proc_with_prefix test-string {variant} {
957 global all_options
958
959 set cmd [make_cmd $variant]
960
961 res_test_gdb_complete_none \
962 "1 [expect_none ""]" \
963 "$cmd -string "
964
965 # Check that "-" where a value is expected does not show the
966 # command's options. I.e., a string's value is not optional.
967 # Check both completion and running the command.
968 res_test_gdb_complete_none \
969 "1 [expect_none ""]" \
970 "$cmd -string -"
971 gdb_test "$cmd -string --"\
972 "-string requires an argument"
973 if {$variant == "require-delimiter"} {
974 gdb_test "$cmd -string" [expect_none "-string"]
975 } else {
976 gdb_test "$cmd -string"\
977 "-string requires an argument"
978 }
979
021d8588
AB
980 foreach_with_prefix str {
981 "STR"
982 "\"STR\""
983 "\\\"STR"
984 "'STR'"
985 "\\'STR"
986 "\"STR AAA\""
987 "'STR BBB'"
988 "\"STR 'CCC' DDD\""
989 "'STR \"EEE\" FFF'"
990 "\"STR \\\"GGG\\\" HHH\""
991 "'STR \\\'III\\\' JJJ'"
992 } {
993 res_test_gdb_complete_none \
994 "1 [expect_none ""]" \
995 "$cmd -string ${str}"
996 gdb_test "$cmd -string ${str} --" [expect_string "${str}" ""]
3d9be6f5 997
021d8588
AB
998 # Completing at "-" after parsing STR should list all options.
999 res_test_gdb_complete_multiple \
1000 "1 [expect_string "${str}" "-"]" \
1001 "$cmd -string ${str} " "-" "" $all_options
3d9be6f5 1002
021d8588
AB
1003 # Check that only $STR is considered part of the string's value.
1004 # I.e., that we stop parsing the string at the first
1005 # whitespace or after the closing quote of $STR.
1006 if {$variant == "require-delimiter"} {
1007 res_test_gdb_complete_none \
1008 "1 [expect_string "${str}" "BAR"]" \
1009 "$cmd -string ${str} BAR"
1010 } else {
1011 res_test_gdb_complete_none "0 BAR" "$cmd -string ${str} BAR"
1012 }
1013 gdb_test "$cmd -string ${str} BAR --" "Unrecognized option at: BAR --"
3d9be6f5 1014 }
3d9be6f5
PA
1015}
1016
9d0faba9
PA
1017# Run the options framework tests first.
1018foreach_with_prefix cmd {
1019 "require-delimiter"
1020 "unknown-is-error"
1021 "unknown-is-operand"
1022} {
1023 test-misc $cmd
1024 test-flag $cmd
1025 test-boolean $cmd
1026 foreach subcmd {"uinteger" "zuinteger-unlimited" } {
1027 test-uinteger $cmd $subcmd
1028 }
1029 test-enum $cmd
3d9be6f5 1030 test-string $cmd
9d0faba9 1031}
7d8062de 1032
5d707134 1033# Run the print integration tests, both as "standalone", and under
6665660a
PA
1034# "frame/thread apply". The latter checks that the "frame/thread
1035# apply ... COMMAND" commands recurse the completion machinery for
1036# COMMAND completion correctly.
5d707134
PA
1037foreach prefix {
1038 ""
1039 "frame apply all "
1040 "frame apply 1 "
1041 "frame apply level 0 "
6665660a
PA
1042 "thread apply all "
1043 "thread apply 1 "
1044 "thread apply 1 frame apply 1 "
5d707134
PA
1045} {
1046 test-print $prefix
1047}
7d8062de 1048
5d707134
PA
1049# Same for "compile print". Not really a wrapper prefix command like
1050# "frame apply", but similar enough that we test pretty much the same
1051# things.
7d8062de
PA
1052if ![skip_compile_feature_tests] {
1053 test-print "compile "
1054}
d4c16835
PA
1055
1056# Basic "backtrace" integration tests.
1057test-backtrace
5d707134
PA
1058
1059# Basic "frame apply" integration tests.
1060test-frame-apply
6665660a
PA
1061
1062# Basic "thread apply" integration tests.
1063test-thread-apply
54d66006
PA
1064
1065# Basic "info threads" integration tests.
1066test-info-threads
This page took 0.482006 seconds and 4 git commands to generate.