14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Author: Steven J. Bethard <steven.bethard@gmail.com>.
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport codecs
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport inspect
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport shutil
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport stat
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport textwrap
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport tempfile
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport argparse
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom StringIO import StringIO
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass StdIOBuffer(StringIO):
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test import test_support
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestCase(unittest.TestCase):
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertEqual(self, obj1, obj2):
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if obj1 != obj2:
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print('')
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print(repr(obj1))
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print(repr(obj2))
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print(obj1)
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print(obj2)
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        super(TestCase, self).assertEqual(obj1, obj2)
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The tests assume that line wrapping occurs at 80 columns, but this
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # behaviour can be overridden by setting the COLUMNS environment
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # variable.  To ensure that this assumption is true, unset COLUMNS.
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        env = test_support.EnvironmentVarGuard()
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        env.unset("COLUMNS")
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.addCleanup(env.__exit__)
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TempDirMixin(object):
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.temp_dir = tempfile.mkdtemp()
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.old_dir = os.getcwd()
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        os.chdir(self.temp_dir)
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tearDown(self):
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        os.chdir(self.old_dir)
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        shutil.rmtree(self.temp_dir, True)
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def create_readonly_file(self, filename):
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file_path = os.path.join(self.temp_dir, filename)
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with open(file_path, 'w') as file:
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file.write(filename)
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        os.chmod(file_path, stat.S_IREAD)
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Sig(object):
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, *args, **kwargs):
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.args = args
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.kwargs = kwargs
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass NS(object):
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, **kwargs):
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.__dict__.update(kwargs)
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __repr__(self):
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sorted_items = sorted(self.__dict__.items())
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        kwarg_str = ', '.join(['%s=%r' % tup for tup in sorted_items])
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return '%s(%s)' % (type(self).__name__, kwarg_str)
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __hash__ = None
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __eq__(self, other):
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return vars(self) == vars(other)
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __ne__(self, other):
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return not (self == other)
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ArgumentParserError(Exception):
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, message, stdout=None, stderr=None, error_code=None):
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Exception.__init__(self, message, stdout, stderr)
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.message = message
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stdout = stdout
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stderr = stderr
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.error_code = error_code
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef stderr_to_parser_error(parse_args, *args, **kwargs):
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # if this is being called recursively and stderr or stdout is already being
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # redirected, simply call the function and let the enclosing function
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # catch the exception
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if isinstance(sys.stderr, StdIOBuffer) or isinstance(sys.stdout, StdIOBuffer):
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return parse_args(*args, **kwargs)
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # if this is not being called recursively, redirect stderr and
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # use it as the ArgumentParserError message
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    old_stdout = sys.stdout
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    old_stderr = sys.stderr
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    sys.stdout = StdIOBuffer()
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    sys.stderr = StdIOBuffer()
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            result = parse_args(*args, **kwargs)
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for key in list(vars(result)):
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if getattr(result, key) is sys.stdout:
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    setattr(result, key, old_stdout)
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if getattr(result, key) is sys.stderr:
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    setattr(result, key, old_stderr)
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return result
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except SystemExit:
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            code = sys.exc_info()[1].code
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            stdout = sys.stdout.getvalue()
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            stderr = sys.stderr.getvalue()
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ArgumentParserError("SystemExit", stdout, stderr, code)
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    finally:
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sys.stdout = old_stdout
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sys.stderr = old_stderr
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ErrorRaisingArgumentParser(argparse.ArgumentParser):
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def parse_args(self, *args, **kwargs):
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parse_args = super(ErrorRaisingArgumentParser, self).parse_args
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return stderr_to_parser_error(parse_args, *args, **kwargs)
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def exit(self, *args, **kwargs):
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        exit = super(ErrorRaisingArgumentParser, self).exit
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return stderr_to_parser_error(exit, *args, **kwargs)
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def error(self, *args, **kwargs):
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        error = super(ErrorRaisingArgumentParser, self).error
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return stderr_to_parser_error(error, *args, **kwargs)
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ParserTesterMetaclass(type):
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Adds parser tests using the class attributes.
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Classes of this type should specify the following attributes:
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures -- a list of Sig objects which specify
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        the signatures of Argument objects to be created
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures -- a list of args lists that should cause the parser
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        to fail
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes -- a list of (initial_args, options, remaining_args) tuples
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        where initial_args specifies the string args to be parsed,
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        options is a dict that should match the vars() of the options
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parsed out of initial_args, and remaining_args should be any
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        remaining unparsed arguments
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(cls, name, bases, bodydict):
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if name == 'ParserTestCase':
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # default parser signature is empty
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not hasattr(cls, 'parser_signature'):
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cls.parser_signature = Sig()
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not hasattr(cls, 'parser_class'):
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cls.parser_class = ErrorRaisingArgumentParser
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ---------------------------------------
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # functions for adding optional arguments
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ---------------------------------------
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def no_groups(parser, argument_signatures):
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """Add all arguments directly to the parser"""
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for sig in argument_signatures:
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parser.add_argument(*sig.args, **sig.kwargs)
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def one_group(parser, argument_signatures):
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """Add all arguments under a single group in the parser"""
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            group = parser.add_argument_group('foo')
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for sig in argument_signatures:
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                group.add_argument(*sig.args, **sig.kwargs)
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def many_groups(parser, argument_signatures):
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """Add each argument in its own group to the parser"""
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for i, sig in enumerate(argument_signatures):
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                group = parser.add_argument_group('foo:%i' % i)
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                group.add_argument(*sig.args, **sig.kwargs)
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # --------------------------
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # functions for parsing args
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # --------------------------
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def listargs(parser, args):
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """Parse the args by passing in a list"""
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return parser.parse_args(args)
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def sysargs(parser, args):
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """Parse the args by defaulting to sys.argv"""
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            old_sys_argv = sys.argv
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            sys.argv = [old_sys_argv[0]] + args
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return parser.parse_args()
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            finally:
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                sys.argv = old_sys_argv
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # class that holds the combination of one optional argument
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # addition method and one arg parsing method
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class AddTests(object):
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self, tester_cls, add_arguments, parse_args):
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._add_arguments = add_arguments
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._parse_args = parse_args
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                add_arguments_name = self._add_arguments.__name__
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parse_args_name = self._parse_args.__name__
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for test_func in [self.test_failures, self.test_successes]:
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    func_name = test_func.__name__
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    names = func_name, add_arguments_name, parse_args_name
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    test_name = '_'.join(names)
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    def wrapper(self, test_func=test_func):
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        test_func(self)
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    try:
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        wrapper.__name__ = test_name
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    except TypeError:
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        pass
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    setattr(tester_cls, test_name, wrapper)
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def _get_parser(self, tester):
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                args = tester.parser_signature.args
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                kwargs = tester.parser_signature.kwargs
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parser = tester.parser_class(*args, **kwargs)
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._add_arguments(parser, tester.argument_signatures)
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return parser
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def test_failures(self, tester):
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parser = self._get_parser(tester)
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for args_str in tester.failures:
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    args = args_str.split()
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raises = tester.assertRaises
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raises(ArgumentParserError, parser.parse_args, args)
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def test_successes(self, tester):
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parser = self._get_parser(tester)
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for args, expected_ns in tester.successes:
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if isinstance(args, str):
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        args = args.split()
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    result_ns = self._parse_args(parser, args)
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    tester.assertEqual(expected_ns, result_ns)
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # add tests for each combination of an optionals adding method
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # and an arg parsing method
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for add_arguments in [no_groups, one_group, many_groups]:
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for parse_args in [listargs, sysargs]:
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                AddTests(cls, add_arguments, parse_args)
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaobases = TestCase,
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoParserTestCase = ParserTesterMetaclass('ParserTestCase', bases, {})
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ===============
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Optionals tests
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ===============
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsSingleDash(ParserTestCase):
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test an Optional with a single-dash option string"""
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-x')]
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x', 'a', '--foo', '-x --foo', '-x -y']
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None)),
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x a', NS(x='a')),
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-xa', NS(x='a')),
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x -1', NS(x='-1')),
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x-1', NS(x='-1')),
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsSingleDashCombined(ParserTestCase):
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test an Optional with a single-dash option string"""
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', action='store_true'),
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-yyy', action='store_const', const=42),
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-z'),
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '--foo', '-xa', '-x --foo', '-x -z', '-z -x',
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                '-yx', '-yz a', '-yyyx', '-yyyza', '-xyza']
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=False, yyy=None, z=None)),
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x', NS(x=True, yyy=None, z=None)),
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-za', NS(x=False, yyy=None, z='a')),
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-z a', NS(x=False, yyy=None, z='a')),
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-xza', NS(x=True, yyy=None, z='a')),
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-xz a', NS(x=True, yyy=None, z='a')),
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x -za', NS(x=True, yyy=None, z='a')),
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x -z a', NS(x=True, yyy=None, z='a')),
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y', NS(x=False, yyy=42, z=None)),
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-yyy', NS(x=False, yyy=42, z=None)),
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x -yyy -za', NS(x=True, yyy=42, z='a')),
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x -yyy -z a', NS(x=True, yyy=42, z='a')),
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsSingleDashLong(ParserTestCase):
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test an Optional with a multi-character single-dash option string"""
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-foo')]
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-foo', 'a', '--foo', '-foo --foo', '-foo -y', '-fooa']
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foo=None)),
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-foo a', NS(foo='a')),
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-foo -1', NS(foo='-1')),
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-fo a', NS(foo='a')),
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-f a', NS(foo='a')),
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsSingleDashSubsetAmbiguous(ParserTestCase):
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test Optionals where option strings are subsets of each other"""
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-f'), Sig('-foobar'), Sig('-foorab')]
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-f', '-foo', '-fo', '-foo b', '-foob', '-fooba', '-foora']
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(f=None, foobar=None, foorab=None)),
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-f a', NS(f='a', foobar=None, foorab=None)),
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-fa', NS(f='a', foobar=None, foorab=None)),
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-foa', NS(f='oa', foobar=None, foorab=None)),
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-fooa', NS(f='ooa', foobar=None, foorab=None)),
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-foobar a', NS(f=None, foobar='a', foorab=None)),
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-foorab a', NS(f=None, foobar=None, foorab='a')),
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsSingleDashAmbiguous(ParserTestCase):
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test Optionals that partially match but are not subsets"""
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-foobar'), Sig('-foorab')]
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-f', '-f a', '-fa', '-foa', '-foo', '-fo', '-foo b']
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foobar=None, foorab=None)),
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-foob a', NS(foobar='a', foorab=None)),
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-foor a', NS(foobar=None, foorab='a')),
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-fooba a', NS(foobar='a', foorab=None)),
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-foora a', NS(foobar=None, foorab='a')),
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-foobar a', NS(foobar='a', foorab=None)),
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-foorab a', NS(foobar=None, foorab='a')),
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsNumeric(ParserTestCase):
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test an Optional with a short opt string"""
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-1', dest='one')]
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-1', 'a', '-1 --foo', '-1 -y', '-1 -1', '-1 -2']
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(one=None)),
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-1 a', NS(one='a')),
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-1a', NS(one='a')),
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-1-2', NS(one='-2')),
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsDoubleDash(ParserTestCase):
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test an Optional with a double-dash option string"""
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('--foo')]
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--foo', '-f', '-f a', 'a', '--foo -x', '--foo --bar']
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foo=None)),
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--foo a', NS(foo='a')),
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--foo=a', NS(foo='a')),
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--foo -2.5', NS(foo='-2.5')),
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--foo=-2.5', NS(foo='-2.5')),
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsDoubleDashPartialMatch(ParserTestCase):
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests partial matching with a double-dash option string"""
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--badger', action='store_true'),
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--bat'),
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--bar', '--b', '--ba', '--b=2', '--ba=4', '--badge 5']
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(badger=False, bat=None)),
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--bat X', NS(badger=False, bat='X')),
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--bad', NS(badger=True, bat=None)),
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--badg', NS(badger=True, bat=None)),
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--badge', NS(badger=True, bat=None)),
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--badger', NS(badger=True, bat=None)),
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsDoubleDashPrefixMatch(ParserTestCase):
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests when one double-dash option string is a prefix of another"""
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--badger', action='store_true'),
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--ba'),
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--bar', '--b', '--ba', '--b=2', '--badge 5']
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(badger=False, ba=None)),
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--ba X', NS(badger=False, ba='X')),
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--ba=X', NS(badger=False, ba='X')),
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--bad', NS(badger=True, ba=None)),
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--badg', NS(badger=True, ba=None)),
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--badge', NS(badger=True, ba=None)),
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--badger', NS(badger=True, ba=None)),
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsSingleDoubleDash(ParserTestCase):
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test an Optional with single- and double-dash option strings"""
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-f', action='store_true'),
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--bar'),
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-baz', action='store_const', const=42),
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--bar', '-fbar', '-fbaz', '-bazf', '-b B', 'B']
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(f=False, bar=None, baz=None)),
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-f', NS(f=True, bar=None, baz=None)),
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--ba B', NS(f=False, bar='B', baz=None)),
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-f --bar B', NS(f=True, bar='B', baz=None)),
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-f -b', NS(f=True, bar=None, baz=42)),
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-ba -f', NS(f=True, bar=None, baz=42)),
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsAlternatePrefixChars(ParserTestCase):
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test an Optional with option strings with custom prefixes"""
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prefix_chars='+:/', add_help=False)
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('+f', action='store_true'),
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('::bar'),
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('/baz', action='store_const', const=42),
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--bar', '-fbar', '-b B', 'B', '-f', '--bar B', '-baz', '-h', '--help', '+h', '::help', '/help']
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(f=False, bar=None, baz=None)),
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('+f', NS(f=True, bar=None, baz=None)),
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('::ba B', NS(f=False, bar='B', baz=None)),
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('+f ::bar B', NS(f=True, bar='B', baz=None)),
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('+f /b', NS(f=True, bar=None, baz=42)),
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('/ba +f', NS(f=True, bar=None, baz=42)),
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsAlternatePrefixCharsAddedHelp(ParserTestCase):
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """When ``-`` not in prefix_chars, default operators created for help
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao       should use the prefix_chars in use rather than - or --
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao       http://bugs.python.org/issue9444"""
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prefix_chars='+:/', add_help=True)
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('+f', action='store_true'),
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('::bar'),
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('/baz', action='store_const', const=42),
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--bar', '-fbar', '-b B', 'B', '-f', '--bar B', '-baz']
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(f=False, bar=None, baz=None)),
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('+f', NS(f=True, bar=None, baz=None)),
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('::ba B', NS(f=False, bar='B', baz=None)),
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('+f ::bar B', NS(f=True, bar='B', baz=None)),
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('+f /b', NS(f=True, bar=None, baz=42)),
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('/ba +f', NS(f=True, bar=None, baz=42))
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsAlternatePrefixCharsMultipleShortArgs(ParserTestCase):
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Verify that Optionals must be called with their defined prefixes"""
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prefix_chars='+-', add_help=False)
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', action='store_true'),
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('+y', action='store_true'),
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('+z', action='store_true'),
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-w',
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                '-xyz',
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                '+x',
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                '-y',
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                '+xyz',
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=False, y=False, z=False)),
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x', NS(x=True, y=False, z=False)),
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('+y -x', NS(x=True, y=True, z=False)),
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('+yz -x', NS(x=True, y=True, z=True)),
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsShortLong(ParserTestCase):
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a combination of single- and double-dash option strings"""
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-v', '--verbose', '-n', '--noisy', action='store_true'),
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--x --verbose', '-N', 'a', '-v x']
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(verbose=False)),
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-v', NS(verbose=True)),
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--verbose', NS(verbose=True)),
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-n', NS(verbose=True)),
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--noisy', NS(verbose=True)),
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsDest(ParserTestCase):
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests various means of setting destination"""
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('--foo-bar'), Sig('--baz', dest='zabbaz')]
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a']
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--foo-bar f', NS(foo_bar='f', zabbaz=None)),
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz g', NS(foo_bar=None, zabbaz='g')),
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--foo-bar h --baz i', NS(foo_bar='h', zabbaz='i')),
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz j --foo-bar k', NS(foo_bar='k', zabbaz='j')),
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsDefault(ParserTestCase):
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests specifying a default for an Optional"""
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-x'), Sig('-y', default=42)]
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a']
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None, y=42)),
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-xx', NS(x='x', y=42)),
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-yy', NS(x=None, y='y')),
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsNargsDefault(ParserTestCase):
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests not specifying the number of args for an Optional"""
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-x')]
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '-x']
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None)),
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x a', NS(x='a')),
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsNargs1(ParserTestCase):
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests specifying the 1 arg for an Optional"""
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-x', nargs=1)]
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '-x']
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None)),
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x a', NS(x=['a'])),
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsNargs3(ParserTestCase):
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests specifying the 3 args for an Optional"""
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-x', nargs=3)]
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '-x', '-x a', '-x a b', 'a -x', 'a -x b']
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None)),
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x a b c', NS(x=['a', 'b', 'c'])),
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsNargsOptional(ParserTestCase):
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests specifying an Optional arg for an Optional"""
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-w', nargs='?'),
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', nargs='?', const=42),
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-y', nargs='?', default='spam'),
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-z', nargs='?', type=int, const='42', default='84'),
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['2']
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(w=None, x=None, y='spam', z=84)),
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-w', NS(w=None, x=None, y='spam', z=84)),
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-w 2', NS(w='2', x=None, y='spam', z=84)),
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x', NS(w=None, x=42, y='spam', z=84)),
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x 2', NS(w=None, x='2', y='spam', z=84)),
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y', NS(w=None, x=None, y=None, z=84)),
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y 2', NS(w=None, x=None, y='2', z=84)),
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-z', NS(w=None, x=None, y='spam', z=42)),
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-z 2', NS(w=None, x=None, y='spam', z=2)),
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsNargsZeroOrMore(ParserTestCase):
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests specifying an args for an Optional that accepts zero or more"""
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', nargs='*'),
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-y', nargs='*', default='spam'),
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a']
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None, y='spam')),
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x', NS(x=[], y='spam')),
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x a', NS(x=['a'], y='spam')),
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x a b', NS(x=['a', 'b'], y='spam')),
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y', NS(x=None, y=[])),
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y a', NS(x=None, y=['a'])),
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y a b', NS(x=None, y=['a', 'b'])),
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsNargsOneOrMore(ParserTestCase):
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests specifying an args for an Optional that accepts one or more"""
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', nargs='+'),
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-y', nargs='+', default='spam'),
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '-x', '-y', 'a -x', 'a -y b']
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None, y='spam')),
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x a', NS(x=['a'], y='spam')),
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x a b', NS(x=['a', 'b'], y='spam')),
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y a', NS(x=None, y=['a'])),
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y a b', NS(x=None, y=['a', 'b'])),
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsChoices(ParserTestCase):
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests specifying the choices for an Optional"""
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-f', choices='abc'),
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-g', type=int, choices=range(5))]
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '-f d', '-fad', '-ga', '-g 6']
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(f=None, g=None)),
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-f a', NS(f='a', g=None)),
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-f c', NS(f='c', g=None)),
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-g 0', NS(f=None, g=0)),
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-g 03', NS(f=None, g=3)),
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-fb -g4', NS(f='b', g=4)),
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsRequired(ParserTestCase):
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests the an optional action that is required"""
6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', type=int, required=True),
6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '']
6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x 1', NS(x=1)),
6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x42', NS(x=42)),
6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsActionStore(ParserTestCase):
6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests the store action for an Optional"""
6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-x', action='store')]
6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', 'a -x']
6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None)),
6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-xfoo', NS(x='foo')),
6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsActionStoreConst(ParserTestCase):
6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests the store_const action for an Optional"""
6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-y', action='store_const', const=object)]
6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a']
6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(y=None)),
6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y', NS(y=object)),
6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsActionStoreFalse(ParserTestCase):
6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests the store_false action for an Optional"""
6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-z', action='store_false')]
6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '-za', '-z a']
6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(z=True)),
6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-z', NS(z=False)),
6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsActionStoreTrue(ParserTestCase):
6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests the store_true action for an Optional"""
6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('--apple', action='store_true')]
6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '--apple=b', '--apple b']
6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(apple=False)),
6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--apple', NS(apple=True)),
6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsActionAppend(ParserTestCase):
7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests the append action for an Optional"""
7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('--baz', action='append')]
7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '--baz', 'a --baz', '--baz a b']
7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(baz=None)),
7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz a', NS(baz=['a'])),
7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz a --baz b', NS(baz=['a', 'b'])),
7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsActionAppendWithDefault(ParserTestCase):
7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests the append action for an Optional"""
7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('--baz', action='append', default=['X'])]
7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '--baz', 'a --baz', '--baz a b']
7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(baz=['X'])),
7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz a', NS(baz=['X', 'a'])),
7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz a --baz b', NS(baz=['X', 'a', 'b'])),
7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsActionAppendConst(ParserTestCase):
7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests the append_const action for an Optional"""
7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-b', action='append_const', const=Exception),
7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-c', action='append', dest='b'),
7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '-c', 'a -c', '-bx', '-b x']
7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(b=None)),
7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-b', NS(b=[Exception])),
7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-b -cx -b -cyz', NS(b=[Exception, 'x', Exception, 'yz'])),
7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
7394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsActionAppendConstWithDefault(ParserTestCase):
7424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests the append_const action for an Optional"""
7434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
7454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-b', action='append_const', const=Exception, default=['X']),
7464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-c', action='append', dest='b'),
7474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
7484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '-c', 'a -c', '-bx', '-b x']
7494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
7504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(b=['X'])),
7514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-b', NS(b=['X', Exception])),
7524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-b -cx -b -cyz', NS(b=['X', Exception, 'x', Exception, 'yz'])),
7534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
7544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsActionCount(ParserTestCase):
7574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests the count action for an Optional"""
7584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-x', action='count')]
7604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '-x a', '-x b', '-x a -x b']
7614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
7624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None)),
7634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x', NS(x=1)),
7644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
7654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ================
7684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Positional tests
7694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ================
7704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsNone(ParserTestCase):
7724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional that doesn't specify nargs"""
7734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo')]
7754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '-x', 'a b']
7764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
7774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo='a')),
7784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
7794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargs1(ParserTestCase):
7824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional that specifies an nargs of 1"""
7834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs=1)]
7854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '-x', 'a b']
7864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
7874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo=['a'])),
7884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
7894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargs2(ParserTestCase):
7924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional that specifies an nargs of 2"""
7934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs=2)]
7954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', 'a', '-x', 'a b c']
7964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
7974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo=['a', 'b'])),
7984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
7994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsZeroOrMore(ParserTestCase):
8024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional that specifies unlimited nargs"""
8034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='*')]
8054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x']
8064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
8074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foo=[])),
8084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo=['a'])),
8094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo=['a', 'b'])),
8104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
8114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsZeroOrMoreDefault(ParserTestCase):
8144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional that specifies unlimited nargs and a default"""
8154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='*', default='bar')]
8174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x']
8184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
8194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foo='bar')),
8204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo=['a'])),
8214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo=['a', 'b'])),
8224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
8234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsOneOrMore(ParserTestCase):
8264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional that specifies one or more nargs"""
8274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='+')]
8294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '-x']
8304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
8314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo=['a'])),
8324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo=['a', 'b'])),
8334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
8344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsOptional(ParserTestCase):
8374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests an Optional Positional"""
8384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='?')]
8404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x', 'a b']
8414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
8424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foo=None)),
8434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo='a')),
8444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
8454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsOptionalDefault(ParserTestCase):
8484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests an Optional Positional with a default value"""
8494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='?', default=42)]
8514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x', 'a b']
8524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
8534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foo=42)),
8544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo='a')),
8554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
8564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsOptionalConvertedDefault(ParserTestCase):
8594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests an Optional Positional with a default value
8604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    that needs to be converted to the appropriate type.
8614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
8624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
8644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('foo', nargs='?', type=int, default='42'),
8654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
8664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x', 'a b', '1 2']
8674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
8684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foo=42)),
8694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('1', NS(foo=1)),
8704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
8714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsNoneNone(ParserTestCase):
8744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test two Positionals that don't specify nargs"""
8754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo'), Sig('bar')]
8774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '-x', 'a', 'a b c']
8784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
8794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar='b')),
8804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
8814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsNone1(ParserTestCase):
8844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with no nargs followed by one with 1"""
8854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo'), Sig('bar', nargs=1)]
8874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a', 'a b c']
8884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
8894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar=['b'])),
8904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
8914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargs2None(ParserTestCase):
8944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with 2 nargs followed by one with none"""
8954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs=2), Sig('bar')]
8974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a', 'a b', 'a b c d']
8984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
8994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo=['a', 'b'], bar='c')),
9004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
9014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsNoneZeroOrMore(ParserTestCase):
9044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with no nargs followed by one with unlimited"""
9054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo'), Sig('bar', nargs='*')]
9074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo']
9084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
9094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo='a', bar=[])),
9104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar=['b'])),
9114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo='a', bar=['b', 'c'])),
9124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
9134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsNoneOneOrMore(ParserTestCase):
9164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with no nargs followed by one with one or more"""
9174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo'), Sig('bar', nargs='+')]
9194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a']
9204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
9214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar=['b'])),
9224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo='a', bar=['b', 'c'])),
9234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
9244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsNoneOptional(ParserTestCase):
9274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with no nargs followed by one with an Optional"""
9284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo'), Sig('bar', nargs='?')]
9304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a b c']
9314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
9324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo='a', bar=None)),
9334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar='b')),
9344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
9354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsZeroOrMoreNone(ParserTestCase):
9384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with unlimited nargs followed by one with none"""
9394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='*'), Sig('bar')]
9414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo']
9424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
9434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo=[], bar='a')),
9444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo=['a'], bar='b')),
9454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo=['a', 'b'], bar='c')),
9464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
9474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsOneOrMoreNone(ParserTestCase):
9504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with one or more nargs followed by one with none"""
9514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='+'), Sig('bar')]
9534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a']
9544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
9554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo=['a'], bar='b')),
9564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo=['a', 'b'], bar='c')),
9574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
9584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsOptionalNone(ParserTestCase):
9614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with an Optional nargs followed by one with none"""
9624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='?', default=42), Sig('bar')]
9644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a b c']
9654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
9664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo=42, bar='a')),
9674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar='b')),
9684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
9694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargs2ZeroOrMore(ParserTestCase):
9724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with 2 nargs followed by one with unlimited"""
9734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='*')]
9754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a']
9764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
9774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo=['a', 'b'], bar=[])),
9784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
9794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
9804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargs2OneOrMore(ParserTestCase):
9834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with 2 nargs followed by one with one or more"""
9844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='+')]
9864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a', 'a b']
9874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
9884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
9894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
9904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargs2Optional(ParserTestCase):
9934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with 2 nargs followed by one optional"""
9944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='?')]
9964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a', 'a b c d']
9974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
9984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo=['a', 'b'], bar=None)),
9994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo=['a', 'b'], bar='c')),
10004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsZeroOrMore1(ParserTestCase):
10044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with unlimited nargs followed by one with 1"""
10054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='*'), Sig('bar', nargs=1)]
10074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', ]
10084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
10094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo=[], bar=['a'])),
10104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo=['a'], bar=['b'])),
10114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
10124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsOneOrMore1(ParserTestCase):
10164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with one or more nargs followed by one with 1"""
10174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='+'), Sig('bar', nargs=1)]
10194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a']
10204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
10214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo=['a'], bar=['b'])),
10224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
10234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsOptional1(ParserTestCase):
10274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a Positional with an Optional nargs followed by one with 1"""
10284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs=1)]
10304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a b c']
10314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
10324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo=None, bar=['a'])),
10334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar=['b'])),
10344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsNoneZeroOrMore1(ParserTestCase):
10384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test three Positionals: no nargs, unlimited nargs and 1 nargs"""
10394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
10414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('foo'),
10424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('bar', nargs='*'),
10434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('baz', nargs=1),
10444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a']
10464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
10474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar=[], baz=['b'])),
10484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo='a', bar=['b'], baz=['c'])),
10494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsNoneOneOrMore1(ParserTestCase):
10534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test three Positionals: no nargs, one or more nargs and 1 nargs"""
10544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
10564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('foo'),
10574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('bar', nargs='+'),
10584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('baz', nargs=1),
10594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a', 'b']
10614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
10624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo='a', bar=['b'], baz=['c'])),
10634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c d', NS(foo='a', bar=['b', 'c'], baz=['d'])),
10644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsNoneOptional1(ParserTestCase):
10684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test three Positionals: no nargs, optional narg and 1 nargs"""
10694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
10714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('foo'),
10724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('bar', nargs='?', default=0.625),
10734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('baz', nargs=1),
10744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a']
10764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
10774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar=0.625, baz=['b'])),
10784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo='a', bar='b', baz=['c'])),
10794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsOptionalOptional(ParserTestCase):
10834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test two optional nargs"""
10844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
10864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('foo', nargs='?'),
10874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('bar', nargs='?', default=42),
10884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--foo', 'a b c']
10904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
10914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foo=None, bar=42)),
10924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo='a', bar=42)),
10934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar='b')),
10944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
10954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsOptionalZeroOrMore(ParserTestCase):
10984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test an Optional narg followed by unlimited nargs"""
10994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs='*')]
11014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--foo']
11024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
11034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foo=None, bar=[])),
11044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo='a', bar=[])),
11054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar=['b'])),
11064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo='a', bar=['b', 'c'])),
11074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
11084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsNargsOptionalOneOrMore(ParserTestCase):
11114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test an Optional narg followed by one or more nargs"""
11124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs='+')]
11144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo']
11154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
11164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo=None, bar=['a'])),
11174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar=['b'])),
11184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(foo='a', bar=['b', 'c'])),
11194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
11204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsChoicesString(ParserTestCase):
11234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a set of single-character choices"""
11244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('spam', choices=set('abcdefg'))]
11264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'h', '42', 'ef']
11274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
11284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(spam='a')),
11294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('g', NS(spam='g')),
11304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
11314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsChoicesInt(ParserTestCase):
11344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a set of integer choices"""
11354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('spam', type=int, choices=range(20))]
11374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'h', '42', 'ef']
11384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
11394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('4', NS(spam=4)),
11404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('15', NS(spam=15)),
11414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
11424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsActionAppend(ParserTestCase):
11454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test the 'append' action"""
11464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
11484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', action='append'),
11494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', action='append', nargs=2),
11504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
11514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '--foo', 'a', 'a b', 'a b c d']
11524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
11534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b c', NS(spam=['a', ['b', 'c']])),
11544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
11554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ========================================
11574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Combined optionals and positionals tests
11584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ========================================
11594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsNumericAndPositionals(ParserTestCase):
11614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests negative number args when numeric options are present"""
11624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
11644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('x', nargs='?'),
11654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-4', dest='y', action='store_true'),
11664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
11674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-2', '-315']
11684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
11694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None, y=False)),
11704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(x='a', y=False)),
11714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-4', NS(x=None, y=True)),
11724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-4 a', NS(x='a', y=True)),
11734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
11744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsAlmostNumericAndPositionals(ParserTestCase):
11774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests negative number args when almost numeric options are present"""
11784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
11804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('x', nargs='?'),
11814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-k4', dest='y', action='store_true'),
11824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
11834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-k3']
11844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
11854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None, y=False)),
11864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-2', NS(x='-2', y=False)),
11874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(x='a', y=False)),
11884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-k4', NS(x=None, y=True)),
11894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-k4 a', NS(x='a', y=True)),
11904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
11914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestEmptyAndSpaceContainingArguments(ParserTestCase):
11944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
11964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('x', nargs='?'),
11974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-y', '--yyy', dest='y'),
11984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
11994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-y']
12004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
12014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ([''], NS(x='', y=None)),
12024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (['a badger'], NS(x='a badger', y=None)),
12034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (['-a badger'], NS(x='-a badger', y=None)),
12044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (['-y', ''], NS(x=None, y='')),
12054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (['-y', 'a badger'], NS(x=None, y='a badger')),
12064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (['-y', '-a badger'], NS(x=None, y='-a badger')),
12074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (['--yyy=a badger'], NS(x=None, y='a badger')),
12084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (['--yyy=-a badger'], NS(x=None, y='-a badger')),
12094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
12104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPrefixCharacterOnlyArguments(ParserTestCase):
12134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prefix_chars='-+')
12154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
12164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-', dest='x', nargs='?', const='badger'),
12174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('+', dest='y', type=int, default=42),
12184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-+-', dest='z', action='store_true'),
12194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
12204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-y', '+ -']
12214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
12224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None, y=42, z=False)),
12234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-', NS(x='badger', y=42, z=False)),
12244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('- X', NS(x='X', y=42, z=False)),
12254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('+ -3', NS(x=None, y=-3, z=False)),
12264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-+-', NS(x=None, y=42, z=True)),
12274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('- ===', NS(x='===', y=42, z=False)),
12284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
12294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestNargsZeroOrMore(ParserTestCase):
12324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests specifying an args for an Optional that accepts zero or more"""
12334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-x', nargs='*'), Sig('y', nargs='*')]
12354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = []
12364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
12374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None, y=[])),
12384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x', NS(x=[], y=[])),
12394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x a', NS(x=['a'], y=[])),
12404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x a -- b', NS(x=['a'], y=['b'])),
12414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(x=None, y=['a'])),
12424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a -x', NS(x=[], y=['a'])),
12434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a -x b', NS(x=['b'], y=['a'])),
12444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
12454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestNargsRemainder(ParserTestCase):
12484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests specifying a positional with nargs=REMAINDER"""
12494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('x'), Sig('y', nargs='...'), Sig('-z')]
12514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '-z', '-z Z']
12524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
12534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X', NS(x='X', y=[], z=None)),
12544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-z Z X', NS(x='X', y=[], z='Z')),
12554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X A B -z Z', NS(x='X', y=['A', 'B', '-z', 'Z'], z=None)),
12564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X Y --foo', NS(x='X', y=['Y', '--foo'], z=None)),
12574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
12584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionLike(ParserTestCase):
12614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests options that may or may not be arguments"""
12624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
12644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', type=float),
12654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-3', type=float, dest='y'),
12664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('z', nargs='*'),
12674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
12684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x', '-y2.5', '-xa', '-x -a',
12694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                '-x -3', '-x -3.5', '-3 -3.5',
12704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                '-x -2.5', '-x -2.5 a', '-3 -.5',
12714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                'a x -1', '-x -1 a', '-3 -1 a']
12724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
12734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None, y=None, z=[])),
12744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x 2.5', NS(x=2.5, y=None, z=[])),
12754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x 2.5 a', NS(x=2.5, y=None, z=['a'])),
12764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-3.5', NS(x=None, y=0.5, z=[])),
12774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-3-.5', NS(x=None, y=-0.5, z=[])),
12784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-3 .5', NS(x=None, y=0.5, z=[])),
12794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a -3.5', NS(x=None, y=0.5, z=['a'])),
12804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(x=None, y=None, z=['a'])),
12814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a -x 1', NS(x=1.0, y=None, z=['a'])),
12824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x 1 a', NS(x=1.0, y=None, z=['a'])),
12834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-3 1 a', NS(x=None, y=1.0, z=['a'])),
12844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
12854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestDefaultSuppress(ParserTestCase):
12884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test actions with suppressed defaults"""
12894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
12914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('foo', nargs='?', default=argparse.SUPPRESS),
12924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('bar', nargs='*', default=argparse.SUPPRESS),
12934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--baz', action='store_true', default=argparse.SUPPRESS),
12944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
12954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x']
12964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
12974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS()),
12984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo='a')),
12994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar=['b'])),
13004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz', NS(baz=True)),
13014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a --baz', NS(foo='a', baz=True)),
13024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
13034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
13044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestParserDefaultSuppress(ParserTestCase):
13074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test actions with a parser-level default of SUPPRESS"""
13084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(argument_default=argparse.SUPPRESS)
13104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
13114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('foo', nargs='?'),
13124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('bar', nargs='*'),
13134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--baz', action='store_true'),
13144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
13154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x']
13164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
13174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS()),
13184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo='a')),
13194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar=['b'])),
13204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz', NS(baz=True)),
13214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a --baz', NS(foo='a', baz=True)),
13224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
13234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
13244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestParserDefault42(ParserTestCase):
13274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test actions with a parser-level default of 42"""
13284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(argument_default=42, version='1.0')
13304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
13314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('foo', nargs='?'),
13324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('bar', nargs='*'),
13334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--baz', action='store_true'),
13344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
13354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x']
13364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
13374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foo=42, bar=42, baz=42)),
13384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a', NS(foo='a', bar=42, baz=42)),
13394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a b', NS(foo='a', bar=['b'], baz=42)),
13404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz', NS(foo=42, bar=42, baz=True)),
13414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a --baz', NS(foo='a', bar=42, baz=True)),
13424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
13434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
13444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestArgumentsFromFile(TempDirMixin, ParserTestCase):
13474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test reading arguments from a file"""
13484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
13504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        super(TestArgumentsFromFile, self).setUp()
13514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file_texts = [
13524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('hello', 'hello world!\n'),
13534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('recursive', '-a\n'
13544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          'A\n'
13554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          '@hello'),
13564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('invalid', '@no-such-path\n'),
13574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ]
13584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for path, text in file_texts:
13594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file = open(path, 'w')
13604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file.write(text)
13614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file.close()
13624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(fromfile_prefix_chars='@')
13644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
13654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-a'),
13664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('x'),
13674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('y', nargs='+'),
13684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
13694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['', '-b', 'X', '@invalid', '@missing']
13704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
13714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X Y', NS(a=None, x='X', y=['Y'])),
13724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X -a A Y Z', NS(a='A', x='X', y=['Y', 'Z'])),
13734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('@hello X', NS(a=None, x='hello world!', y=['X'])),
13744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X @hello', NS(a=None, x='X', y=['hello world!'])),
13754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-a B @recursive Y Z', NS(a='A', x='hello world!', y=['Y', 'Z'])),
13764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X @recursive Z -a B', NS(a='B', x='X', y=['hello world!', 'Z'])),
13774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (["-a", "", "X", "Y"], NS(a='', x='X', y=['Y'])),
13784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
13794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestArgumentsFromFileConverter(TempDirMixin, ParserTestCase):
13824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test reading arguments from a file"""
13834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
13854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        super(TestArgumentsFromFileConverter, self).setUp()
13864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file_texts = [
13874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('hello', 'hello world!\n'),
13884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ]
13894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for path, text in file_texts:
13904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file = open(path, 'w')
13914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file.write(text)
13924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file.close()
13934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class FromFileConverterArgumentParser(ErrorRaisingArgumentParser):
13954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def convert_arg_line_to_args(self, arg_line):
13974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for arg in arg_line.split():
13984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if not arg.strip():
13994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    continue
14004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                yield arg
14014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_class = FromFileConverterArgumentParser
14024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(fromfile_prefix_chars='@')
14034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
14044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('y', nargs='+'),
14054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
14064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = []
14074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
14084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('@hello X', NS(y=['hello', 'world!', 'X'])),
14094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
14104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =====================
14134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Type conversion tests
14144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =====================
14154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestFileTypeRepr(TestCase):
14174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_r(self):
14194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        type = argparse.FileType('r')
14204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual("FileType('r')", repr(type))
14214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_wb_1(self):
14234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        type = argparse.FileType('wb', 1)
14244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual("FileType('wb', 1)", repr(type))
14254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass RFile(object):
14284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    seen = {}
14294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, name):
14314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.name = name
14324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __hash__ = None
14344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __eq__(self, other):
14364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if other in self.seen:
14374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            text = self.seen[other]
14384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
14394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            text = self.seen[other] = other.read()
14404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            other.close()
14414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not isinstance(text, str):
14424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            text = text.decode('ascii')
14434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.name == other.name == text
14444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestFileTypeR(TempDirMixin, ParserTestCase):
14474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test the FileType option/argument type for reading files"""
14484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
14504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        super(TestFileTypeR, self).setUp()
14514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for file_name in ['foo', 'bar']:
14524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file = open(os.path.join(self.temp_dir, file_name), 'w')
14534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file.write(file_name)
14544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file.close()
14554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.create_readonly_file('readonly')
14564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
14584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', type=argparse.FileType()),
14594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', type=argparse.FileType('r')),
14604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
14614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x', '-x bar', 'non-existent-file.txt']
14624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
14634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('foo', NS(x=None, spam=RFile('foo'))),
14644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
14654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
14664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x - -', NS(x=sys.stdin, spam=sys.stdin)),
14674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('readonly', NS(x=None, spam=RFile('readonly'))),
14684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
14694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestFileTypeDefaults(TempDirMixin, ParserTestCase):
14714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that a file is not created unless the default is needed"""
14724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
14734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        super(TestFileTypeDefaults, self).setUp()
14744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file = open(os.path.join(self.temp_dir, 'good'), 'w')
14754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file.write('good')
14764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file.close()
14774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
14794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-c', type=argparse.FileType('r'), default='no-file.txt'),
14804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
14814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # should provoke no such file error
14824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['']
14834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # should not provoke error because default file is created
14844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [('-c good', NS(c=RFile('good')))]
14854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestFileTypeRB(TempDirMixin, ParserTestCase):
14884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test the FileType option/argument type for reading files"""
14894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
14914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        super(TestFileTypeRB, self).setUp()
14924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for file_name in ['foo', 'bar']:
14934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file = open(os.path.join(self.temp_dir, file_name), 'w')
14944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file.write(file_name)
14954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file.close()
14964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
14984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', type=argparse.FileType('rb')),
14994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', type=argparse.FileType('rb')),
15004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
15014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x', '-x bar']
15024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
15034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('foo', NS(x=None, spam=RFile('foo'))),
15044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
15054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
15064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x - -', NS(x=sys.stdin, spam=sys.stdin)),
15074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
15084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass WFile(object):
15114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    seen = set()
15124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, name):
15144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.name = name
15154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __hash__ = None
15174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __eq__(self, other):
15194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if other not in self.seen:
15204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            text = 'Check that file is writable.'
15214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if 'b' in other.mode:
15224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                text = text.encode('ascii')
15234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            other.write(text)
15244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            other.close()
15254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.seen.add(other)
15264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.name == other.name
15274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao@unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0,
15304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 "non-root user required")
15314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestFileTypeW(TempDirMixin, ParserTestCase):
15324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test the FileType option/argument type for writing files"""
15334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
15354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        super(TestFileTypeW, self).setUp()
15364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.create_readonly_file('readonly')
15374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
15394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', type=argparse.FileType('w')),
15404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', type=argparse.FileType('w')),
15414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
15424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x', '-x bar']
15434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x', '-x bar', 'readonly']
15444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
15454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('foo', NS(x=None, spam=WFile('foo'))),
15464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
15474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))),
15484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x - -', NS(x=sys.stdout, spam=sys.stdout)),
15494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
15504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestFileTypeWB(TempDirMixin, ParserTestCase):
15534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
15554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', type=argparse.FileType('wb')),
15564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', type=argparse.FileType('wb')),
15574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
15584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x', '-x bar']
15594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
15604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('foo', NS(x=None, spam=WFile('foo'))),
15614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
15624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))),
15634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x - -', NS(x=sys.stdout, spam=sys.stdout)),
15644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
15654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestTypeCallable(ParserTestCase):
15684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test some callables as option/argument types"""
15694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
15714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--eggs', type=complex),
15724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', type=float),
15734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
15744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['a', '42j', '--eggs a', '--eggs 2i']
15754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
15764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--eggs=42 42', NS(eggs=42, spam=42.0)),
15774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--eggs 2j -- -1.5', NS(eggs=2j, spam=-1.5)),
15784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('1024.675', NS(eggs=None, spam=1024.675)),
15794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
15804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestTypeUserDefined(ParserTestCase):
15834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a user-defined option/argument type"""
15844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class MyType(TestCase):
15864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __init__(self, value):
15884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.value = value
15894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        __hash__ = None
15914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __eq__(self, other):
15934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return (type(self), self.value) == (type(other), other.value)
15944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
15964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', type=MyType),
15974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', type=MyType),
15984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
15994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = []
16004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
16014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a -x b', NS(x=MyType('b'), spam=MyType('a'))),
16024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-xf g', NS(x=MyType('f'), spam=MyType('g'))),
16034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
16044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestTypeClassicClass(ParserTestCase):
16074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a classic class type"""
16084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class C:
16104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __init__(self, value):
16124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.value = value
16134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        __hash__ = None
16154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __eq__(self, other):
16174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return (type(self), self.value) == (type(other), other.value)
16184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
16204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', type=C),
16214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', type=C),
16224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
16234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = []
16244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
16254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('a -x b', NS(x=C('b'), spam=C('a'))),
16264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-xf g', NS(x=C('f'), spam=C('g'))),
16274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
16284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestTypeRegistration(TestCase):
16314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a user-defined type by registering it"""
16324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test(self):
16344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get_my_type(string):
16364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 'my_type{%s}' % string
16374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
16394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.register('type', 'my_type', get_my_type)
16404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-x', type='my_type')
16414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('y', type='my_type')
16424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.parse_args('1'.split()),
16444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         NS(x=None, y='my_type{1}'))
16454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.parse_args('-x 1 42'.split()),
16464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         NS(x='my_type{1}', y='my_type{42}'))
16474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ============
16504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Action tests
16514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ============
16524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestActionUserDefined(ParserTestCase):
16544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a user-defined option/argument action"""
16554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class OptionalAction(argparse.Action):
16574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __call__(self, parser, namespace, value, option_string=None):
16594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
16604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # check destination and option string
16614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                assert self.dest == 'spam', 'dest: %s' % self.dest
16624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                assert option_string == '-s', 'flag: %s' % option_string
16634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # when option is before argument, badger=2, and when
16644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # option is after argument, badger=<whatever was set>
16654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                expected_ns = NS(spam=0.25)
16664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if value in [0.125, 0.625]:
16674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    expected_ns.badger = 2
16684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                elif value in [2.0]:
16694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    expected_ns.badger = 84
16704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
16714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raise AssertionError('value: %s' % value)
16724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                assert expected_ns == namespace, ('expected %s, got %s' %
16734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                  (expected_ns, namespace))
16744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except AssertionError:
16754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                e = sys.exc_info()[1]
16764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise ArgumentParserError('opt_action failed: %s' % e)
16774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            setattr(namespace, 'spam', value)
16784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class PositionalAction(argparse.Action):
16804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __call__(self, parser, namespace, value, option_string=None):
16824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
16834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                assert option_string is None, ('option_string: %s' %
16844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                               option_string)
16854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # check destination
16864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                assert self.dest == 'badger', 'dest: %s' % self.dest
16874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # when argument is before option, spam=0.25, and when
16884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # option is after argument, spam=<whatever was set>
16894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                expected_ns = NS(badger=2)
16904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if value in [42, 84]:
16914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    expected_ns.spam = 0.25
16924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                elif value in [1]:
16934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    expected_ns.spam = 0.625
16944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                elif value in [2]:
16954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    expected_ns.spam = 0.125
16964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
16974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raise AssertionError('value: %s' % value)
16984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                assert expected_ns == namespace, ('expected %s, got %s' %
16994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                  (expected_ns, namespace))
17004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except AssertionError:
17014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                e = sys.exc_info()[1]
17024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise ArgumentParserError('arg_action failed: %s' % e)
17034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            setattr(namespace, 'badger', value)
17044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
17064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-s', dest='spam', action=OptionalAction,
17074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            type=float, default=0.25),
17084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('badger', action=PositionalAction,
17094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            type=int, nargs='?', default=2),
17104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
17114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = []
17124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
17134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-s0.125', NS(spam=0.125, badger=2)),
17144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('42', NS(spam=0.25, badger=42)),
17154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-s 0.625 1', NS(spam=0.625, badger=1)),
17164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('84 -s2', NS(spam=2.0, badger=84)),
17174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
17184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestActionRegistration(TestCase):
17214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a user-defined action supplied by registering it"""
17224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class MyAction(argparse.Action):
17244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __call__(self, parser, namespace, values, option_string=None):
17264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            setattr(namespace, self.dest, 'foo[%s]' % values)
17274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test(self):
17294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
17314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.register('action', 'my_action', self.MyAction)
17324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('badger', action='my_action')
17334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.parse_args(['1']), NS(badger='foo[1]'))
17354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.parse_args(['42']), NS(badger='foo[42]'))
17364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ================
17394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Subparsers tests
17404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ================
17414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestAddSubparsers(TestCase):
17434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test the add_subparsers method"""
17444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertArgumentParserError(self, *args, **kwargs):
17464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ArgumentParserError, *args, **kwargs)
17474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _get_parser(self, subparser_help=False, prefix_chars=None):
17494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # create a parser with a subparsers argument
17504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if prefix_chars:
17514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser = ErrorRaisingArgumentParser(
17524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                prog='PROG', description='main description', prefix_chars=prefix_chars)
17534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.add_argument(
17544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                prefix_chars[0] * 2 + 'foo', action='store_true', help='foo help')
17554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
17564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser = ErrorRaisingArgumentParser(
17574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                prog='PROG', description='main description')
17584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.add_argument(
17594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                '--foo', action='store_true', help='foo help')
17604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument(
17614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'bar', type=float, help='bar help')
17624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check that only one subparsers argument can be added
17644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        subparsers = parser.add_subparsers(help='command help')
17654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parser.add_subparsers)
17664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # add first sub-parser
17684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser1_kwargs = dict(description='1 description')
17694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if subparser_help:
17704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser1_kwargs['help'] = '1 help'
17714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser1 = subparsers.add_parser('1', **parser1_kwargs)
17724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser1.add_argument('-w', type=int, help='w help')
17734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser1.add_argument('x', choices='abc', help='x help')
17744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # add second sub-parser
17764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser2_kwargs = dict(description='2 description')
17774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if subparser_help:
17784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser2_kwargs['help'] = '2 help'
17794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser2 = subparsers.add_parser('2', **parser2_kwargs)
17804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser2.add_argument('-y', choices='123', help='y help')
17814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser2.add_argument('z', type=complex, nargs='*', help='z help')
17824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # add third sub-parser
17844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser3_kwargs = dict(description='3 description')
17854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if subparser_help:
17864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser3_kwargs['help'] = '3 help'
17874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser3 = subparsers.add_parser('3', **parser3_kwargs)
17884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser3.add_argument('t', type=int, help='t help')
17894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser3.add_argument('u', nargs='...', help='u help')
17904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # return the main parser
17924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return parser
17934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
17954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        super(TestAddSubparsers, self).setUp()
17964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.parser = self._get_parser()
17974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.command_help_parser = self._get_parser(subparser_help=True)
17984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parse_args_failures(self):
18004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check some failure cases:
18014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for args_str in ['', 'a', 'a a', '0.5 a', '0.5 1',
18024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         '0.5 1 -y', '0.5 2 -w']:
18034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            args = args_str.split()
18044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertArgumentParserError(self.parser.parse_args, args)
18054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parse_args(self):
18074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check some non-failure cases:
18084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
18094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.parser.parse_args('0.5 1 b -w 7'.split()),
18104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            NS(foo=False, bar=0.5, w=7, x='b'),
18114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
18124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
18134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.parser.parse_args('0.25 --foo 2 -y 2 3j -- -1j'.split()),
18144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            NS(foo=True, bar=0.25, y='2', z=[3j, -1j]),
18154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
18164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
18174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.parser.parse_args('--foo 0.125 1 c'.split()),
18184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            NS(foo=True, bar=0.125, w=None, x='c'),
18194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
18204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
18214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.parser.parse_args('-1.5 3 11 -- a --foo 7 -- b'.split()),
18224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            NS(foo=False, bar=-1.5, t=11, u=['a', '--foo', '7', '--', 'b']),
18234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
18244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parse_known_args(self):
18264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
18274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.parser.parse_known_args('0.5 1 b -w 7'.split()),
18284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (NS(foo=False, bar=0.5, w=7, x='b'), []),
18294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
18304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
18314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.parser.parse_known_args('0.5 -p 1 b -w 7'.split()),
18324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (NS(foo=False, bar=0.5, w=7, x='b'), ['-p']),
18334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
18344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
18354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.parser.parse_known_args('0.5 1 b -w 7 -p'.split()),
18364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (NS(foo=False, bar=0.5, w=7, x='b'), ['-p']),
18374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
18384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
18394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.parser.parse_known_args('0.5 1 b -q -rs -w 7'.split()),
18404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (NS(foo=False, bar=0.5, w=7, x='b'), ['-q', '-rs']),
18414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
18424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
18434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.parser.parse_known_args('0.5 -W 1 b -X Y -w 7 Z'.split()),
18444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (NS(foo=False, bar=0.5, w=7, x='b'), ['-W', '-X', 'Y', 'Z']),
18454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
18464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_dest(self):
18484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
18494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--foo', action='store_true')
18504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        subparsers = parser.add_subparsers(dest='bar')
18514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser1 = subparsers.add_parser('1')
18524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser1.add_argument('baz')
18534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(foo=False, bar='1', baz='2'),
18544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args('1 2'.split()))
18554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_help(self):
18574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.parser.format_usage(),
18584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         'usage: PROG [-h] [--foo] bar {1,2,3} ...\n')
18594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.parser.format_help(), textwrap.dedent('''\
18604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: PROG [-h] [--foo] bar {1,2,3} ...
18614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            main description
18634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            positional arguments:
18654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              bar         bar help
18664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              {1,2,3}     command help
18674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
18694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -h, --help  show this help message and exit
18704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              --foo       foo help
18714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '''))
18724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_help_extra_prefix_chars(self):
18744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Make sure - is still used for help if it is a non-first prefix char
18754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = self._get_parser(prefix_chars='+:-')
18764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.format_usage(),
18774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         'usage: PROG [-h] [++foo] bar {1,2,3} ...\n')
18784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.format_help(), textwrap.dedent('''\
18794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: PROG [-h] [++foo] bar {1,2,3} ...
18804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            main description
18824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            positional arguments:
18844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              bar         bar help
18854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              {1,2,3}     command help
18864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
18884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -h, --help  show this help message and exit
18894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              ++foo       foo help
18904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '''))
18914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_help_alternate_prefix_chars(self):
18944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = self._get_parser(prefix_chars='+:/')
18954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.format_usage(),
18964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         'usage: PROG [+h] [++foo] bar {1,2,3} ...\n')
18974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.format_help(), textwrap.dedent('''\
18984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: PROG [+h] [++foo] bar {1,2,3} ...
18994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            main description
19014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            positional arguments:
19034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              bar         bar help
19044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              {1,2,3}     command help
19054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
19074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              +h, ++help  show this help message and exit
19084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              ++foo       foo help
19094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '''))
19104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parser_command_help(self):
19124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.command_help_parser.format_usage(),
19134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         'usage: PROG [-h] [--foo] bar {1,2,3} ...\n')
19144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.command_help_parser.format_help(),
19154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         textwrap.dedent('''\
19164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: PROG [-h] [--foo] bar {1,2,3} ...
19174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            main description
19194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            positional arguments:
19214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              bar         bar help
19224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              {1,2,3}     command help
19234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                1         1 help
19244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                2         2 help
19254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                3         3 help
19264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
19284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -h, --help  show this help message and exit
19294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              --foo       foo help
19304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '''))
19314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_subparser_title_help(self):
19334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PROG',
19344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                            description='main description')
19354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--foo', action='store_true', help='foo help')
19364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('bar', help='bar help')
19374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        subparsers = parser.add_subparsers(title='subcommands',
19384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                           description='command help',
19394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                           help='additional text')
19404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser1 = subparsers.add_parser('1')
19414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser2 = subparsers.add_parser('2')
19424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.format_usage(),
19434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         'usage: PROG [-h] [--foo] bar {1,2} ...\n')
19444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.format_help(), textwrap.dedent('''\
19454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: PROG [-h] [--foo] bar {1,2} ...
19464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            main description
19484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            positional arguments:
19504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              bar         bar help
19514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
19534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -h, --help  show this help message and exit
19544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              --foo       foo help
19554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            subcommands:
19574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              command help
19584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              {1,2}       additional text
19604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '''))
19614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _test_subparser_help(self, args_str, expected_help):
19634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
19644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.parser.parse_args(args_str.split())
19654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ArgumentParserError:
19664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            err = sys.exc_info()[1]
19674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if err.stdout != expected_help:
19684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print(repr(expected_help))
19694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print(repr(err.stdout))
19704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(err.stdout, expected_help)
19714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_subparser1_help(self):
19734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._test_subparser_help('5.0 1 -h', textwrap.dedent('''\
19744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: PROG bar 1 [-h] [-w W] {a,b,c}
19754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            1 description
19774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            positional arguments:
19794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              {a,b,c}     x help
19804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
19824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -h, --help  show this help message and exit
19834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -w W        w help
19844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '''))
19854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_subparser2_help(self):
19874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._test_subparser_help('5.0 2 -h', textwrap.dedent('''\
19884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: PROG bar 2 [-h] [-y {1,2,3}] [z [z ...]]
19894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            2 description
19914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            positional arguments:
19934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              z           z help
19944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
19964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -h, --help  show this help message and exit
19974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -y {1,2,3}  y help
19984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '''))
19994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ============
20014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Groups tests
20024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ============
20034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestPositionalsGroups(TestCase):
20054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests that order of group positionals matches construction order"""
20064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nongroup_first(self):
20084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
20094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('foo')
20104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_argument_group('g')
20114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('bar')
20124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('baz')
20134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expected = NS(foo='1', bar='2', baz='3')
20144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result = parser.parse_args('1 2 3'.split())
20154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(expected, result)
20164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_group_first(self):
20184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
20194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_argument_group('xxx')
20204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('foo')
20214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('bar')
20224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('baz')
20234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expected = NS(foo='1', bar='2', baz='3')
20244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result = parser.parse_args('1 2 3'.split())
20254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(expected, result)
20264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_interleaved_groups(self):
20284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
20294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_argument_group('xxx')
20304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('foo')
20314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('bar')
20324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('baz')
20334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_argument_group('yyy')
20344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('frell')
20354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expected = NS(foo='1', bar='2', baz='3', frell='4')
20364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result = parser.parse_args('1 2 3 4'.split())
20374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(expected, result)
20384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ===================
20404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Parent parser tests
20414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ===================
20424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestParentParsers(TestCase):
20444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests that parsers can be created with parent parsers"""
20454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertArgumentParserError(self, *args, **kwargs):
20474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ArgumentParserError, *args, **kwargs)
20484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
20504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        super(TestParentParsers, self).setUp()
20514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.wxyz_parent = ErrorRaisingArgumentParser(add_help=False)
20524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.wxyz_parent.add_argument('--w')
20534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x_group = self.wxyz_parent.add_argument_group('x')
20544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x_group.add_argument('-y')
20554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.wxyz_parent.add_argument('z')
20564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.abcd_parent = ErrorRaisingArgumentParser(add_help=False)
20584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.abcd_parent.add_argument('a')
20594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.abcd_parent.add_argument('-b')
20604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c_group = self.abcd_parent.add_argument_group('c')
20614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c_group.add_argument('--d')
20624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.w_parent = ErrorRaisingArgumentParser(add_help=False)
20644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.w_parent.add_argument('--w')
20654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.z_parent = ErrorRaisingArgumentParser(add_help=False)
20674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.z_parent.add_argument('z')
20684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # parents with mutually exclusive groups
20704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ab_mutex_parent = ErrorRaisingArgumentParser(add_help=False)
20714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = self.ab_mutex_parent.add_mutually_exclusive_group()
20724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('-a', action='store_true')
20734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('-b', action='store_true')
20744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.main_program = os.path.basename(sys.argv[0])
20764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_single_parent(self):
20784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(parents=[self.wxyz_parent])
20794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.parse_args('-y 1 2 --w 3'.split()),
20804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         NS(w='3', y='1', z='2'))
20814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_single_parent_mutex(self):
20834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._test_mutex_ab(self.ab_mutex_parent.parse_args)
20844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(parents=[self.ab_mutex_parent])
20854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._test_mutex_ab(parser.parse_args)
20864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_single_granparent_mutex(self):
20884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parents = [self.ab_mutex_parent]
20894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(add_help=False, parents=parents)
20904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(parents=[parser])
20914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._test_mutex_ab(parser.parse_args)
20924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _test_mutex_ab(self, parse_args):
20944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parse_args([]), NS(a=False, b=False))
20954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parse_args(['-a']), NS(a=True, b=False))
20964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parse_args(['-b']), NS(a=False, b=True))
20974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parse_args, ['-a', '-b'])
20984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parse_args, ['-b', '-a'])
20994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parse_args, ['-c'])
21004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parse_args, ['-a', '-c'])
21014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parse_args, ['-b', '-c'])
21024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_multiple_parents(self):
21044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parents = [self.abcd_parent, self.wxyz_parent]
21054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(parents=parents)
21064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.parse_args('--d 1 --w 2 3 4'.split()),
21074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         NS(a='3', b=None, d='1', w='2', y=None, z='4'))
21084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_multiple_parents_mutex(self):
21104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parents = [self.ab_mutex_parent, self.wxyz_parent]
21114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(parents=parents)
21124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.parse_args('-a --w 2 3'.split()),
21134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         NS(a=True, b=False, w='2', y=None, z='3'))
21144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(
21154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.parse_args, '-a --w 2 3 -b'.split())
21164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(
21174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.parse_args, '-a -b --w 2 3'.split())
21184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_conflicting_parents(self):
21204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(
21214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            argparse.ArgumentError,
21224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            argparse.ArgumentParser,
21234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parents=[self.w_parent, self.wxyz_parent])
21244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_conflicting_parents_mutex(self):
21264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(
21274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            argparse.ArgumentError,
21284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            argparse.ArgumentParser,
21294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parents=[self.abcd_parent, self.ab_mutex_parent])
21304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_same_argument_name_parents(self):
21324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parents = [self.wxyz_parent, self.z_parent]
21334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(parents=parents)
21344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.parse_args('1 2'.split()),
21354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         NS(w=None, y=None, z='2'))
21364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_subparser_parents(self):
21384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
21394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        subparsers = parser.add_subparsers()
21404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        abcde_parser = subparsers.add_parser('bar', parents=[self.abcd_parent])
21414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        abcde_parser.add_argument('e')
21424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.parse_args('bar -b 1 --d 2 3 4'.split()),
21434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         NS(a='3', b='1', d='2', e='4'))
21444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_subparser_parents_mutex(self):
21464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
21474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        subparsers = parser.add_subparsers()
21484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parents = [self.ab_mutex_parent]
21494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        abc_parser = subparsers.add_parser('foo', parents=parents)
21504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c_group = abc_parser.add_argument_group('c_group')
21514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c_group.add_argument('c')
21524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parents = [self.wxyz_parent, self.ab_mutex_parent]
21534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        wxyzabe_parser = subparsers.add_parser('bar', parents=parents)
21544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        wxyzabe_parser.add_argument('e')
21554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.parse_args('foo -a 4'.split()),
21564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         NS(a=True, b=False, c='4'))
21574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.parse_args('bar -b  --w 2 3 4'.split()),
21584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         NS(a=False, b=True, w='2', y=None, z='3', e='4'))
21594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(
21604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.parse_args, 'foo -a -b 4'.split())
21614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(
21624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.parse_args, 'bar -b -a 4'.split())
21634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parent_help(self):
21654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parents = [self.abcd_parent, self.wxyz_parent]
21664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(parents=parents)
21674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser_help = parser.format_help()
21684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        progname = self.main_program
21694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser_help, textwrap.dedent('''\
21704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: {}{}[-h] [-b B] [--d D] [--w W] [-y Y] a z
21714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            positional arguments:
21734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              a
21744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              z
21754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
21774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -h, --help  show this help message and exit
21784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -b B
21794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              --w W
21804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c:
21824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              --d D
21834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x:
21854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -y Y
21864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''.format(progname, ' ' if progname else '' )))
21874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_groups_parents(self):
21894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parent = ErrorRaisingArgumentParser(add_help=False)
21904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        g = parent.add_argument_group(title='g', description='gd')
21914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        g.add_argument('-w')
21924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        g.add_argument('-x')
21934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m = parent.add_mutually_exclusive_group()
21944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m.add_argument('-y')
21954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m.add_argument('-z')
21964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(parents=[parent])
21974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
21984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ArgumentParserError, parser.parse_args,
21994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ['-y', 'Y', '-z', 'Z'])
22004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser_help = parser.format_help()
22024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        progname = self.main_program
22034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser_help, textwrap.dedent('''\
22044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: {}{}[-h] [-w W] [-x X] [-y Y | -z Z]
22054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
22074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -h, --help  show this help message and exit
22084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -y Y
22094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -z Z
22104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            g:
22124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              gd
22134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -w W
22154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -x X
22164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''.format(progname, ' ' if progname else '' )))
22174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ==============================
22194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Mutually exclusive group tests
22204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ==============================
22214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveGroupErrors(TestCase):
22234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_invalid_add_argument_group(self):
22254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
22264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raises = self.assertRaises
22274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raises(TypeError, parser.add_mutually_exclusive_group, title='foo')
22284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_invalid_add_argument(self):
22304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
22314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_mutually_exclusive_group()
22324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        add_argument = group.add_argument
22334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raises = self.assertRaises
22344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raises(ValueError, add_argument, '--foo', required=True)
22354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raises(ValueError, add_argument, 'bar')
22364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raises(ValueError, add_argument, 'bar', nargs='+')
22374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raises(ValueError, add_argument, 'bar', nargs=1)
22384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raises(ValueError, add_argument, 'bar', nargs=argparse.PARSER)
22394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_help(self):
22414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PROG')
22424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group1 = parser.add_mutually_exclusive_group()
22434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group1.add_argument('--foo', action='store_true')
22444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group1.add_argument('--bar', action='store_false')
22454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group2 = parser.add_mutually_exclusive_group()
22464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group2.add_argument('--soup', action='store_true')
22474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group2.add_argument('--nuts', action='store_false')
22484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expected = '''\
22494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: PROG [-h] [--foo | --bar] [--soup | --nuts]
22504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
22524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -h, --help  show this help message and exit
22534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              --foo
22544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              --bar
22554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              --soup
22564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              --nuts
22574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              '''
22584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.format_help(), textwrap.dedent(expected))
22594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MEMixin(object):
22614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_failures_when_not_required(self):
22634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parse_args = self.get_parser(required=False).parse_args
22644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        error = ArgumentParserError
22654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for args_string in self.failures:
22664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(error, parse_args, args_string.split())
22674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_failures_when_required(self):
22694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parse_args = self.get_parser(required=True).parse_args
22704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        error = ArgumentParserError
22714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for args_string in self.failures + ['']:
22724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(error, parse_args, args_string.split())
22734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_successes_when_not_required(self):
22754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parse_args = self.get_parser(required=False).parse_args
22764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        successes = self.successes + self.successes_when_not_required
22774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for args_string, expected_ns in successes:
22784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            actual_ns = parse_args(args_string.split())
22794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(actual_ns, expected_ns)
22804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_successes_when_required(self):
22824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parse_args = self.get_parser(required=True).parse_args
22834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for args_string, expected_ns in self.successes:
22844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            actual_ns = parse_args(args_string.split())
22854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(actual_ns, expected_ns)
22864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_usage_when_not_required(self):
22884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        format_usage = self.get_parser(required=False).format_usage
22894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expected_usage = self.usage_when_not_required
22904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(format_usage(), textwrap.dedent(expected_usage))
22914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_usage_when_required(self):
22934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        format_usage = self.get_parser(required=True).format_usage
22944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expected_usage = self.usage_when_required
22954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(format_usage(), textwrap.dedent(expected_usage))
22964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
22974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_help_when_not_required(self):
22984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        format_help = self.get_parser(required=False).format_help
22994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        help = self.usage_when_not_required + self.help
23004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(format_help(), textwrap.dedent(help))
23014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_help_when_required(self):
23034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        format_help = self.get_parser(required=True).format_help
23044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        help = self.usage_when_required + self.help
23054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(format_help(), textwrap.dedent(help))
23064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveSimple(MEMixin, TestCase):
23094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_parser(self, required=None):
23114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PROG')
23124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_mutually_exclusive_group(required=required)
23134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('--bar', help='bar help')
23144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('--baz', nargs='?', const='Z', help='baz help')
23154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return parser
23164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--bar X --baz Y', '--bar X --baz']
23184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
23194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--bar X', NS(bar='X', baz=None)),
23204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--bar X --bar Z', NS(bar='Z', baz=None)),
23214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz Y', NS(bar=None, baz='Y')),
23224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz', NS(bar=None, baz='Z')),
23234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
23244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes_when_not_required = [
23254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(bar=None, baz=None)),
23264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
23274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_not_required = '''\
23294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [--bar BAR | --baz [BAZ]]
23304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
23314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_required = '''\
23324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] (--bar BAR | --baz [BAZ])
23334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
23344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = '''\
23354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
23374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help   show this help message and exit
23384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --bar BAR    bar help
23394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --baz [BAZ]  baz help
23404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
23414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveLong(MEMixin, TestCase):
23444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_parser(self, required=None):
23464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PROG')
23474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--abcde', help='abcde help')
23484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--fghij', help='fghij help')
23494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_mutually_exclusive_group(required=required)
23504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('--klmno', help='klmno help')
23514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('--pqrst', help='pqrst help')
23524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return parser
23534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--klmno X --pqrst Y']
23554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
23564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--klmno X', NS(abcde=None, fghij=None, klmno='X', pqrst=None)),
23574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--abcde Y --klmno X',
23584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            NS(abcde='Y', fghij=None, klmno='X', pqrst=None)),
23594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--pqrst X', NS(abcde=None, fghij=None, klmno=None, pqrst='X')),
23604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--pqrst X --fghij Y',
23614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            NS(abcde=None, fghij='Y', klmno=None, pqrst='X')),
23624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
23634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes_when_not_required = [
23644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(abcde=None, fghij=None, klmno=None, pqrst=None)),
23654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
23664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_not_required = '''\
23684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
23694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                [--klmno KLMNO | --pqrst PQRST]
23704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
23714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_required = '''\
23724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
23734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                (--klmno KLMNO | --pqrst PQRST)
23744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
23754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = '''\
23764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    optional arguments:
23784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      -h, --help     show this help message and exit
23794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      --abcde ABCDE  abcde help
23804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      --fghij FGHIJ  fghij help
23814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      --klmno KLMNO  klmno help
23824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      --pqrst PQRST  pqrst help
23834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
23844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveFirstSuppressed(MEMixin, TestCase):
23874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_parser(self, required):
23894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PROG')
23904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_mutually_exclusive_group(required=required)
23914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('-x', help=argparse.SUPPRESS)
23924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('-y', action='store_false', help='y help')
23934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return parser
23944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
23954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-x X -y']
23964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
23974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x X', NS(x='X', y=True)),
23984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x X -x Y', NS(x='Y', y=True)),
23994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y', NS(x=None, y=False)),
24004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
24014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes_when_not_required = [
24024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(x=None, y=True)),
24034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
24044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_not_required = '''\
24064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-y]
24074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
24084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_required = '''\
24094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] -y
24104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
24114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = '''\
24124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
24144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
24154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y          y help
24164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
24174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveManySuppressed(MEMixin, TestCase):
24204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_parser(self, required):
24224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PROG')
24234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_mutually_exclusive_group(required=required)
24244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        add = group.add_argument
24254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        add('--spam', action='store_true', help=argparse.SUPPRESS)
24264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        add('--badger', action='store_false', help=argparse.SUPPRESS)
24274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        add('--bladder', help=argparse.SUPPRESS)
24284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return parser
24294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = [
24314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '--spam --badger',
24324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '--badger --bladder B',
24334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '--bladder B --spam',
24344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
24354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
24364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--spam', NS(spam=True, badger=True, bladder=None)),
24374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--badger', NS(spam=False, badger=False, bladder=None)),
24384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--bladder B', NS(spam=False, badger=True, bladder='B')),
24394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--spam --spam', NS(spam=True, badger=True, bladder=None)),
24404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
24414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes_when_not_required = [
24424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(spam=False, badger=True, bladder=None)),
24434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
24444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_required = usage_when_not_required = '''\
24464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h]
24474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
24484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = '''\
24494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
24514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
24524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
24534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveOptionalAndPositional(MEMixin, TestCase):
24564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_parser(self, required):
24584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PROG')
24594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_mutually_exclusive_group(required=required)
24604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('--foo', action='store_true', help='FOO')
24614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('--spam', help='SPAM')
24624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('badger', nargs='*', default='X', help='BADGER')
24634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return parser
24644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = [
24664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '--foo --spam S',
24674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '--spam S X',
24684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'X --foo',
24694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'X Y Z --spam S',
24704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '--foo X Y',
24714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
24724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
24734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--foo', NS(foo=True, spam=None, badger='X')),
24744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--spam S', NS(foo=False, spam='S', badger='X')),
24754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X', NS(foo=False, spam=None, badger=['X'])),
24764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X Y Z', NS(foo=False, spam=None, badger=['X', 'Y', 'Z'])),
24774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
24784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes_when_not_required = [
24794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(foo=False, spam=None, badger='X')),
24804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
24814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_not_required = '''\
24834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [--foo | --spam SPAM | badger [badger ...]]
24844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
24854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_required = '''\
24864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] (--foo | --spam SPAM | badger [badger ...])
24874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
24884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = '''\
24894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
24914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          badger       BADGER
24924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
24944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help   show this help message and exit
24954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo        FOO
24964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --spam SPAM  SPAM
24974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
24984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
24994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveOptionalsMixed(MEMixin, TestCase):
25014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_parser(self, required):
25034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PROG')
25044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-x', action='store_true', help='x help')
25054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_mutually_exclusive_group(required=required)
25064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('-a', action='store_true', help='a help')
25074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('-b', action='store_true', help='b help')
25084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-y', action='store_true', help='y help')
25094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('-c', action='store_true', help='c help')
25104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return parser
25114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['-a -b', '-b -c', '-a -c', '-a -b -c']
25134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
25144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-a', NS(a=True, b=False, c=False, x=False, y=False)),
25154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-b', NS(a=False, b=True, c=False, x=False, y=False)),
25164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-c', NS(a=False, b=False, c=True, x=False, y=False)),
25174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-a -x', NS(a=True, b=False, c=False, x=True, y=False)),
25184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y -b', NS(a=False, b=True, c=False, x=False, y=True)),
25194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x -y -c', NS(a=False, b=False, c=True, x=True, y=True)),
25204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
25214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes_when_not_required = [
25224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(a=False, b=False, c=False, x=False, y=False)),
25234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-x', NS(a=False, b=False, c=False, x=True, y=False)),
25244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('-y', NS(a=False, b=False, c=False, x=False, y=True)),
25254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
25264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_required = usage_when_not_required = '''\
25284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-x] [-a] [-b] [-y] [-c]
25294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
25304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = '''\
25314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
25334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
25344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x          x help
25354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -a          a help
25364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -b          b help
25374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y          y help
25384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -c          c help
25394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
25404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveInGroup(MEMixin, TestCase):
25434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_parser(self, required=None):
25454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PROG')
25464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        titled_group = parser.add_argument_group(
25474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            title='Titled group', description='Group description')
25484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mutex_group = \
25494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            titled_group.add_mutually_exclusive_group(required=required)
25504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mutex_group.add_argument('--bar', help='bar help')
25514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mutex_group.add_argument('--baz', help='baz help')
25524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return parser
25534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['--bar X --baz Y', '--baz X --bar Y']
25554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
25564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--bar X', NS(bar='X', baz=None)),
25574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('--baz Y', NS(bar=None, baz='Y')),
25584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
25594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes_when_not_required = [
25604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('', NS(bar=None, baz=None)),
25614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
25624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_not_required = '''\
25644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [--bar BAR | --baz BAZ]
25654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
25664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_required = '''\
25674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] (--bar BAR | --baz BAZ)
25684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
25694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = '''\
25704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
25724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
25734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Titled group:
25754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          Group description
25764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --bar BAR   bar help
25784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --baz BAZ   baz help
25794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
25804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveOptionalsAndPositionalsMixed(MEMixin, TestCase):
25834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_parser(self, required):
25854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PROG')
25864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('x', help='x help')
25874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-y', action='store_true', help='y help')
25884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_mutually_exclusive_group(required=required)
25894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('a', nargs='?', help='a help')
25904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('-b', action='store_true', help='b help')
25914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('-c', action='store_true', help='c help')
25924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return parser
25934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
25944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    failures = ['X A -b', '-b -c', '-c X A']
25954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes = [
25964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X A', NS(a='A', b=False, c=False, x='X', y=False)),
25974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X -b', NS(a=None, b=True, c=False, x='X', y=False)),
25984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X -c', NS(a=None, b=False, c=True, x='X', y=False)),
25994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X A -y', NS(a='A', b=False, c=False, x='X', y=True)),
26004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X -y -b', NS(a=None, b=True, c=False, x='X', y=True)),
26014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
26024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successes_when_not_required = [
26034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X', NS(a=None, b=False, c=False, x='X', y=False)),
26044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ('X -y', NS(a=None, b=False, c=False, x='X', y=True)),
26054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
26064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage_when_required = usage_when_not_required = '''\
26084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-y] [-b] [-c] x [a]
26094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
26104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = '''\
26114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
26134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          x           x help
26144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          a           a help
26154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
26174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
26184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y          y help
26194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -b          b help
26204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -c          c help
26214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
26224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =================================================
26244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Mutually exclusive group in parent parser tests
26254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =================================================
26264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MEPBase(object):
26284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_parser(self, required=None):
26304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parent = super(MEPBase, self).get_parser(required=required)
26314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(
26324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            prog=parent.prog, add_help=False, parents=[parent])
26334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return parser
26344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveGroupErrorsParent(
26374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    MEPBase, TestMutuallyExclusiveGroupErrors):
26384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
26394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveSimpleParent(
26424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    MEPBase, TestMutuallyExclusiveSimple):
26434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
26444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveLongParent(
26474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    MEPBase, TestMutuallyExclusiveLong):
26484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
26494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveFirstSuppressedParent(
26524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    MEPBase, TestMutuallyExclusiveFirstSuppressed):
26534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
26544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveManySuppressedParent(
26574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    MEPBase, TestMutuallyExclusiveManySuppressed):
26584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
26594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveOptionalAndPositionalParent(
26624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    MEPBase, TestMutuallyExclusiveOptionalAndPositional):
26634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
26644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveOptionalsMixedParent(
26674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    MEPBase, TestMutuallyExclusiveOptionalsMixed):
26684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
26694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMutuallyExclusiveOptionalsAndPositionalsMixedParent(
26724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    MEPBase, TestMutuallyExclusiveOptionalsAndPositionalsMixed):
26734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
26744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =================
26764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Set default tests
26774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =================
26784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestSetDefaults(TestCase):
26804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_set_defaults_no_args(self):
26824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
26834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.set_defaults(x='foo')
26844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.set_defaults(y='bar', z=1)
26854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='foo', y='bar', z=1),
26864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args([]))
26874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='foo', y='bar', z=1),
26884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args([], NS()))
26894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='baz', y='bar', z=1),
26904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args([], NS(x='baz')))
26914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='baz', y='bar', z=2),
26924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args([], NS(x='baz', z=2)))
26934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
26944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_set_defaults_with_args(self):
26954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
26964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.set_defaults(x='foo', y='bar')
26974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-x', default='xfoox')
26984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='xfoox', y='bar'),
26994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args([]))
27004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='xfoox', y='bar'),
27014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args([], NS()))
27024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='baz', y='bar'),
27034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args([], NS(x='baz')))
27044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='1', y='bar'),
27054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args('-x 1'.split()))
27064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='1', y='bar'),
27074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args('-x 1'.split(), NS()))
27084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='1', y='bar'),
27094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args('-x 1'.split(), NS(x='baz')))
27104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_set_defaults_subparsers(self):
27124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
27134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.set_defaults(x='foo')
27144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        subparsers = parser.add_subparsers()
27154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser_a = subparsers.add_parser('a')
27164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser_a.set_defaults(y='bar')
27174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='foo', y='bar'),
27184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args('a'.split()))
27194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_set_defaults_parents(self):
27214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parent = ErrorRaisingArgumentParser(add_help=False)
27224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parent.set_defaults(x='foo')
27234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(parents=[parent])
27244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(x='foo'), parser.parse_args([]))
27254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_set_defaults_same_as_add_argument(self):
27274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
27284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.set_defaults(w='W', x='X', y='Y', z='Z')
27294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-w')
27304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-x', default='XX')
27314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('y', nargs='?')
27324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('z', nargs='?', default='ZZ')
27334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # defaults set previously
27354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(w='W', x='XX', y='Y', z='ZZ'),
27364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args([]))
27374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # reset defaults
27394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.set_defaults(w='WW', x='X', y='YY', z='Z')
27404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(w='WW', x='X', y='YY', z='Z'),
27414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args([]))
27424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_set_defaults_same_as_add_argument_group(self):
27444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
27454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.set_defaults(w='W', x='X', y='Y', z='Z')
27464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group = parser.add_argument_group('foo')
27474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('-w')
27484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('-x', default='XX')
27494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('y', nargs='?')
27504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group.add_argument('z', nargs='?', default='ZZ')
27514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # defaults set previously
27544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(w='W', x='XX', y='Y', z='ZZ'),
27554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args([]))
27564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # reset defaults
27584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.set_defaults(w='WW', x='X', y='YY', z='Z')
27594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(w='WW', x='X', y='YY', z='Z'),
27604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         parser.parse_args([]))
27614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =================
27634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Get default tests
27644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =================
27654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestGetDefault(TestCase):
27674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_get_default(self):
27694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
27704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(None, parser.get_default("foo"))
27714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(None, parser.get_default("bar"))
27724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument("--foo")
27744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(None, parser.get_default("foo"))
27754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(None, parser.get_default("bar"))
27764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument("--bar", type=int, default=42)
27784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(None, parser.get_default("foo"))
27794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(42, parser.get_default("bar"))
27804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.set_defaults(foo="badger")
27824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual("badger", parser.get_default("foo"))
27834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(42, parser.get_default("bar"))
27844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ==========================
27864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Namespace 'contains' tests
27874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ==========================
27884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestNamespaceContainsSimple(TestCase):
27904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_empty(self):
27924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ns = argparse.Namespace()
27934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual('' in ns, False)
27944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual('' not in ns, True)
27954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual('x' in ns, False)
27964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
27974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_non_empty(self):
27984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ns = argparse.Namespace(x=1, y=2)
27994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual('x' in ns, True)
28004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual('x' not in ns, False)
28014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual('y' in ns, True)
28024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual('' in ns, False)
28034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual('xx' in ns, False)
28044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual('z' in ns, False)
28054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =====================
28074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Help formatting tests
28084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =====================
28094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpFormattingMetaclass(type):
28114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(cls, name, bases, bodydict):
28134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if name == 'HelpTestCase':
28144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
28154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class AddTests(object):
28174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self, test_class, func_suffix, std_name):
28194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.func_suffix = func_suffix
28204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.std_name = std_name
28214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for test_func in [self.test_format,
28234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  self.test_print,
28244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  self.test_print_file]:
28254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    test_name = '%s_%s' % (test_func.__name__, func_suffix)
28264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    def test_wrapper(self, test_func=test_func):
28284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        test_func(self)
28294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    try:
28304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        test_wrapper.__name__ = test_name
28314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    except TypeError:
28324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        pass
28334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    setattr(test_class, test_name, test_wrapper)
28344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def _get_parser(self, tester):
28364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parser = argparse.ArgumentParser(
28374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    *tester.parser_signature.args,
28384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    **tester.parser_signature.kwargs)
28394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for argument_sig in getattr(tester, 'argument_signatures', []):
28404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    parser.add_argument(*argument_sig.args,
28414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                        **argument_sig.kwargs)
28424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                group_sigs = getattr(tester, 'argument_group_signatures', [])
28434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for group_sig, argument_sigs in group_sigs:
28444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    group = parser.add_argument_group(*group_sig.args,
28454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                      **group_sig.kwargs)
28464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    for argument_sig in argument_sigs:
28474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        group.add_argument(*argument_sig.args,
28484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                           **argument_sig.kwargs)
28494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                subparsers_sigs = getattr(tester, 'subparsers_signatures', [])
28504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if subparsers_sigs:
28514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    subparsers = parser.add_subparsers()
28524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    for subparser_sig in subparsers_sigs:
28534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        subparsers.add_parser(*subparser_sig.args,
28544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                               **subparser_sig.kwargs)
28554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return parser
28564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def _test(self, tester, parser_text):
28584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                expected_text = getattr(tester, self.func_suffix)
28594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                expected_text = textwrap.dedent(expected_text)
28604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if expected_text != parser_text:
28614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    print(repr(expected_text))
28624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    print(repr(parser_text))
28634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    for char1, char2 in zip(expected_text, parser_text):
28644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        if char1 != char2:
28654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            print('first diff: %r %r' % (char1, char2))
28664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            break
28674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                tester.assertEqual(expected_text, parser_text)
28684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def test_format(self, tester):
28704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parser = self._get_parser(tester)
28714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                format = getattr(parser, 'format_%s' % self.func_suffix)
28724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._test(tester, format())
28734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def test_print(self, tester):
28754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parser = self._get_parser(tester)
28764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print_ = getattr(parser, 'print_%s' % self.func_suffix)
28774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                old_stream = getattr(sys, self.std_name)
28784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                setattr(sys, self.std_name, StdIOBuffer())
28794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
28804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    print_()
28814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    parser_text = getattr(sys, self.std_name).getvalue()
28824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                finally:
28834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    setattr(sys, self.std_name, old_stream)
28844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._test(tester, parser_text)
28854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def test_print_file(self, tester):
28874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parser = self._get_parser(tester)
28884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print_ = getattr(parser, 'print_%s' % self.func_suffix)
28894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                sfile = StdIOBuffer()
28904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print_(sfile)
28914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parser_text = sfile.getvalue()
28924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._test(tester, parser_text)
28934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
28944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # add tests for {format,print}_{usage,help,version}
28954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for func_suffix, std_name in [('usage', 'stdout'),
28964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                      ('help', 'stdout'),
28974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                      ('version', 'stderr')]:
28984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            AddTests(cls, func_suffix, std_name)
28994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaobases = TestCase,
29014adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoHelpTestCase = TestHelpFormattingMetaclass('HelpTestCase', bases, {})
29024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpBiggerOptionals(HelpTestCase):
29054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Make sure that argument help aligns when options are longer"""
29064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', description='DESCRIPTION',
29084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           epilog='EPILOG', version='0.1')
29094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
29104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', action='store_true', help='X HELP'),
29114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--y', help='Y HELP'),
29124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('foo', help='FOO HELP'),
29134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('bar', help='BAR HELP'),
29144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
29154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
29164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
29174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-v] [-x] [--y Y] foo bar
29184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
29194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
29204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        DESCRIPTION
29224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
29244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          foo            FOO HELP
29254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          bar            BAR HELP
29264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
29284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help     show this help message and exit
29294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -v, --version  show program's version number and exit
29304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x             X HELP
29314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --y Y          Y HELP
29324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        EPILOG
29344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
29354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = '''\
29364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        0.1
29374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
29384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpBiggerOptionalGroups(HelpTestCase):
29414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Make sure that argument help aligns when options are longer"""
29424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', description='DESCRIPTION',
29444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           epilog='EPILOG', version='0.1')
29454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
29464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', action='store_true', help='X HELP'),
29474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--y', help='Y HELP'),
29484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('foo', help='FOO HELP'),
29494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('bar', help='BAR HELP'),
29504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
29514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = [
29524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('GROUP TITLE', description='GROUP DESCRIPTION'), [
29534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('baz', help='BAZ HELP'),
29544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('-z', nargs='+', help='Z HELP')]),
29554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
29564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
29574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-v] [-x] [--y Y] [-z Z [Z ...]] foo bar baz
29584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
29594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
29604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        DESCRIPTION
29624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
29644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          foo            FOO HELP
29654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          bar            BAR HELP
29664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
29684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help     show this help message and exit
29694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -v, --version  show program's version number and exit
29704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x             X HELP
29714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --y Y          Y HELP
29724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        GROUP TITLE:
29744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          GROUP DESCRIPTION
29754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          baz            BAZ HELP
29774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -z Z [Z ...]   Z HELP
29784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        EPILOG
29804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
29814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = '''\
29824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        0.1
29834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
29844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpBiggerPositionals(HelpTestCase):
29874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Make sure that help aligns when arguments are longer"""
29884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
29894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(usage='USAGE', description='DESCRIPTION')
29904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
29914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', action='store_true', help='X HELP'),
29924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--y', help='Y HELP'),
29934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('ekiekiekifekang', help='EKI HELP'),
29944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('bar', help='BAR HELP'),
29954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
29964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
29974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
29984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: USAGE
29994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
30004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
30014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        DESCRIPTION
30034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
30054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          ekiekiekifekang  EKI HELP
30064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          bar              BAR HELP
30074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
30094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help       show this help message and exit
30104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x               X HELP
30114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --y Y            Y HELP
30124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
30134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
30154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpReformatting(HelpTestCase):
30184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Make sure that text after short names starts on the first line"""
30194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(
30214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        prog='PROG',
30224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        description='   oddly    formatted\n'
30234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    'description\n'
30244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    '\n'
30254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    'that is so long that it should go onto multiple '
30264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    'lines when wrapped')
30274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
30284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', metavar='XX', help='oddly\n'
30294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                     '    formatted -x help'),
30304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('y', metavar='yyy', help='normal y help'),
30314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
30324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = [
30334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('title', description='\n'
30344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  '    oddly formatted group\n'
30354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  '\n'
30364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  'description'),
30374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         [Sig('-a', action='store_true',
30384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              help=' oddly \n'
30394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                   'formatted    -a  help  \n'
30404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                   '    again, so long that it should be wrapped over '
30414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                   'multiple lines')]),
30424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
30434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
30444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-x XX] [-a] yyy
30454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
30464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
30474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        oddly formatted description that is so long that it should go onto \
30494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaomultiple
30504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        lines when wrapped
30514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
30534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          yyy         normal y help
30544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
30564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
30574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x XX       oddly formatted -x help
30584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        title:
30604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          oddly formatted group description
30614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -a          oddly formatted -a help again, so long that it should \
30634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaobe wrapped
30644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      over multiple lines
30654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
30664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
30674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpWrappingShortNames(HelpTestCase):
30704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Make sure that text after short names starts on the first line"""
30714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', description= 'D\nD' * 30)
30734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
30744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', metavar='XX', help='XHH HX' * 20),
30754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('y', metavar='yyy', help='YH YH' * 20),
30764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
30774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = [
30784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('ALPHAS'), [
30794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('-a', action='store_true', help='AHHH HHA' * 10)]),
30804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
30814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
30824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-x XX] [-a] yyy
30834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
30844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
30854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        D DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD \
30874adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDD DD DD
30884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        DD DD DD DD D
30894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
30914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          yyy         YH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH \
30924adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoYHYH YHYH
30934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH
30944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
30954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
30964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
30974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x XX       XHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH \
30984adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoHXXHH HXXHH
30994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HX
31004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ALPHAS:
31024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -a          AHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH \
31034adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoHHAAHHH
31044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      HHAAHHH HHAAHHH HHA
31054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
31064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
31074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpWrappingLongNames(HelpTestCase):
31104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Make sure that text after long names starts on the next line"""
31114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(usage='USAGE', description= 'D D' * 30,
31134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           version='V V'*30)
31144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
31154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', metavar='X' * 25, help='XH XH' * 20),
31164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('y', metavar='y' * 25, help='YH YH' * 20),
31174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
31184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = [
31194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('ALPHAS'), [
31204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('-a', metavar='A' * 25, help='AH AH' * 20),
31214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('z', metavar='z' * 25, help='ZH ZH' * 20)]),
31224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
31234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
31244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: USAGE
31254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
31264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
31274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        D DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD \
31294adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDD DD DD
31304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        DD DD DD DD D
31314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
31334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          yyyyyyyyyyyyyyyyyyyyyyyyy
31344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                YH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH \
31354adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoYHYH YHYH
31364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH
31374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
31394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help            show this help message and exit
31404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -v, --version         show program's version number and exit
31414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x XXXXXXXXXXXXXXXXXXXXXXXXX
31424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                XH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH \
31434adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoXHXH XHXH
31444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XH
31454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ALPHAS:
31474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -a AAAAAAAAAAAAAAAAAAAAAAAAA
31484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                AH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH \
31494adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoAHAH AHAH
31504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AH
31514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          zzzzzzzzzzzzzzzzzzzzzzzzz
31524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                ZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH \
31534adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoZHZH ZHZH
31544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZH
31554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
31564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = '''\
31574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        V VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV \
31584adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoVV VV VV
31594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        VV VV VV VV V
31604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
31614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpUsage(HelpTestCase):
31644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test basic usage messages"""
31654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG')
31674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
31684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-w', nargs='+', help='w'),
31694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', nargs='*', help='x'),
31704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('a', help='a'),
31714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('b', help='b', nargs=2),
31724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('c', help='c', nargs='?'),
31734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
31744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = [
31754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('group'), [
31764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('-y', nargs='?', help='y'),
31774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('-z', nargs=3, help='z'),
31784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('d', help='d', nargs='*'),
31794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('e', help='e', nargs='+'),
31804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ])
31814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
31824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
31834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-w W [W ...]] [-x [X [X ...]]] [-y [Y]] [-z Z Z Z]
31844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    a b b [c] [d [d ...]] e [e ...]
31854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
31864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
31874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
31894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          a               a
31904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          b               b
31914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          c               c
31924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
31944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help      show this help message and exit
31954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -w W [W ...]    w
31964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x [X [X ...]]  x
31974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
31984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group:
31994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y [Y]          y
32004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -z Z Z Z        z
32014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          d               d
32024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          e               e
32034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
32044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
32054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpOnlyUserGroups(HelpTestCase):
32084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test basic usage messages"""
32094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', add_help=False)
32114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = []
32124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = [
32134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('xxxx'), [
32144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('-x', help='x'),
32154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('a', help='a'),
32164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ]),
32174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('yyyy'), [
32184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('b', help='b'),
32194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('-y', help='y'),
32204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ]),
32214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
32224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
32234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-x X] [-y Y] a b
32244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
32254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
32264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        xxxx:
32284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x X  x
32294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          a     a
32304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        yyyy:
32324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          b     b
32334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y Y  y
32344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
32354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
32364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpUsageLongProg(HelpTestCase):
32394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test usage messages where the prog is long"""
32404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='P' * 60)
32424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
32434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-w', metavar='W'),
32444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', metavar='X'),
32454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('a'),
32464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('b'),
32474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
32484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
32494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
32504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
32514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao               [-h] [-w W] [-x X] a b
32524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
32534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
32544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
32564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          a
32574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          b
32584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
32604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
32614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -w W
32624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x X
32634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
32644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
32654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpUsageLongProgOptionsWrap(HelpTestCase):
32684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test usage messages where the prog is long and the optionals wrap"""
32694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='P' * 60)
32714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
32724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-w', metavar='W' * 25),
32734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', metavar='X' * 25),
32744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-y', metavar='Y' * 25),
32754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-z', metavar='Z' * 25),
32764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('a'),
32774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('b'),
32784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
32794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
32804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
32814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
32824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao               [-h] [-w WWWWWWWWWWWWWWWWWWWWWWWWW] \
32834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao[-x XXXXXXXXXXXXXXXXXXXXXXXXX]
32844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao               [-y YYYYYYYYYYYYYYYYYYYYYYYYY] [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
32854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao               a b
32864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
32874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
32884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
32904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          a
32914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          b
32924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
32934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
32944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help            show this help message and exit
32954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -w WWWWWWWWWWWWWWWWWWWWWWWWW
32964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x XXXXXXXXXXXXXXXXXXXXXXXXX
32974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y YYYYYYYYYYYYYYYYYYYYYYYYY
32984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
32994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
33004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
33014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpUsageLongProgPositionalsWrap(HelpTestCase):
33044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test usage messages where the prog is long and the positionals wrap"""
33054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='P' * 60, add_help=False)
33074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
33084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('a' * 25),
33094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('b' * 25),
33104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('c' * 25),
33114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
33124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
33134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
33144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
33154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao               aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
33164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao               ccccccccccccccccccccccccc
33174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
33184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
33194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
33214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          aaaaaaaaaaaaaaaaaaaaaaaaa
33224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          bbbbbbbbbbbbbbbbbbbbbbbbb
33234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          ccccccccccccccccccccccccc
33244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
33254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
33264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpUsageOptionalsWrap(HelpTestCase):
33294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test usage messages where the optionals wrap"""
33304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG')
33324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
33334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-w', metavar='W' * 25),
33344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', metavar='X' * 25),
33354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-y', metavar='Y' * 25),
33364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-z', metavar='Z' * 25),
33374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('a'),
33384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('b'),
33394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('c'),
33404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
33414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
33424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
33434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-w WWWWWWWWWWWWWWWWWWWWWWWWW] \
33444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao[-x XXXXXXXXXXXXXXXXXXXXXXXXX]
33454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    [-y YYYYYYYYYYYYYYYYYYYYYYYYY] \
33464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao[-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
33474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    a b c
33484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
33494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
33504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
33524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          a
33534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          b
33544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          c
33554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
33574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help            show this help message and exit
33584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -w WWWWWWWWWWWWWWWWWWWWWWWWW
33594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x XXXXXXXXXXXXXXXXXXXXXXXXX
33604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y YYYYYYYYYYYYYYYYYYYYYYYYY
33614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
33624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
33634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
33644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpUsagePositionalsWrap(HelpTestCase):
33674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test usage messages where the positionals wrap"""
33684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG')
33704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
33714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x'),
33724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-y'),
33734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-z'),
33744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('a' * 25),
33754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('b' * 25),
33764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('c' * 25),
33774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
33784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
33794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
33804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-x X] [-y Y] [-z Z]
33814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
33824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    ccccccccccccccccccccccccc
33834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
33844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
33854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
33874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          aaaaaaaaaaaaaaaaaaaaaaaaa
33884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          bbbbbbbbbbbbbbbbbbbbbbbbb
33894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          ccccccccccccccccccccccccc
33904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
33924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help            show this help message and exit
33934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x X
33944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y Y
33954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -z Z
33964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
33974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
33984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
33994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpUsageOptionalsPositionalsWrap(HelpTestCase):
34014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test usage messages where the optionals and positionals wrap"""
34024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG')
34044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
34054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', metavar='X' * 25),
34064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-y', metavar='Y' * 25),
34074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-z', metavar='Z' * 25),
34084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('a' * 25),
34094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('b' * 25),
34104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('c' * 25),
34114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
34124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
34134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
34144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-x XXXXXXXXXXXXXXXXXXXXXXXXX] \
34154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao[-y YYYYYYYYYYYYYYYYYYYYYYYYY]
34164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
34174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
34184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    ccccccccccccccccccccccccc
34194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
34204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
34214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
34234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          aaaaaaaaaaaaaaaaaaaaaaaaa
34244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          bbbbbbbbbbbbbbbbbbbbbbbbb
34254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          ccccccccccccccccccccccccc
34264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
34284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help            show this help message and exit
34294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x XXXXXXXXXXXXXXXXXXXXXXXXX
34304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y YYYYYYYYYYYYYYYYYYYYYYYYY
34314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
34324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
34334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
34344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpUsageOptionalsOnlyWrap(HelpTestCase):
34374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test usage messages where there are only optionals and they wrap"""
34384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG')
34404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
34414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', metavar='X' * 25),
34424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-y', metavar='Y' * 25),
34434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-z', metavar='Z' * 25),
34444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
34454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
34464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
34474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-x XXXXXXXXXXXXXXXXXXXXXXXXX] \
34484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao[-y YYYYYYYYYYYYYYYYYYYYYYYYY]
34494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
34504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
34514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
34524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
34544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help            show this help message and exit
34554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x XXXXXXXXXXXXXXXXXXXXXXXXX
34564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y YYYYYYYYYYYYYYYYYYYYYYYYY
34574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
34584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
34594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
34604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpUsagePositionalsOnlyWrap(HelpTestCase):
34634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test usage messages where there are only positionals and they wrap"""
34644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', add_help=False)
34664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
34674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('a' * 25),
34684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('b' * 25),
34694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('c' * 25),
34704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
34714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
34724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
34734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
34744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    ccccccccccccccccccccccccc
34754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
34764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
34774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
34794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          aaaaaaaaaaaaaaaaaaaaaaaaa
34804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          bbbbbbbbbbbbbbbbbbbbbbbbb
34814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          ccccccccccccccccccccccccc
34824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
34834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
34844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpVariableExpansion(HelpTestCase):
34874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that variables are expanded properly in help messages"""
34884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG')
34904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
34914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', type=int,
34924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            help='x %(prog)s %(default)s %(type)s %%'),
34934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-y', action='store_const', default=42, const='XXX',
34944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            help='y %(prog)s %(default)s %(const)s'),
34954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo', choices='abc',
34964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            help='foo %(prog)s %(default)s %(choices)s'),
34974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--bar', default='baz', choices=[1, 2], metavar='BBB',
34984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            help='bar %(prog)s %(default)s %(dest)s'),
34994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', help='spam %(prog)s %(default)s'),
35004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('badger', default=0.5, help='badger %(prog)s %(default)s'),
35014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
35024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = [
35034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('group'), [
35044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('-a', help='a %(prog)s %(default)s'),
35054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Sig('-b', default=-1, help='b %(prog)s %(default)s'),
35064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ])
35074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
35084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = ('''\
35094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-x X] [-y] [--foo {a,b,c}] [--bar BBB] [-a A] [-b B]
35104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    spam badger
35114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ''')
35124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
35134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
35154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          spam           spam PROG None
35164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          badger         badger PROG 0.5
35174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
35194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help     show this help message and exit
35204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x X           x PROG None int %
35214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y             y PROG 42 XXX
35224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo {a,b,c}  foo PROG None a, b, c
35234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --bar BBB      bar PROG baz bar
35244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        group:
35264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -a A           a PROG None
35274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -b B           b PROG -1
35284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
35294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
35304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpVariableExpansionUsageSupplied(HelpTestCase):
35334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that variables are expanded properly when usage= is present"""
35344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', usage='%(prog)s FOO')
35364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = []
35374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
35384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = ('''\
35394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG FOO
35404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ''')
35414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
35424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
35444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
35454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
35464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
35474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpVariableExpansionNoArguments(HelpTestCase):
35504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that variables are expanded properly with no arguments"""
35514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', add_help=False)
35534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = []
35544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
35554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = ('''\
35564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG
35574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ''')
35584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage
35594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
35604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpSuppressUsage(HelpTestCase):
35634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that items can be suppressed in usage messages"""
35644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', usage=argparse.SUPPRESS)
35664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
35674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo', help='foo help'),
35684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', help='spam help'),
35694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
35704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
35714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = '''\
35724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
35734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          spam        spam help
35744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
35764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
35774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo FOO   foo help
35784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
35794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = ''
35804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
35814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpSuppressOptional(HelpTestCase):
35844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that optional arguments can be suppressed in help messages"""
35854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', add_help=False)
35874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
35884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo', help=argparse.SUPPRESS),
35894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', help='spam help'),
35904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
35914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
35924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
35934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG spam
35944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
35954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
35964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
35974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
35984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          spam  spam help
35994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
36004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
36014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpSuppressOptionalGroup(HelpTestCase):
36044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that optional groups can be suppressed in help messages"""
36054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG')
36074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
36084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo', help='foo help'),
36094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', help='spam help'),
36104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
36114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = [
36124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('group'), [Sig('--bar', help=argparse.SUPPRESS)]),
36134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
36144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
36154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [--foo FOO] spam
36164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
36174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
36184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
36204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          spam        spam help
36214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
36234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
36244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo FOO   foo help
36254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
36264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
36274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpSuppressPositional(HelpTestCase):
36304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that positional arguments can be suppressed in help messages"""
36314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG')
36334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
36344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo', help='foo help'),
36354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', help=argparse.SUPPRESS),
36364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
36374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
36384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
36394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [--foo FOO]
36404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
36414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
36424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
36444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
36454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo FOO   foo help
36464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
36474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
36484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpRequiredOptional(HelpTestCase):
36514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that required options don't look optional"""
36524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG')
36544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
36554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo', required=True, help='foo help'),
36564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
36574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
36584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
36594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] --foo FOO
36604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
36614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
36624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
36644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
36654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo FOO   foo help
36664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
36674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
36684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpAlternatePrefixChars(HelpTestCase):
36714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that options display with different prefix characters"""
36724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', prefix_chars='^;', add_help=False)
36744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
36754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('^^foo', action='store_true', help='foo help'),
36764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig(';b', ';;bar', help='bar help'),
36774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
36784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
36794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
36804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [^^foo] [;b BAR]
36814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
36824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
36834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
36854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          ^^foo              foo help
36864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          ;b BAR, ;;bar BAR  bar help
36874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
36884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
36894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpNoHelpOptional(HelpTestCase):
36924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that the --help argument can be suppressed help messages"""
36934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
36944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', add_help=False)
36954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
36964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo', help='foo help'),
36974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', help='spam help'),
36984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
36994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
37004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
37014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [--foo FOO] spam
37024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
37034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
37044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
37064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          spam       spam help
37074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
37094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo FOO  foo help
37104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
37114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
37124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpVersionOptional(HelpTestCase):
37154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that the --version argument can be suppressed help messages"""
37164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', version='1.0')
37184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
37194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo', help='foo help'),
37204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', help='spam help'),
37214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
37224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
37234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
37244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-v] [--foo FOO] spam
37254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
37264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
37274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
37294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          spam           spam help
37304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
37324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help     show this help message and exit
37334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -v, --version  show program's version number and exit
37344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo FOO      foo help
37354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
37364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = '''\
37374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1.0
37384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
37394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpNone(HelpTestCase):
37424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test that no errors occur if no help is specified"""
37434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG')
37454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
37464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo'),
37474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam'),
37484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
37494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
37504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
37514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [--foo FOO] spam
37524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
37534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
37544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
37564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          spam
37574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
37594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
37604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo FOO
37614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
37624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
37634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpTupleMetavar(HelpTestCase):
37664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test specifying metavar as a tuple"""
37674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG')
37694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
37704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-w', help='w', nargs='+', metavar=('W1', 'W2')),
37714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-x', help='x', nargs='*', metavar=('X1', 'X2')),
37724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-y', help='y', nargs=3, metavar=('Y1', 'Y2', 'Y3')),
37734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('-z', help='z', nargs='?', metavar=('Z1', )),
37744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
37754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
37764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
37774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-w W1 [W2 ...]] [-x [X1 [X2 ...]]] [-y Y1 Y2 Y3] \
37784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao[-z [Z1]]
37794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
37804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
37814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
37834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help        show this help message and exit
37844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -w W1 [W2 ...]    w
37854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -x [X1 [X2 ...]]  x
37864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -y Y1 Y2 Y3       y
37874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -z [Z1]           z
37884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
37894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
37904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpRawText(HelpTestCase):
37934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test the RawTextHelpFormatter"""
37944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
37954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(
37964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        prog='PROG', formatter_class=argparse.RawTextHelpFormatter,
37974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        description='Keep the formatting\n'
37984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    '    exactly as it is written\n'
37994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    '\n'
38004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    'here\n')
38014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
38034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo', help='    foo help should also\n'
38044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          'appear as given here'),
38054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', help='spam help'),
38064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
38074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = [
38084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('title', description='    This text\n'
38094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  '  should be indented\n'
38104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  '    exactly like it is here\n'),
38114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         [Sig('--bar', help='bar help')]),
38124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
38134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
38144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [--foo FOO] [--bar BAR] spam
38154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
38164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
38174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Keep the formatting
38194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            exactly as it is written
38204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        here
38224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
38244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          spam        spam help
38254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
38274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
38284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo FOO       foo help should also
38294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      appear as given here
38304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        title:
38324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              This text
38334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            should be indented
38344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              exactly like it is here
38354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --bar BAR   bar help
38374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
38384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
38394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpRawDescription(HelpTestCase):
38424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test the RawTextHelpFormatter"""
38434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(
38454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        prog='PROG', formatter_class=argparse.RawDescriptionHelpFormatter,
38464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        description='Keep the formatting\n'
38474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    '    exactly as it is written\n'
38484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    '\n'
38494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    'here\n')
38504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
38524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo', help='  foo help should not\n'
38534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          '    retain this odd formatting'),
38544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', help='spam help'),
38554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
38564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = [
38574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('title', description='    This text\n'
38584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  '  should be indented\n'
38594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  '    exactly like it is here\n'),
38604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         [Sig('--bar', help='bar help')]),
38614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
38624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
38634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [--foo FOO] [--bar BAR] spam
38644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
38654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
38664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Keep the formatting
38684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            exactly as it is written
38694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        here
38714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
38734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          spam        spam help
38744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
38764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
38774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo FOO   foo help should not retain this odd formatting
38784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        title:
38804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              This text
38814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            should be indented
38824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              exactly like it is here
38834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --bar BAR   bar help
38854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
38864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
38874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpArgumentDefaults(HelpTestCase):
38904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test the ArgumentDefaultsHelpFormatter"""
38914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(
38934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        prog='PROG', formatter_class=argparse.ArgumentDefaultsHelpFormatter,
38944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        description='description')
38954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
38964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [
38974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--foo', help='foo help - oh and by the way, %(default)s'),
38984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('--bar', action='store_true', help='bar help'),
38994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('spam', help='spam help'),
39004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sig('badger', nargs='?', default='wooden', help='badger help'),
39014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
39024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = [
39034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (Sig('title', description='description'),
39044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         [Sig('--baz', type=int, default=42, help='baz help')]),
39054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
39064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
39074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [--foo FOO] [--bar] [--baz BAZ] spam [badger]
39084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
39094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
39104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        description
39124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
39144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          spam        spam help
39154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          badger      badger help (default: wooden)
39164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
39184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help  show this help message and exit
39194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --foo FOO   foo help - oh and by the way, None
39204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --bar       bar help (default: False)
39214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        title:
39234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          description
39244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          --baz BAZ   baz help (default: 42)
39264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
39274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
39284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpVersionAction(HelpTestCase):
39304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test the default help for the version action"""
39314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG', description='description')
39334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_signatures = [Sig('-V', '--version', action='version', version='3.6')]
39344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument_group_signatures = []
39354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
39364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-V]
39374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
39384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
39394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        description
39414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
39434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help     show this help message and exit
39444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -V, --version  show program's version number and exit
39454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
39464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = ''
39474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpSubparsersOrdering(HelpTestCase):
39494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test ordering of subcommands in help matches the code"""
39504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG',
39514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           description='display some subcommands',
39524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           version='0.1')
39534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    subparsers_signatures = [Sig(name=name)
39554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             for name in ('a', 'b', 'c', 'd', 'e')]
39564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
39584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-v] {a,b,c,d,e} ...
39594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
39604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
39624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        display some subcommands
39644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
39664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          {a,b,c,d,e}
39674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
39694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help     show this help message and exit
39704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -v, --version  show program's version number and exit
39714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
39724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = '''\
39744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        0.1
39754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
39764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHelpSubparsersWithHelpOrdering(HelpTestCase):
39784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test ordering of subcommands in help matches the code"""
39794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    parser_signature = Sig(prog='PROG',
39804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           description='display some subcommands',
39814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           version='0.1')
39824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    subcommand_data = (('a', 'a subcommand help'),
39844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       ('b', 'b subcommand help'),
39854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       ('c', 'c subcommand help'),
39864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       ('d', 'd subcommand help'),
39874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       ('e', 'e subcommand help'),
39884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       )
39894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    subparsers_signatures = [Sig(name=name, help=help)
39914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             for name, help in subcommand_data]
39924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    usage = '''\
39944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        usage: PROG [-h] [-v] {a,b,c,d,e} ...
39954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
39964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help = usage + '''\
39984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
39994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        display some subcommands
40004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        positional arguments:
40024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          {a,b,c,d,e}
40034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            a            a subcommand help
40044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b            b subcommand help
40054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c            c subcommand help
40064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            d            d subcommand help
40074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            e            e subcommand help
40084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        optional arguments:
40104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -h, --help     show this help message and exit
40114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          -v, --version  show program's version number and exit
40124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
40134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    version = '''\
40154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        0.1
40164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
40174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =====================================
40204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Optional/Positional constructor tests
40214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =====================================
40224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestInvalidArgumentConstructors(TestCase):
40244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test a bunch of invalid Argument constructors"""
40254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertTypeError(self, *args, **kwargs):
40274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
40284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, parser.add_argument,
40294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          *args, **kwargs)
40304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertValueError(self, *args, **kwargs):
40324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
40334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, parser.add_argument,
40344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          *args, **kwargs)
40354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_invalid_keyword_arguments(self):
40374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTypeError('-x', bar=None)
40384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTypeError('-y', callback='foo')
40394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTypeError('-y', callback_args=())
40404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTypeError('-y', callback_kwargs={})
40414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_missing_destination(self):
40434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTypeError()
40444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for action in ['append', 'store']:
40454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTypeError(action=action)
40464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_invalid_option_strings(self):
40484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertValueError('--')
40494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertValueError('---')
40504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_invalid_type(self):
40524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertValueError('--foo', type='int')
40534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertValueError('--foo', type=(int, float))
40544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_invalid_action(self):
40564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertValueError('-x', action='foo')
40574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertValueError('foo', action='baz')
40584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertValueError('--foo', action=('store', 'append'))
40594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
40604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
40614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.add_argument("--foo", action="store-true")
40624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
40634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            e = sys.exc_info()[1]
40644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            expected = 'unknown action'
40654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            msg = 'expected %r, found %r' % (expected, e)
40664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(expected in str(e), msg)
40674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_multiple_dest(self):
40694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
40704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument(dest='foo')
40714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
40724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.add_argument('bar', dest='baz')
40734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
40744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            e = sys.exc_info()[1]
40754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            expected = 'dest supplied twice for positional argument'
40764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            msg = 'expected %r, found %r' % (expected, e)
40774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(expected in str(e), msg)
40784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_no_argument_actions(self):
40804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for action in ['store_const', 'store_true', 'store_false',
40814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       'append_const', 'count']:
40824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for attrs in [dict(type=int), dict(nargs='+'),
40834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          dict(choices='ab')]:
40844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertTypeError('-x', action=action, **attrs)
40854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_no_argument_no_const_actions(self):
40874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # options with zero arguments
40884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for action in ['store_true', 'store_false', 'count']:
40894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # const is always disallowed
40914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTypeError('-x', const='foo', action=action)
40924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # nargs is always disallowed
40944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTypeError('-x', nargs='*', action=action)
40954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_more_than_one_argument_actions(self):
40974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for action in ['store', 'append']:
40984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
40994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # nargs=0 is disallowed
41004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertValueError('-x', nargs=0, action=action)
41014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertValueError('spam', nargs=0, action=action)
41024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # const is disallowed with non-optional arguments
41044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for nargs in [1, '*', '+']:
41054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertValueError('-x', const='foo',
41064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                      nargs=nargs, action=action)
41074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertValueError('spam', const='foo',
41084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                      nargs=nargs, action=action)
41094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_required_const_actions(self):
41114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for action in ['store_const', 'append_const']:
41124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # nargs is always disallowed
41144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTypeError('-x', nargs='+', action=action)
41154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parsers_action_missing_params(self):
41174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTypeError('command', action='parsers')
41184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTypeError('command', action='parsers', prog='PROG')
41194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTypeError('command', action='parsers',
41204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             parser_class=argparse.ArgumentParser)
41214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_required_positional(self):
41234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTypeError('foo', required=True)
41244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_user_defined_action(self):
41264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Success(Exception):
41284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
41294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Action(object):
41314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self,
41334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         option_strings,
41344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         dest,
41354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         const,
41364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         default,
41374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         required=False):
41384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if dest == 'spam':
41394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if const is Success:
41404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        if default is Success:
41414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            raise Success()
41424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __call__(self, *args, **kwargs):
41444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
41454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
41474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Success, parser.add_argument, '--spam',
41484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          action=Action, default=Success, const=Success)
41494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Success, parser.add_argument, 'spam',
41504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          action=Action, default=Success, const=Success)
41514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ================================
41534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Actions returned by add_argument
41544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ================================
41554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestActionsReturned(TestCase):
41574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_dest(self):
41594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
41604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        action = parser.add_argument('--foo')
41614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(action.dest, 'foo')
41624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        action = parser.add_argument('-b', '--bar')
41634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(action.dest, 'bar')
41644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        action = parser.add_argument('-x', '-y')
41654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(action.dest, 'x')
41664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_misc(self):
41684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
41694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        action = parser.add_argument('--foo', nargs='?', const=42,
41704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                     default=84, type=int, choices=[1, 2],
41714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                     help='FOO', metavar='BAR', dest='baz')
41724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(action.nargs, '?')
41734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(action.const, 42)
41744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(action.default, 84)
41754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(action.type, int)
41764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(action.choices, [1, 2])
41774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(action.help, 'FOO')
41784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(action.metavar, 'BAR')
41794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(action.dest, 'baz')
41804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ================================
41834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Argument conflict handling tests
41844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ================================
41854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestConflictHandling(TestCase):
41874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_bad_type(self):
41894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, argparse.ArgumentParser,
41904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          conflict_handler='foo')
41914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
41924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_conflict_error(self):
41934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
41944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-x')
41954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(argparse.ArgumentError,
41964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          parser.add_argument, '-x')
41974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--spam')
41984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(argparse.ArgumentError,
41994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          parser.add_argument, '--spam')
42004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_resolve_error(self):
42024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        get_parser = argparse.ArgumentParser
42034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = get_parser(prog='PROG', conflict_handler='resolve')
42044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-x', help='OLD X')
42064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-x', help='NEW X')
42074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.format_help(), textwrap.dedent('''\
42084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: PROG [-h] [-x X]
42094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
42114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -h, --help  show this help message and exit
42124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -x X        NEW X
42134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '''))
42144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--spam', metavar='OLD_SPAM')
42164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--spam', metavar='NEW_SPAM')
42174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parser.format_help(), textwrap.dedent('''\
42184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            usage: PROG [-h] [-x X] [--spam NEW_SPAM]
42194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            optional arguments:
42214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -h, --help       show this help message and exit
42224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              -x X             NEW X
42234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              --spam NEW_SPAM
42244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '''))
42254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =============================
42284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Help and Version option tests
42294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =============================
42304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestOptionalsHelpVersionActions(TestCase):
42324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test the help and version actions"""
42334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _get_error(self, func, *args, **kwargs):
42354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
42364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            func(*args, **kwargs)
42374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ArgumentParserError:
42384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return sys.exc_info()[1]
42394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
42404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(ArgumentParserError, func, *args, **kwargs)
42414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertPrintHelpExit(self, parser, args_str):
42434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
42444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.format_help(),
42454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._get_error(parser.parse_args, args_str.split()).stdout)
42464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertPrintVersionExit(self, parser, args_str):
42484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
42494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.format_version(),
42504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._get_error(parser.parse_args, args_str.split()).stderr)
42514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertArgumentParserError(self, parser, *args):
42534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ArgumentParserError, parser.parse_args, args)
42544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_version(self):
42564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(version='1.0')
42574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertPrintHelpExit(parser, '-h')
42584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertPrintHelpExit(parser, '--help')
42594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertPrintVersionExit(parser, '-v')
42604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertPrintVersionExit(parser, '--version')
42614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_version_format(self):
42634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PPP', version='%(prog)s 3.5')
42644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        msg = self._get_error(parser.parse_args, ['-v']).stderr
42654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual('PPP 3.5\n', msg)
42664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_version_no_help(self):
42684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(add_help=False, version='1.0')
42694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parser, '-h')
42704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parser, '--help')
42714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertPrintVersionExit(parser, '-v')
42724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertPrintVersionExit(parser, '--version')
42734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_version_action(self):
42754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='XXX')
42764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-V', action='version', version='%(prog)s 3.7')
42774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        msg = self._get_error(parser.parse_args, ['-V']).stderr
42784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual('XXX 3.7\n', msg)
42794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_no_help(self):
42814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(add_help=False)
42824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parser, '-h')
42834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parser, '--help')
42844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parser, '-v')
42854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parser, '--version')
42864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_alternate_help_version(self):
42884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser()
42894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-x', action='help')
42904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-y', action='version')
42914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertPrintHelpExit(parser, '-x')
42924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertPrintVersionExit(parser, '-y')
42934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parser, '-v')
42944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertArgumentParserError(parser, '--version')
42954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
42964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_help_version_extra_arguments(self):
42974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(version='1.0')
42984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-x', action='store_true')
42994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('y')
43004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # try all combinations of valid prefixes and suffixes
43024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        valid_prefixes = ['', '-x', 'foo', '-x bar', 'baz -x']
43034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        valid_suffixes = valid_prefixes + ['--bad-option', 'foo bar baz']
43044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for prefix in valid_prefixes:
43054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for suffix in valid_suffixes:
43064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                format = '%s %%s %s' % (prefix, suffix)
43074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertPrintHelpExit(parser, format % '-h')
43084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertPrintHelpExit(parser, format % '--help')
43094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertPrintVersionExit(parser, format % '-v')
43104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertPrintVersionExit(parser, format % '--version')
43114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ======================
43144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# str() and repr() tests
43154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ======================
43164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestStrings(TestCase):
43184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test str()  and repr() on Optionals and Positionals"""
43194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertStringEqual(self, obj, result_string):
43214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for func in [str, repr]:
43224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(func(obj), result_string)
43234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_optional(self):
43254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        option = argparse.Action(
43264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            option_strings=['--foo', '-a', '-b'],
43274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dest='b',
43284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            type='int',
43294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            nargs='+',
43304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            default=42,
43314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            choices=[1, 2, 3],
43324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            help='HELP',
43334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            metavar='METAVAR')
43344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        string = (
43354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Action(option_strings=['--foo', '-a', '-b'], dest='b', "
43364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "nargs='+', const=None, default=42, type='int', "
43374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "choices=[1, 2, 3], help='HELP', metavar='METAVAR')")
43384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertStringEqual(option, string)
43394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_argument(self):
43414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        argument = argparse.Action(
43424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            option_strings=[],
43434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dest='x',
43444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            type=float,
43454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            nargs='?',
43464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            default=2.5,
43474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            choices=[0.5, 1.5, 2.5],
43484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            help='H HH H',
43494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            metavar='MV MV MV')
43504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        string = (
43514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Action(option_strings=[], dest='x', nargs='?', "
43524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "const=None, default=2.5, type=%r, choices=[0.5, 1.5, 2.5], "
43534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "help='H HH H', metavar='MV MV MV')" % float)
43544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertStringEqual(argument, string)
43554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_namespace(self):
43574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ns = argparse.Namespace(foo=42, bar='spam')
43584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        string = "Namespace(bar='spam', foo=42)"
43594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertStringEqual(ns, string)
43604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parser(self):
43624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser(prog='PROG')
43634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        string = (
43644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "ArgumentParser(prog='PROG', usage=None, description=None, "
43654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "version=None, formatter_class=%r, conflict_handler='error', "
43664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "add_help=True)" % argparse.HelpFormatter)
43674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertStringEqual(parser, string)
43684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ===============
43704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Namespace tests
43714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ===============
43724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestNamespace(TestCase):
43744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_constructor(self):
43764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ns = argparse.Namespace()
43774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(AttributeError, getattr, ns, 'x')
43784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ns = argparse.Namespace(a=42, b='spam')
43804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ns.a, 42)
43814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ns.b, 'spam')
43824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_equality(self):
43844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ns1 = argparse.Namespace(a=1, b=2)
43854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ns2 = argparse.Namespace(b=2, a=1)
43864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ns3 = argparse.Namespace(a=1)
43874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ns4 = argparse.Namespace(b=2)
43884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ns1, ns2)
43904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(ns1, ns3)
43914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(ns1, ns4)
43924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(ns2, ns3)
43934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(ns2, ns4)
43944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(ns1 != ns3)
43954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(ns1 != ns4)
43964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(ns2 != ns3)
43974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(ns2 != ns4)
43984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
43994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ===================
44014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# File encoding tests
44024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ===================
44034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestEncoding(TestCase):
44054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _test_module_encoding(self, path):
44074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        path, _ = os.path.splitext(path)
44084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        path += ".py"
44094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with codecs.open(path, 'r', 'utf8') as f:
44104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            f.read()
44114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_argparse_module_encoding(self):
44134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._test_module_encoding(argparse.__file__)
44144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_test_argparse_module_encoding(self):
44164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._test_module_encoding(__file__)
44174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ===================
44194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ArgumentError tests
44204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ===================
44214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestArgumentError(TestCase):
44234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_argument_error(self):
44254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        msg = "my error here"
44264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        error = argparse.ArgumentError(None, msg)
44274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(str(error), msg)
44284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =======================
44304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ArgumentTypeError tests
44314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# =======================
44324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestArgumentTypeError(TestCase):
44344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_argument_type_error(self):
44364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def spam(string):
44384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise argparse.ArgumentTypeError('spam!')
44394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = ErrorRaisingArgumentParser(prog='PROG', add_help=False)
44414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('x', type=spam)
44424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
44434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.parse_args(['XXX'])
44444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ArgumentParserError:
44454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            expected = 'usage: PROG x\nPROG: error: argument x: spam!\n'
44464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            msg = sys.exc_info()[1].stderr
44474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(expected, msg)
44484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
44494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail()
44504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ================================================
44524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Check that the type function is called only once
44534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ================================================
44544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestTypeFunctionCallOnlyOnce(TestCase):
44564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_type_function_call_only_once(self):
44584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def spam(string_to_convert):
44594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(string_to_convert, 'spam!')
44604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 'foo_converted'
44614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
44634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--foo', type=spam, default='bar')
44644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = parser.parse_args('--foo spam!'.split())
44654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(foo='foo_converted'), args)
44664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ==================================================================
44684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Check semantics regarding the default argument and type conversion
44694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ==================================================================
44704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestTypeFunctionCalledOnDefault(TestCase):
44724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_type_function_call_with_non_string_default(self):
44744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def spam(int_to_convert):
44754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(int_to_convert, 0)
44764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 'foo_converted'
44774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
44794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--foo', type=spam, default=0)
44804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = parser.parse_args([])
44814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # foo should *not* be converted because its default is not a string.
44824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(foo=0), args)
44834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_type_function_call_with_string_default(self):
44854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def spam(int_to_convert):
44864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 'foo_converted'
44874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
44894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--foo', type=spam, default='0')
44904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = parser.parse_args([])
44914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # foo is converted because its default is a string.
44924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(foo='foo_converted'), args)
44934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_no_double_type_conversion_of_default(self):
44954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def extend(str_to_convert):
44964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return str_to_convert + '*'
44974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
44994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--test', type=extend, default='*')
45004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = parser.parse_args([])
45014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The test argument will be two stars, one coming from the default
45024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # value and one coming from the type conversion being called exactly
45034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # once.
45044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(test='**'), args)
45054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_issue_15906(self):
45074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Issue #15906: When action='append', type=str, default=[] are
45084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # providing, the dest value was the string representation "[]" when it
45094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # should have been an empty list.
45104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
45114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--test', dest='test', type=str,
45124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            default=[], action='append')
45134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = parser.parse_args([])
45144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(args.test, [])
45154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ======================
45174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# parse_known_args tests
45184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ======================
45194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestParseKnownArgs(TestCase):
45214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_arguments_tuple(self):
45234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
45244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.parse_args(())
45254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_arguments_list(self):
45274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
45284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.parse_args([])
45294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_arguments_tuple_positional(self):
45314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
45324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('x')
45334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.parse_args(('x',))
45344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_arguments_list_positional(self):
45364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
45374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('x')
45384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.parse_args(['x'])
45394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_optionals(self):
45414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
45424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--foo')
45434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args, extras = parser.parse_known_args('--foo F --bar --baz'.split())
45444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(foo='F'), args)
45454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(['--bar', '--baz'], extras)
45464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_mixed(self):
45484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
45494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('-v', nargs='?', const=1, type=int)
45504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('--spam', action='store_false')
45514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument('badger')
45524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        argv = ["B", "C", "--foo", "-v", "3", "4"]
45544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args, extras = parser.parse_known_args(argv)
45554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(NS(v=3, spam=True, badger="B"), args)
45564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(["C", "--foo", "4"], extras)
45574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ==========================
45594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# add_argument metavar tests
45604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ==========================
45614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestAddArgumentMetavar(TestCase):
45634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    EXPECTED_MESSAGE = "length of metavar tuple does not match nargs"
45654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_test_no_exception(self, nargs, metavar):
45674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
45684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser.add_argument("--foo", nargs=nargs, metavar=metavar)
45694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_test_exception(self, nargs, metavar):
45714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parser = argparse.ArgumentParser()
45724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.assertRaises(ValueError) as cm:
45734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parser.add_argument("--foo", nargs=nargs, metavar=metavar)
45744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cm.exception.args[0], self.EXPECTED_MESSAGE)
45754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Unit tests for different values of metavar when nargs=None
45774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_None_metavar_string(self):
45794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs=None, metavar="1")
45804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_None_metavar_length0(self):
45824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs=None, metavar=tuple())
45834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_None_metavar_length1(self):
45854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs=None, metavar=("1"))
45864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_None_metavar_length2(self):
45884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs=None, metavar=("1", "2"))
45894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_None_metavar_length3(self):
45914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs=None, metavar=("1", "2", "3"))
45924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Unit tests for different values of metavar when nargs=?
45944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_optional_metavar_string(self):
45964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="?", metavar="1")
45974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
45984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_optional_metavar_length0(self):
45994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs="?", metavar=tuple())
46004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_optional_metavar_length1(self):
46024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="?", metavar=("1"))
46034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_optional_metavar_length2(self):
46054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs="?", metavar=("1", "2"))
46064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_optional_metavar_length3(self):
46084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs="?", metavar=("1", "2", "3"))
46094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Unit tests for different values of metavar when nargs=*
46114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_zeroormore_metavar_string(self):
46134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="*", metavar="1")
46144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_zeroormore_metavar_length0(self):
46164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs="*", metavar=tuple())
46174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_zeroormore_metavar_length1(self):
46194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="*", metavar=("1"))
46204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_zeroormore_metavar_length2(self):
46224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="*", metavar=("1", "2"))
46234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_zeroormore_metavar_length3(self):
46254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs="*", metavar=("1", "2", "3"))
46264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Unit tests for different values of metavar when nargs=+
46284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_oneormore_metavar_string(self):
46304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="+", metavar="1")
46314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_oneormore_metavar_length0(self):
46334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs="+", metavar=tuple())
46344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_oneormore_metavar_length1(self):
46364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="+", metavar=("1"))
46374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_oneormore_metavar_length2(self):
46394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="+", metavar=("1", "2"))
46404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_oneormore_metavar_length3(self):
46424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs="+", metavar=("1", "2", "3"))
46434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Unit tests for different values of metavar when nargs=...
46454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_remainder_metavar_string(self):
46474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="...", metavar="1")
46484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_remainder_metavar_length0(self):
46504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="...", metavar=tuple())
46514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_remainder_metavar_length1(self):
46534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="...", metavar=("1"))
46544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_remainder_metavar_length2(self):
46564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="...", metavar=("1", "2"))
46574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_remainder_metavar_length3(self):
46594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="...", metavar=("1", "2", "3"))
46604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Unit tests for different values of metavar when nargs=A...
46624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_parser_metavar_string(self):
46644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="A...", metavar="1")
46654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_parser_metavar_length0(self):
46674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs="A...", metavar=tuple())
46684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_parser_metavar_length1(self):
46704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs="A...", metavar=("1"))
46714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_parser_metavar_length2(self):
46734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs="A...", metavar=("1", "2"))
46744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_parser_metavar_length3(self):
46764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs="A...", metavar=("1", "2", "3"))
46774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Unit tests for different values of metavar when nargs=1
46794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_1_metavar_string(self):
46814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs=1, metavar="1")
46824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_1_metavar_length0(self):
46844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs=1, metavar=tuple())
46854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_1_metavar_length1(self):
46874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs=1, metavar=("1"))
46884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_1_metavar_length2(self):
46904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs=1, metavar=("1", "2"))
46914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_1_metavar_length3(self):
46934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs=1, metavar=("1", "2", "3"))
46944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Unit tests for different values of metavar when nargs=2
46964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
46974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_2_metavar_string(self):
46984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs=2, metavar="1")
46994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_2_metavar_length0(self):
47014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs=2, metavar=tuple())
47024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_2_metavar_length1(self):
47044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs=2, metavar=("1"))
47054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_2_metavar_length2(self):
47074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs=2, metavar=("1", "2"))
47084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_2_metavar_length3(self):
47104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs=2, metavar=("1", "2", "3"))
47114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Unit tests for different values of metavar when nargs=3
47134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_3_metavar_string(self):
47154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs=3, metavar="1")
47164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_3_metavar_length0(self):
47184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs=3, metavar=tuple())
47194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_3_metavar_length1(self):
47214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs=3, metavar=("1"))
47224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_3_metavar_length2(self):
47244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_exception(nargs=3, metavar=("1", "2"))
47254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nargs_3_metavar_length3(self):
47274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_test_no_exception(nargs=3, metavar=("1", "2", "3"))
47284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ============================
47304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# from argparse import * tests
47314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ============================
47324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestImportStar(TestCase):
47344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test(self):
47364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for name in argparse.__all__:
47374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(hasattr(argparse, name))
47384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_all_exports_everything_but_modules(self):
47404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        items = [
47414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            name
47424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for name, value in vars(argparse).items()
47434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not name.startswith("_")
47444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not inspect.ismodule(value)
47454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ]
47464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(sorted(items), sorted(argparse.__all__))
47474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
47494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # silence warnings about version argument - these are expected
47504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    with test_support.check_warnings(
47514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('The "version" argument to ArgumentParser is deprecated.',
47524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             DeprecationWarning),
47534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('The (format|print)_version method is deprecated',
47544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             DeprecationWarning)):
47554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_support.run_unittest(__name__)
47564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Remove global references to avoid looking like we have refleaks.
47574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    RFile.seen = {}
47584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    WFile.seen = set()
47594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
47624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == '__main__':
47634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
4764