# Copyright 2003 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu


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

# Currently, no source file is used.

if $tracelevel then {
        strace $tracelevel
        }

# Test the help messages.

proc test_help {} {
    gdb_test "help maintenance cplus" "C\\+\\+ maintenance commands.\r\n\r\nList of maintenance cplus subcommands:\r\n\r\nmaintenance cplus first_component -- Print the first class/namespace component of NAME\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 "help maint cp" "C\\+\\+ maintenance commands.\r\n\r\nList of maintenance cplus subcommands:\r\n\r\nmaintenance cplus first_component -- Print the first class/namespace component of NAME\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\nList of maintenance cplus subcommands:\r\n\r\nmaintenance cplus first_component -- Print the first class/namespace component of NAME\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 "help maint cp first_component" "Print the first class/namespace component of NAME."
}

# 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"
}

proc test_first_component {} {
    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> > >"
}

gdb_exit
gdb_start

test_help
test_first_component

gdb_exit
return 0
