292 lines
9.2 KiB
Plaintext
292 lines
9.2 KiB
Plaintext
# This testcase is part of GDB, the GNU debugger.
|
|
|
|
# Copyright 2019-2020 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/>.
|
|
|
|
# Test the "with" command.
|
|
|
|
load_lib completion-support.exp
|
|
|
|
standard_testfile .c
|
|
|
|
if {[build_executable "failed to prepare" $testfile $srcfile debug]} {
|
|
return -1
|
|
}
|
|
|
|
clean_restart $binfile
|
|
|
|
# Test "maint with". VALUES is a list of values. A nested "with" is
|
|
# performed with each combination of pair of values from this list.
|
|
# This exercises setting a value, and restoring it too. This is
|
|
# particularly important for the "special" values like "unlimited",
|
|
# which for example for var_uinteger maps to 0 at the user-visible
|
|
# level, but maps to -1 internally.
|
|
|
|
proc test_with {setting values} {
|
|
foreach val1 $values {
|
|
foreach val2 $values {
|
|
gdb_test \
|
|
"maint with test-settings $setting $val1 -- maint with test-settings $setting $val2 -- p 1" \
|
|
" = 1"
|
|
}
|
|
}
|
|
}
|
|
|
|
# Test "maint with" in the error case. SETTING is the "maint set
|
|
# test-setting" setting to exercise. TMP_VAL is the value to set the
|
|
# setting to. EXPECTED_RE is the expected GDB output, which should be
|
|
# an error of some kind. Also checks that the setting's original
|
|
# value is preserved across the error.
|
|
|
|
proc test_with_error {setting tmp_val expected_re} {
|
|
global gdb_prompt
|
|
|
|
with_test_prefix "$setting, $tmp_val" {
|
|
set test "save org value"
|
|
set org_val ""
|
|
gdb_test_multiple "maint show test-settings $setting" $test {
|
|
-re "(.*)\r\n$gdb_prompt $" {
|
|
set org_val $expect_out(1,string)
|
|
pass $test
|
|
}
|
|
}
|
|
|
|
gdb_test \
|
|
"maint with test-settings $setting $tmp_val -- p 1" \
|
|
$expected_re
|
|
|
|
gdb_test "maint show test-settings $setting" "^$org_val" \
|
|
"value hasn't changed across error"
|
|
}
|
|
}
|
|
|
|
# Test "with" framework basics, using the internal "maint with
|
|
# test-settings" subcommands.
|
|
with_test_prefix "maint" {
|
|
test_with "auto-boolean" {"on" "off" "auto"}
|
|
test_with "boolean" {"" "on" "off" "0" "1" "enable" "disable"}
|
|
test_with "integer" {"0" "1" "-1" "unlimited"}
|
|
test_with "uinteger" {"0" "1" "unlimited"}
|
|
test_with "zinteger" {"0" "1" "-1"}
|
|
test_with "zuinteger" {"0" "1"}
|
|
test_with "zuinteger-unlimited" {"-1" "unlimited" "0" "1"}
|
|
test_with "string" {"" "foo" "\"hello world\""}
|
|
test_with "string-noescape" {"" "foo" "\"hello world\""}
|
|
test_with "filename" {"/foo" "bar/x/y"}
|
|
test_with "optional-filename" {"" "/foo" "bar/x/y"}
|
|
test_with "enum" {"xxx" "yyy"}
|
|
|
|
# Check the most important error conditions. E.g., empty,
|
|
# negative or "unlimited" values for settings that don't accept
|
|
# those. Exhaustive error coverage of the set/with value parsing
|
|
# is left to "set" testing, in gdb.base/settings.exp.
|
|
test_with_error "auto-boolean" "" \
|
|
"\"on\", \"off\" or \"auto\" expected\\."
|
|
test_with_error "auto-boolean" "xxx" \
|
|
"\"on\", \"off\" or \"auto\" expected\\."
|
|
test_with_error "boolean" "2" "\"on\" or \"off\" expected\\."
|
|
test_with_error "uinteger" "-1" "integer -1 out of range"
|
|
test_with_error "uinteger" "" \
|
|
"Argument required \\(integer to set it to, or \"unlimited\"\\.\\)\\."
|
|
test_with_error "zuinteger" "-1" "integer -1 out of range"
|
|
test_with_error "zuinteger" "" \
|
|
"Argument required \\(integer to set it to\\.\\)\\."
|
|
test_with_error "zuinteger-unlimited" "-2" \
|
|
"only -1 is allowed to set as unlimited"
|
|
test_with_error "zuinteger-unlimited" "" \
|
|
"Argument required \\(integer to set it to, or \"unlimited\"\\.\\)\\."
|
|
test_with_error "filename" "" \
|
|
"Argument required \\(filename to set it to\\.\\)\\."
|
|
test_with_error "enum" "" \
|
|
"Requires an argument\\. Valid arguments are xxx, yyy, zzz\\."
|
|
}
|
|
|
|
# Basic/core tests using user-visible commands.
|
|
with_test_prefix "basics" {
|
|
gdb_test "print g_s" " = {a = 1, b = 2, c = 3}"
|
|
gdb_test "with print pretty -- print g_s" \
|
|
[multi_line \
|
|
" = {" \
|
|
" a = 1," \
|
|
" b = 2," \
|
|
" c = 3" \
|
|
"}"]
|
|
|
|
# A boolean setting.
|
|
gdb_test "with non-stop on -- show non-stop" \
|
|
"Controlling the inferior in non-stop mode is on\\."
|
|
gdb_test "show non-stop" \
|
|
"Controlling the inferior in non-stop mode is off\\."
|
|
|
|
# Language.
|
|
gdb_test "with language pascal -- show language" \
|
|
"The current source language is \"pascal\"\\."
|
|
|
|
gdb_test "show language" \
|
|
"The current source language is \"auto; currently c\"\\."
|
|
|
|
gdb_test "with language ada -- print g_s" \
|
|
" = \\(a => 1, b => 2, c => 3\\)"
|
|
|
|
# Nested "with"s.
|
|
gdb_test "with language ada -- with language c -- print g_s" \
|
|
" = {a = 1, b = 2, c = 3}"
|
|
|
|
# "w" alias.
|
|
gdb_test "w language pascal -- show language" \
|
|
"The current source language is \"pascal\"\\." \
|
|
"w alias works"
|
|
|
|
# An early prototype of the "with" command got this wrong.
|
|
gdb_test \
|
|
"w print repeats unlimited -- w print repeats 1 -- p \"1223334444\"" \
|
|
" = \"1\", '2' <repeats 2 times>, '3' <repeats 3 times>, '4' <repeats 4 times>"
|
|
}
|
|
|
|
# Check a user-defined command.
|
|
with_test_prefix "user-defined" {
|
|
# A user defined command.
|
|
set test "define usercmd"
|
|
gdb_test_multiple "define usercmd" $test {
|
|
-re "End with" {
|
|
gdb_test \
|
|
[multi_line_input \
|
|
{print g_s} \
|
|
{end}] \
|
|
"" \
|
|
$test
|
|
}
|
|
}
|
|
gdb_test "with language ada -- usercmd" \
|
|
" = \\(a => 1, b => 2, c => 3\\)"
|
|
}
|
|
|
|
# Check repeating.
|
|
with_test_prefix "repeat" {
|
|
clean_restart $binfile
|
|
|
|
# "with" with no command reinvokes the previous command.
|
|
gdb_test "with language ada" \
|
|
"No previous command to relaunch" \
|
|
"reinvoke with no previous command to relaunch"
|
|
|
|
gdb_test "print g_s" " = {a = 1, b = 2, c = 3}"
|
|
|
|
gdb_test "with language ada" \
|
|
" = \\(a => 1, b => 2, c => 3\\)" \
|
|
"reinvoke with language"
|
|
|
|
# Same, but with "--".
|
|
gdb_test "with language fortran --" \
|
|
" = \\( a = 1, b = 2, c = 3 \\)" \
|
|
"reinvoke with language and --"
|
|
|
|
# Repeating repeats the original "print g_s", not the last "with"
|
|
# command.
|
|
set test "repeat command line"
|
|
send_gdb "\n"
|
|
gdb_test_multiple "" $test {
|
|
-re " = {a = 1, b = 2, c = 3}\r\n$gdb_prompt $" {
|
|
pass $test
|
|
}
|
|
}
|
|
}
|
|
|
|
# Basic run control.
|
|
with_test_prefix "run control" {
|
|
clean_restart $binfile
|
|
|
|
if ![runto_main] {
|
|
fail "cannot run to main"
|
|
return
|
|
}
|
|
|
|
# Check "with" with a synchronous execution command.
|
|
gdb_test "with disassemble-next-line on -- next" \
|
|
"return 0;.*=>.*"
|
|
}
|
|
|
|
# Check errors.
|
|
with_test_prefix "errors" {
|
|
gdb_test "with" "Missing arguments\\."
|
|
|
|
# Try both an unknown root setting and an unknown prefixed
|
|
# setting. The errors come from different locations in the
|
|
# sources.
|
|
gdb_test "with xxxx yyyy" \
|
|
"Undefined set command: \"xxxx\". Try \"help set\"\\."
|
|
gdb_test "with print xxxx yyyy" \
|
|
"Undefined set print command: \"xxxx yyyy\". Try \"help set print\"\\."
|
|
# Try one error case for "maint with", to make sure the right
|
|
# "maintenance with" prefix is shown.
|
|
gdb_test "maint with xxxx yyyy" \
|
|
"Undefined maintenance set command: \"xxxx\". Try \"help maintenance set\"\\."
|
|
|
|
# Try ambiguous settings.
|
|
gdb_test "with w" \
|
|
"Ambiguous set command \"w\": watchdog, width, write\\."
|
|
gdb_test "with print m" \
|
|
"Ambiguous set print command \"m\": max-depth, max-symbolic-offset\\."
|
|
|
|
gdb_test "with variable xxx=1" \
|
|
"Cannot use this setting with the \"with\" command"
|
|
|
|
gdb_test "with print elements -- p 1" \
|
|
"Argument required \\(integer to set it to, or \"unlimited\"\\.\\)\\."
|
|
|
|
gdb_test "with -- p 1" \
|
|
"Missing setting before '--' delimiter"
|
|
|
|
# Check that the setting is restored even if the command throws.
|
|
gdb_test "with print elements 1 -- unknowncommand" \
|
|
"Undefined command: \"unknowncommand\"\\. Try \"help\"\\."
|
|
gdb_test "show print elements" \
|
|
"Limit on string chars or array elements to print is 200\\."
|
|
}
|
|
|
|
# Check completion.
|
|
with_test_prefix "completion" {
|
|
test_gdb_complete_unique \
|
|
"with pri" \
|
|
"with print"
|
|
|
|
test_gdb_complete_unique \
|
|
"with print ele" \
|
|
"with print elements"
|
|
|
|
test_gdb_complete_unique \
|
|
"with print elements u" \
|
|
"with print elements unlimited"
|
|
|
|
test_gdb_complete_none \
|
|
"with print elements unlimited "
|
|
|
|
test_gdb_completion_offers_commands "with print elements unlimited -- "
|
|
|
|
# Check that the completer nests into the nested command line's
|
|
# completer.
|
|
test_gdb_complete_unique \
|
|
"with print elements unlimited -- with print ele" \
|
|
"with print elements unlimited -- with print elements"
|
|
|
|
# Check completion of "maint with". "maint with" and "with"'s
|
|
# completers share 99% of the code. All we need to care about
|
|
# here is that the completion word point is computed correctly, so
|
|
# any simple completion is sufficient.
|
|
test_gdb_complete_unique \
|
|
"maint with test-set" \
|
|
"maint with test-settings"
|
|
}
|