10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Author: Steven J. Bethard <steven.bethard@gmail.com>.
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport codecs
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport inspect
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport shutil
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport stat
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport sys
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport textwrap
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport tempfile
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport argparse
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom StringIO import StringIO
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass StdIOBuffer(StringIO):
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    pass
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom test import test_support
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestCase(unittest.TestCase):
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def assertEqual(self, obj1, obj2):
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if obj1 != obj2:
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            print('')
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            print(repr(obj1))
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            print(repr(obj2))
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            print(obj1)
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            print(obj2)
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        super(TestCase, self).assertEqual(obj1, obj2)
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # The tests assume that line wrapping occurs at 80 columns, but this
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # behaviour can be overridden by setting the COLUMNS environment
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # variable.  To ensure that this assumption is true, unset COLUMNS.
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        env = test_support.EnvironmentVarGuard()
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        env.unset("COLUMNS")
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.addCleanup(env.__exit__)
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TempDirMixin(object):
420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.temp_dir = tempfile.mkdtemp()
450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.old_dir = os.getcwd()
460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        os.chdir(self.temp_dir)
470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def tearDown(self):
490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        os.chdir(self.old_dir)
500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        shutil.rmtree(self.temp_dir, True)
510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def create_readonly_file(self, filename):
530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file_path = os.path.join(self.temp_dir, filename)
540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with open(file_path, 'w') as file:
550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file.write(filename)
560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        os.chmod(file_path, stat.S_IREAD)
570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass Sig(object):
590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(self, *args, **kwargs):
610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.args = args
620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.kwargs = kwargs
630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass NS(object):
660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(self, **kwargs):
680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.__dict__.update(kwargs)
690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __repr__(self):
710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        sorted_items = sorted(self.__dict__.items())
720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        kwarg_str = ', '.join(['%s=%r' % tup for tup in sorted_items])
730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return '%s(%s)' % (type(self).__name__, kwarg_str)
740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    __hash__ = None
760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __eq__(self, other):
780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return vars(self) == vars(other)
790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __ne__(self, other):
810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return not (self == other)
820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass ArgumentParserError(Exception):
850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(self, message, stdout=None, stderr=None, error_code=None):
870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Exception.__init__(self, message, stdout, stderr)
880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.message = message
890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.stdout = stdout
900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.stderr = stderr
910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.error_code = error_code
920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef stderr_to_parser_error(parse_args, *args, **kwargs):
950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # if this is being called recursively and stderr or stdout is already being
960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # redirected, simply call the function and let the enclosing function
970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # catch the exception
980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if isinstance(sys.stderr, StdIOBuffer) or isinstance(sys.stdout, StdIOBuffer):
990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return parse_args(*args, **kwargs)
1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # if this is not being called recursively, redirect stderr and
1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # use it as the ArgumentParserError message
1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    old_stdout = sys.stdout
1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    old_stderr = sys.stderr
1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    sys.stdout = StdIOBuffer()
1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    sys.stderr = StdIOBuffer()
1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    try:
1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            result = parse_args(*args, **kwargs)
1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for key in list(vars(result)):
1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if getattr(result, key) is sys.stdout:
1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    setattr(result, key, old_stdout)
1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if getattr(result, key) is sys.stderr:
1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    setattr(result, key, old_stderr)
1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return result
1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except SystemExit:
1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            code = sys.exc_info()[1].code
1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            stdout = sys.stdout.getvalue()
1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            stderr = sys.stderr.getvalue()
1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            raise ArgumentParserError("SystemExit", stdout, stderr, code)
1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    finally:
1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        sys.stdout = old_stdout
1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        sys.stderr = old_stderr
1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass ErrorRaisingArgumentParser(argparse.ArgumentParser):
1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def parse_args(self, *args, **kwargs):
1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parse_args = super(ErrorRaisingArgumentParser, self).parse_args
1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return stderr_to_parser_error(parse_args, *args, **kwargs)
1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def exit(self, *args, **kwargs):
1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        exit = super(ErrorRaisingArgumentParser, self).exit
1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return stderr_to_parser_error(exit, *args, **kwargs)
1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def error(self, *args, **kwargs):
1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        error = super(ErrorRaisingArgumentParser, self).error
1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return stderr_to_parser_error(error, *args, **kwargs)
1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass ParserTesterMetaclass(type):
1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Adds parser tests using the class attributes.
1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    Classes of this type should specify the following attributes:
1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures -- a list of Sig objects which specify
1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        the signatures of Argument objects to be created
1480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures -- a list of args lists that should cause the parser
1490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        to fail
1500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes -- a list of (initial_args, options, remaining_args) tuples
1510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        where initial_args specifies the string args to be parsed,
1520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        options is a dict that should match the vars() of the options
1530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parsed out of initial_args, and remaining_args should be any
1540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        remaining unparsed arguments
1550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """
1560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(cls, name, bases, bodydict):
1580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if name == 'ParserTestCase':
1590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return
1600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # default parser signature is empty
1620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if not hasattr(cls, 'parser_signature'):
1630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cls.parser_signature = Sig()
1640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if not hasattr(cls, 'parser_class'):
1650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cls.parser_class = ErrorRaisingArgumentParser
1660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # ---------------------------------------
1680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # functions for adding optional arguments
1690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # ---------------------------------------
1700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def no_groups(parser, argument_signatures):
1710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """Add all arguments directly to the parser"""
1720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for sig in argument_signatures:
1730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                parser.add_argument(*sig.args, **sig.kwargs)
1740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def one_group(parser, argument_signatures):
1760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """Add all arguments under a single group in the parser"""
1770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            group = parser.add_argument_group('foo')
1780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for sig in argument_signatures:
1790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                group.add_argument(*sig.args, **sig.kwargs)
1800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def many_groups(parser, argument_signatures):
1820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """Add each argument in its own group to the parser"""
1830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for i, sig in enumerate(argument_signatures):
1840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                group = parser.add_argument_group('foo:%i' % i)
1850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                group.add_argument(*sig.args, **sig.kwargs)
1860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # --------------------------
1880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # functions for parsing args
1890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # --------------------------
1900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def listargs(parser, args):
1910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """Parse the args by passing in a list"""
1920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return parser.parse_args(args)
1930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def sysargs(parser, args):
1950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """Parse the args by defaulting to sys.argv"""
1960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            old_sys_argv = sys.argv
1970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            sys.argv = [old_sys_argv[0]] + args
1980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
1990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return parser.parse_args()
2000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            finally:
2010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                sys.argv = old_sys_argv
2020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # class that holds the combination of one optional argument
2040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # addition method and one arg parsing method
2050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class AddTests(object):
2060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, tester_cls, add_arguments, parse_args):
2080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._add_arguments = add_arguments
2090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._parse_args = parse_args
2100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                add_arguments_name = self._add_arguments.__name__
2120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                parse_args_name = self._parse_args.__name__
2130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for test_func in [self.test_failures, self.test_successes]:
2140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    func_name = test_func.__name__
2150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    names = func_name, add_arguments_name, parse_args_name
2160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    test_name = '_'.join(names)
2170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    def wrapper(self, test_func=test_func):
2190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        test_func(self)
2200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    try:
2210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        wrapper.__name__ = test_name
2220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    except TypeError:
2230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        pass
2240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    setattr(tester_cls, test_name, wrapper)
2250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def _get_parser(self, tester):
2270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                args = tester.parser_signature.args
2280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                kwargs = tester.parser_signature.kwargs
2290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                parser = tester.parser_class(*args, **kwargs)
2300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._add_arguments(parser, tester.argument_signatures)
2310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return parser
2320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def test_failures(self, tester):
2340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                parser = self._get_parser(tester)
2350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for args_str in tester.failures:
2360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    args = args_str.split()
2370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    raises = tester.assertRaises
2380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    raises(ArgumentParserError, parser.parse_args, args)
2390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def test_successes(self, tester):
2410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                parser = self._get_parser(tester)
2420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for args, expected_ns in tester.successes:
2430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(args, str):
2440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        args = args.split()
2450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    result_ns = self._parse_args(parser, args)
2460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    tester.assertEqual(expected_ns, result_ns)
2470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # add tests for each combination of an optionals adding method
2490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # and an arg parsing method
2500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for add_arguments in [no_groups, one_group, many_groups]:
2510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for parse_args in [listargs, sysargs]:
2520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                AddTests(cls, add_arguments, parse_args)
2530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yibases = TestCase,
2550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiParserTestCase = ParserTesterMetaclass('ParserTestCase', bases, {})
2560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ===============
2580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Optionals tests
2590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ===============
2600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsSingleDash(ParserTestCase):
2620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test an Optional with a single-dash option string"""
2630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-x')]
2650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x', 'a', '--foo', '-x --foo', '-x -y']
2660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
2670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None)),
2680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x a', NS(x='a')),
2690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-xa', NS(x='a')),
2700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x -1', NS(x='-1')),
2710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x-1', NS(x='-1')),
2720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
2730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsSingleDashCombined(ParserTestCase):
2760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test an Optional with a single-dash option string"""
2770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
2790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', action='store_true'),
2800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-yyy', action='store_const', const=42),
2810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-z'),
2820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
2830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '--foo', '-xa', '-x --foo', '-x -z', '-z -x',
2840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                '-yx', '-yz a', '-yyyx', '-yyyza', '-xyza']
2850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
2860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=False, yyy=None, z=None)),
2870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x', NS(x=True, yyy=None, z=None)),
2880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-za', NS(x=False, yyy=None, z='a')),
2890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-z a', NS(x=False, yyy=None, z='a')),
2900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-xza', NS(x=True, yyy=None, z='a')),
2910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-xz a', NS(x=True, yyy=None, z='a')),
2920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x -za', NS(x=True, yyy=None, z='a')),
2930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x -z a', NS(x=True, yyy=None, z='a')),
2940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y', NS(x=False, yyy=42, z=None)),
2950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-yyy', NS(x=False, yyy=42, z=None)),
2960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x -yyy -za', NS(x=True, yyy=42, z='a')),
2970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x -yyy -z a', NS(x=True, yyy=42, z='a')),
2980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
2990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsSingleDashLong(ParserTestCase):
3020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test an Optional with a multi-character single-dash option string"""
3030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-foo')]
3050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-foo', 'a', '--foo', '-foo --foo', '-foo -y', '-fooa']
3060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
3070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foo=None)),
3080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-foo a', NS(foo='a')),
3090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-foo -1', NS(foo='-1')),
3100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-fo a', NS(foo='a')),
3110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-f a', NS(foo='a')),
3120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
3130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsSingleDashSubsetAmbiguous(ParserTestCase):
3160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test Optionals where option strings are subsets of each other"""
3170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-f'), Sig('-foobar'), Sig('-foorab')]
3190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-f', '-foo', '-fo', '-foo b', '-foob', '-fooba', '-foora']
3200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
3210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(f=None, foobar=None, foorab=None)),
3220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-f a', NS(f='a', foobar=None, foorab=None)),
3230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-fa', NS(f='a', foobar=None, foorab=None)),
3240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-foa', NS(f='oa', foobar=None, foorab=None)),
3250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-fooa', NS(f='ooa', foobar=None, foorab=None)),
3260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-foobar a', NS(f=None, foobar='a', foorab=None)),
3270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-foorab a', NS(f=None, foobar=None, foorab='a')),
3280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
3290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsSingleDashAmbiguous(ParserTestCase):
3320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test Optionals that partially match but are not subsets"""
3330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-foobar'), Sig('-foorab')]
3350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-f', '-f a', '-fa', '-foa', '-foo', '-fo', '-foo b']
3360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
3370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foobar=None, foorab=None)),
3380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-foob a', NS(foobar='a', foorab=None)),
3390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-foor a', NS(foobar=None, foorab='a')),
3400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-fooba a', NS(foobar='a', foorab=None)),
3410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-foora a', NS(foobar=None, foorab='a')),
3420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-foobar a', NS(foobar='a', foorab=None)),
3430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-foorab a', NS(foobar=None, foorab='a')),
3440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
3450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsNumeric(ParserTestCase):
3480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test an Optional with a short opt string"""
3490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-1', dest='one')]
3510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-1', 'a', '-1 --foo', '-1 -y', '-1 -1', '-1 -2']
3520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
3530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(one=None)),
3540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-1 a', NS(one='a')),
3550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-1a', NS(one='a')),
3560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-1-2', NS(one='-2')),
3570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
3580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsDoubleDash(ParserTestCase):
3610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test an Optional with a double-dash option string"""
3620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('--foo')]
3640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--foo', '-f', '-f a', 'a', '--foo -x', '--foo --bar']
3650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
3660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foo=None)),
3670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--foo a', NS(foo='a')),
3680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--foo=a', NS(foo='a')),
3690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--foo -2.5', NS(foo='-2.5')),
3700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--foo=-2.5', NS(foo='-2.5')),
3710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
3720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsDoubleDashPartialMatch(ParserTestCase):
3750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests partial matching with a double-dash option string"""
3760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
3780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--badger', action='store_true'),
3790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--bat'),
3800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
3810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--bar', '--b', '--ba', '--b=2', '--ba=4', '--badge 5']
3820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
3830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(badger=False, bat=None)),
3840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--bat X', NS(badger=False, bat='X')),
3850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--bad', NS(badger=True, bat=None)),
3860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--badg', NS(badger=True, bat=None)),
3870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--badge', NS(badger=True, bat=None)),
3880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--badger', NS(badger=True, bat=None)),
3890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
3900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsDoubleDashPrefixMatch(ParserTestCase):
3930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests when one double-dash option string is a prefix of another"""
3940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
3960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--badger', action='store_true'),
3970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--ba'),
3980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
3990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--bar', '--b', '--ba', '--b=2', '--badge 5']
4000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
4010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(badger=False, ba=None)),
4020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--ba X', NS(badger=False, ba='X')),
4030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--ba=X', NS(badger=False, ba='X')),
4040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--bad', NS(badger=True, ba=None)),
4050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--badg', NS(badger=True, ba=None)),
4060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--badge', NS(badger=True, ba=None)),
4070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--badger', NS(badger=True, ba=None)),
4080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
4090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsSingleDoubleDash(ParserTestCase):
4120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test an Optional with single- and double-dash option strings"""
4130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
4150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-f', action='store_true'),
4160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--bar'),
4170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-baz', action='store_const', const=42),
4180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
4190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--bar', '-fbar', '-fbaz', '-bazf', '-b B', 'B']
4200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
4210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(f=False, bar=None, baz=None)),
4220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-f', NS(f=True, bar=None, baz=None)),
4230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--ba B', NS(f=False, bar='B', baz=None)),
4240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-f --bar B', NS(f=True, bar='B', baz=None)),
4250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-f -b', NS(f=True, bar=None, baz=42)),
4260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-ba -f', NS(f=True, bar=None, baz=42)),
4270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
4280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsAlternatePrefixChars(ParserTestCase):
4310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test an Optional with option strings with custom prefixes"""
4320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prefix_chars='+:/', add_help=False)
4340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
4350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('+f', action='store_true'),
4360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('::bar'),
4370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('/baz', action='store_const', const=42),
4380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
4390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--bar', '-fbar', '-b B', 'B', '-f', '--bar B', '-baz', '-h', '--help', '+h', '::help', '/help']
4400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
4410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(f=False, bar=None, baz=None)),
4420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('+f', NS(f=True, bar=None, baz=None)),
4430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('::ba B', NS(f=False, bar='B', baz=None)),
4440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('+f ::bar B', NS(f=True, bar='B', baz=None)),
4450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('+f /b', NS(f=True, bar=None, baz=42)),
4460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('/ba +f', NS(f=True, bar=None, baz=42)),
4470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
4480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsAlternatePrefixCharsAddedHelp(ParserTestCase):
4510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """When ``-`` not in prefix_chars, default operators created for help
4520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi       should use the prefix_chars in use rather than - or --
4530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi       http://bugs.python.org/issue9444"""
4540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prefix_chars='+:/', add_help=True)
4560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
4570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('+f', action='store_true'),
4580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('::bar'),
4590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('/baz', action='store_const', const=42),
4600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
4610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--bar', '-fbar', '-b B', 'B', '-f', '--bar B', '-baz']
4620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
4630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(f=False, bar=None, baz=None)),
4640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('+f', NS(f=True, bar=None, baz=None)),
4650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('::ba B', NS(f=False, bar='B', baz=None)),
4660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('+f ::bar B', NS(f=True, bar='B', baz=None)),
4670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('+f /b', NS(f=True, bar=None, baz=42)),
4680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('/ba +f', NS(f=True, bar=None, baz=42))
4690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
4700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsAlternatePrefixCharsMultipleShortArgs(ParserTestCase):
4730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Verify that Optionals must be called with their defined prefixes"""
4740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prefix_chars='+-', add_help=False)
4760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
4770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', action='store_true'),
4780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('+y', action='store_true'),
4790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('+z', action='store_true'),
4800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
4810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-w',
4820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                '-xyz',
4830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                '+x',
4840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                '-y',
4850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                '+xyz',
4860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
4870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
4880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=False, y=False, z=False)),
4890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x', NS(x=True, y=False, z=False)),
4900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('+y -x', NS(x=True, y=True, z=False)),
4910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('+yz -x', NS(x=True, y=True, z=True)),
4920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
4930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsShortLong(ParserTestCase):
4960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a combination of single- and double-dash option strings"""
4970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
4990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-v', '--verbose', '-n', '--noisy', action='store_true'),
5000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
5010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--x --verbose', '-N', 'a', '-v x']
5020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
5030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(verbose=False)),
5040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-v', NS(verbose=True)),
5050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--verbose', NS(verbose=True)),
5060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-n', NS(verbose=True)),
5070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--noisy', NS(verbose=True)),
5080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
5090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsDest(ParserTestCase):
5120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests various means of setting destination"""
5130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('--foo-bar'), Sig('--baz', dest='zabbaz')]
5150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a']
5160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
5170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--foo-bar f', NS(foo_bar='f', zabbaz=None)),
5180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz g', NS(foo_bar=None, zabbaz='g')),
5190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--foo-bar h --baz i', NS(foo_bar='h', zabbaz='i')),
5200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz j --foo-bar k', NS(foo_bar='k', zabbaz='j')),
5210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
5220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsDefault(ParserTestCase):
5250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests specifying a default for an Optional"""
5260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-x'), Sig('-y', default=42)]
5280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a']
5290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
5300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None, y=42)),
5310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-xx', NS(x='x', y=42)),
5320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-yy', NS(x=None, y='y')),
5330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
5340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsNargsDefault(ParserTestCase):
5370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests not specifying the number of args for an Optional"""
5380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-x')]
5400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '-x']
5410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
5420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None)),
5430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x a', NS(x='a')),
5440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
5450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsNargs1(ParserTestCase):
5480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests specifying the 1 arg for an Optional"""
5490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-x', nargs=1)]
5510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '-x']
5520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
5530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None)),
5540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x a', NS(x=['a'])),
5550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
5560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsNargs3(ParserTestCase):
5590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests specifying the 3 args for an Optional"""
5600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-x', nargs=3)]
5620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '-x', '-x a', '-x a b', 'a -x', 'a -x b']
5630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
5640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None)),
5650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x a b c', NS(x=['a', 'b', 'c'])),
5660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
5670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsNargsOptional(ParserTestCase):
5700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests specifying an Optional arg for an Optional"""
5710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
5730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-w', nargs='?'),
5740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', nargs='?', const=42),
5750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-y', nargs='?', default='spam'),
5760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-z', nargs='?', type=int, const='42', default='84'),
5770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
5780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['2']
5790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
5800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(w=None, x=None, y='spam', z=84)),
5810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-w', NS(w=None, x=None, y='spam', z=84)),
5820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-w 2', NS(w='2', x=None, y='spam', z=84)),
5830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x', NS(w=None, x=42, y='spam', z=84)),
5840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x 2', NS(w=None, x='2', y='spam', z=84)),
5850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y', NS(w=None, x=None, y=None, z=84)),
5860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y 2', NS(w=None, x=None, y='2', z=84)),
5870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-z', NS(w=None, x=None, y='spam', z=42)),
5880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-z 2', NS(w=None, x=None, y='spam', z=2)),
5890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
5900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsNargsZeroOrMore(ParserTestCase):
5930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests specifying an args for an Optional that accepts zero or more"""
5940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
5960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', nargs='*'),
5970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-y', nargs='*', default='spam'),
5980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
5990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a']
6000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
6010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None, y='spam')),
6020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x', NS(x=[], y='spam')),
6030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x a', NS(x=['a'], y='spam')),
6040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x a b', NS(x=['a', 'b'], y='spam')),
6050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y', NS(x=None, y=[])),
6060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y a', NS(x=None, y=['a'])),
6070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y a b', NS(x=None, y=['a', 'b'])),
6080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
6090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsNargsOneOrMore(ParserTestCase):
6120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests specifying an args for an Optional that accepts one or more"""
6130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
6150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', nargs='+'),
6160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-y', nargs='+', default='spam'),
6170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
6180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '-x', '-y', 'a -x', 'a -y b']
6190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
6200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None, y='spam')),
6210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x a', NS(x=['a'], y='spam')),
6220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x a b', NS(x=['a', 'b'], y='spam')),
6230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y a', NS(x=None, y=['a'])),
6240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y a b', NS(x=None, y=['a', 'b'])),
6250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
6260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsChoices(ParserTestCase):
6290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests specifying the choices for an Optional"""
6300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
6320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-f', choices='abc'),
6330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-g', type=int, choices=range(5))]
6340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '-f d', '-fad', '-ga', '-g 6']
6350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
6360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(f=None, g=None)),
6370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-f a', NS(f='a', g=None)),
6380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-f c', NS(f='c', g=None)),
6390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-g 0', NS(f=None, g=0)),
6400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-g 03', NS(f=None, g=3)),
6410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-fb -g4', NS(f='b', g=4)),
6420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
6430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsRequired(ParserTestCase):
6460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests the an optional action that is required"""
6470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
6490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', type=int, required=True),
6500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
6510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '']
6520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
6530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x 1', NS(x=1)),
6540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x42', NS(x=42)),
6550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
6560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsActionStore(ParserTestCase):
6590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests the store action for an Optional"""
6600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-x', action='store')]
6620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', 'a -x']
6630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
6640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None)),
6650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-xfoo', NS(x='foo')),
6660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
6670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsActionStoreConst(ParserTestCase):
6700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests the store_const action for an Optional"""
6710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-y', action='store_const', const=object)]
6730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a']
6740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
6750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(y=None)),
6760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y', NS(y=object)),
6770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
6780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsActionStoreFalse(ParserTestCase):
6810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests the store_false action for an Optional"""
6820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-z', action='store_false')]
6840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '-za', '-z a']
6850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
6860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(z=True)),
6870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-z', NS(z=False)),
6880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
6890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsActionStoreTrue(ParserTestCase):
6920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests the store_true action for an Optional"""
6930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('--apple', action='store_true')]
6950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '--apple=b', '--apple b']
6960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
6970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(apple=False)),
6980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--apple', NS(apple=True)),
6990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
7000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsActionAppend(ParserTestCase):
7030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests the append action for an Optional"""
7040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('--baz', action='append')]
7060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '--baz', 'a --baz', '--baz a b']
7070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
7080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(baz=None)),
7090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz a', NS(baz=['a'])),
7100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz a --baz b', NS(baz=['a', 'b'])),
7110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
7120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsActionAppendWithDefault(ParserTestCase):
7150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests the append action for an Optional"""
7160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('--baz', action='append', default=['X'])]
7180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '--baz', 'a --baz', '--baz a b']
7190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
7200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(baz=['X'])),
7210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz a', NS(baz=['X', 'a'])),
7220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz a --baz b', NS(baz=['X', 'a', 'b'])),
7230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
7240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsActionAppendConst(ParserTestCase):
7270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests the append_const action for an Optional"""
7280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
7300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-b', action='append_const', const=Exception),
7310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-c', action='append', dest='b'),
7320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
7330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '-c', 'a -c', '-bx', '-b x']
7340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
7350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(b=None)),
7360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-b', NS(b=[Exception])),
7370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-b -cx -b -cyz', NS(b=[Exception, 'x', Exception, 'yz'])),
7380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
7390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsActionAppendConstWithDefault(ParserTestCase):
7420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests the append_const action for an Optional"""
7430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
7450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-b', action='append_const', const=Exception, default=['X']),
7460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-c', action='append', dest='b'),
7470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
7480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '-c', 'a -c', '-bx', '-b x']
7490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
7500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(b=['X'])),
7510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-b', NS(b=['X', Exception])),
7520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-b -cx -b -cyz', NS(b=['X', Exception, 'x', Exception, 'yz'])),
7530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
7540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsActionCount(ParserTestCase):
7570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests the count action for an Optional"""
7580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-x', action='count')]
7600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '-x a', '-x b', '-x a -x b']
7610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
7620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None)),
7630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x', NS(x=1)),
7640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
7650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ================
7680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Positional tests
7690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ================
7700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsNone(ParserTestCase):
7720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional that doesn't specify nargs"""
7730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo')]
7750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '-x', 'a b']
7760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
7770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo='a')),
7780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
7790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargs1(ParserTestCase):
7820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional that specifies an nargs of 1"""
7830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs=1)]
7850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '-x', 'a b']
7860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
7870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo=['a'])),
7880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
7890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargs2(ParserTestCase):
7920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional that specifies an nargs of 2"""
7930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs=2)]
7950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', 'a', '-x', 'a b c']
7960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
7970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo=['a', 'b'])),
7980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
7990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsZeroOrMore(ParserTestCase):
8020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional that specifies unlimited nargs"""
8030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='*')]
8050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x']
8060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
8070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foo=[])),
8080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo=['a'])),
8090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo=['a', 'b'])),
8100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
8110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsZeroOrMoreDefault(ParserTestCase):
8140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional that specifies unlimited nargs and a default"""
8150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='*', default='bar')]
8170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x']
8180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
8190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foo='bar')),
8200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo=['a'])),
8210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo=['a', 'b'])),
8220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
8230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsOneOrMore(ParserTestCase):
8260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional that specifies one or more nargs"""
8270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='+')]
8290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '-x']
8300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
8310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo=['a'])),
8320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo=['a', 'b'])),
8330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
8340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsOptional(ParserTestCase):
8370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests an Optional Positional"""
8380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='?')]
8400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x', 'a b']
8410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
8420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foo=None)),
8430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo='a')),
8440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
8450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsOptionalDefault(ParserTestCase):
8480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests an Optional Positional with a default value"""
8490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='?', default=42)]
8510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x', 'a b']
8520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
8530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foo=42)),
8540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo='a')),
8550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
8560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsOptionalConvertedDefault(ParserTestCase):
8590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests an Optional Positional with a default value
8600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    that needs to be converted to the appropriate type.
8610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """
8620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
8640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('foo', nargs='?', type=int, default='42'),
8650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
8660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x', 'a b', '1 2']
8670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
8680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foo=42)),
8690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('1', NS(foo=1)),
8700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
8710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsNoneNone(ParserTestCase):
8740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test two Positionals that don't specify nargs"""
8750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo'), Sig('bar')]
8770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '-x', 'a', 'a b c']
8780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
8790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar='b')),
8800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
8810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsNone1(ParserTestCase):
8840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with no nargs followed by one with 1"""
8850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo'), Sig('bar', nargs=1)]
8870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a', 'a b c']
8880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
8890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar=['b'])),
8900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
8910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargs2None(ParserTestCase):
8940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with 2 nargs followed by one with none"""
8950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs=2), Sig('bar')]
8970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a', 'a b', 'a b c d']
8980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
8990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo=['a', 'b'], bar='c')),
9000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
9010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsNoneZeroOrMore(ParserTestCase):
9040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with no nargs followed by one with unlimited"""
9050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo'), Sig('bar', nargs='*')]
9070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo']
9080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
9090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo='a', bar=[])),
9100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar=['b'])),
9110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo='a', bar=['b', 'c'])),
9120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
9130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsNoneOneOrMore(ParserTestCase):
9160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with no nargs followed by one with one or more"""
9170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo'), Sig('bar', nargs='+')]
9190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a']
9200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
9210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar=['b'])),
9220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo='a', bar=['b', 'c'])),
9230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
9240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsNoneOptional(ParserTestCase):
9270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with no nargs followed by one with an Optional"""
9280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo'), Sig('bar', nargs='?')]
9300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a b c']
9310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
9320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo='a', bar=None)),
9330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar='b')),
9340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
9350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsZeroOrMoreNone(ParserTestCase):
9380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with unlimited nargs followed by one with none"""
9390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='*'), Sig('bar')]
9410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo']
9420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
9430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo=[], bar='a')),
9440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo=['a'], bar='b')),
9450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo=['a', 'b'], bar='c')),
9460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
9470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsOneOrMoreNone(ParserTestCase):
9500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with one or more nargs followed by one with none"""
9510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='+'), Sig('bar')]
9530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a']
9540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
9550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo=['a'], bar='b')),
9560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo=['a', 'b'], bar='c')),
9570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
9580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsOptionalNone(ParserTestCase):
9610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with an Optional nargs followed by one with none"""
9620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='?', default=42), Sig('bar')]
9640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a b c']
9650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
9660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo=42, bar='a')),
9670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar='b')),
9680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
9690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargs2ZeroOrMore(ParserTestCase):
9720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with 2 nargs followed by one with unlimited"""
9730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='*')]
9750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a']
9760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
9770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo=['a', 'b'], bar=[])),
9780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
9790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
9800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargs2OneOrMore(ParserTestCase):
9830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with 2 nargs followed by one with one or more"""
9840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='+')]
9860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a', 'a b']
9870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
9880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
9890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
9900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargs2Optional(ParserTestCase):
9930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with 2 nargs followed by one optional"""
9940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='?')]
9960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a', 'a b c d']
9970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
9980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo=['a', 'b'], bar=None)),
9990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo=['a', 'b'], bar='c')),
10000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsZeroOrMore1(ParserTestCase):
10040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with unlimited nargs followed by one with 1"""
10050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='*'), Sig('bar', nargs=1)]
10070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', ]
10080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
10090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo=[], bar=['a'])),
10100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo=['a'], bar=['b'])),
10110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
10120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsOneOrMore1(ParserTestCase):
10160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with one or more nargs followed by one with 1"""
10170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='+'), Sig('bar', nargs=1)]
10190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a']
10200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
10210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo=['a'], bar=['b'])),
10220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
10230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsOptional1(ParserTestCase):
10270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a Positional with an Optional nargs followed by one with 1"""
10280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs=1)]
10300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a b c']
10310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
10320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo=None, bar=['a'])),
10330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar=['b'])),
10340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsNoneZeroOrMore1(ParserTestCase):
10380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test three Positionals: no nargs, unlimited nargs and 1 nargs"""
10390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
10410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('foo'),
10420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('bar', nargs='*'),
10430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('baz', nargs=1),
10440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a']
10460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
10470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar=[], baz=['b'])),
10480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo='a', bar=['b'], baz=['c'])),
10490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsNoneOneOrMore1(ParserTestCase):
10530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test three Positionals: no nargs, one or more nargs and 1 nargs"""
10540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
10560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('foo'),
10570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('bar', nargs='+'),
10580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('baz', nargs=1),
10590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a', 'b']
10610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
10620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo='a', bar=['b'], baz=['c'])),
10630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c d', NS(foo='a', bar=['b', 'c'], baz=['d'])),
10640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsNoneOptional1(ParserTestCase):
10680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test three Positionals: no nargs, optional narg and 1 nargs"""
10690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
10710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('foo'),
10720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('bar', nargs='?', default=0.625),
10730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('baz', nargs=1),
10740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a']
10760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
10770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar=0.625, baz=['b'])),
10780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo='a', bar='b', baz=['c'])),
10790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsOptionalOptional(ParserTestCase):
10830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test two optional nargs"""
10840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
10860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('foo', nargs='?'),
10870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('bar', nargs='?', default=42),
10880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--foo', 'a b c']
10900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
10910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foo=None, bar=42)),
10920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo='a', bar=42)),
10930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar='b')),
10940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
10950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsOptionalZeroOrMore(ParserTestCase):
10980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test an Optional narg followed by unlimited nargs"""
10990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs='*')]
11010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--foo']
11020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
11030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foo=None, bar=[])),
11040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo='a', bar=[])),
11050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar=['b'])),
11060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo='a', bar=['b', 'c'])),
11070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
11080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsNargsOptionalOneOrMore(ParserTestCase):
11110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test an Optional narg followed by one or more nargs"""
11120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs='+')]
11140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo']
11150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
11160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo=None, bar=['a'])),
11170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar=['b'])),
11180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(foo='a', bar=['b', 'c'])),
11190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
11200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsChoicesString(ParserTestCase):
11230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a set of single-character choices"""
11240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('spam', choices=set('abcdefg'))]
11260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'h', '42', 'ef']
11270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
11280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(spam='a')),
11290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('g', NS(spam='g')),
11300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
11310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsChoicesInt(ParserTestCase):
11340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a set of integer choices"""
11350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('spam', type=int, choices=range(20))]
11370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'h', '42', 'ef']
11380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
11390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('4', NS(spam=4)),
11400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('15', NS(spam=15)),
11410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
11420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsActionAppend(ParserTestCase):
11450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test the 'append' action"""
11460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
11480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', action='append'),
11490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', action='append', nargs=2),
11500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
11510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '--foo', 'a', 'a b', 'a b c d']
11520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
11530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b c', NS(spam=['a', ['b', 'c']])),
11540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
11550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ========================================
11570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Combined optionals and positionals tests
11580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ========================================
11590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsNumericAndPositionals(ParserTestCase):
11610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests negative number args when numeric options are present"""
11620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
11640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('x', nargs='?'),
11650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-4', dest='y', action='store_true'),
11660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
11670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-2', '-315']
11680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
11690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None, y=False)),
11700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(x='a', y=False)),
11710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-4', NS(x=None, y=True)),
11720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-4 a', NS(x='a', y=True)),
11730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
11740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsAlmostNumericAndPositionals(ParserTestCase):
11770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests negative number args when almost numeric options are present"""
11780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
11800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('x', nargs='?'),
11810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-k4', dest='y', action='store_true'),
11820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
11830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-k3']
11840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
11850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None, y=False)),
11860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-2', NS(x='-2', y=False)),
11870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(x='a', y=False)),
11880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-k4', NS(x=None, y=True)),
11890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-k4 a', NS(x='a', y=True)),
11900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
11910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestEmptyAndSpaceContainingArguments(ParserTestCase):
11940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
11960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('x', nargs='?'),
11970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-y', '--yyy', dest='y'),
11980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
11990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-y']
12000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
12010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ([''], NS(x='', y=None)),
12020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (['a badger'], NS(x='a badger', y=None)),
12030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (['-a badger'], NS(x='-a badger', y=None)),
12040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (['-y', ''], NS(x=None, y='')),
12050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (['-y', 'a badger'], NS(x=None, y='a badger')),
12060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (['-y', '-a badger'], NS(x=None, y='-a badger')),
12070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (['--yyy=a badger'], NS(x=None, y='a badger')),
12080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (['--yyy=-a badger'], NS(x=None, y='-a badger')),
12090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
12100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPrefixCharacterOnlyArguments(ParserTestCase):
12130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prefix_chars='-+')
12150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
12160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-', dest='x', nargs='?', const='badger'),
12170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('+', dest='y', type=int, default=42),
12180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-+-', dest='z', action='store_true'),
12190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
12200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-y', '+ -']
12210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
12220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None, y=42, z=False)),
12230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-', NS(x='badger', y=42, z=False)),
12240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('- X', NS(x='X', y=42, z=False)),
12250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('+ -3', NS(x=None, y=-3, z=False)),
12260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-+-', NS(x=None, y=42, z=True)),
12270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('- ===', NS(x='===', y=42, z=False)),
12280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
12290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestNargsZeroOrMore(ParserTestCase):
12320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests specifying an args for an Optional that accepts zero or more"""
12330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-x', nargs='*'), Sig('y', nargs='*')]
12350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = []
12360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
12370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None, y=[])),
12380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x', NS(x=[], y=[])),
12390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x a', NS(x=['a'], y=[])),
12400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x a -- b', NS(x=['a'], y=['b'])),
12410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(x=None, y=['a'])),
12420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a -x', NS(x=[], y=['a'])),
12430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a -x b', NS(x=['b'], y=['a'])),
12440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
12450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestNargsRemainder(ParserTestCase):
12480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests specifying a positional with nargs=REMAINDER"""
12490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('x'), Sig('y', nargs='...'), Sig('-z')]
12510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '-z', '-z Z']
12520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
12530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X', NS(x='X', y=[], z=None)),
12540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-z Z X', NS(x='X', y=[], z='Z')),
12550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X A B -z Z', NS(x='X', y=['A', 'B', '-z', 'Z'], z=None)),
12560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X Y --foo', NS(x='X', y=['Y', '--foo'], z=None)),
12570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
12580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionLike(ParserTestCase):
12610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests options that may or may not be arguments"""
12620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
12640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', type=float),
12650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-3', type=float, dest='y'),
12660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('z', nargs='*'),
12670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
12680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x', '-y2.5', '-xa', '-x -a',
12690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                '-x -3', '-x -3.5', '-3 -3.5',
12700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                '-x -2.5', '-x -2.5 a', '-3 -.5',
12710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                'a x -1', '-x -1 a', '-3 -1 a']
12720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
12730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None, y=None, z=[])),
12740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x 2.5', NS(x=2.5, y=None, z=[])),
12750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x 2.5 a', NS(x=2.5, y=None, z=['a'])),
12760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-3.5', NS(x=None, y=0.5, z=[])),
12770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-3-.5', NS(x=None, y=-0.5, z=[])),
12780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-3 .5', NS(x=None, y=0.5, z=[])),
12790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a -3.5', NS(x=None, y=0.5, z=['a'])),
12800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(x=None, y=None, z=['a'])),
12810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a -x 1', NS(x=1.0, y=None, z=['a'])),
12820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x 1 a', NS(x=1.0, y=None, z=['a'])),
12830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-3 1 a', NS(x=None, y=1.0, z=['a'])),
12840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
12850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestDefaultSuppress(ParserTestCase):
12880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test actions with suppressed defaults"""
12890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
12910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('foo', nargs='?', default=argparse.SUPPRESS),
12920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('bar', nargs='*', default=argparse.SUPPRESS),
12930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--baz', action='store_true', default=argparse.SUPPRESS),
12940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
12950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x']
12960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
12970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS()),
12980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo='a')),
12990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar=['b'])),
13000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz', NS(baz=True)),
13010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a --baz', NS(foo='a', baz=True)),
13020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
13030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
13040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestParserDefaultSuppress(ParserTestCase):
13070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test actions with a parser-level default of SUPPRESS"""
13080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(argument_default=argparse.SUPPRESS)
13100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
13110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('foo', nargs='?'),
13120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('bar', nargs='*'),
13130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--baz', action='store_true'),
13140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
13150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x']
13160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
13170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS()),
13180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo='a')),
13190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar=['b'])),
13200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz', NS(baz=True)),
13210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a --baz', NS(foo='a', baz=True)),
13220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
13230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
13240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestParserDefault42(ParserTestCase):
13270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test actions with a parser-level default of 42"""
13280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(argument_default=42, version='1.0')
13300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
13310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('foo', nargs='?'),
13320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('bar', nargs='*'),
13330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--baz', action='store_true'),
13340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
13350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x']
13360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
13370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foo=42, bar=42, baz=42)),
13380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a', NS(foo='a', bar=42, baz=42)),
13390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a b', NS(foo='a', bar=['b'], baz=42)),
13400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz', NS(foo=42, bar=42, baz=True)),
13410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a --baz', NS(foo='a', bar=42, baz=True)),
13420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
13430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
13440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestArgumentsFromFile(TempDirMixin, ParserTestCase):
13470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test reading arguments from a file"""
13480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
13500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        super(TestArgumentsFromFile, self).setUp()
13510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file_texts = [
13520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ('hello', 'hello world!\n'),
13530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ('recursive', '-a\n'
13540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          'A\n'
13550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          '@hello'),
13560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ('invalid', '@no-such-path\n'),
13570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ]
13580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for path, text in file_texts:
13590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file = open(path, 'w')
13600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file.write(text)
13610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file.close()
13620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(fromfile_prefix_chars='@')
13640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
13650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-a'),
13660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('x'),
13670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('y', nargs='+'),
13680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
13690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['', '-b', 'X', '@invalid', '@missing']
13700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
13710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X Y', NS(a=None, x='X', y=['Y'])),
13720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X -a A Y Z', NS(a='A', x='X', y=['Y', 'Z'])),
13730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('@hello X', NS(a=None, x='hello world!', y=['X'])),
13740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X @hello', NS(a=None, x='X', y=['hello world!'])),
13750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-a B @recursive Y Z', NS(a='A', x='hello world!', y=['Y', 'Z'])),
13760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X @recursive Z -a B', NS(a='B', x='X', y=['hello world!', 'Z'])),
13770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (["-a", "", "X", "Y"], NS(a='', x='X', y=['Y'])),
13780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
13790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestArgumentsFromFileConverter(TempDirMixin, ParserTestCase):
13820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test reading arguments from a file"""
13830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
13850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        super(TestArgumentsFromFileConverter, self).setUp()
13860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file_texts = [
13870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ('hello', 'hello world!\n'),
13880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ]
13890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for path, text in file_texts:
13900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file = open(path, 'w')
13910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file.write(text)
13920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file.close()
13930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class FromFileConverterArgumentParser(ErrorRaisingArgumentParser):
13950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def convert_arg_line_to_args(self, arg_line):
13970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for arg in arg_line.split():
13980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if not arg.strip():
13990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    continue
14000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                yield arg
14010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_class = FromFileConverterArgumentParser
14020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(fromfile_prefix_chars='@')
14030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
14040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('y', nargs='+'),
14050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
14060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = []
14070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
14080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('@hello X', NS(y=['hello', 'world!', 'X'])),
14090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
14100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =====================
14130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Type conversion tests
14140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =====================
14150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestFileTypeRepr(TestCase):
14170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_r(self):
14190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        type = argparse.FileType('r')
14200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual("FileType('r')", repr(type))
14210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_wb_1(self):
14230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        type = argparse.FileType('wb', 1)
14240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual("FileType('wb', 1)", repr(type))
14250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass RFile(object):
14280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    seen = {}
14290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(self, name):
14310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.name = name
14320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    __hash__ = None
14340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __eq__(self, other):
14360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if other in self.seen:
14370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            text = self.seen[other]
14380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
14390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            text = self.seen[other] = other.read()
14400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            other.close()
14410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if not isinstance(text, str):
14420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            text = text.decode('ascii')
14430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self.name == other.name == text
14440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestFileTypeR(TempDirMixin, ParserTestCase):
14470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test the FileType option/argument type for reading files"""
14480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
14500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        super(TestFileTypeR, self).setUp()
14510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for file_name in ['foo', 'bar']:
14520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file = open(os.path.join(self.temp_dir, file_name), 'w')
14530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file.write(file_name)
14540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file.close()
14550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.create_readonly_file('readonly')
14560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
14580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', type=argparse.FileType()),
14590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', type=argparse.FileType('r')),
14600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
14610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x', '-x bar', 'non-existent-file.txt']
14620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
14630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('foo', NS(x=None, spam=RFile('foo'))),
14640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
14650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
14660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x - -', NS(x=sys.stdin, spam=sys.stdin)),
14670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('readonly', NS(x=None, spam=RFile('readonly'))),
14680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
14690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestFileTypeDefaults(TempDirMixin, ParserTestCase):
14710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that a file is not created unless the default is needed"""
14720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
14730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        super(TestFileTypeDefaults, self).setUp()
14740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file = open(os.path.join(self.temp_dir, 'good'), 'w')
14750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file.write('good')
14760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file.close()
14770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
14790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-c', type=argparse.FileType('r'), default='no-file.txt'),
14800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
14810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # should provoke no such file error
14820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['']
14830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # should not provoke error because default file is created
14840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [('-c good', NS(c=RFile('good')))]
14850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestFileTypeRB(TempDirMixin, ParserTestCase):
14880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test the FileType option/argument type for reading files"""
14890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
14910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        super(TestFileTypeRB, self).setUp()
14920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for file_name in ['foo', 'bar']:
14930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file = open(os.path.join(self.temp_dir, file_name), 'w')
14940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file.write(file_name)
14950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            file.close()
14960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
14980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', type=argparse.FileType('rb')),
14990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', type=argparse.FileType('rb')),
15000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
15010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x', '-x bar']
15020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
15030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('foo', NS(x=None, spam=RFile('foo'))),
15040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
15050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
15060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x - -', NS(x=sys.stdin, spam=sys.stdin)),
15070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
15080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass WFile(object):
15110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    seen = set()
15120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(self, name):
15140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.name = name
15150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    __hash__ = None
15170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __eq__(self, other):
15190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if other not in self.seen:
15200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            text = 'Check that file is writable.'
15210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if 'b' in other.mode:
15220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                text = text.encode('ascii')
15230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            other.write(text)
15240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            other.close()
15250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.seen.add(other)
15260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self.name == other.name
15270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi@unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0,
15300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                 "non-root user required")
15310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestFileTypeW(TempDirMixin, ParserTestCase):
15320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test the FileType option/argument type for writing files"""
15330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
15350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        super(TestFileTypeW, self).setUp()
15360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.create_readonly_file('readonly')
15370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
15390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', type=argparse.FileType('w')),
15400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', type=argparse.FileType('w')),
15410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
15420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x', '-x bar']
15430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x', '-x bar', 'readonly']
15440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
15450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('foo', NS(x=None, spam=WFile('foo'))),
15460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
15470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))),
15480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x - -', NS(x=sys.stdout, spam=sys.stdout)),
15490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
15500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestFileTypeWB(TempDirMixin, ParserTestCase):
15530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
15550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', type=argparse.FileType('wb')),
15560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', type=argparse.FileType('wb')),
15570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
15580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x', '-x bar']
15590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
15600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('foo', NS(x=None, spam=WFile('foo'))),
15610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
15620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))),
15630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x - -', NS(x=sys.stdout, spam=sys.stdout)),
15640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
15650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestTypeCallable(ParserTestCase):
15680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test some callables as option/argument types"""
15690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
15710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--eggs', type=complex),
15720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', type=float),
15730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
15740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['a', '42j', '--eggs a', '--eggs 2i']
15750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
15760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--eggs=42 42', NS(eggs=42, spam=42.0)),
15770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--eggs 2j -- -1.5', NS(eggs=2j, spam=-1.5)),
15780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('1024.675', NS(eggs=None, spam=1024.675)),
15790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
15800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestTypeUserDefined(ParserTestCase):
15830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a user-defined option/argument type"""
15840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class MyType(TestCase):
15860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __init__(self, value):
15880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.value = value
15890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        __hash__ = None
15910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __eq__(self, other):
15930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return (type(self), self.value) == (type(other), other.value)
15940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
15960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', type=MyType),
15970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', type=MyType),
15980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
15990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = []
16000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
16010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a -x b', NS(x=MyType('b'), spam=MyType('a'))),
16020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-xf g', NS(x=MyType('f'), spam=MyType('g'))),
16030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
16040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestTypeClassicClass(ParserTestCase):
16070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a classic class type"""
16080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class C:
16100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __init__(self, value):
16120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.value = value
16130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        __hash__ = None
16150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __eq__(self, other):
16170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return (type(self), self.value) == (type(other), other.value)
16180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
16200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', type=C),
16210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', type=C),
16220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
16230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = []
16240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
16250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('a -x b', NS(x=C('b'), spam=C('a'))),
16260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-xf g', NS(x=C('f'), spam=C('g'))),
16270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
16280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestTypeRegistration(TestCase):
16310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a user-defined type by registering it"""
16320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test(self):
16340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get_my_type(string):
16360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return 'my_type{%s}' % string
16370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
16390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.register('type', 'my_type', get_my_type)
16400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-x', type='my_type')
16410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('y', type='my_type')
16420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.parse_args('1'.split()),
16440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         NS(x=None, y='my_type{1}'))
16450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.parse_args('-x 1 42'.split()),
16460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         NS(x='my_type{1}', y='my_type{42}'))
16470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ============
16500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Action tests
16510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ============
16520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestActionUserDefined(ParserTestCase):
16540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a user-defined option/argument action"""
16550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class OptionalAction(argparse.Action):
16570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __call__(self, parser, namespace, value, option_string=None):
16590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
16600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # check destination and option string
16610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                assert self.dest == 'spam', 'dest: %s' % self.dest
16620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                assert option_string == '-s', 'flag: %s' % option_string
16630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # when option is before argument, badger=2, and when
16640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # option is after argument, badger=<whatever was set>
16650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                expected_ns = NS(spam=0.25)
16660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if value in [0.125, 0.625]:
16670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    expected_ns.badger = 2
16680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                elif value in [2.0]:
16690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    expected_ns.badger = 84
16700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
16710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    raise AssertionError('value: %s' % value)
16720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                assert expected_ns == namespace, ('expected %s, got %s' %
16730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                                  (expected_ns, namespace))
16740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except AssertionError:
16750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                e = sys.exc_info()[1]
16760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                raise ArgumentParserError('opt_action failed: %s' % e)
16770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            setattr(namespace, 'spam', value)
16780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class PositionalAction(argparse.Action):
16800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __call__(self, parser, namespace, value, option_string=None):
16820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
16830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                assert option_string is None, ('option_string: %s' %
16840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                               option_string)
16850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # check destination
16860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                assert self.dest == 'badger', 'dest: %s' % self.dest
16870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # when argument is before option, spam=0.25, and when
16880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # option is after argument, spam=<whatever was set>
16890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                expected_ns = NS(badger=2)
16900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if value in [42, 84]:
16910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    expected_ns.spam = 0.25
16920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                elif value in [1]:
16930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    expected_ns.spam = 0.625
16940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                elif value in [2]:
16950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    expected_ns.spam = 0.125
16960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
16970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    raise AssertionError('value: %s' % value)
16980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                assert expected_ns == namespace, ('expected %s, got %s' %
16990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                                  (expected_ns, namespace))
17000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except AssertionError:
17010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                e = sys.exc_info()[1]
17020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                raise ArgumentParserError('arg_action failed: %s' % e)
17030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            setattr(namespace, 'badger', value)
17040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
17060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-s', dest='spam', action=OptionalAction,
17070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            type=float, default=0.25),
17080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('badger', action=PositionalAction,
17090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            type=int, nargs='?', default=2),
17100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
17110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = []
17120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
17130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-s0.125', NS(spam=0.125, badger=2)),
17140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('42', NS(spam=0.25, badger=42)),
17150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-s 0.625 1', NS(spam=0.625, badger=1)),
17160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('84 -s2', NS(spam=2.0, badger=84)),
17170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
17180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestActionRegistration(TestCase):
17210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a user-defined action supplied by registering it"""
17220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class MyAction(argparse.Action):
17240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __call__(self, parser, namespace, values, option_string=None):
17260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            setattr(namespace, self.dest, 'foo[%s]' % values)
17270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test(self):
17290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
17310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.register('action', 'my_action', self.MyAction)
17320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('badger', action='my_action')
17330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.parse_args(['1']), NS(badger='foo[1]'))
17350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.parse_args(['42']), NS(badger='foo[42]'))
17360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ================
17390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Subparsers tests
17400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ================
17410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestAddSubparsers(TestCase):
17430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test the add_subparsers method"""
17440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def assertArgumentParserError(self, *args, **kwargs):
17460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ArgumentParserError, *args, **kwargs)
17470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def _get_parser(self, subparser_help=False, prefix_chars=None):
17490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # create a parser with a subparsers argument
17500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if prefix_chars:
17510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser = ErrorRaisingArgumentParser(
17520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                prog='PROG', description='main description', prefix_chars=prefix_chars)
17530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.add_argument(
17540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                prefix_chars[0] * 2 + 'foo', action='store_true', help='foo help')
17550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
17560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser = ErrorRaisingArgumentParser(
17570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                prog='PROG', description='main description')
17580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.add_argument(
17590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                '--foo', action='store_true', help='foo help')
17600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument(
17610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'bar', type=float, help='bar help')
17620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # check that only one subparsers argument can be added
17640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        subparsers = parser.add_subparsers(help='command help')
17650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parser.add_subparsers)
17660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # add first sub-parser
17680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser1_kwargs = dict(description='1 description')
17690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if subparser_help:
17700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser1_kwargs['help'] = '1 help'
17710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser1 = subparsers.add_parser('1', **parser1_kwargs)
17720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser1.add_argument('-w', type=int, help='w help')
17730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser1.add_argument('x', choices='abc', help='x help')
17740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # add second sub-parser
17760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser2_kwargs = dict(description='2 description')
17770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if subparser_help:
17780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser2_kwargs['help'] = '2 help'
17790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser2 = subparsers.add_parser('2', **parser2_kwargs)
17800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser2.add_argument('-y', choices='123', help='y help')
17810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser2.add_argument('z', type=complex, nargs='*', help='z help')
17820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # add third sub-parser
17840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser3_kwargs = dict(description='3 description')
17850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if subparser_help:
17860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser3_kwargs['help'] = '3 help'
17870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser3 = subparsers.add_parser('3', **parser3_kwargs)
17880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser3.add_argument('t', type=int, help='t help')
17890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser3.add_argument('u', nargs='...', help='u help')
17900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # return the main parser
17920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return parser
17930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
17950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        super(TestAddSubparsers, self).setUp()
17960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.parser = self._get_parser()
17970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.command_help_parser = self._get_parser(subparser_help=True)
17980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_parse_args_failures(self):
18000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # check some failure cases:
18010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for args_str in ['', 'a', 'a a', '0.5 a', '0.5 1',
18020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         '0.5 1 -y', '0.5 2 -w']:
18030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            args = args_str.split()
18040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertArgumentParserError(self.parser.parse_args, args)
18050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_parse_args(self):
18070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # check some non-failure cases:
18080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
18090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.parser.parse_args('0.5 1 b -w 7'.split()),
18100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            NS(foo=False, bar=0.5, w=7, x='b'),
18110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
18120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
18130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.parser.parse_args('0.25 --foo 2 -y 2 3j -- -1j'.split()),
18140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            NS(foo=True, bar=0.25, y='2', z=[3j, -1j]),
18150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
18160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
18170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.parser.parse_args('--foo 0.125 1 c'.split()),
18180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            NS(foo=True, bar=0.125, w=None, x='c'),
18190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
18200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
18210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.parser.parse_args('-1.5 3 11 -- a --foo 7 -- b'.split()),
18220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            NS(foo=False, bar=-1.5, t=11, u=['a', '--foo', '7', '--', 'b']),
18230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
18240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_parse_known_args(self):
18260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
18270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.parser.parse_known_args('0.5 1 b -w 7'.split()),
18280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            (NS(foo=False, bar=0.5, w=7, x='b'), []),
18290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
18300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
18310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.parser.parse_known_args('0.5 -p 1 b -w 7'.split()),
18320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            (NS(foo=False, bar=0.5, w=7, x='b'), ['-p']),
18330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
18340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
18350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.parser.parse_known_args('0.5 1 b -w 7 -p'.split()),
18360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            (NS(foo=False, bar=0.5, w=7, x='b'), ['-p']),
18370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
18380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
18390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.parser.parse_known_args('0.5 1 b -q -rs -w 7'.split()),
18400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            (NS(foo=False, bar=0.5, w=7, x='b'), ['-q', '-rs']),
18410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
18420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
18430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.parser.parse_known_args('0.5 -W 1 b -X Y -w 7 Z'.split()),
18440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            (NS(foo=False, bar=0.5, w=7, x='b'), ['-W', '-X', 'Y', 'Z']),
18450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
18460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_dest(self):
18480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
18490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--foo', action='store_true')
18500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        subparsers = parser.add_subparsers(dest='bar')
18510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser1 = subparsers.add_parser('1')
18520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser1.add_argument('baz')
18530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(foo=False, bar='1', baz='2'),
18540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args('1 2'.split()))
18550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_help(self):
18570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.parser.format_usage(),
18580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         'usage: PROG [-h] [--foo] bar {1,2,3} ...\n')
18590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.parser.format_help(), textwrap.dedent('''\
18600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: PROG [-h] [--foo] bar {1,2,3} ...
18610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            main description
18630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            positional arguments:
18650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              bar         bar help
18660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              {1,2,3}     command help
18670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
18690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -h, --help  show this help message and exit
18700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              --foo       foo help
18710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            '''))
18720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_help_extra_prefix_chars(self):
18740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Make sure - is still used for help if it is a non-first prefix char
18750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = self._get_parser(prefix_chars='+:-')
18760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.format_usage(),
18770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         'usage: PROG [-h] [++foo] bar {1,2,3} ...\n')
18780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.format_help(), textwrap.dedent('''\
18790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: PROG [-h] [++foo] bar {1,2,3} ...
18800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            main description
18820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            positional arguments:
18840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              bar         bar help
18850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              {1,2,3}     command help
18860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
18880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -h, --help  show this help message and exit
18890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              ++foo       foo help
18900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            '''))
18910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
18930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_help_alternate_prefix_chars(self):
18940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = self._get_parser(prefix_chars='+:/')
18950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.format_usage(),
18960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         'usage: PROG [+h] [++foo] bar {1,2,3} ...\n')
18970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.format_help(), textwrap.dedent('''\
18980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: PROG [+h] [++foo] bar {1,2,3} ...
18990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            main description
19010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            positional arguments:
19030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              bar         bar help
19040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              {1,2,3}     command help
19050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
19070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              +h, ++help  show this help message and exit
19080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              ++foo       foo help
19090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            '''))
19100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_parser_command_help(self):
19120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.command_help_parser.format_usage(),
19130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         'usage: PROG [-h] [--foo] bar {1,2,3} ...\n')
19140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.command_help_parser.format_help(),
19150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         textwrap.dedent('''\
19160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: PROG [-h] [--foo] bar {1,2,3} ...
19170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            main description
19190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            positional arguments:
19210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              bar         bar help
19220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              {1,2,3}     command help
19230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                1         1 help
19240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                2         2 help
19250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                3         3 help
19260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
19280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -h, --help  show this help message and exit
19290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              --foo       foo help
19300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            '''))
19310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_subparser_title_help(self):
19330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PROG',
19340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                            description='main description')
19350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--foo', action='store_true', help='foo help')
19360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('bar', help='bar help')
19370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        subparsers = parser.add_subparsers(title='subcommands',
19380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                           description='command help',
19390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                           help='additional text')
19400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser1 = subparsers.add_parser('1')
19410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser2 = subparsers.add_parser('2')
19420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.format_usage(),
19430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         'usage: PROG [-h] [--foo] bar {1,2} ...\n')
19440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.format_help(), textwrap.dedent('''\
19450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: PROG [-h] [--foo] bar {1,2} ...
19460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            main description
19480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            positional arguments:
19500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              bar         bar help
19510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
19530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -h, --help  show this help message and exit
19540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              --foo       foo help
19550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            subcommands:
19570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              command help
19580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              {1,2}       additional text
19600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            '''))
19610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def _test_subparser_help(self, args_str, expected_help):
19630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
19640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.parser.parse_args(args_str.split())
19650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except ArgumentParserError:
19660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            err = sys.exc_info()[1]
19670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if err.stdout != expected_help:
19680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                print(repr(expected_help))
19690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                print(repr(err.stdout))
19700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(err.stdout, expected_help)
19710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_subparser1_help(self):
19730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._test_subparser_help('5.0 1 -h', textwrap.dedent('''\
19740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: PROG bar 1 [-h] [-w W] {a,b,c}
19750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            1 description
19770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            positional arguments:
19790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              {a,b,c}     x help
19800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
19820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -h, --help  show this help message and exit
19830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -w W        w help
19840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            '''))
19850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_subparser2_help(self):
19870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._test_subparser_help('5.0 2 -h', textwrap.dedent('''\
19880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: PROG bar 2 [-h] [-y {1,2,3}] [z [z ...]]
19890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            2 description
19910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            positional arguments:
19930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              z           z help
19940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
19960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -h, --help  show this help message and exit
19970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -y {1,2,3}  y help
19980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            '''))
19990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ============
20010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Groups tests
20020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ============
20030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestPositionalsGroups(TestCase):
20050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests that order of group positionals matches construction order"""
20060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nongroup_first(self):
20080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
20090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('foo')
20100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_argument_group('g')
20110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('bar')
20120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('baz')
20130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        expected = NS(foo='1', bar='2', baz='3')
20140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        result = parser.parse_args('1 2 3'.split())
20150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(expected, result)
20160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_group_first(self):
20180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
20190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_argument_group('xxx')
20200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('foo')
20210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('bar')
20220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('baz')
20230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        expected = NS(foo='1', bar='2', baz='3')
20240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        result = parser.parse_args('1 2 3'.split())
20250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(expected, result)
20260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_interleaved_groups(self):
20280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
20290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_argument_group('xxx')
20300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('foo')
20310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('bar')
20320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('baz')
20330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_argument_group('yyy')
20340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('frell')
20350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        expected = NS(foo='1', bar='2', baz='3', frell='4')
20360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        result = parser.parse_args('1 2 3 4'.split())
20370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(expected, result)
20380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ===================
20400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Parent parser tests
20410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ===================
20420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestParentParsers(TestCase):
20440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests that parsers can be created with parent parsers"""
20450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def assertArgumentParserError(self, *args, **kwargs):
20470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ArgumentParserError, *args, **kwargs)
20480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
20500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        super(TestParentParsers, self).setUp()
20510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.wxyz_parent = ErrorRaisingArgumentParser(add_help=False)
20520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.wxyz_parent.add_argument('--w')
20530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x_group = self.wxyz_parent.add_argument_group('x')
20540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x_group.add_argument('-y')
20550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.wxyz_parent.add_argument('z')
20560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.abcd_parent = ErrorRaisingArgumentParser(add_help=False)
20580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.abcd_parent.add_argument('a')
20590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.abcd_parent.add_argument('-b')
20600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c_group = self.abcd_parent.add_argument_group('c')
20610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c_group.add_argument('--d')
20620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.w_parent = ErrorRaisingArgumentParser(add_help=False)
20640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.w_parent.add_argument('--w')
20650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.z_parent = ErrorRaisingArgumentParser(add_help=False)
20670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.z_parent.add_argument('z')
20680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # parents with mutually exclusive groups
20700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.ab_mutex_parent = ErrorRaisingArgumentParser(add_help=False)
20710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = self.ab_mutex_parent.add_mutually_exclusive_group()
20720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('-a', action='store_true')
20730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('-b', action='store_true')
20740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.main_program = os.path.basename(sys.argv[0])
20760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_single_parent(self):
20780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(parents=[self.wxyz_parent])
20790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.parse_args('-y 1 2 --w 3'.split()),
20800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         NS(w='3', y='1', z='2'))
20810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_single_parent_mutex(self):
20830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._test_mutex_ab(self.ab_mutex_parent.parse_args)
20840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(parents=[self.ab_mutex_parent])
20850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._test_mutex_ab(parser.parse_args)
20860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_single_granparent_mutex(self):
20880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parents = [self.ab_mutex_parent]
20890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(add_help=False, parents=parents)
20900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(parents=[parser])
20910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._test_mutex_ab(parser.parse_args)
20920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def _test_mutex_ab(self, parse_args):
20940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parse_args([]), NS(a=False, b=False))
20950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parse_args(['-a']), NS(a=True, b=False))
20960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parse_args(['-b']), NS(a=False, b=True))
20970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parse_args, ['-a', '-b'])
20980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parse_args, ['-b', '-a'])
20990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parse_args, ['-c'])
21000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parse_args, ['-a', '-c'])
21010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parse_args, ['-b', '-c'])
21020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_multiple_parents(self):
21040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parents = [self.abcd_parent, self.wxyz_parent]
21050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(parents=parents)
21060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.parse_args('--d 1 --w 2 3 4'.split()),
21070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         NS(a='3', b=None, d='1', w='2', y=None, z='4'))
21080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_multiple_parents_mutex(self):
21100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parents = [self.ab_mutex_parent, self.wxyz_parent]
21110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(parents=parents)
21120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.parse_args('-a --w 2 3'.split()),
21130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         NS(a=True, b=False, w='2', y=None, z='3'))
21140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(
21150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.parse_args, '-a --w 2 3 -b'.split())
21160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(
21170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.parse_args, '-a -b --w 2 3'.split())
21180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_conflicting_parents(self):
21200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(
21210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            argparse.ArgumentError,
21220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            argparse.ArgumentParser,
21230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parents=[self.w_parent, self.wxyz_parent])
21240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_conflicting_parents_mutex(self):
21260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(
21270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            argparse.ArgumentError,
21280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            argparse.ArgumentParser,
21290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parents=[self.abcd_parent, self.ab_mutex_parent])
21300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_same_argument_name_parents(self):
21320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parents = [self.wxyz_parent, self.z_parent]
21330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(parents=parents)
21340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.parse_args('1 2'.split()),
21350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         NS(w=None, y=None, z='2'))
21360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_subparser_parents(self):
21380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
21390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        subparsers = parser.add_subparsers()
21400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        abcde_parser = subparsers.add_parser('bar', parents=[self.abcd_parent])
21410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        abcde_parser.add_argument('e')
21420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.parse_args('bar -b 1 --d 2 3 4'.split()),
21430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         NS(a='3', b='1', d='2', e='4'))
21440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_subparser_parents_mutex(self):
21460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
21470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        subparsers = parser.add_subparsers()
21480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parents = [self.ab_mutex_parent]
21490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        abc_parser = subparsers.add_parser('foo', parents=parents)
21500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c_group = abc_parser.add_argument_group('c_group')
21510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c_group.add_argument('c')
21520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parents = [self.wxyz_parent, self.ab_mutex_parent]
21530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        wxyzabe_parser = subparsers.add_parser('bar', parents=parents)
21540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        wxyzabe_parser.add_argument('e')
21550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.parse_args('foo -a 4'.split()),
21560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         NS(a=True, b=False, c='4'))
21570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.parse_args('bar -b  --w 2 3 4'.split()),
21580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         NS(a=False, b=True, w='2', y=None, z='3', e='4'))
21590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(
21600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.parse_args, 'foo -a -b 4'.split())
21610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(
21620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.parse_args, 'bar -b -a 4'.split())
21630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_parent_help(self):
21650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parents = [self.abcd_parent, self.wxyz_parent]
21660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(parents=parents)
21670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser_help = parser.format_help()
21680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        progname = self.main_program
21690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser_help, textwrap.dedent('''\
21700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: {}{}[-h] [-b B] [--d D] [--w W] [-y Y] a z
21710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            positional arguments:
21730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              a
21740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              z
21750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
21770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -h, --help  show this help message and exit
21780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -b B
21790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              --w W
21800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c:
21820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              --d D
21830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x:
21850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -y Y
21860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''.format(progname, ' ' if progname else '' )))
21870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_groups_parents(self):
21890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parent = ErrorRaisingArgumentParser(add_help=False)
21900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        g = parent.add_argument_group(title='g', description='gd')
21910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        g.add_argument('-w')
21920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        g.add_argument('-x')
21930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = parent.add_mutually_exclusive_group()
21940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m.add_argument('-y')
21950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m.add_argument('-z')
21960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(parents=[parent])
21970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ArgumentParserError, parser.parse_args,
21990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ['-y', 'Y', '-z', 'Z'])
22000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser_help = parser.format_help()
22020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        progname = self.main_program
22030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser_help, textwrap.dedent('''\
22040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: {}{}[-h] [-w W] [-x X] [-y Y | -z Z]
22050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
22070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -h, --help  show this help message and exit
22080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -y Y
22090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -z Z
22100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            g:
22120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              gd
22130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -w W
22150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -x X
22160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''.format(progname, ' ' if progname else '' )))
22170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ==============================
22190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Mutually exclusive group tests
22200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ==============================
22210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveGroupErrors(TestCase):
22230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_invalid_add_argument_group(self):
22250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
22260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises = self.assertRaises
22270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises(TypeError, parser.add_mutually_exclusive_group, title='foo')
22280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_invalid_add_argument(self):
22300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
22310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_mutually_exclusive_group()
22320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        add_argument = group.add_argument
22330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises = self.assertRaises
22340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises(ValueError, add_argument, '--foo', required=True)
22350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises(ValueError, add_argument, 'bar')
22360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises(ValueError, add_argument, 'bar', nargs='+')
22370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises(ValueError, add_argument, 'bar', nargs=1)
22380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises(ValueError, add_argument, 'bar', nargs=argparse.PARSER)
22390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_help(self):
22410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PROG')
22420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group1 = parser.add_mutually_exclusive_group()
22430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group1.add_argument('--foo', action='store_true')
22440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group1.add_argument('--bar', action='store_false')
22450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group2 = parser.add_mutually_exclusive_group()
22460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group2.add_argument('--soup', action='store_true')
22470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group2.add_argument('--nuts', action='store_false')
22480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        expected = '''\
22490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: PROG [-h] [--foo | --bar] [--soup | --nuts]
22500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
22520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -h, --help  show this help message and exit
22530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              --foo
22540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              --bar
22550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              --soup
22560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              --nuts
22570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              '''
22580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.format_help(), textwrap.dedent(expected))
22590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass MEMixin(object):
22610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_failures_when_not_required(self):
22630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parse_args = self.get_parser(required=False).parse_args
22640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        error = ArgumentParserError
22650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for args_string in self.failures:
22660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertRaises(error, parse_args, args_string.split())
22670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_failures_when_required(self):
22690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parse_args = self.get_parser(required=True).parse_args
22700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        error = ArgumentParserError
22710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for args_string in self.failures + ['']:
22720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertRaises(error, parse_args, args_string.split())
22730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_successes_when_not_required(self):
22750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parse_args = self.get_parser(required=False).parse_args
22760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        successes = self.successes + self.successes_when_not_required
22770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for args_string, expected_ns in successes:
22780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            actual_ns = parse_args(args_string.split())
22790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(actual_ns, expected_ns)
22800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_successes_when_required(self):
22820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parse_args = self.get_parser(required=True).parse_args
22830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for args_string, expected_ns in self.successes:
22840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            actual_ns = parse_args(args_string.split())
22850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(actual_ns, expected_ns)
22860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_usage_when_not_required(self):
22880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        format_usage = self.get_parser(required=False).format_usage
22890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        expected_usage = self.usage_when_not_required
22900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(format_usage(), textwrap.dedent(expected_usage))
22910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_usage_when_required(self):
22930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        format_usage = self.get_parser(required=True).format_usage
22940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        expected_usage = self.usage_when_required
22950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(format_usage(), textwrap.dedent(expected_usage))
22960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_help_when_not_required(self):
22980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        format_help = self.get_parser(required=False).format_help
22990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        help = self.usage_when_not_required + self.help
23000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(format_help(), textwrap.dedent(help))
23010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_help_when_required(self):
23030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        format_help = self.get_parser(required=True).format_help
23040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        help = self.usage_when_required + self.help
23050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(format_help(), textwrap.dedent(help))
23060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveSimple(MEMixin, TestCase):
23090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def get_parser(self, required=None):
23110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PROG')
23120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_mutually_exclusive_group(required=required)
23130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('--bar', help='bar help')
23140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('--baz', nargs='?', const='Z', help='baz help')
23150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return parser
23160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--bar X --baz Y', '--bar X --baz']
23180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
23190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--bar X', NS(bar='X', baz=None)),
23200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--bar X --bar Z', NS(bar='Z', baz=None)),
23210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz Y', NS(bar=None, baz='Y')),
23220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz', NS(bar=None, baz='Z')),
23230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
23240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes_when_not_required = [
23250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(bar=None, baz=None)),
23260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
23270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_not_required = '''\
23290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [--bar BAR | --baz [BAZ]]
23300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
23310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_required = '''\
23320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] (--bar BAR | --baz [BAZ])
23330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
23340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = '''\
23350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
23370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help   show this help message and exit
23380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --bar BAR    bar help
23390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --baz [BAZ]  baz help
23400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
23410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveLong(MEMixin, TestCase):
23440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def get_parser(self, required=None):
23460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PROG')
23470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--abcde', help='abcde help')
23480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--fghij', help='fghij help')
23490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_mutually_exclusive_group(required=required)
23500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('--klmno', help='klmno help')
23510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('--pqrst', help='pqrst help')
23520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return parser
23530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--klmno X --pqrst Y']
23550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
23560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--klmno X', NS(abcde=None, fghij=None, klmno='X', pqrst=None)),
23570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--abcde Y --klmno X',
23580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            NS(abcde='Y', fghij=None, klmno='X', pqrst=None)),
23590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--pqrst X', NS(abcde=None, fghij=None, klmno=None, pqrst='X')),
23600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--pqrst X --fghij Y',
23610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            NS(abcde=None, fghij='Y', klmno=None, pqrst='X')),
23620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
23630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes_when_not_required = [
23640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(abcde=None, fghij=None, klmno=None, pqrst=None)),
23650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
23660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_not_required = '''\
23680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
23690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                [--klmno KLMNO | --pqrst PQRST]
23700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    '''
23710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_required = '''\
23720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
23730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                (--klmno KLMNO | --pqrst PQRST)
23740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    '''
23750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = '''\
23760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    optional arguments:
23780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi      -h, --help     show this help message and exit
23790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi      --abcde ABCDE  abcde help
23800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi      --fghij FGHIJ  fghij help
23810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi      --klmno KLMNO  klmno help
23820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi      --pqrst PQRST  pqrst help
23830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    '''
23840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveFirstSuppressed(MEMixin, TestCase):
23870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def get_parser(self, required):
23890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PROG')
23900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_mutually_exclusive_group(required=required)
23910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('-x', help=argparse.SUPPRESS)
23920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('-y', action='store_false', help='y help')
23930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return parser
23940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-x X -y']
23960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
23970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x X', NS(x='X', y=True)),
23980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x X -x Y', NS(x='Y', y=True)),
23990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y', NS(x=None, y=False)),
24000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
24010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes_when_not_required = [
24020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(x=None, y=True)),
24030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
24040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_not_required = '''\
24060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-y]
24070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
24080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_required = '''\
24090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] -y
24100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
24110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = '''\
24120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
24140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
24150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y          y help
24160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
24170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveManySuppressed(MEMixin, TestCase):
24200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def get_parser(self, required):
24220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PROG')
24230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_mutually_exclusive_group(required=required)
24240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        add = group.add_argument
24250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        add('--spam', action='store_true', help=argparse.SUPPRESS)
24260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        add('--badger', action='store_false', help=argparse.SUPPRESS)
24270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        add('--bladder', help=argparse.SUPPRESS)
24280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return parser
24290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = [
24310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '--spam --badger',
24320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '--badger --bladder B',
24330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '--bladder B --spam',
24340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
24350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
24360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--spam', NS(spam=True, badger=True, bladder=None)),
24370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--badger', NS(spam=False, badger=False, bladder=None)),
24380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--bladder B', NS(spam=False, badger=True, bladder='B')),
24390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--spam --spam', NS(spam=True, badger=True, bladder=None)),
24400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
24410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes_when_not_required = [
24420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(spam=False, badger=True, bladder=None)),
24430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
24440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_required = usage_when_not_required = '''\
24460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h]
24470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
24480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = '''\
24490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
24510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
24520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
24530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveOptionalAndPositional(MEMixin, TestCase):
24560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def get_parser(self, required):
24580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PROG')
24590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_mutually_exclusive_group(required=required)
24600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('--foo', action='store_true', help='FOO')
24610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('--spam', help='SPAM')
24620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('badger', nargs='*', default='X', help='BADGER')
24630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return parser
24640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = [
24660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '--foo --spam S',
24670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '--spam S X',
24680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'X --foo',
24690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'X Y Z --spam S',
24700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '--foo X Y',
24710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
24720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
24730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--foo', NS(foo=True, spam=None, badger='X')),
24740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--spam S', NS(foo=False, spam='S', badger='X')),
24750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X', NS(foo=False, spam=None, badger=['X'])),
24760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X Y Z', NS(foo=False, spam=None, badger=['X', 'Y', 'Z'])),
24770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
24780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes_when_not_required = [
24790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(foo=False, spam=None, badger='X')),
24800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
24810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_not_required = '''\
24830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [--foo | --spam SPAM | badger [badger ...]]
24840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
24850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_required = '''\
24860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] (--foo | --spam SPAM | badger [badger ...])
24870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
24880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = '''\
24890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
24910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          badger       BADGER
24920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
24940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help   show this help message and exit
24950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo        FOO
24960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --spam SPAM  SPAM
24970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
24980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveOptionalsMixed(MEMixin, TestCase):
25010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def get_parser(self, required):
25030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PROG')
25040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-x', action='store_true', help='x help')
25050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_mutually_exclusive_group(required=required)
25060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('-a', action='store_true', help='a help')
25070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('-b', action='store_true', help='b help')
25080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-y', action='store_true', help='y help')
25090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('-c', action='store_true', help='c help')
25100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return parser
25110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['-a -b', '-b -c', '-a -c', '-a -b -c']
25130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
25140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-a', NS(a=True, b=False, c=False, x=False, y=False)),
25150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-b', NS(a=False, b=True, c=False, x=False, y=False)),
25160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-c', NS(a=False, b=False, c=True, x=False, y=False)),
25170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-a -x', NS(a=True, b=False, c=False, x=True, y=False)),
25180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y -b', NS(a=False, b=True, c=False, x=False, y=True)),
25190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x -y -c', NS(a=False, b=False, c=True, x=True, y=True)),
25200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
25210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes_when_not_required = [
25220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(a=False, b=False, c=False, x=False, y=False)),
25230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-x', NS(a=False, b=False, c=False, x=True, y=False)),
25240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('-y', NS(a=False, b=False, c=False, x=False, y=True)),
25250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
25260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_required = usage_when_not_required = '''\
25280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-x] [-a] [-b] [-y] [-c]
25290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
25300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = '''\
25310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
25330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
25340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x          x help
25350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -a          a help
25360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -b          b help
25370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y          y help
25380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -c          c help
25390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
25400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveInGroup(MEMixin, TestCase):
25430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def get_parser(self, required=None):
25450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PROG')
25460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        titled_group = parser.add_argument_group(
25470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            title='Titled group', description='Group description')
25480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        mutex_group = \
25490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            titled_group.add_mutually_exclusive_group(required=required)
25500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        mutex_group.add_argument('--bar', help='bar help')
25510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        mutex_group.add_argument('--baz', help='baz help')
25520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return parser
25530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['--bar X --baz Y', '--baz X --bar Y']
25550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
25560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--bar X', NS(bar='X', baz=None)),
25570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('--baz Y', NS(bar=None, baz='Y')),
25580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
25590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes_when_not_required = [
25600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('', NS(bar=None, baz=None)),
25610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
25620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_not_required = '''\
25640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [--bar BAR | --baz BAZ]
25650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
25660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_required = '''\
25670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] (--bar BAR | --baz BAZ)
25680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
25690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = '''\
25700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
25720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
25730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Titled group:
25750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          Group description
25760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --bar BAR   bar help
25780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --baz BAZ   baz help
25790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
25800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveOptionalsAndPositionalsMixed(MEMixin, TestCase):
25830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def get_parser(self, required):
25850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PROG')
25860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('x', help='x help')
25870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-y', action='store_true', help='y help')
25880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_mutually_exclusive_group(required=required)
25890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('a', nargs='?', help='a help')
25900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('-b', action='store_true', help='b help')
25910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('-c', action='store_true', help='c help')
25920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return parser
25930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    failures = ['X A -b', '-b -c', '-c X A']
25950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes = [
25960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X A', NS(a='A', b=False, c=False, x='X', y=False)),
25970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X -b', NS(a=None, b=True, c=False, x='X', y=False)),
25980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X -c', NS(a=None, b=False, c=True, x='X', y=False)),
25990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X A -y', NS(a='A', b=False, c=False, x='X', y=True)),
26000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X -y -b', NS(a=None, b=True, c=False, x='X', y=True)),
26010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
26020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    successes_when_not_required = [
26030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X', NS(a=None, b=False, c=False, x='X', y=False)),
26040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ('X -y', NS(a=None, b=False, c=False, x='X', y=True)),
26050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
26060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage_when_required = usage_when_not_required = '''\
26080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-y] [-b] [-c] x [a]
26090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
26100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = '''\
26110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
26130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          x           x help
26140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          a           a help
26150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
26170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
26180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y          y help
26190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -b          b help
26200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -c          c help
26210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
26220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =================================================
26240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Mutually exclusive group in parent parser tests
26250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =================================================
26260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass MEPBase(object):
26280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def get_parser(self, required=None):
26300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parent = super(MEPBase, self).get_parser(required=required)
26310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(
26320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            prog=parent.prog, add_help=False, parents=[parent])
26330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return parser
26340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveGroupErrorsParent(
26370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    MEPBase, TestMutuallyExclusiveGroupErrors):
26380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    pass
26390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveSimpleParent(
26420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    MEPBase, TestMutuallyExclusiveSimple):
26430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    pass
26440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveLongParent(
26470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    MEPBase, TestMutuallyExclusiveLong):
26480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    pass
26490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveFirstSuppressedParent(
26520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    MEPBase, TestMutuallyExclusiveFirstSuppressed):
26530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    pass
26540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveManySuppressedParent(
26570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    MEPBase, TestMutuallyExclusiveManySuppressed):
26580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    pass
26590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveOptionalAndPositionalParent(
26620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    MEPBase, TestMutuallyExclusiveOptionalAndPositional):
26630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    pass
26640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveOptionalsMixedParent(
26670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    MEPBase, TestMutuallyExclusiveOptionalsMixed):
26680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    pass
26690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestMutuallyExclusiveOptionalsAndPositionalsMixedParent(
26720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    MEPBase, TestMutuallyExclusiveOptionalsAndPositionalsMixed):
26730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    pass
26740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =================
26760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Set default tests
26770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =================
26780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestSetDefaults(TestCase):
26800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_defaults_no_args(self):
26820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
26830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.set_defaults(x='foo')
26840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.set_defaults(y='bar', z=1)
26850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='foo', y='bar', z=1),
26860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args([]))
26870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='foo', y='bar', z=1),
26880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args([], NS()))
26890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='baz', y='bar', z=1),
26900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args([], NS(x='baz')))
26910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='baz', y='bar', z=2),
26920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args([], NS(x='baz', z=2)))
26930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_defaults_with_args(self):
26950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
26960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.set_defaults(x='foo', y='bar')
26970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-x', default='xfoox')
26980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='xfoox', y='bar'),
26990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args([]))
27000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='xfoox', y='bar'),
27010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args([], NS()))
27020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='baz', y='bar'),
27030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args([], NS(x='baz')))
27040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='1', y='bar'),
27050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args('-x 1'.split()))
27060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='1', y='bar'),
27070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args('-x 1'.split(), NS()))
27080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='1', y='bar'),
27090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args('-x 1'.split(), NS(x='baz')))
27100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_defaults_subparsers(self):
27120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
27130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.set_defaults(x='foo')
27140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        subparsers = parser.add_subparsers()
27150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser_a = subparsers.add_parser('a')
27160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser_a.set_defaults(y='bar')
27170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='foo', y='bar'),
27180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args('a'.split()))
27190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_defaults_parents(self):
27210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parent = ErrorRaisingArgumentParser(add_help=False)
27220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parent.set_defaults(x='foo')
27230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(parents=[parent])
27240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(x='foo'), parser.parse_args([]))
27250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_defaults_same_as_add_argument(self):
27270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
27280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.set_defaults(w='W', x='X', y='Y', z='Z')
27290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-w')
27300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-x', default='XX')
27310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('y', nargs='?')
27320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('z', nargs='?', default='ZZ')
27330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # defaults set previously
27350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(w='W', x='XX', y='Y', z='ZZ'),
27360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args([]))
27370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # reset defaults
27390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.set_defaults(w='WW', x='X', y='YY', z='Z')
27400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(w='WW', x='X', y='YY', z='Z'),
27410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args([]))
27420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_defaults_same_as_add_argument_group(self):
27440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
27450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.set_defaults(w='W', x='X', y='Y', z='Z')
27460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group = parser.add_argument_group('foo')
27470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('-w')
27480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('-x', default='XX')
27490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('y', nargs='?')
27500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group.add_argument('z', nargs='?', default='ZZ')
27510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # defaults set previously
27540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(w='W', x='XX', y='Y', z='ZZ'),
27550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args([]))
27560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # reset defaults
27580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.set_defaults(w='WW', x='X', y='YY', z='Z')
27590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(w='WW', x='X', y='YY', z='Z'),
27600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         parser.parse_args([]))
27610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =================
27630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Get default tests
27640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =================
27650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestGetDefault(TestCase):
27670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_get_default(self):
27690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
27700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(None, parser.get_default("foo"))
27710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(None, parser.get_default("bar"))
27720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument("--foo")
27740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(None, parser.get_default("foo"))
27750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(None, parser.get_default("bar"))
27760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument("--bar", type=int, default=42)
27780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(None, parser.get_default("foo"))
27790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(42, parser.get_default("bar"))
27800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.set_defaults(foo="badger")
27820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual("badger", parser.get_default("foo"))
27830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(42, parser.get_default("bar"))
27840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ==========================
27860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Namespace 'contains' tests
27870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ==========================
27880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestNamespaceContainsSimple(TestCase):
27900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_empty(self):
27920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ns = argparse.Namespace()
27930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('' in ns, False)
27940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('' not in ns, True)
27950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('x' in ns, False)
27960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_non_empty(self):
27980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ns = argparse.Namespace(x=1, y=2)
27990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('x' in ns, True)
28000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('x' not in ns, False)
28010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('y' in ns, True)
28020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('' in ns, False)
28030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('xx' in ns, False)
28040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('z' in ns, False)
28050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =====================
28070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Help formatting tests
28080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =====================
28090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpFormattingMetaclass(type):
28110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(cls, name, bases, bodydict):
28130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if name == 'HelpTestCase':
28140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return
28150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class AddTests(object):
28170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, test_class, func_suffix, std_name):
28190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.func_suffix = func_suffix
28200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.std_name = std_name
28210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for test_func in [self.test_format,
28230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                  self.test_print,
28240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                  self.test_print_file]:
28250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    test_name = '%s_%s' % (test_func.__name__, func_suffix)
28260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    def test_wrapper(self, test_func=test_func):
28280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        test_func(self)
28290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    try:
28300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        test_wrapper.__name__ = test_name
28310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    except TypeError:
28320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        pass
28330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    setattr(test_class, test_name, test_wrapper)
28340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def _get_parser(self, tester):
28360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                parser = argparse.ArgumentParser(
28370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    *tester.parser_signature.args,
28380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    **tester.parser_signature.kwargs)
28390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for argument_sig in getattr(tester, 'argument_signatures', []):
28400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    parser.add_argument(*argument_sig.args,
28410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                        **argument_sig.kwargs)
28420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                group_sigs = getattr(tester, 'argument_group_signatures', [])
28430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for group_sig, argument_sigs in group_sigs:
28440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    group = parser.add_argument_group(*group_sig.args,
28450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                                      **group_sig.kwargs)
28460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    for argument_sig in argument_sigs:
28470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        group.add_argument(*argument_sig.args,
28480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                           **argument_sig.kwargs)
28490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                subparsers_sigs = getattr(tester, 'subparsers_signatures', [])
28500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if subparsers_sigs:
28510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    subparsers = parser.add_subparsers()
28520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    for subparser_sig in subparsers_sigs:
28530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        subparsers.add_parser(*subparser_sig.args,
28540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                               **subparser_sig.kwargs)
28550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return parser
28560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def _test(self, tester, parser_text):
28580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                expected_text = getattr(tester, self.func_suffix)
28590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                expected_text = textwrap.dedent(expected_text)
28600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if expected_text != parser_text:
28610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    print(repr(expected_text))
28620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    print(repr(parser_text))
28630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    for char1, char2 in zip(expected_text, parser_text):
28640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        if char1 != char2:
28650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            print('first diff: %r %r' % (char1, char2))
28660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            break
28670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                tester.assertEqual(expected_text, parser_text)
28680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def test_format(self, tester):
28700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                parser = self._get_parser(tester)
28710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                format = getattr(parser, 'format_%s' % self.func_suffix)
28720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._test(tester, format())
28730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def test_print(self, tester):
28750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                parser = self._get_parser(tester)
28760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                print_ = getattr(parser, 'print_%s' % self.func_suffix)
28770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                old_stream = getattr(sys, self.std_name)
28780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                setattr(sys, self.std_name, StdIOBuffer())
28790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                try:
28800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    print_()
28810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    parser_text = getattr(sys, self.std_name).getvalue()
28820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                finally:
28830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    setattr(sys, self.std_name, old_stream)
28840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._test(tester, parser_text)
28850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def test_print_file(self, tester):
28870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                parser = self._get_parser(tester)
28880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                print_ = getattr(parser, 'print_%s' % self.func_suffix)
28890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                sfile = StdIOBuffer()
28900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                print_(sfile)
28910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                parser_text = sfile.getvalue()
28920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._test(tester, parser_text)
28930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # add tests for {format,print}_{usage,help,version}
28950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for func_suffix, std_name in [('usage', 'stdout'),
28960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                      ('help', 'stdout'),
28970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                      ('version', 'stderr')]:
28980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            AddTests(cls, func_suffix, std_name)
28990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yibases = TestCase,
29010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiHelpTestCase = TestHelpFormattingMetaclass('HelpTestCase', bases, {})
29020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpBiggerOptionals(HelpTestCase):
29050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Make sure that argument help aligns when options are longer"""
29060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', description='DESCRIPTION',
29080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                           epilog='EPILOG', version='0.1')
29090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
29100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', action='store_true', help='X HELP'),
29110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--y', help='Y HELP'),
29120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('foo', help='FOO HELP'),
29130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('bar', help='BAR HELP'),
29140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
29150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
29160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
29170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-v] [-x] [--y Y] foo bar
29180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
29190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
29200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        DESCRIPTION
29220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
29240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          foo            FOO HELP
29250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          bar            BAR HELP
29260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
29280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help     show this help message and exit
29290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -v, --version  show program's version number and exit
29300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x             X HELP
29310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --y Y          Y HELP
29320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        EPILOG
29340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    '''
29350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = '''\
29360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        0.1
29370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
29380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpBiggerOptionalGroups(HelpTestCase):
29410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Make sure that argument help aligns when options are longer"""
29420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', description='DESCRIPTION',
29440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                           epilog='EPILOG', version='0.1')
29450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
29460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', action='store_true', help='X HELP'),
29470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--y', help='Y HELP'),
29480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('foo', help='FOO HELP'),
29490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('bar', help='BAR HELP'),
29500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
29510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = [
29520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('GROUP TITLE', description='GROUP DESCRIPTION'), [
29530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('baz', help='BAZ HELP'),
29540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('-z', nargs='+', help='Z HELP')]),
29550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
29560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
29570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-v] [-x] [--y Y] [-z Z [Z ...]] foo bar baz
29580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
29590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
29600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        DESCRIPTION
29620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
29640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          foo            FOO HELP
29650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          bar            BAR HELP
29660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
29680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help     show this help message and exit
29690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -v, --version  show program's version number and exit
29700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x             X HELP
29710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --y Y          Y HELP
29720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        GROUP TITLE:
29740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          GROUP DESCRIPTION
29750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          baz            BAZ HELP
29770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -z Z [Z ...]   Z HELP
29780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        EPILOG
29800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    '''
29810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = '''\
29820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        0.1
29830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
29840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpBiggerPositionals(HelpTestCase):
29870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Make sure that help aligns when arguments are longer"""
29880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(usage='USAGE', description='DESCRIPTION')
29900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
29910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', action='store_true', help='X HELP'),
29920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--y', help='Y HELP'),
29930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('ekiekiekifekang', help='EKI HELP'),
29940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('bar', help='BAR HELP'),
29950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
29960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
29970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
29980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: USAGE
29990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
30000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
30010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        DESCRIPTION
30030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
30050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          ekiekiekifekang  EKI HELP
30060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          bar              BAR HELP
30070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
30090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help       show this help message and exit
30100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x               X HELP
30110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --y Y            Y HELP
30120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
30130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
30150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpReformatting(HelpTestCase):
30180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Make sure that text after short names starts on the first line"""
30190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(
30210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        prog='PROG',
30220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        description='   oddly    formatted\n'
30230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    'description\n'
30240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    '\n'
30250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    'that is so long that it should go onto multiple '
30260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    'lines when wrapped')
30270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
30280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', metavar='XX', help='oddly\n'
30290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                     '    formatted -x help'),
30300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('y', metavar='yyy', help='normal y help'),
30310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
30320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = [
30330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('title', description='\n'
30340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                  '    oddly formatted group\n'
30350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                  '\n'
30360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                  'description'),
30370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi         [Sig('-a', action='store_true',
30380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              help=' oddly \n'
30390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                   'formatted    -a  help  \n'
30400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                   '    again, so long that it should be wrapped over '
30410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                   'multiple lines')]),
30420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
30430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
30440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-x XX] [-a] yyy
30450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
30460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
30470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        oddly formatted description that is so long that it should go onto \
30490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yimultiple
30500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        lines when wrapped
30510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
30530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          yyy         normal y help
30540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
30560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
30570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x XX       oddly formatted -x help
30580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        title:
30600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          oddly formatted group description
30610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -a          oddly formatted -a help again, so long that it should \
30630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yibe wrapped
30640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                      over multiple lines
30650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
30660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
30670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpWrappingShortNames(HelpTestCase):
30700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Make sure that text after short names starts on the first line"""
30710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', description= 'D\nD' * 30)
30730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
30740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', metavar='XX', help='XHH HX' * 20),
30750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('y', metavar='yyy', help='YH YH' * 20),
30760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
30770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = [
30780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('ALPHAS'), [
30790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('-a', action='store_true', help='AHHH HHA' * 10)]),
30800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
30810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
30820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-x XX] [-a] yyy
30830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
30840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
30850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        D DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD \
30870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiDD DD DD
30880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        DD DD DD DD D
30890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
30910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          yyy         YH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH \
30920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiYHYH YHYH
30930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                      YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH
30940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
30960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
30970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x XX       XHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH \
30980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiHXXHH HXXHH
30990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                      HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HX
31000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ALPHAS:
31020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -a          AHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH \
31030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiHHAAHHH
31040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                      HHAAHHH HHAAHHH HHA
31050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
31060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
31070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpWrappingLongNames(HelpTestCase):
31100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Make sure that text after long names starts on the next line"""
31110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(usage='USAGE', description= 'D D' * 30,
31130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                           version='V V'*30)
31140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
31150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', metavar='X' * 25, help='XH XH' * 20),
31160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('y', metavar='y' * 25, help='YH YH' * 20),
31170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
31180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = [
31190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('ALPHAS'), [
31200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('-a', metavar='A' * 25, help='AH AH' * 20),
31210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('z', metavar='z' * 25, help='ZH ZH' * 20)]),
31220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
31230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
31240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: USAGE
31250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
31260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
31270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        D DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD \
31290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiDD DD DD
31300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        DD DD DD DD D
31310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
31330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          yyyyyyyyyyyyyyyyyyyyyyyyy
31340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                YH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH \
31350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiYHYH YHYH
31360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH
31370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
31390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help            show this help message and exit
31400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -v, --version         show program's version number and exit
31410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x XXXXXXXXXXXXXXXXXXXXXXXXX
31420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                XH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH \
31430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiXHXH XHXH
31440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XH
31450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ALPHAS:
31470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -a AAAAAAAAAAAAAAAAAAAAAAAAA
31480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                AH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH \
31490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiAHAH AHAH
31500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AH
31510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          zzzzzzzzzzzzzzzzzzzzzzzzz
31520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                ZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH \
31530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiZHZH ZHZH
31540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZH
31550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
31560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = '''\
31570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        V VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV \
31580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiVV VV VV
31590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        VV VV VV VV V
31600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
31610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpUsage(HelpTestCase):
31640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test basic usage messages"""
31650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG')
31670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
31680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-w', nargs='+', help='w'),
31690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', nargs='*', help='x'),
31700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('a', help='a'),
31710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('b', help='b', nargs=2),
31720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('c', help='c', nargs='?'),
31730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
31740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = [
31750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('group'), [
31760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('-y', nargs='?', help='y'),
31770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('-z', nargs=3, help='z'),
31780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('d', help='d', nargs='*'),
31790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('e', help='e', nargs='+'),
31800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ])
31810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
31820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
31830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-w W [W ...]] [-x [X [X ...]]] [-y [Y]] [-z Z Z Z]
31840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    a b b [c] [d [d ...]] e [e ...]
31850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
31860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
31870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
31890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          a               a
31900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          b               b
31910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          c               c
31920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
31940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help      show this help message and exit
31950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -w W [W ...]    w
31960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x [X [X ...]]  x
31970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group:
31990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y [Y]          y
32000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -z Z Z Z        z
32010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          d               d
32020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          e               e
32030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
32040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
32050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpOnlyUserGroups(HelpTestCase):
32080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test basic usage messages"""
32090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', add_help=False)
32110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = []
32120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = [
32130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('xxxx'), [
32140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('-x', help='x'),
32150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('a', help='a'),
32160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ]),
32170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('yyyy'), [
32180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('b', help='b'),
32190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('-y', help='y'),
32200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ]),
32210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
32220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
32230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-x X] [-y Y] a b
32240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
32250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
32260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        xxxx:
32280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x X  x
32290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          a     a
32300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        yyyy:
32320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          b     b
32330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y Y  y
32340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
32350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
32360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpUsageLongProg(HelpTestCase):
32390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test usage messages where the prog is long"""
32400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='P' * 60)
32420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
32430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-w', metavar='W'),
32440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', metavar='X'),
32450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('a'),
32460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('b'),
32470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
32480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
32490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
32500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
32510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi               [-h] [-w W] [-x X] a b
32520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
32530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
32540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
32560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          a
32570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          b
32580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
32600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
32610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -w W
32620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x X
32630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
32640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
32650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpUsageLongProgOptionsWrap(HelpTestCase):
32680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test usage messages where the prog is long and the optionals wrap"""
32690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='P' * 60)
32710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
32720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-w', metavar='W' * 25),
32730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', metavar='X' * 25),
32740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-y', metavar='Y' * 25),
32750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-z', metavar='Z' * 25),
32760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('a'),
32770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('b'),
32780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
32790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
32800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
32810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
32820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi               [-h] [-w WWWWWWWWWWWWWWWWWWWWWWWWW] \
32830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi[-x XXXXXXXXXXXXXXXXXXXXXXXXX]
32840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi               [-y YYYYYYYYYYYYYYYYYYYYYYYYY] [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
32850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi               a b
32860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
32870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
32880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
32900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          a
32910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          b
32920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
32940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help            show this help message and exit
32950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -w WWWWWWWWWWWWWWWWWWWWWWWWW
32960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x XXXXXXXXXXXXXXXXXXXXXXXXX
32970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y YYYYYYYYYYYYYYYYYYYYYYYYY
32980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
32990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
33000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
33010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpUsageLongProgPositionalsWrap(HelpTestCase):
33040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test usage messages where the prog is long and the positionals wrap"""
33050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='P' * 60, add_help=False)
33070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
33080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('a' * 25),
33090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('b' * 25),
33100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('c' * 25),
33110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
33120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
33130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
33140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
33150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi               aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
33160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi               ccccccccccccccccccccccccc
33170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
33180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
33190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
33210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          aaaaaaaaaaaaaaaaaaaaaaaaa
33220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          bbbbbbbbbbbbbbbbbbbbbbbbb
33230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          ccccccccccccccccccccccccc
33240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
33250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
33260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpUsageOptionalsWrap(HelpTestCase):
33290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test usage messages where the optionals wrap"""
33300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG')
33320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
33330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-w', metavar='W' * 25),
33340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', metavar='X' * 25),
33350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-y', metavar='Y' * 25),
33360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-z', metavar='Z' * 25),
33370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('a'),
33380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('b'),
33390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('c'),
33400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
33410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
33420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
33430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-w WWWWWWWWWWWWWWWWWWWWWWWWW] \
33440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi[-x XXXXXXXXXXXXXXXXXXXXXXXXX]
33450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    [-y YYYYYYYYYYYYYYYYYYYYYYYYY] \
33460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi[-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
33470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    a b c
33480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
33490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
33500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
33520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          a
33530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          b
33540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          c
33550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
33570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help            show this help message and exit
33580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -w WWWWWWWWWWWWWWWWWWWWWWWWW
33590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x XXXXXXXXXXXXXXXXXXXXXXXXX
33600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y YYYYYYYYYYYYYYYYYYYYYYYYY
33610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
33620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
33630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
33640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpUsagePositionalsWrap(HelpTestCase):
33670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test usage messages where the positionals wrap"""
33680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG')
33700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
33710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x'),
33720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-y'),
33730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-z'),
33740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('a' * 25),
33750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('b' * 25),
33760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('c' * 25),
33770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
33780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
33790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
33800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-x X] [-y Y] [-z Z]
33810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
33820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ccccccccccccccccccccccccc
33830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
33840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
33850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
33870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          aaaaaaaaaaaaaaaaaaaaaaaaa
33880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          bbbbbbbbbbbbbbbbbbbbbbbbb
33890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          ccccccccccccccccccccccccc
33900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
33920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help            show this help message and exit
33930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x X
33940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y Y
33950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -z Z
33960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
33970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
33980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpUsageOptionalsPositionalsWrap(HelpTestCase):
34010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test usage messages where the optionals and positionals wrap"""
34020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG')
34040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
34050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', metavar='X' * 25),
34060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-y', metavar='Y' * 25),
34070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-z', metavar='Z' * 25),
34080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('a' * 25),
34090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('b' * 25),
34100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('c' * 25),
34110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
34120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
34130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
34140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-x XXXXXXXXXXXXXXXXXXXXXXXXX] \
34150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi[-y YYYYYYYYYYYYYYYYYYYYYYYYY]
34160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
34170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
34180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ccccccccccccccccccccccccc
34190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
34200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
34210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
34230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          aaaaaaaaaaaaaaaaaaaaaaaaa
34240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          bbbbbbbbbbbbbbbbbbbbbbbbb
34250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          ccccccccccccccccccccccccc
34260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
34280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help            show this help message and exit
34290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x XXXXXXXXXXXXXXXXXXXXXXXXX
34300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y YYYYYYYYYYYYYYYYYYYYYYYYY
34310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
34320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
34330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
34340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpUsageOptionalsOnlyWrap(HelpTestCase):
34370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test usage messages where there are only optionals and they wrap"""
34380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG')
34400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
34410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', metavar='X' * 25),
34420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-y', metavar='Y' * 25),
34430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-z', metavar='Z' * 25),
34440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
34450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
34460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
34470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-x XXXXXXXXXXXXXXXXXXXXXXXXX] \
34480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi[-y YYYYYYYYYYYYYYYYYYYYYYYYY]
34490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
34500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
34510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
34520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
34540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help            show this help message and exit
34550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x XXXXXXXXXXXXXXXXXXXXXXXXX
34560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y YYYYYYYYYYYYYYYYYYYYYYYYY
34570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
34580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
34590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
34600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpUsagePositionalsOnlyWrap(HelpTestCase):
34630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test usage messages where there are only positionals and they wrap"""
34640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', add_help=False)
34660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
34670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('a' * 25),
34680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('b' * 25),
34690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('c' * 25),
34700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
34710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
34720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
34730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
34740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ccccccccccccccccccccccccc
34750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
34760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
34770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
34790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          aaaaaaaaaaaaaaaaaaaaaaaaa
34800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          bbbbbbbbbbbbbbbbbbbbbbbbb
34810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          ccccccccccccccccccccccccc
34820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
34830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
34840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpVariableExpansion(HelpTestCase):
34870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that variables are expanded properly in help messages"""
34880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG')
34900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
34910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', type=int,
34920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            help='x %(prog)s %(default)s %(type)s %%'),
34930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-y', action='store_const', default=42, const='XXX',
34940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            help='y %(prog)s %(default)s %(const)s'),
34950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo', choices='abc',
34960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            help='foo %(prog)s %(default)s %(choices)s'),
34970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--bar', default='baz', choices=[1, 2], metavar='BBB',
34980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            help='bar %(prog)s %(default)s %(dest)s'),
34990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', help='spam %(prog)s %(default)s'),
35000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('badger', default=0.5, help='badger %(prog)s %(default)s'),
35010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
35020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = [
35030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('group'), [
35040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('-a', help='a %(prog)s %(default)s'),
35050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Sig('-b', default=-1, help='b %(prog)s %(default)s'),
35060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ])
35070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
35080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = ('''\
35090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-x X] [-y] [--foo {a,b,c}] [--bar BBB] [-a A] [-b B]
35100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    spam badger
35110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ''')
35120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
35130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
35150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          spam           spam PROG None
35160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          badger         badger PROG 0.5
35170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
35190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help     show this help message and exit
35200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x X           x PROG None int %
35210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y             y PROG 42 XXX
35220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo {a,b,c}  foo PROG None a, b, c
35230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --bar BBB      bar PROG baz bar
35240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        group:
35260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -a A           a PROG None
35270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -b B           b PROG -1
35280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
35290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
35300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpVariableExpansionUsageSupplied(HelpTestCase):
35330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that variables are expanded properly when usage= is present"""
35340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', usage='%(prog)s FOO')
35360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = []
35370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
35380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = ('''\
35390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG FOO
35400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ''')
35410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
35420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
35440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
35450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
35460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
35470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpVariableExpansionNoArguments(HelpTestCase):
35500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that variables are expanded properly with no arguments"""
35510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', add_help=False)
35530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = []
35540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
35550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = ('''\
35560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG
35570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ''')
35580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage
35590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
35600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpSuppressUsage(HelpTestCase):
35630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that items can be suppressed in usage messages"""
35640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', usage=argparse.SUPPRESS)
35660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
35670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo', help='foo help'),
35680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', help='spam help'),
35690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
35700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
35710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = '''\
35720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
35730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          spam        spam help
35740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
35760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
35770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo FOO   foo help
35780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
35790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = ''
35800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
35810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpSuppressOptional(HelpTestCase):
35840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that optional arguments can be suppressed in help messages"""
35850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', add_help=False)
35870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
35880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo', help=argparse.SUPPRESS),
35890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', help='spam help'),
35900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
35910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
35920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
35930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG spam
35940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
35950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
35960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
35980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          spam  spam help
35990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
36000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
36010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpSuppressOptionalGroup(HelpTestCase):
36040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that optional groups can be suppressed in help messages"""
36050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG')
36070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
36080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo', help='foo help'),
36090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', help='spam help'),
36100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
36110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = [
36120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('group'), [Sig('--bar', help=argparse.SUPPRESS)]),
36130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
36140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
36150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [--foo FOO] spam
36160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
36170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
36180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
36200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          spam        spam help
36210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
36230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
36240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo FOO   foo help
36250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
36260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
36270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpSuppressPositional(HelpTestCase):
36300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that positional arguments can be suppressed in help messages"""
36310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG')
36330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
36340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo', help='foo help'),
36350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', help=argparse.SUPPRESS),
36360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
36370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
36380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
36390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [--foo FOO]
36400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
36410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
36420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
36440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
36450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo FOO   foo help
36460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
36470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
36480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpRequiredOptional(HelpTestCase):
36510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that required options don't look optional"""
36520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG')
36540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
36550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo', required=True, help='foo help'),
36560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
36570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
36580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
36590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] --foo FOO
36600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
36610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
36620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
36640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
36650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo FOO   foo help
36660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
36670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
36680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpAlternatePrefixChars(HelpTestCase):
36710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that options display with different prefix characters"""
36720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', prefix_chars='^;', add_help=False)
36740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
36750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('^^foo', action='store_true', help='foo help'),
36760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig(';b', ';;bar', help='bar help'),
36770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
36780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
36790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
36800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [^^foo] [;b BAR]
36810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
36820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
36830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
36850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          ^^foo              foo help
36860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          ;b BAR, ;;bar BAR  bar help
36870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
36880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
36890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpNoHelpOptional(HelpTestCase):
36920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that the --help argument can be suppressed help messages"""
36930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', add_help=False)
36950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
36960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo', help='foo help'),
36970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', help='spam help'),
36980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
36990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
37000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
37010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [--foo FOO] spam
37020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
37030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
37040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
37060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          spam       spam help
37070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
37090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo FOO  foo help
37100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
37110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
37120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpVersionOptional(HelpTestCase):
37150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that the --version argument can be suppressed help messages"""
37160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', version='1.0')
37180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
37190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo', help='foo help'),
37200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', help='spam help'),
37210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
37220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
37230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
37240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-v] [--foo FOO] spam
37250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
37260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
37270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
37290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          spam           spam help
37300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
37320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help     show this help message and exit
37330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -v, --version  show program's version number and exit
37340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo FOO      foo help
37350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
37360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = '''\
37370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        1.0
37380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
37390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpNone(HelpTestCase):
37420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test that no errors occur if no help is specified"""
37430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG')
37450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
37460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo'),
37470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam'),
37480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
37490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
37500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
37510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [--foo FOO] spam
37520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
37530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
37540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
37560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          spam
37570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
37590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
37600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo FOO
37610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
37620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
37630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpTupleMetavar(HelpTestCase):
37660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test specifying metavar as a tuple"""
37670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG')
37690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
37700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-w', help='w', nargs='+', metavar=('W1', 'W2')),
37710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-x', help='x', nargs='*', metavar=('X1', 'X2')),
37720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-y', help='y', nargs=3, metavar=('Y1', 'Y2', 'Y3')),
37730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('-z', help='z', nargs='?', metavar=('Z1', )),
37740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
37750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
37760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
37770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-w W1 [W2 ...]] [-x [X1 [X2 ...]]] [-y Y1 Y2 Y3] \
37780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi[-z [Z1]]
37790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
37800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
37810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
37830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help        show this help message and exit
37840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -w W1 [W2 ...]    w
37850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -x [X1 [X2 ...]]  x
37860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -y Y1 Y2 Y3       y
37870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -z [Z1]           z
37880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
37890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
37900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpRawText(HelpTestCase):
37930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test the RawTextHelpFormatter"""
37940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(
37960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        prog='PROG', formatter_class=argparse.RawTextHelpFormatter,
37970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        description='Keep the formatting\n'
37980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    '    exactly as it is written\n'
37990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    '\n'
38000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    'here\n')
38010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
38030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo', help='    foo help should also\n'
38040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          'appear as given here'),
38050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', help='spam help'),
38060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
38070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = [
38080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('title', description='    This text\n'
38090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                  '  should be indented\n'
38100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                  '    exactly like it is here\n'),
38110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi         [Sig('--bar', help='bar help')]),
38120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
38130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
38140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [--foo FOO] [--bar BAR] spam
38150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
38160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
38170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Keep the formatting
38190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            exactly as it is written
38200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        here
38220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
38240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          spam        spam help
38250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
38270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
38280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo FOO       foo help should also
38290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                      appear as given here
38300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        title:
38320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              This text
38330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            should be indented
38340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              exactly like it is here
38350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --bar BAR   bar help
38370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
38380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
38390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpRawDescription(HelpTestCase):
38420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test the RawTextHelpFormatter"""
38430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(
38450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        prog='PROG', formatter_class=argparse.RawDescriptionHelpFormatter,
38460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        description='Keep the formatting\n'
38470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    '    exactly as it is written\n'
38480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    '\n'
38490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    'here\n')
38500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
38520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo', help='  foo help should not\n'
38530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          '    retain this odd formatting'),
38540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', help='spam help'),
38550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
38560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = [
38570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('title', description='    This text\n'
38580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                  '  should be indented\n'
38590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                  '    exactly like it is here\n'),
38600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi         [Sig('--bar', help='bar help')]),
38610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
38620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
38630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [--foo FOO] [--bar BAR] spam
38640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
38650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
38660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Keep the formatting
38680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            exactly as it is written
38690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        here
38710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
38730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          spam        spam help
38740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
38760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
38770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo FOO   foo help should not retain this odd formatting
38780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        title:
38800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              This text
38810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            should be indented
38820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              exactly like it is here
38830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --bar BAR   bar help
38850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
38860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
38870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpArgumentDefaults(HelpTestCase):
38900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test the ArgumentDefaultsHelpFormatter"""
38910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(
38930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        prog='PROG', formatter_class=argparse.ArgumentDefaultsHelpFormatter,
38940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        description='description')
38950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [
38970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--foo', help='foo help - oh and by the way, %(default)s'),
38980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('--bar', action='store_true', help='bar help'),
38990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('spam', help='spam help'),
39000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Sig('badger', nargs='?', default='wooden', help='badger help'),
39010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
39020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = [
39030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (Sig('title', description='description'),
39040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi         [Sig('--baz', type=int, default=42, help='baz help')]),
39050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ]
39060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
39070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [--foo FOO] [--bar] [--baz BAZ] spam [badger]
39080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
39090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
39100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        description
39120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
39140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          spam        spam help
39150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          badger      badger help (default: wooden)
39160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
39180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help  show this help message and exit
39190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --foo FOO   foo help - oh and by the way, None
39200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --bar       bar help (default: False)
39210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        title:
39230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          description
39240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          --baz BAZ   baz help (default: 42)
39260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
39270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
39280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpVersionAction(HelpTestCase):
39300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test the default help for the version action"""
39310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG', description='description')
39330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_signatures = [Sig('-V', '--version', action='version', version='3.6')]
39340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    argument_group_signatures = []
39350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
39360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-V]
39370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
39380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
39390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        description
39410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
39430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help     show this help message and exit
39440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -V, --version  show program's version number and exit
39450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
39460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = ''
39470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpSubparsersOrdering(HelpTestCase):
39490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test ordering of subcommands in help matches the code"""
39500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG',
39510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                           description='display some subcommands',
39520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                           version='0.1')
39530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    subparsers_signatures = [Sig(name=name)
39550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             for name in ('a', 'b', 'c', 'd', 'e')]
39560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
39580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-v] {a,b,c,d,e} ...
39590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
39600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
39620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        display some subcommands
39640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
39660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          {a,b,c,d,e}
39670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
39690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help     show this help message and exit
39700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -v, --version  show program's version number and exit
39710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
39720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = '''\
39740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        0.1
39750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
39760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestHelpSubparsersWithHelpOrdering(HelpTestCase):
39780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test ordering of subcommands in help matches the code"""
39790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    parser_signature = Sig(prog='PROG',
39800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                           description='display some subcommands',
39810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                           version='0.1')
39820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    subcommand_data = (('a', 'a subcommand help'),
39840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       ('b', 'b subcommand help'),
39850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       ('c', 'c subcommand help'),
39860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       ('d', 'd subcommand help'),
39870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       ('e', 'e subcommand help'),
39880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       )
39890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    subparsers_signatures = [Sig(name=name, help=help)
39910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             for name, help in subcommand_data]
39920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    usage = '''\
39940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        usage: PROG [-h] [-v] {a,b,c,d,e} ...
39950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
39960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    help = usage + '''\
39980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        display some subcommands
40000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        positional arguments:
40020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          {a,b,c,d,e}
40030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            a            a subcommand help
40040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            b            b subcommand help
40050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c            c subcommand help
40060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            d            d subcommand help
40070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            e            e subcommand help
40080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        optional arguments:
40100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -h, --help     show this help message and exit
40110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi          -v, --version  show program's version number and exit
40120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
40130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    version = '''\
40150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        0.1
40160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        '''
40170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =====================================
40200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Optional/Positional constructor tests
40210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =====================================
40220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestInvalidArgumentConstructors(TestCase):
40240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test a bunch of invalid Argument constructors"""
40250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def assertTypeError(self, *args, **kwargs):
40270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
40280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, parser.add_argument,
40290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          *args, **kwargs)
40300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def assertValueError(self, *args, **kwargs):
40320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
40330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ValueError, parser.add_argument,
40340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          *args, **kwargs)
40350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_invalid_keyword_arguments(self):
40370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTypeError('-x', bar=None)
40380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTypeError('-y', callback='foo')
40390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTypeError('-y', callback_args=())
40400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTypeError('-y', callback_kwargs={})
40410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_missing_destination(self):
40430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTypeError()
40440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for action in ['append', 'store']:
40450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTypeError(action=action)
40460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_invalid_option_strings(self):
40480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertValueError('--')
40490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertValueError('---')
40500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_invalid_type(self):
40520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertValueError('--foo', type='int')
40530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertValueError('--foo', type=(int, float))
40540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_invalid_action(self):
40560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertValueError('-x', action='foo')
40570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertValueError('foo', action='baz')
40580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertValueError('--foo', action=('store', 'append'))
40590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
40600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
40610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.add_argument("--foo", action="store-true")
40620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except ValueError:
40630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            e = sys.exc_info()[1]
40640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            expected = 'unknown action'
40650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            msg = 'expected %r, found %r' % (expected, e)
40660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(expected in str(e), msg)
40670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_multiple_dest(self):
40690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
40700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument(dest='foo')
40710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
40720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.add_argument('bar', dest='baz')
40730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except ValueError:
40740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            e = sys.exc_info()[1]
40750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            expected = 'dest supplied twice for positional argument'
40760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            msg = 'expected %r, found %r' % (expected, e)
40770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(expected in str(e), msg)
40780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_no_argument_actions(self):
40800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for action in ['store_const', 'store_true', 'store_false',
40810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       'append_const', 'count']:
40820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for attrs in [dict(type=int), dict(nargs='+'),
40830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          dict(choices='ab')]:
40840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertTypeError('-x', action=action, **attrs)
40850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_no_argument_no_const_actions(self):
40870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # options with zero arguments
40880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for action in ['store_true', 'store_false', 'count']:
40890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # const is always disallowed
40910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTypeError('-x', const='foo', action=action)
40920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # nargs is always disallowed
40940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTypeError('-x', nargs='*', action=action)
40950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_more_than_one_argument_actions(self):
40970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for action in ['store', 'append']:
40980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # nargs=0 is disallowed
41000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertValueError('-x', nargs=0, action=action)
41010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertValueError('spam', nargs=0, action=action)
41020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # const is disallowed with non-optional arguments
41040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for nargs in [1, '*', '+']:
41050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertValueError('-x', const='foo',
41060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                      nargs=nargs, action=action)
41070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertValueError('spam', const='foo',
41080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                      nargs=nargs, action=action)
41090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_required_const_actions(self):
41110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for action in ['store_const', 'append_const']:
41120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # nargs is always disallowed
41140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTypeError('-x', nargs='+', action=action)
41150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_parsers_action_missing_params(self):
41170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTypeError('command', action='parsers')
41180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTypeError('command', action='parsers', prog='PROG')
41190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTypeError('command', action='parsers',
41200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             parser_class=argparse.ArgumentParser)
41210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_required_positional(self):
41230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTypeError('foo', required=True)
41240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_user_defined_action(self):
41260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Success(Exception):
41280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
41290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Action(object):
41310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self,
41330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         option_strings,
41340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         dest,
41350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         const,
41360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         default,
41370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         required=False):
41380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if dest == 'spam':
41390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if const is Success:
41400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        if default is Success:
41410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            raise Success()
41420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __call__(self, *args, **kwargs):
41440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
41450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
41470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(Success, parser.add_argument, '--spam',
41480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          action=Action, default=Success, const=Success)
41490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(Success, parser.add_argument, 'spam',
41500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          action=Action, default=Success, const=Success)
41510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ================================
41530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Actions returned by add_argument
41540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ================================
41550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestActionsReturned(TestCase):
41570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_dest(self):
41590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
41600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        action = parser.add_argument('--foo')
41610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(action.dest, 'foo')
41620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        action = parser.add_argument('-b', '--bar')
41630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(action.dest, 'bar')
41640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        action = parser.add_argument('-x', '-y')
41650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(action.dest, 'x')
41660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_misc(self):
41680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
41690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        action = parser.add_argument('--foo', nargs='?', const=42,
41700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                     default=84, type=int, choices=[1, 2],
41710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                     help='FOO', metavar='BAR', dest='baz')
41720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(action.nargs, '?')
41730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(action.const, 42)
41740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(action.default, 84)
41750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(action.type, int)
41760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(action.choices, [1, 2])
41770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(action.help, 'FOO')
41780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(action.metavar, 'BAR')
41790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(action.dest, 'baz')
41800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ================================
41830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Argument conflict handling tests
41840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ================================
41850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestConflictHandling(TestCase):
41870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_bad_type(self):
41890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ValueError, argparse.ArgumentParser,
41900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          conflict_handler='foo')
41910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_conflict_error(self):
41930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
41940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-x')
41950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(argparse.ArgumentError,
41960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          parser.add_argument, '-x')
41970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--spam')
41980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(argparse.ArgumentError,
41990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          parser.add_argument, '--spam')
42000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_resolve_error(self):
42020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        get_parser = argparse.ArgumentParser
42030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = get_parser(prog='PROG', conflict_handler='resolve')
42040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-x', help='OLD X')
42060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-x', help='NEW X')
42070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.format_help(), textwrap.dedent('''\
42080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: PROG [-h] [-x X]
42090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
42110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -h, --help  show this help message and exit
42120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -x X        NEW X
42130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            '''))
42140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--spam', metavar='OLD_SPAM')
42160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--spam', metavar='NEW_SPAM')
42170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parser.format_help(), textwrap.dedent('''\
42180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            usage: PROG [-h] [-x X] [--spam NEW_SPAM]
42190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            optional arguments:
42210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -h, --help       show this help message and exit
42220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              -x X             NEW X
42230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              --spam NEW_SPAM
42240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            '''))
42250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =============================
42280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Help and Version option tests
42290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =============================
42300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestOptionalsHelpVersionActions(TestCase):
42320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test the help and version actions"""
42330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def _get_error(self, func, *args, **kwargs):
42350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
42360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            func(*args, **kwargs)
42370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except ArgumentParserError:
42380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return sys.exc_info()[1]
42390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
42400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertRaises(ArgumentParserError, func, *args, **kwargs)
42410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def assertPrintHelpExit(self, parser, args_str):
42430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
42440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.format_help(),
42450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._get_error(parser.parse_args, args_str.split()).stdout)
42460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def assertPrintVersionExit(self, parser, args_str):
42480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
42490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.format_version(),
42500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._get_error(parser.parse_args, args_str.split()).stderr)
42510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def assertArgumentParserError(self, parser, *args):
42530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ArgumentParserError, parser.parse_args, args)
42540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_version(self):
42560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(version='1.0')
42570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertPrintHelpExit(parser, '-h')
42580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertPrintHelpExit(parser, '--help')
42590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertPrintVersionExit(parser, '-v')
42600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertPrintVersionExit(parser, '--version')
42610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_version_format(self):
42630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PPP', version='%(prog)s 3.5')
42640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        msg = self._get_error(parser.parse_args, ['-v']).stderr
42650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('PPP 3.5\n', msg)
42660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_version_no_help(self):
42680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(add_help=False, version='1.0')
42690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parser, '-h')
42700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parser, '--help')
42710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertPrintVersionExit(parser, '-v')
42720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertPrintVersionExit(parser, '--version')
42730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_version_action(self):
42750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='XXX')
42760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-V', action='version', version='%(prog)s 3.7')
42770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        msg = self._get_error(parser.parse_args, ['-V']).stderr
42780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('XXX 3.7\n', msg)
42790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_no_help(self):
42810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(add_help=False)
42820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parser, '-h')
42830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parser, '--help')
42840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parser, '-v')
42850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parser, '--version')
42860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_alternate_help_version(self):
42880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser()
42890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-x', action='help')
42900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-y', action='version')
42910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertPrintHelpExit(parser, '-x')
42920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertPrintVersionExit(parser, '-y')
42930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parser, '-v')
42940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertArgumentParserError(parser, '--version')
42950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_help_version_extra_arguments(self):
42970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(version='1.0')
42980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-x', action='store_true')
42990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('y')
43000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # try all combinations of valid prefixes and suffixes
43020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        valid_prefixes = ['', '-x', 'foo', '-x bar', 'baz -x']
43030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        valid_suffixes = valid_prefixes + ['--bad-option', 'foo bar baz']
43040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for prefix in valid_prefixes:
43050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for suffix in valid_suffixes:
43060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                format = '%s %%s %s' % (prefix, suffix)
43070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertPrintHelpExit(parser, format % '-h')
43080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertPrintHelpExit(parser, format % '--help')
43090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertPrintVersionExit(parser, format % '-v')
43100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertPrintVersionExit(parser, format % '--version')
43110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ======================
43140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# str() and repr() tests
43150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ======================
43160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestStrings(TestCase):
43180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test str()  and repr() on Optionals and Positionals"""
43190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def assertStringEqual(self, obj, result_string):
43210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for func in [str, repr]:
43220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(func(obj), result_string)
43230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_optional(self):
43250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        option = argparse.Action(
43260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            option_strings=['--foo', '-a', '-b'],
43270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            dest='b',
43280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            type='int',
43290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            nargs='+',
43300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            default=42,
43310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            choices=[1, 2, 3],
43320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            help='HELP',
43330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            metavar='METAVAR')
43340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        string = (
43350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "Action(option_strings=['--foo', '-a', '-b'], dest='b', "
43360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "nargs='+', const=None, default=42, type='int', "
43370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "choices=[1, 2, 3], help='HELP', metavar='METAVAR')")
43380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertStringEqual(option, string)
43390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_argument(self):
43410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        argument = argparse.Action(
43420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            option_strings=[],
43430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            dest='x',
43440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            type=float,
43450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            nargs='?',
43460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            default=2.5,
43470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            choices=[0.5, 1.5, 2.5],
43480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            help='H HH H',
43490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            metavar='MV MV MV')
43500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        string = (
43510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "Action(option_strings=[], dest='x', nargs='?', "
43520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "const=None, default=2.5, type=%r, choices=[0.5, 1.5, 2.5], "
43530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "help='H HH H', metavar='MV MV MV')" % float)
43540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertStringEqual(argument, string)
43550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_namespace(self):
43570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ns = argparse.Namespace(foo=42, bar='spam')
43580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        string = "Namespace(bar='spam', foo=42)"
43590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertStringEqual(ns, string)
43600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_parser(self):
43620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser(prog='PROG')
43630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        string = (
43640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "ArgumentParser(prog='PROG', usage=None, description=None, "
43650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "version=None, formatter_class=%r, conflict_handler='error', "
43660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "add_help=True)" % argparse.HelpFormatter)
43670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertStringEqual(parser, string)
43680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ===============
43700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Namespace tests
43710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ===============
43720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestNamespace(TestCase):
43740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_constructor(self):
43760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ns = argparse.Namespace()
43770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(AttributeError, getattr, ns, 'x')
43780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ns = argparse.Namespace(a=42, b='spam')
43800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(ns.a, 42)
43810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(ns.b, 'spam')
43820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_equality(self):
43840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ns1 = argparse.Namespace(a=1, b=2)
43850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ns2 = argparse.Namespace(b=2, a=1)
43860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ns3 = argparse.Namespace(a=1)
43870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ns4 = argparse.Namespace(b=2)
43880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(ns1, ns2)
43900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(ns1, ns3)
43910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(ns1, ns4)
43920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(ns2, ns3)
43930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(ns2, ns4)
43940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(ns1 != ns3)
43950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(ns1 != ns4)
43960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(ns2 != ns3)
43970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(ns2 != ns4)
43980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ===================
44010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# File encoding tests
44020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ===================
44030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestEncoding(TestCase):
44050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def _test_module_encoding(self, path):
44070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        path, _ = os.path.splitext(path)
44080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        path += ".py"
44090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with codecs.open(path, 'r', 'utf8') as f:
44100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            f.read()
44110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_argparse_module_encoding(self):
44130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._test_module_encoding(argparse.__file__)
44140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_test_argparse_module_encoding(self):
44160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._test_module_encoding(__file__)
44170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ===================
44190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ArgumentError tests
44200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ===================
44210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestArgumentError(TestCase):
44230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_argument_error(self):
44250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        msg = "my error here"
44260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        error = argparse.ArgumentError(None, msg)
44270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(error), msg)
44280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =======================
44300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ArgumentTypeError tests
44310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# =======================
44320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestArgumentTypeError(TestCase):
44340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_argument_type_error(self):
44360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def spam(string):
44380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            raise argparse.ArgumentTypeError('spam!')
44390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = ErrorRaisingArgumentParser(prog='PROG', add_help=False)
44410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('x', type=spam)
44420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
44430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.parse_args(['XXX'])
44440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except ArgumentParserError:
44450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            expected = 'usage: PROG x\nPROG: error: argument x: spam!\n'
44460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            msg = sys.exc_info()[1].stderr
44470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(expected, msg)
44480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
44490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail()
44500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ================================================
44520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Check that the type function is called only once
44530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ================================================
44540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestTypeFunctionCallOnlyOnce(TestCase):
44560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_type_function_call_only_once(self):
44580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def spam(string_to_convert):
44590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(string_to_convert, 'spam!')
44600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return 'foo_converted'
44610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
44630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--foo', type=spam, default='bar')
44640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        args = parser.parse_args('--foo spam!'.split())
44650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(foo='foo_converted'), args)
44660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ==================================================================
44680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Check semantics regarding the default argument and type conversion
44690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ==================================================================
44700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestTypeFunctionCalledOnDefault(TestCase):
44720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_type_function_call_with_non_string_default(self):
44740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def spam(int_to_convert):
44750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(int_to_convert, 0)
44760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return 'foo_converted'
44770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
44790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--foo', type=spam, default=0)
44800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        args = parser.parse_args([])
44810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # foo should *not* be converted because its default is not a string.
44820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(foo=0), args)
44830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_type_function_call_with_string_default(self):
44850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def spam(int_to_convert):
44860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return 'foo_converted'
44870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
44890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--foo', type=spam, default='0')
44900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        args = parser.parse_args([])
44910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # foo is converted because its default is a string.
44920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(foo='foo_converted'), args)
44930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_no_double_type_conversion_of_default(self):
44950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def extend(str_to_convert):
44960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return str_to_convert + '*'
44970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
44990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--test', type=extend, default='*')
45000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        args = parser.parse_args([])
45010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # The test argument will be two stars, one coming from the default
45020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # value and one coming from the type conversion being called exactly
45030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # once.
45040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(test='**'), args)
45050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_issue_15906(self):
45070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Issue #15906: When action='append', type=str, default=[] are
45080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # providing, the dest value was the string representation "[]" when it
45090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # should have been an empty list.
45100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
45110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--test', dest='test', type=str,
45120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            default=[], action='append')
45130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        args = parser.parse_args([])
45140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(args.test, [])
45150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ======================
45170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# parse_known_args tests
45180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ======================
45190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestParseKnownArgs(TestCase):
45210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_arguments_tuple(self):
45230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
45240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.parse_args(())
45250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_arguments_list(self):
45270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
45280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.parse_args([])
45290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_arguments_tuple_positional(self):
45310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
45320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('x')
45330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.parse_args(('x',))
45340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_arguments_list_positional(self):
45360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
45370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('x')
45380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.parse_args(['x'])
45390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_optionals(self):
45410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
45420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--foo')
45430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        args, extras = parser.parse_known_args('--foo F --bar --baz'.split())
45440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(foo='F'), args)
45450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(['--bar', '--baz'], extras)
45460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_mixed(self):
45480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
45490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('-v', nargs='?', const=1, type=int)
45500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('--spam', action='store_false')
45510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument('badger')
45520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        argv = ["B", "C", "--foo", "-v", "3", "4"]
45540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        args, extras = parser.parse_known_args(argv)
45550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NS(v=3, spam=True, badger="B"), args)
45560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(["C", "--foo", "4"], extras)
45570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ==========================
45590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# add_argument metavar tests
45600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ==========================
45610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestAddArgumentMetavar(TestCase):
45630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    EXPECTED_MESSAGE = "length of metavar tuple does not match nargs"
45650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def do_test_no_exception(self, nargs, metavar):
45670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
45680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser.add_argument("--foo", nargs=nargs, metavar=metavar)
45690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def do_test_exception(self, nargs, metavar):
45710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parser = argparse.ArgumentParser()
45720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with self.assertRaises(ValueError) as cm:
45730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            parser.add_argument("--foo", nargs=nargs, metavar=metavar)
45740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cm.exception.args[0], self.EXPECTED_MESSAGE)
45750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Unit tests for different values of metavar when nargs=None
45770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_None_metavar_string(self):
45790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs=None, metavar="1")
45800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_None_metavar_length0(self):
45820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs=None, metavar=tuple())
45830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_None_metavar_length1(self):
45850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs=None, metavar=("1"))
45860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_None_metavar_length2(self):
45880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs=None, metavar=("1", "2"))
45890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_None_metavar_length3(self):
45910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs=None, metavar=("1", "2", "3"))
45920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Unit tests for different values of metavar when nargs=?
45940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_optional_metavar_string(self):
45960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="?", metavar="1")
45970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_optional_metavar_length0(self):
45990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs="?", metavar=tuple())
46000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_optional_metavar_length1(self):
46020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="?", metavar=("1"))
46030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_optional_metavar_length2(self):
46050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs="?", metavar=("1", "2"))
46060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_optional_metavar_length3(self):
46080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs="?", metavar=("1", "2", "3"))
46090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Unit tests for different values of metavar when nargs=*
46110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_zeroormore_metavar_string(self):
46130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="*", metavar="1")
46140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_zeroormore_metavar_length0(self):
46160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs="*", metavar=tuple())
46170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_zeroormore_metavar_length1(self):
46190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="*", metavar=("1"))
46200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_zeroormore_metavar_length2(self):
46220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="*", metavar=("1", "2"))
46230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_zeroormore_metavar_length3(self):
46250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs="*", metavar=("1", "2", "3"))
46260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Unit tests for different values of metavar when nargs=+
46280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_oneormore_metavar_string(self):
46300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="+", metavar="1")
46310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_oneormore_metavar_length0(self):
46330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs="+", metavar=tuple())
46340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_oneormore_metavar_length1(self):
46360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="+", metavar=("1"))
46370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_oneormore_metavar_length2(self):
46390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="+", metavar=("1", "2"))
46400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_oneormore_metavar_length3(self):
46420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs="+", metavar=("1", "2", "3"))
46430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Unit tests for different values of metavar when nargs=...
46450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_remainder_metavar_string(self):
46470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="...", metavar="1")
46480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_remainder_metavar_length0(self):
46500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="...", metavar=tuple())
46510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_remainder_metavar_length1(self):
46530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="...", metavar=("1"))
46540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_remainder_metavar_length2(self):
46560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="...", metavar=("1", "2"))
46570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_remainder_metavar_length3(self):
46590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="...", metavar=("1", "2", "3"))
46600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Unit tests for different values of metavar when nargs=A...
46620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_parser_metavar_string(self):
46640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="A...", metavar="1")
46650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_parser_metavar_length0(self):
46670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs="A...", metavar=tuple())
46680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_parser_metavar_length1(self):
46700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs="A...", metavar=("1"))
46710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_parser_metavar_length2(self):
46730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs="A...", metavar=("1", "2"))
46740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_parser_metavar_length3(self):
46760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs="A...", metavar=("1", "2", "3"))
46770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Unit tests for different values of metavar when nargs=1
46790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_1_metavar_string(self):
46810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs=1, metavar="1")
46820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_1_metavar_length0(self):
46840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs=1, metavar=tuple())
46850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_1_metavar_length1(self):
46870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs=1, metavar=("1"))
46880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_1_metavar_length2(self):
46900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs=1, metavar=("1", "2"))
46910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_1_metavar_length3(self):
46930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs=1, metavar=("1", "2", "3"))
46940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Unit tests for different values of metavar when nargs=2
46960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_2_metavar_string(self):
46980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs=2, metavar="1")
46990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_2_metavar_length0(self):
47010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs=2, metavar=tuple())
47020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_2_metavar_length1(self):
47040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs=2, metavar=("1"))
47050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_2_metavar_length2(self):
47070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs=2, metavar=("1", "2"))
47080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_2_metavar_length3(self):
47100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs=2, metavar=("1", "2", "3"))
47110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Unit tests for different values of metavar when nargs=3
47130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_3_metavar_string(self):
47150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs=3, metavar="1")
47160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_3_metavar_length0(self):
47180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs=3, metavar=tuple())
47190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_3_metavar_length1(self):
47210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs=3, metavar=("1"))
47220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_3_metavar_length2(self):
47240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_exception(nargs=3, metavar=("1", "2"))
47250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nargs_3_metavar_length3(self):
47270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.do_test_no_exception(nargs=3, metavar=("1", "2", "3"))
47280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ============================
47300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# from argparse import * tests
47310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# ============================
47320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestImportStar(TestCase):
47340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test(self):
47360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for name in argparse.__all__:
47370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(hasattr(argparse, name))
47380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_all_exports_everything_but_modules(self):
47400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        items = [
47410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            name
47420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for name, value in vars(argparse).items()
47430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if not name.startswith("_")
47440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if not inspect.ismodule(value)
47450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ]
47460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(sorted(items), sorted(argparse.__all__))
47470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_main():
47490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # silence warnings about version argument - these are expected
47500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    with test_support.check_warnings(
47510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ('The "version" argument to ArgumentParser is deprecated.',
47520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             DeprecationWarning),
47530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ('The (format|print)_version method is deprecated',
47540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             DeprecationWarning)):
47550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.run_unittest(__name__)
47560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Remove global references to avoid looking like we have refleaks.
47570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    RFile.seen = {}
47580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    WFile.seen = set()
47590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == '__main__':
47630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    test_main()
4764