# This testcase is part of GDB, the GNU debugger.

# Copyright 2019-2021 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 gdb::option framework.

# The test uses the "maintenance test-options" subcommands to exercise
# TAB-completion and option processing.
#
# It also tests option integration in various commands, including:
#
#  - print
#  - compile print
#  - backtrace
#  - frame apply
#  - faas
#  - tfaas
#  - thread apply
#  - taas

load_lib completion-support.exp

standard_testfile .c

if {[build_executable "failed to prepare" $testfile $srcfile debug]} {
    return -1
}

clean_restart

if { ![readline_is_used] } {
    untested "no tab completion support without readline"
    return -1
}

# Check the completion result, as returned by the "maintenance show
# test-options-completion-result" command.  TEST is used as test name.
proc check_completion_result {expected test} {
    gdb_test "maintenance show test-options-completion-result" \
	"$expected" \
	"$test: res=$expected"
}

# Like test_gdb_complete_unique, but the expected output is expected
# to be the input line.  I.e., the line is already complete.  We're
# just checking whether GDB recognizes the option and auto-appends a
# space.
proc test_completer_recognizes {res input_line} {
    set expected_re [string_to_regexp $input_line]
    test_gdb_complete_unique $input_line $expected_re
    check_completion_result $res $input_line
}

# Wrapper around test_gdb_complete_multiple that also checks the
# completion result is RES.
proc res_test_gdb_complete_multiple {res cmd_prefix completion_word args} {
    test_gdb_complete_multiple $cmd_prefix $completion_word {*}$args
    check_completion_result $res "$cmd_prefix$completion_word"
}

# Wrapper around test_gdb_complete_none that also checks the
# completion result is RES.
proc res_test_gdb_complete_none { res input_line } {
    test_gdb_complete_none $input_line
    check_completion_result $res "$input_line"
}

# Wrapper around test_gdb_complete_unique that also checks the
# completion result is RES.
proc res_test_gdb_complete_unique { res input_line args} {
    test_gdb_complete_unique $input_line {*}$args
    check_completion_result $res "$input_line"
}

# Make a full command name from VARIANT.  VARIANT is either
# "require-delimiter", "unknown-is-error" or "unknown-is-operand".
proc make_cmd {variant} {
    return "maint test-options $variant"
}

# Return a string for the expected result of running "maint
# test-options xxx", with no flag/option set.  OPERAND is the expected
# operand.
proc expect_none {operand} {
    return "-flag 0 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint 0 -zuint-unl 0 -string '' -- $operand"
}

# Return a string for the expected result of running "maint
# test-options xxx", with -flag set.  OPERAND is the expected operand.
proc expect_flag {operand} {
    return "-flag 1 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint 0 -zuint-unl 0 -string '' -- $operand"
}

# Return a string for the expected result of running "maint
# test-options xxx", with -bool set.  OPERAND is the expected operand.
proc expect_bool {operand} {
    return "-flag 0 -xx1 0 -xx2 0 -bool 1 -enum xxx -uint 0 -zuint-unl 0 -string '' -- $operand"
}

# Return a string for the expected result of running "maint
# test-options xxx", with one of the integer options set to $VAL.
# OPTION determines which option to expect set.  OPERAND is the
# expected operand.
proc expect_integer {option val operand} {
    if {$option == "uinteger"} {
	return "-flag 0 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint $val -zuint-unl 0 -string '' -- $operand"
    } elseif {$option == "zuinteger-unlimited"} {
	return "-flag 0 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint 0 -zuint-unl $val -string '' -- $operand"
    } else {
	error "unsupported option: $option"
    }
}

# Return a string for the expected result of running "maint
# test-options xxx", with -string set to $STR.  OPERAND is the
# expected operand.
proc expect_string {str operand} {
    # Dequote the string in the expected output.
    if { ( [string range $str 0 0] == "\""
	   && [string range $str end end] == "\"")
	 || ([string range $str 0 0] == "'"
	     && [string range $str end end] == "'")} {
	set str [string range $str 1 end-1]
    }
    return "-flag 0 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint 0 -zuint-unl 0 -string '$str' -- $operand"
}

set all_options {
    "-bool"
    "-enum"
    "-flag"
    "-string"
    "-uinteger"
    "-xx1"
    "-xx2"
    "-zuinteger-unlimited"
}

# Basic option-machinery + "print" command integration tests.
proc_with_prefix test-print {{prefix ""}} {
    clean_restart

    # Completing "print" with no argument completes on symbols only,
    # no options are offered.  Since we haven't loaded any symbols,
    # the match list should be empty.
    test_gdb_complete_none "${prefix}print "

    # OTOH, completing at "-" should list all options.
    test_gdb_complete_multiple "${prefix}print " "-" "" {
	"-address"
	"-array"
	"-array-indexes"
	"-elements"
	"-max-depth"
	"-memory-tag-violations"
	"-null-stop"
	"-object"
	"-pretty"
	"-raw-values"
	"-repeats"
	"-static-members"
	"-symbol"
	"-union"
	"-vtbl"
    }

    global binfile
    clean_restart $binfile

    if ![runto_main] {
	fail "cannot run to main"
	return
    }

    # Mix options and format.
    gdb_test "${prefix}print -pretty -- /x 1" " = 0x1"

    # Smoke test that options actually work.
    gdb_test "${prefix}print -pretty -- g_s" \
	[multi_line  \
	     " = {" \
	     "  a = 1," \
	     "  b = 2," \
	     "  c = 3" \
	     "}"]

    test_gdb_complete_unique \
	"${prefix}print xxx" \
	"${prefix}print xxx1"
    test_gdb_complete_unique \
	"${prefix}print -- xxx" \
	"${prefix}print -- xxx1"

    # Error messages when testing with "compile" are different from
    # the error messages gdb's internal parser throws.  This procedure
    # hides the difference.  EXPECTED_RE is only considered when not
    # testing with "compile".
    proc test_invalid_expression {cmd expected_re} {
	upvar prefix prefix

	if {$prefix != "compile "} {
	    gdb_test $cmd $expected_re
	} else {
	    # Error messages depend on compiler version, so we just
	    # look for the last line indicating a failure.
	    gdb_test $cmd "Compilation failed\\."
	}
    }

    # Check that '-XXX' without a "--" is handled as an
    # expression.
    gdb_test "${prefix}print -1" " = -1"
    test_invalid_expression \
	"${prefix}print --1" \
	"Left operand of assignment is not an lvalue\\."
    test_invalid_expression \
	"${prefix}print -object" \
	"No symbol \"object\".*"

    # Test printing with options and no expression.
    set test "${prefix}print -object --"
    if {$prefix != "compile "} {
	# Regular "print" repeats the last history value.
	gdb_test $test " = -1"
    } else {
	# "compile print" starts a multiline expression.
	gdb_test_multiple $test $test {
	    -re ">$" {
		gdb_test "-1\nend" " = -1" \
		    $test
	    }
	}
    }

    # Check that everything after "-- " is treated as an
    # expression, not confused with an option.
    test_invalid_expression \
	"${prefix}print -- -address" \
	"No symbol.*"
    gdb_test "${prefix}print -- -1" " = -1"
    test_invalid_expression \
	"${prefix}print -- --1" \
	"Left operand of assignment is not an lvalue\\."
}

# Basic option-machinery + "backtrace" command integration tests.
proc_with_prefix test-backtrace {} {
    clean_restart

    test_gdb_complete_unique "backtrace" "backtrace"
    test_gdb_complete_none "backtrace "

    gdb_test "backtrace -" "Ambiguous option at: -"
    gdb_test "backtrace --" "No stack\\."
    gdb_test "backtrace -- -" "No stack\\."

    test_gdb_complete_multiple "backtrace " "-" "" {
	"-entry-values"
	"-frame-arguments"
	"-frame-info"
	"-full"
	"-hide"
	"-no-filters"
	"-past-entry"
	"-past-main"
	"-raw-frame-arguments"
    }

    # Test that we complete the qualifiers, if there's any.
    test_gdb_complete_unique \
	"backtrace ful" \
	"backtrace full"
    test_gdb_complete_unique \
	"backtrace hid" \
	"backtrace hide"
    test_gdb_complete_unique \
	"backtrace no-fil" \
	"backtrace no-filters"

    global binfile
    clean_restart $binfile

    if ![runto_main] {
	fail "cannot run to main"
	return
    }

    # COUNT in "backtrace COUNT" is parsed as an expression.  Check
    # that we complete expressions.

    test_gdb_complete_unique \
	"backtrace xxx" \
	"backtrace xxx1"

    test_gdb_complete_unique \
	"backtrace -xxx" \
	"backtrace -xxx1"

    test_gdb_complete_unique \
	"backtrace 1 + xxx" \
	"backtrace 1 + xxx1"

    test_gdb_complete_unique \
	"backtrace (1 + xxx" \
	"backtrace (1 + xxx1"
}

# Basic option-machinery + "frame apply" command integration tests.
proc_with_prefix test-frame-apply {} {
    test_gdb_complete_unique "frame apply all" "frame apply all"

    gdb_test "frame apply level 0-" \
	"Please specify a command to apply on the selected frames"
    test_gdb_complete_none "frame apply level 0-"

    foreach cmd {
	"frame apply all"
	"frame apply 1"
	"frame apply level 0"
	"faas"
	"tfaas"
    } {
	test_gdb_completion_offers_commands "$cmd "

	# tfaas is silent on command error by design.  This procedure
	# hides that aspect.  EXPECTED_RE is only considered when not
	# testing with "faas"/"tfaas".
	proc test_error_cmd {cmd arg expected_re} {
	    if {$cmd == "tfaas"} {
		gdb_test_no_output "$cmd$arg"
	    } else {
		gdb_test "$cmd$arg" $expected_re
	    }
	}
	# Same, but for tests where both "faas" and "tfaas" are
	# expected to be silent.
	proc test_error_cmd2 {cmd arg expected_re} {
	    if {$cmd == "tfaas" || $cmd == "faas"} {
		gdb_test_no_output "$cmd$arg"
	    } else {
		gdb_test "$cmd$arg" $expected_re
	    }
	}

	test_error_cmd $cmd " -" "Ambiguous option at: -"
	test_gdb_complete_multiple "$cmd " "-" "" {
	    "-c"
	    "-past-entry"
	    "-past-main"
	    "-q"
	    "-s"
	}

	with_test_prefix "no-trailing-space" {
	    test_error_cmd $cmd " --" \
		"Please specify a command to apply on the selected frames"
	    test_gdb_complete_unique "$cmd --" "$cmd --"
	}

	with_test_prefix "trailing-space" {
	    test_error_cmd $cmd " -- " \
		"Please specify a command to apply on the selected frames"
	    test_gdb_completion_offers_commands "$cmd -- "
	}

	# '-' is a valid TUI command.
	test_error_cmd2 $cmd " -- -" \
	    "Cannot enable the TUI when output is not a terminal"
	test_gdb_complete_unique \
	    "$cmd -- -" \
	    "$cmd -- -"

	test_error_cmd2 $cmd " -foo" \
	    "Undefined command: \"-foo\".  Try \"help\"\\."
	test_gdb_complete_none "$cmd -foo"

	test_gdb_completion_offers_commands "$cmd -s "
    }
}

# Basic option-machinery + "thread apply" command integration tests.
proc_with_prefix test-thread-apply {} {

    test_gdb_complete_unique "thread apply all" "thread apply all"
    test_gdb_complete_unique "taas" "taas"

    gdb_test "thread apply 1-" \
	"inverted range"
    test_gdb_complete_none "frame apply level 1-"

    foreach cmd {
	"thread apply all"
	"thread apply 1"
	"taas"
    } {
	test_gdb_completion_offers_commands "$cmd "

	# taas is silent on command error by design.  This procedure
	# hides the difference.  EXPECTED_RE is only considered when
	# not testing with "taas".
	proc test_invalid_cmd {cmd arg expected_re} {
	    if {$cmd != "taas"} {
		gdb_test "$cmd$arg" $expected_re
	    } else {
		gdb_test_no_output "$cmd$arg"
	    }
	}

	gdb_test "$cmd -" "Ambiguous option at: -"

	if {$cmd != "thread apply 1"} {
	    test_gdb_complete_multiple "$cmd " "-" "" {
		"-ascending"
		"-c"
		"-q"
		"-s"
	    }
	} else {
	    # "-ascending" only works with "all".
	    test_gdb_complete_multiple "$cmd " "-" "" {
		"-c"
		"-q"
		"-s"
	    }
	}

	if {$cmd == "thread apply all" || $cmd == "taas"} {
	    set errmsg \
		"Please specify a command at the end of 'thread apply all'"
	} elseif {$cmd == "thread apply 1"} {
	    set errmsg \
		"Please specify a command following the thread ID list"
	} else {
	    error "unexpected cmd: $cmd"
	}

	with_test_prefix "no-trailing-space" {
	    gdb_test "$cmd --" $errmsg
	    test_gdb_complete_unique "$cmd --" "$cmd --"
	}

	with_test_prefix "trailing-space" {
	    gdb_test "$cmd -- " $errmsg
	    test_gdb_completion_offers_commands "$cmd -- "
	}

	# '-' is a valid TUI command.
	test_invalid_cmd "$cmd" " -- -" \
	    "Cannot enable the TUI when output is not a terminal"
	test_gdb_complete_unique \
	    "$cmd -- -" \
	    "$cmd -- -"

	test_invalid_cmd $cmd " -foo" \
	    "Undefined command: \"-foo\".  Try \"help\"\\."
	test_gdb_complete_none "$cmd -foo"

	test_gdb_completion_offers_commands "$cmd -c "
    }
}

# Basic option-machinery + "info threads" command integration tests.
proc_with_prefix test-info-threads {} {
    test_gdb_complete_multiple "info threads " "" "" {
	"-gid"
	"ID"
    }

    test_gdb_complete_unique \
	"info threads -" \
	"info threads -gid"

    # "ID" isn't really something the user can type.
    test_gdb_complete_none "info threads I"
}

# Miscellaneous tests.
proc_with_prefix test-misc {variant} {
    global all_options

    set cmd [make_cmd $variant]

    # Call test command with no arguments at all.
    gdb_test "$cmd" [expect_none ""]

    # Now with a single dash.
    if {$variant == "require-delimiter"} {
	gdb_test "$cmd -" [expect_none "-"]
    } else {
	gdb_test "$cmd -" "Ambiguous option at: -"
    }

    # Completing at "-" should list all options.
    res_test_gdb_complete_multiple \
	"1 [expect_none "-"]" \
	"$cmd " "-" "" $all_options

    # Now with a double dash.
    gdb_test "$cmd --" [expect_none ""]

    # "--" is recognized by options completer, gdb auto-appends a
    # space.
    test_completer_recognizes \
	"1 [expect_none "--"]" \
	"$cmd --"

    # Now with a double dash, plus a dash as operand.
    gdb_test "$cmd -- -" [expect_none "-"]
    res_test_gdb_complete_none "0 -" "$cmd -- -"

    # Completing an unambiguous option just appends an empty space.
    test_completer_recognizes \
	"1 [expect_none "-flag"]" \
	"$cmd -flag"

    # Try running an ambiguous option.
    if {$variant == "require-delimiter"} {
	gdb_test "$cmd -xx" [expect_none "-xx"]
    } else {
	gdb_test "$cmd -xx" "Ambiguous option at: -xx"
    }

    # Check that options are not case insensitive.
    gdb_test "$cmd -flag --" [expect_flag ""]

    # Check how the different modes behave on unknown option, with a
    # delimiter.
    gdb_test "$cmd -FLAG --" \
	"Unrecognized option at: -FLAG --"

    # Check how the different modes behave on unknown option, without
    # a delimiter.
    if {$variant == "unknown-is-error"} {
	gdb_test "$cmd -FLAG" \
	    "Unrecognized option at: -FLAG"
    } else {
	gdb_test "$cmd -FLAG" [expect_none "-FLAG"]
    }

    # Test parsing stops at a negative integer.
    gdb_test "$cmd -1 --" \
	"Unrecognized option at: -1 --"
    gdb_test "$cmd -2 --" \
	"Unrecognized option at: -2 --"
}

# Flag option tests.
proc_with_prefix test-flag {variant} {
    global all_options

    set cmd [make_cmd $variant]

    # Completing a flag just appends a space.
    test_completer_recognizes \
	"1 [expect_none "-flag"]" \
	"$cmd -flag"

    # Add a dash, and all options should be shown.
    res_test_gdb_complete_multiple \
	"1 [expect_flag "-"]" \
	"$cmd  -flag " "-" "" $all_options

    # Basic smoke tests of accepted / not accepted values.

    # Check all the different variants a bool option may be specified.
    if {$variant == "require-delimiter"} {
	gdb_test "$cmd -flag 999" [expect_none "-flag 999"]
    } else {
	gdb_test "$cmd -flag 999" [expect_flag "999"]
    }
    gdb_test "$cmd -flag -- 999" [expect_flag "999"]

    # If the "--" separator is present, then GDB errors out if the
    # flag option is passed some value -- check that too.
    gdb_test "$cmd -flag xxx 999 --" "Unrecognized option at: xxx 999 --"
    gdb_test "$cmd -flag o 999 --" "Unrecognized option at: o 999 --"
    gdb_test "$cmd -flag 1 999 --" "Unrecognized option at: 1 999 --"

    # Extract twice the same flag, separated by one space.
    gdb_test "$cmd -flag -flag -- non flags args" \
	[expect_flag "non flags args"]

    # Extract twice the same flag, separated by one space.
    gdb_test "$cmd -xx1     -xx2 -xx1  -xx2 -xx1    -- non flags args" \
	"-flag 0 -xx1 1 -xx2 1 -bool 0 -enum xxx -uint 0 -zuint-unl 0 -string '' -- non flags args"

    # Extract 2 known flags in front of unknown flags.
    gdb_test "$cmd -xx1 -xx2 -a -b -c -xx1 --" \
	"Unrecognized option at: -a -b -c -xx1 --"

    # Check that combined flags are not recognised.
    gdb_test "$cmd -xx1 -xx1xx2 -xx1 --" \
	"Unrecognized option at: -xx1xx2 -xx1 --"

    # Make sure the completer don't confuse a flag option with a
    # boolean option.  Specifically, "o" should not complete to
    # "on/off".

    if {$variant == "require-delimiter"} {
	res_test_gdb_complete_none \
	    "1 [expect_flag "o"]" \
	    "$cmd -flag o"

	gdb_test "$cmd -flag o" [expect_none "-flag o"]
    } else {
	res_test_gdb_complete_none "0 o" "$cmd -flag o"

	gdb_test "$cmd -flag o" [expect_flag "o"]
    }
}

# Boolean option tests.
proc_with_prefix test-boolean {variant} {
    global all_options

    set cmd [make_cmd $variant]

    # Boolean option's values are optional -- "on" is implied.  Check
    # that:
    #
    # - For require-delimiter commands, completing after a boolean
    #   option lists all other options, plus "on/off".  This is
    #   because operands won't be processed until we see a "--"
    #   delimiter.
    #
    # - For !require-delimiter commands, completing after a boolean
    #   option completes as an operand, since that will tend to be
    #   more common than typing "on/off".
    #   E.g., "frame apply all -past-main COMMAND".

    if {$variant == "require-delimiter"} {
	set match_list $all_options
	lappend match_list "off" "on"
	res_test_gdb_complete_multiple \
	    "1 [expect_none ""]" \
	    "$cmd -bool " "" "" $match_list
    } else {
	res_test_gdb_complete_none "0 " "$cmd -bool "
    }

    # Add another dash, and "on/off" are no longer offered:
    res_test_gdb_complete_multiple \
	"1 [expect_bool "-"]" \
	"$cmd -bool " "-" ""  $all_options

    # Basic smoke tests of accepted / not accepted values.

    # The command accepts all of "1/0/enable/disable/yes/no" too, even
    # though like the "set" command, we don't offer those as
    # completion candidates if you complete right after the boolean
    # command's name, like:
    #
    #  (gdb) maint test-options require-delimiter -bool [TAB]
    #  off        on
    #
    # However, the completer does recognize them if you start typing
    # the boolean value.
    foreach value {"0" "1"} {
	test_completer_recognizes \
	    "1 [expect_none ""]" \
	    "$cmd -bool $value"
    }
    foreach value {"of" "off"} {
	res_test_gdb_complete_unique \
	    "1 [expect_none ""]" \
	    "$cmd -bool $value" \
	    "$cmd -bool off"
    }
    foreach value {"y" "ye" "yes"} {
	res_test_gdb_complete_unique \
	    "1 [expect_none ""]" \
	    "$cmd -bool $value" \
	    "$cmd -bool yes"
    }
    foreach value {"n" "no"} {
	res_test_gdb_complete_unique \
	    "1 [expect_none ""]" \
	    "$cmd -bool $value" \
	    "$cmd -bool no"
    }
    foreach value {
	"e"
	"en"
	"ena"
	"enab"
	"enabl"
	"enable"
    } {
	res_test_gdb_complete_unique \
	    "1 [expect_none ""]" \
	    "$cmd -bool $value" \
	    "$cmd -bool enable"
    }
    foreach value {
	"d"
	"di"
	"dis"
	"disa"
	"disab"
	"disabl"
	"disable"
    } {
	res_test_gdb_complete_unique \
	    "1 [expect_none ""]" \
	    "$cmd -bool $value" \
	    "$cmd -bool disable"
    }

    if {$variant == "require-delimiter"} {
	res_test_gdb_complete_none \
	    "1 [expect_none "xxx"]" \
	    "$cmd -bool xxx"
    } else {
	res_test_gdb_complete_none "0 xxx" "$cmd -bool xxx"
    }

    # The command accepts abbreviations of "enable/disable/yes/no",
    # even though we don't offer those for completion.
    foreach value {
	"1"
	"y" "ye" "yes"
	"e"
	"en"
	"ena"
	"enab"
	"enabl"
	"enable"} {
	gdb_test "$cmd -bool $value --" [expect_bool ""]
    }
    foreach value {
	"0"
	"of" "off"
	"n" "no"
	"d"
	"di"
	"dis"
	"disa"
	"disab"
	"disabl"
	"disable"} {
	gdb_test "$cmd -bool $value --" [expect_none ""]
    }

    if {$variant == "require-delimiter"} {
	gdb_test "$cmd -bool 999" [expect_none "-bool 999"]
    } else {
	gdb_test "$cmd -bool 999" [expect_bool "999"]
    }
    gdb_test "$cmd -bool -- 999" [expect_bool "999"]

    # Since "on" is implied after a boolean option, for
    # !require-delimiter commands, anything that is not
    # yes/no/1/0/on/off/enable/disable should be considered as the raw
    # input after the last option.  Also check "o", which might look
    # like "on" or "off", but it's treated the same.

    foreach arg {"xxx" "o"} {
	if {$variant == "require-delimiter"} {
	    gdb_test "$cmd -bool $arg" [expect_none "-bool $arg"]
	} else {
	    gdb_test "$cmd -bool $arg" [expect_bool "$arg"]
	}
    }
    # Also try -1.  "unknown-is-error" commands error out saying that
    # that's not a valid option.
    if {$variant == "require-delimiter"} {
	gdb_test "$cmd -bool -1" \
	     [expect_none "-bool -1"]
    } elseif {$variant == "unknown-is-error"} {
	gdb_test "$cmd -bool -1" \
	    "Unrecognized option at: -1"
    } else {
	gdb_test "$cmd -bool -1" [expect_bool "-1"]
    }

    # OTOH, if the "--" separator is present, then GDB errors out if
    # the boolean option is passed an invalid value -- check that too.
    gdb_test "$cmd -bool -1 999 --" \
	"Unrecognized option at: -1 999 --"
    gdb_test "$cmd -bool xxx 999 --" \
	"Value given for `-bool' is not a boolean: xxx"
    gdb_test "$cmd -bool o 999 --" \
	"Value given for `-bool' is not a boolean: o"

    # Completing after a boolean option + "o" does list "on/off",
    # though.
    if {$variant == "require-delimiter"} {
	res_test_gdb_complete_multiple \
	    "1 [expect_none "o"]" \
	    "$cmd -bool " "o" "" {
	    "off"
	    "on"
	}
    } else {
	res_test_gdb_complete_multiple "0 o" "$cmd -bool " "o" "" {
	    "off"
	    "on"
	}
    }
}

# Uinteger option tests.  OPTION is which integer option we're
# testing.  Can be "uinteger" or "zuinteger-unlimited".
proc_with_prefix test-uinteger {variant option} {
    global all_options

    set cmd "[make_cmd $variant] -$option"

    # Test completing a uinteger option:
    res_test_gdb_complete_multiple \
	"1 [expect_none ""]" \
	"$cmd " "" "" {
	"NUMBER"
	"unlimited"
    }

    # NUMBER above is just a placeholder, make sure we don't complete
    # it as a valid option.
    res_test_gdb_complete_none \
	"1 [expect_none "NU"]" \
	"$cmd NU"

    # "unlimited" is valid though.
    res_test_gdb_complete_unique \
	"1 [expect_none "u"]" \
	"$cmd u" \
	"$cmd unlimited"

    # Basic smoke test of accepted / not accepted values.
    gdb_test "$cmd 1 -- 999" [expect_integer $option "1" "999"]
    gdb_test "$cmd unlimited -- 999" \
	[expect_integer $option "unlimited" "999"]
    if {$option == "zuinteger-unlimited"} {
	gdb_test "$cmd -1 --" [expect_integer $option "unlimited" ""]
	gdb_test "$cmd 0 --" [expect_integer $option "0" ""]
    } else {
	gdb_test "$cmd -1 --" "integer -1 out of range"
	gdb_test "$cmd 0 --" [expect_integer $option "unlimited" ""]
    }
    gdb_test "$cmd xxx --" \
	"Expected integer at: xxx --"
    gdb_test "$cmd unlimitedx --" \
	"Expected integer at: unlimitedx --"

    # Don't offer completions until we're past the
    # -uinteger/-zuinteger-unlimited argument.
    res_test_gdb_complete_none \
	"1 [expect_none ""]" \
	"$cmd 1"

    # A number of invalid values.
    foreach value {"x" "x " "1a" "1a " "1-" "1- " "unlimitedx"} {
	res_test_gdb_complete_none \
	    "1 [expect_none $value]" \
	    "$cmd $value"
    }

    # Try "-1".
    if {$option == "uinteger"} {
	# -1 is invalid uinteger.
	foreach value {"-1" "-1 "} {
	    res_test_gdb_complete_none \
		"1 [expect_none ""]" \
		"$cmd $value"
	}
    } else {
	# -1 is valid for zuinteger-unlimited.
	res_test_gdb_complete_none \
	    "1 [expect_none ""]" \
	    "$cmd -1"
	if {$variant == "require-delimiter"} {
	    res_test_gdb_complete_multiple \
		"1 [expect_integer $option "unlimited" ""]" \
		"$cmd -1 " "" "-" $all_options
	} else {
	    res_test_gdb_complete_none "0 " "$cmd -1 "
	}
    }

    # Check that after a fully parsed option:
    #
    #  - for require-delimiter commands, completion offers all
    #    options.
    #
    #  - for !require-delimiter commands, completion offers nothing
    #    and returns false.
    if {$variant == "require-delimiter"} {
	res_test_gdb_complete_multiple \
	    "1 [expect_integer $option 1 ""]" \
	    "$cmd 1 " "" "-" $all_options
    } else {
	res_test_gdb_complete_none "0 " "$cmd 1 "
    }

    # Test completing non-option arguments after "-uinteger 1 ".
    foreach operand {"x" "x " "1a" "1a " "1-" "1- "} {
	if {$variant == "require-delimiter"} {
	    res_test_gdb_complete_none \
		"1 [expect_integer $option 1 $operand]" \
		"$cmd 1 $operand"
	} else {
	    res_test_gdb_complete_none "0 $operand" "$cmd 1 $operand"
	}
    }
    # These look like options, but they aren't.
    foreach operand {"-1" "-1 "} {
	if {$variant == "unknown-is-operand"} {
	    res_test_gdb_complete_none "0 $operand" "$cmd 1 $operand"
	} else {
	    res_test_gdb_complete_none \
		"1 [expect_integer $option 1 $operand]" \
		"$cmd 1 $operand"
	}
    }
}

# Enum option tests.
proc_with_prefix test-enum {variant} {
    set cmd [make_cmd $variant]

    res_test_gdb_complete_multiple \
	"1 [expect_none ""]" \
	"$cmd -enum " "" "" {
	"xxx"
	"yyy"
	"zzz"
    }

    # Check that "-" where a value is expected does not show the
    # command's options.  I.e., an enum's value is not optional.
    # Check both completion and running the command.
    res_test_gdb_complete_none \
	"1 [expect_none "-"]" \
	"$cmd -enum -"
    gdb_test "$cmd -enum --"\
	"Requires an argument. Valid arguments are xxx, yyy, zzz\\."

    # Try passing an undefined item to an enum option.
    gdb_test "$cmd -enum www --" "Undefined item: \"www\"."
}

# String option tests.
proc_with_prefix test-string {variant} {
    global all_options

    set cmd [make_cmd $variant]

    res_test_gdb_complete_none \
	"1 [expect_none ""]" \
	"$cmd -string "

    # Check that "-" where a value is expected does not show the
    # command's options.  I.e., a string's value is not optional.
    # Check both completion and running the command.
    res_test_gdb_complete_none \
	"1 [expect_none ""]" \
	"$cmd -string -"
    gdb_test "$cmd -string --"\
	"-string requires an argument"
    if {$variant == "require-delimiter"} {
	gdb_test "$cmd -string" [expect_none "-string"]
    } else {
	gdb_test "$cmd -string"\
	    "-string requires an argument"
    }

    foreach_with_prefix str {
	"STR"
	"\"STR\""
	"\\\"STR"
	"'STR'"
	"\\'STR"
	"\"STR AAA\""
	"'STR BBB'"
	"\"STR 'CCC' DDD\""
	"'STR \"EEE\" FFF'"
	"\"STR \\\"GGG\\\" HHH\""
	"'STR \\\'III\\\' JJJ'"
    } {
	res_test_gdb_complete_none \
	    "1 [expect_none ""]" \
	    "$cmd -string ${str}"
	gdb_test "$cmd -string ${str} --" [expect_string "${str}" ""]

	# Completing at "-" after parsing STR should list all options.
	res_test_gdb_complete_multiple \
	    "1 [expect_string "${str}" "-"]" \
	    "$cmd -string ${str} " "-" "" $all_options

	# Check that only $STR is considered part of the string's value.
	# I.e., that we stop parsing the string at the first
	# whitespace or after the closing quote of $STR.
	if {$variant == "require-delimiter"} {
	    res_test_gdb_complete_none \
		"1 [expect_string "${str}" "BAR"]" \
		"$cmd -string ${str} BAR"
	} else {
	    res_test_gdb_complete_none "0 BAR" "$cmd -string ${str} BAR"
	}
	gdb_test "$cmd -string ${str} BAR --" "Unrecognized option at: BAR --"
    }
}

# Run the options framework tests first.
foreach_with_prefix cmd {
    "require-delimiter"
    "unknown-is-error"
    "unknown-is-operand"
} {
    test-misc $cmd
    test-flag $cmd
    test-boolean $cmd
    foreach subcmd {"uinteger" "zuinteger-unlimited" } {
	test-uinteger $cmd $subcmd
    }
    test-enum $cmd
    test-string $cmd
}

# Run the print integration tests, both as "standalone", and under
# "frame/thread apply".  The latter checks that the "frame/thread
# apply ... COMMAND" commands recurse the completion machinery for
# COMMAND completion correctly.
foreach prefix {
    ""
    "frame apply all "
    "frame apply 1 "
    "frame apply level 0 "
    "thread apply all "
    "thread apply 1 "
    "thread apply 1 frame apply 1 "
} {
    test-print $prefix
}

# Same for "compile print".  Not really a wrapper prefix command like
# "frame apply", but similar enough that we test pretty much the same
# things.
if ![skip_compile_feature_tests] {
    test-print "compile "
}

# Basic "backtrace" integration tests.
test-backtrace

# Basic "frame apply" integration tests.
test-frame-apply

# Basic "thread apply" integration tests.
test-thread-apply

# Basic "info threads" integration tests.
test-info-threads
