# Copyright 2003-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/>.


# This file tests C++-specific maintenance commands and help on those.

# Currently, no source file is used.

# Test the help messages.

proc test_help {} {
    set first_component_help "Print the first class/namespace component of NAME"
    set namespace_help "Deprecated placeholder for removed functionality."

    test_prefix_command_help {"maintenance cplus"} {
        "C\\+\\+ maintenance commands\.\[\r\n\]+"
    }

    test_prefix_command_help {"maint cp" "maintenance cplus"} {
        "C\\+\\+ maintenance commands.\r\n\r\n"
    }

    set multiple_help_body "List of maintenance cplus subcommands:\r\n\r\nmaintenance cplus first_component -- ${first_component_help}\r\nmaintenance cplus namespace -- ${namespace_help}\r\n\r\nType \"help maintenance cplus\" followed by maintenance cplus subcommand name for full documentation.\r\nCommand name abbreviations are allowed if unambiguous."

    gdb_test "maint cp" "\"maintenance cplus\" must be followed by the name of a command.\r\n.*"

    gdb_test "help maint cp first_component" "${first_component_help}."
    gdb_test "help maint cp namespace" "${namespace_help}."
}

# This is used when NAME should contain only a single component.  Be
# careful to make sure that parentheses get escaped properly.
proc test_single_component {name} {
    set matchname [string_to_regexp "$name"]
    gdb_test "maint cp first_component $name" "$matchname"
}

# This is used when NAME is invalid.
proc test_invalid_name {name} {
    set matchname [string_to_regexp "$name"]
    gdb_test "maint cp first_component $name" \
	"During symbol reading: unexpected demangled name '$matchname'\r\n$matchname"
}

proc test_first_component {} {
    # The function in question might complain; make sure that we see
    # all complaints.

    gdb_test_no_output "set complaints 1000"

    test_single_component "foo"
    test_single_component "operator<<"
    test_single_component "operator>>"
    test_single_component "operator ->"
    test_single_component "operator()"
    test_single_component "operator>"
    test_single_component "operator<"
    test_single_component "operator ->"
    test_single_component "operator  ->"

    test_single_component "foo()"
    test_single_component "foo(int)"
    test_single_component "foo(X::Y)"
    test_single_component "foo(X::Y, A::B)"
    test_single_component "foo(std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >)"
    test_single_component "operator>(X::Y)"

    # Operator names can show up in weird places.

    test_single_component "int operator<< <char>()"
    test_single_component "T<Cooperator>"

    # NOTE: carlton/2003-04-23: I've only seen the first of these
    # produced by the demangler, but I'm including two more just to be
    # on the safe side.
    test_single_component "int foo<&(operator<<(C, C))>()"
    test_single_component "int foo<&operator<<(C, C)>()"
    test_single_component "int foo<operator<<(C, C)>()"

    gdb_test "maint cp first_component foo::bar" "foo"
    gdb_test "maint cp first_component foo::bar::baz" "foo"
    gdb_test "maint cp first_component C<A>::bar" "C<A>"
    gdb_test "maint cp first_component C<std::basic_streambuf<wchar_t,std::char_traits<wchar_t> > >::bar" "C<std::basic_streambuf<wchar_t,std::char_traits<wchar_t> > >"

    # Make sure we behave appropriately on invalid input.

    # NOTE: carlton/2003-06-25: As of today, the demangler can in fact
    # produce examples like the third case below: there really should
    # be a space between the two <'s.  See PR gdb/1245.

    test_invalid_name "foo<"
    test_invalid_name "foo("
    test_invalid_name "bool operator<<char>"
}

proc test_namespace {} {
    gdb_test "maint cp namespace" "The `maint namespace' command was removed."
}

gdb_exit
gdb_start

test_help
test_first_component
test_namespace

gdb_exit
return 0
