14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Author: Steven J. Bethard <steven.bethard@gmail.com>.
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport codecs
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport inspect
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport shutil
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport stat
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport textwrap
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport tempfile
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport argparse
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom StringIO import StringIO
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass StdIOBuffer(StringIO):
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import test_support
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestCase(unittest.TestCase):
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def assertEqual(self, obj1, obj2):
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if obj1 != obj2:
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print('')
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print(repr(obj1))
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print(repr(obj2))
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print(obj1)
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print(obj2)
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        super(TestCase, self).assertEqual(obj1, obj2)
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def setUp(self):
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # The tests assume that line wrapping occurs at 80 columns, but this
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # behaviour can be overridden by setting the COLUMNS environment
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # variable.  To ensure that this assumption is true, unset COLUMNS.
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        env = test_support.EnvironmentVarGuard()
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        env.unset("COLUMNS")
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.addCleanup(env.__exit__)
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TempDirMixin(object):
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def setUp(self):
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.temp_dir = tempfile.mkdtemp()
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.old_dir = os.getcwd()
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        os.chdir(self.temp_dir)
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def tearDown(self):
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        os.chdir(self.old_dir)
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        shutil.rmtree(self.temp_dir, True)
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def create_readonly_file(self, filename):
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        file_path = os.path.join(self.temp_dir, filename)
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with open(file_path, 'w') as file:
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file.write(filename)
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        os.chmod(file_path, stat.S_IREAD)
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Sig(object):
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, *args, **kwargs):
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.args = args
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.kwargs = kwargs
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass NS(object):
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, **kwargs):
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.__dict__.update(kwargs)
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __repr__(self):
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sorted_items = sorted(self.__dict__.items())
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        kwarg_str = ', '.join(['%s=%r' % tup for tup in sorted_items])
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return '%s(%s)' % (type(self).__name__, kwarg_str)
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __hash__ = None
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __eq__(self, other):
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return vars(self) == vars(other)
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __ne__(self, other):
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return not (self == other)
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass ArgumentParserError(Exception):
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, message, stdout=None, stderr=None, error_code=None):
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Exception.__init__(self, message, stdout, stderr)
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.message = message
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.stdout = stdout
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.stderr = stderr
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.error_code = error_code
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef stderr_to_parser_error(parse_args, *args, **kwargs):
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # if this is being called recursively and stderr or stdout is already being
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # redirected, simply call the function and let the enclosing function
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # catch the exception
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if isinstance(sys.stderr, StdIOBuffer) or isinstance(sys.stdout, StdIOBuffer):
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return parse_args(*args, **kwargs)
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # if this is not being called recursively, redirect stderr and
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # use it as the ArgumentParserError message
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    old_stdout = sys.stdout
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    old_stderr = sys.stderr
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sys.stdout = StdIOBuffer()
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sys.stderr = StdIOBuffer()
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    try:
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = parse_args(*args, **kwargs)
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for key in list(vars(result)):
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if getattr(result, key) is sys.stdout:
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    setattr(result, key, old_stdout)
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if getattr(result, key) is sys.stderr:
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    setattr(result, key, old_stderr)
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return result
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except SystemExit:
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            code = sys.exc_info()[1].code
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            stdout = sys.stdout.getvalue()
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            stderr = sys.stderr.getvalue()
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise ArgumentParserError("SystemExit", stdout, stderr, code)
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    finally:
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stdout = old_stdout
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stderr = old_stderr
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass ErrorRaisingArgumentParser(argparse.ArgumentParser):
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def parse_args(self, *args, **kwargs):
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parse_args = super(ErrorRaisingArgumentParser, self).parse_args
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return stderr_to_parser_error(parse_args, *args, **kwargs)
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def exit(self, *args, **kwargs):
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit = super(ErrorRaisingArgumentParser, self).exit
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return stderr_to_parser_error(exit, *args, **kwargs)
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def error(self, *args, **kwargs):
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        error = super(ErrorRaisingArgumentParser, self).error
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return stderr_to_parser_error(error, *args, **kwargs)
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass ParserTesterMetaclass(type):
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Adds parser tests using the class attributes.
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Classes of this type should specify the following attributes:
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures -- a list of Sig objects which specify
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        the signatures of Argument objects to be created
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures -- a list of args lists that should cause the parser
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        to fail
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes -- a list of (initial_args, options, remaining_args) tuples
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        where initial_args specifies the string args to be parsed,
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        options is a dict that should match the vars() of the options
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parsed out of initial_args, and remaining_args should be any
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        remaining unparsed arguments
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(cls, name, bases, bodydict):
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if name == 'ParserTestCase':
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # default parser signature is empty
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not hasattr(cls, 'parser_signature'):
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            cls.parser_signature = Sig()
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not hasattr(cls, 'parser_class'):
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            cls.parser_class = ErrorRaisingArgumentParser
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # ---------------------------------------
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # functions for adding optional arguments
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # ---------------------------------------
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def no_groups(parser, argument_signatures):
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            """Add all arguments directly to the parser"""
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for sig in argument_signatures:
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                parser.add_argument(*sig.args, **sig.kwargs)
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def one_group(parser, argument_signatures):
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            """Add all arguments under a single group in the parser"""
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            group = parser.add_argument_group('foo')
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for sig in argument_signatures:
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                group.add_argument(*sig.args, **sig.kwargs)
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def many_groups(parser, argument_signatures):
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            """Add each argument in its own group to the parser"""
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for i, sig in enumerate(argument_signatures):
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                group = parser.add_argument_group('foo:%i' % i)
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                group.add_argument(*sig.args, **sig.kwargs)
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # --------------------------
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # functions for parsing args
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # --------------------------
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def listargs(parser, args):
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            """Parse the args by passing in a list"""
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return parser.parse_args(args)
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def sysargs(parser, args):
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            """Parse the args by defaulting to sys.argv"""
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            old_sys_argv = sys.argv
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sys.argv = [old_sys_argv[0]] + args
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return parser.parse_args()
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            finally:
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sys.argv = old_sys_argv
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # class that holds the combination of one optional argument
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # addition method and one arg parsing method
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class AddTests(object):
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, tester_cls, add_arguments, parse_args):
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._add_arguments = add_arguments
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._parse_args = parse_args
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                add_arguments_name = self._add_arguments.__name__
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                parse_args_name = self._parse_args.__name__
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for test_func in [self.test_failures, self.test_successes]:
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    func_name = test_func.__name__
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    names = func_name, add_arguments_name, parse_args_name
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    test_name = '_'.join(names)
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    def wrapper(self, test_func=test_func):
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        test_func(self)
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    try:
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        wrapper.__name__ = test_name
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    except TypeError:
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        pass
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    setattr(tester_cls, test_name, wrapper)
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def _get_parser(self, tester):
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                args = tester.parser_signature.args
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                kwargs = tester.parser_signature.kwargs
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                parser = tester.parser_class(*args, **kwargs)
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._add_arguments(parser, tester.argument_signatures)
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return parser
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test_failures(self, tester):
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                parser = self._get_parser(tester)
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for args_str in tester.failures:
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    args = args_str.split()
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raises = tester.assertRaises
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raises(ArgumentParserError, parser.parse_args, args)
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test_successes(self, tester):
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                parser = self._get_parser(tester)
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for args, expected_ns in tester.successes:
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if isinstance(args, str):
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        args = args.split()
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    result_ns = self._parse_args(parser, args)
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    tester.assertEqual(expected_ns, result_ns)
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # add tests for each combination of an optionals adding method
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # and an arg parsing method
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for add_arguments in [no_groups, one_group, many_groups]:
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for parse_args in [listargs, sysargs]:
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                AddTests(cls, add_arguments, parse_args)
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbases = TestCase,
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmParserTestCase = ParserTesterMetaclass('ParserTestCase', bases, {})
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ===============
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Optionals tests
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ===============
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsSingleDash(ParserTestCase):
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test an Optional with a single-dash option string"""
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-x')]
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x', 'a', '--foo', '-x --foo', '-x -y']
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None)),
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x a', NS(x='a')),
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-xa', NS(x='a')),
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x -1', NS(x='-1')),
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x-1', NS(x='-1')),
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsSingleDashCombined(ParserTestCase):
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test an Optional with a single-dash option string"""
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', action='store_true'),
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-yyy', action='store_const', const=42),
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-z'),
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '--foo', '-xa', '-x --foo', '-x -z', '-z -x',
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                '-yx', '-yz a', '-yyyx', '-yyyza', '-xyza']
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=False, yyy=None, z=None)),
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x', NS(x=True, yyy=None, z=None)),
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-za', NS(x=False, yyy=None, z='a')),
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-z a', NS(x=False, yyy=None, z='a')),
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-xza', NS(x=True, yyy=None, z='a')),
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-xz a', NS(x=True, yyy=None, z='a')),
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x -za', NS(x=True, yyy=None, z='a')),
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x -z a', NS(x=True, yyy=None, z='a')),
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y', NS(x=False, yyy=42, z=None)),
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-yyy', NS(x=False, yyy=42, z=None)),
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x -yyy -za', NS(x=True, yyy=42, z='a')),
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x -yyy -z a', NS(x=True, yyy=42, z='a')),
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsSingleDashLong(ParserTestCase):
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test an Optional with a multi-character single-dash option string"""
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-foo')]
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-foo', 'a', '--foo', '-foo --foo', '-foo -y', '-fooa']
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foo=None)),
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-foo a', NS(foo='a')),
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-foo -1', NS(foo='-1')),
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-fo a', NS(foo='a')),
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-f a', NS(foo='a')),
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsSingleDashSubsetAmbiguous(ParserTestCase):
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test Optionals where option strings are subsets of each other"""
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-f'), Sig('-foobar'), Sig('-foorab')]
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-f', '-foo', '-fo', '-foo b', '-foob', '-fooba', '-foora']
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(f=None, foobar=None, foorab=None)),
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-f a', NS(f='a', foobar=None, foorab=None)),
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-fa', NS(f='a', foobar=None, foorab=None)),
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-foa', NS(f='oa', foobar=None, foorab=None)),
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-fooa', NS(f='ooa', foobar=None, foorab=None)),
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-foobar a', NS(f=None, foobar='a', foorab=None)),
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-foorab a', NS(f=None, foobar=None, foorab='a')),
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsSingleDashAmbiguous(ParserTestCase):
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test Optionals that partially match but are not subsets"""
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-foobar'), Sig('-foorab')]
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-f', '-f a', '-fa', '-foa', '-foo', '-fo', '-foo b']
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foobar=None, foorab=None)),
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-foob a', NS(foobar='a', foorab=None)),
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-foor a', NS(foobar=None, foorab='a')),
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-fooba a', NS(foobar='a', foorab=None)),
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-foora a', NS(foobar=None, foorab='a')),
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-foobar a', NS(foobar='a', foorab=None)),
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-foorab a', NS(foobar=None, foorab='a')),
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsNumeric(ParserTestCase):
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test an Optional with a short opt string"""
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-1', dest='one')]
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-1', 'a', '-1 --foo', '-1 -y', '-1 -1', '-1 -2']
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(one=None)),
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-1 a', NS(one='a')),
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-1a', NS(one='a')),
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-1-2', NS(one='-2')),
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsDoubleDash(ParserTestCase):
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test an Optional with a double-dash option string"""
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('--foo')]
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--foo', '-f', '-f a', 'a', '--foo -x', '--foo --bar']
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foo=None)),
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--foo a', NS(foo='a')),
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--foo=a', NS(foo='a')),
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--foo -2.5', NS(foo='-2.5')),
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--foo=-2.5', NS(foo='-2.5')),
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsDoubleDashPartialMatch(ParserTestCase):
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests partial matching with a double-dash option string"""
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--badger', action='store_true'),
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--bat'),
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--bar', '--b', '--ba', '--b=2', '--ba=4', '--badge 5']
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(badger=False, bat=None)),
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--bat X', NS(badger=False, bat='X')),
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--bad', NS(badger=True, bat=None)),
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--badg', NS(badger=True, bat=None)),
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--badge', NS(badger=True, bat=None)),
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--badger', NS(badger=True, bat=None)),
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsDoubleDashPrefixMatch(ParserTestCase):
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests when one double-dash option string is a prefix of another"""
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--badger', action='store_true'),
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--ba'),
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--bar', '--b', '--ba', '--b=2', '--badge 5']
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(badger=False, ba=None)),
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--ba X', NS(badger=False, ba='X')),
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--ba=X', NS(badger=False, ba='X')),
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--bad', NS(badger=True, ba=None)),
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--badg', NS(badger=True, ba=None)),
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--badge', NS(badger=True, ba=None)),
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--badger', NS(badger=True, ba=None)),
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsSingleDoubleDash(ParserTestCase):
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test an Optional with single- and double-dash option strings"""
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-f', action='store_true'),
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--bar'),
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-baz', action='store_const', const=42),
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--bar', '-fbar', '-fbaz', '-bazf', '-b B', 'B']
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(f=False, bar=None, baz=None)),
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-f', NS(f=True, bar=None, baz=None)),
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--ba B', NS(f=False, bar='B', baz=None)),
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-f --bar B', NS(f=True, bar='B', baz=None)),
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-f -b', NS(f=True, bar=None, baz=42)),
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-ba -f', NS(f=True, bar=None, baz=42)),
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsAlternatePrefixChars(ParserTestCase):
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test an Optional with option strings with custom prefixes"""
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prefix_chars='+:/', add_help=False)
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('+f', action='store_true'),
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('::bar'),
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('/baz', action='store_const', const=42),
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--bar', '-fbar', '-b B', 'B', '-f', '--bar B', '-baz', '-h', '--help', '+h', '::help', '/help']
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(f=False, bar=None, baz=None)),
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('+f', NS(f=True, bar=None, baz=None)),
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('::ba B', NS(f=False, bar='B', baz=None)),
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('+f ::bar B', NS(f=True, bar='B', baz=None)),
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('+f /b', NS(f=True, bar=None, baz=42)),
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('/ba +f', NS(f=True, bar=None, baz=42)),
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsAlternatePrefixCharsAddedHelp(ParserTestCase):
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """When ``-`` not in prefix_chars, default operators created for help
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       should use the prefix_chars in use rather than - or --
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       http://bugs.python.org/issue9444"""
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prefix_chars='+:/', add_help=True)
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('+f', action='store_true'),
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('::bar'),
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('/baz', action='store_const', const=42),
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--bar', '-fbar', '-b B', 'B', '-f', '--bar B', '-baz']
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(f=False, bar=None, baz=None)),
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('+f', NS(f=True, bar=None, baz=None)),
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('::ba B', NS(f=False, bar='B', baz=None)),
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('+f ::bar B', NS(f=True, bar='B', baz=None)),
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('+f /b', NS(f=True, bar=None, baz=42)),
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('/ba +f', NS(f=True, bar=None, baz=42))
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsAlternatePrefixCharsMultipleShortArgs(ParserTestCase):
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Verify that Optionals must be called with their defined prefixes"""
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prefix_chars='+-', add_help=False)
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', action='store_true'),
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('+y', action='store_true'),
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('+z', action='store_true'),
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-w',
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                '-xyz',
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                '+x',
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                '-y',
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                '+xyz',
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=False, y=False, z=False)),
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x', NS(x=True, y=False, z=False)),
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('+y -x', NS(x=True, y=True, z=False)),
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('+yz -x', NS(x=True, y=True, z=True)),
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsShortLong(ParserTestCase):
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a combination of single- and double-dash option strings"""
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-v', '--verbose', '-n', '--noisy', action='store_true'),
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--x --verbose', '-N', 'a', '-v x']
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(verbose=False)),
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-v', NS(verbose=True)),
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--verbose', NS(verbose=True)),
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-n', NS(verbose=True)),
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--noisy', NS(verbose=True)),
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsDest(ParserTestCase):
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests various means of setting destination"""
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('--foo-bar'), Sig('--baz', dest='zabbaz')]
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a']
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--foo-bar f', NS(foo_bar='f', zabbaz=None)),
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz g', NS(foo_bar=None, zabbaz='g')),
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--foo-bar h --baz i', NS(foo_bar='h', zabbaz='i')),
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz j --foo-bar k', NS(foo_bar='k', zabbaz='j')),
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsDefault(ParserTestCase):
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests specifying a default for an Optional"""
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-x'), Sig('-y', default=42)]
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a']
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None, y=42)),
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-xx', NS(x='x', y=42)),
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-yy', NS(x=None, y='y')),
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsNargsDefault(ParserTestCase):
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests not specifying the number of args for an Optional"""
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-x')]
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '-x']
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None)),
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x a', NS(x='a')),
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsNargs1(ParserTestCase):
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests specifying the 1 arg for an Optional"""
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-x', nargs=1)]
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '-x']
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None)),
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x a', NS(x=['a'])),
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsNargs3(ParserTestCase):
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests specifying the 3 args for an Optional"""
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-x', nargs=3)]
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '-x', '-x a', '-x a b', 'a -x', 'a -x b']
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None)),
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x a b c', NS(x=['a', 'b', 'c'])),
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsNargsOptional(ParserTestCase):
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests specifying an Optional arg for an Optional"""
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-w', nargs='?'),
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', nargs='?', const=42),
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-y', nargs='?', default='spam'),
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-z', nargs='?', type=int, const='42', default='84'),
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['2']
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(w=None, x=None, y='spam', z=84)),
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-w', NS(w=None, x=None, y='spam', z=84)),
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-w 2', NS(w='2', x=None, y='spam', z=84)),
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x', NS(w=None, x=42, y='spam', z=84)),
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x 2', NS(w=None, x='2', y='spam', z=84)),
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y', NS(w=None, x=None, y=None, z=84)),
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y 2', NS(w=None, x=None, y='2', z=84)),
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-z', NS(w=None, x=None, y='spam', z=42)),
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-z 2', NS(w=None, x=None, y='spam', z=2)),
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsNargsZeroOrMore(ParserTestCase):
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests specifying an args for an Optional that accepts zero or more"""
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', nargs='*'),
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-y', nargs='*', default='spam'),
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a']
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None, y='spam')),
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x', NS(x=[], y='spam')),
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x a', NS(x=['a'], y='spam')),
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x a b', NS(x=['a', 'b'], y='spam')),
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y', NS(x=None, y=[])),
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y a', NS(x=None, y=['a'])),
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y a b', NS(x=None, y=['a', 'b'])),
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsNargsOneOrMore(ParserTestCase):
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests specifying an args for an Optional that accepts one or more"""
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', nargs='+'),
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-y', nargs='+', default='spam'),
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '-x', '-y', 'a -x', 'a -y b']
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None, y='spam')),
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x a', NS(x=['a'], y='spam')),
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x a b', NS(x=['a', 'b'], y='spam')),
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y a', NS(x=None, y=['a'])),
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y a b', NS(x=None, y=['a', 'b'])),
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsChoices(ParserTestCase):
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests specifying the choices for an Optional"""
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-f', choices='abc'),
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-g', type=int, choices=range(5))]
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '-f d', '-fad', '-ga', '-g 6']
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(f=None, g=None)),
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-f a', NS(f='a', g=None)),
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-f c', NS(f='c', g=None)),
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-g 0', NS(f=None, g=0)),
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-g 03', NS(f=None, g=3)),
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-fb -g4', NS(f='b', g=4)),
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsRequired(ParserTestCase):
6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests the an optional action that is required"""
6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', type=int, required=True),
6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '']
6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x 1', NS(x=1)),
6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x42', NS(x=42)),
6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsActionStore(ParserTestCase):
6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests the store action for an Optional"""
6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-x', action='store')]
6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', 'a -x']
6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None)),
6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-xfoo', NS(x='foo')),
6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsActionStoreConst(ParserTestCase):
6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests the store_const action for an Optional"""
6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-y', action='store_const', const=object)]
6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a']
6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(y=None)),
6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y', NS(y=object)),
6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsActionStoreFalse(ParserTestCase):
6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests the store_false action for an Optional"""
6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-z', action='store_false')]
6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '-za', '-z a']
6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(z=True)),
6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-z', NS(z=False)),
6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsActionStoreTrue(ParserTestCase):
6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests the store_true action for an Optional"""
6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('--apple', action='store_true')]
6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '--apple=b', '--apple b']
6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(apple=False)),
6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--apple', NS(apple=True)),
6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsActionAppend(ParserTestCase):
7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests the append action for an Optional"""
7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('--baz', action='append')]
7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '--baz', 'a --baz', '--baz a b']
7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(baz=None)),
7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz a', NS(baz=['a'])),
7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz a --baz b', NS(baz=['a', 'b'])),
7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsActionAppendWithDefault(ParserTestCase):
7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests the append action for an Optional"""
7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('--baz', action='append', default=['X'])]
7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '--baz', 'a --baz', '--baz a b']
7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(baz=['X'])),
7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz a', NS(baz=['X', 'a'])),
7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz a --baz b', NS(baz=['X', 'a', 'b'])),
7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsActionAppendConst(ParserTestCase):
7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests the append_const action for an Optional"""
7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-b', action='append_const', const=Exception),
7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-c', action='append', dest='b'),
7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '-c', 'a -c', '-bx', '-b x']
7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(b=None)),
7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-b', NS(b=[Exception])),
7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-b -cx -b -cyz', NS(b=[Exception, 'x', Exception, 'yz'])),
7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsActionAppendConstWithDefault(ParserTestCase):
7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests the append_const action for an Optional"""
7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-b', action='append_const', const=Exception, default=['X']),
7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-c', action='append', dest='b'),
7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '-c', 'a -c', '-bx', '-b x']
7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(b=['X'])),
7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-b', NS(b=['X', Exception])),
7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-b -cx -b -cyz', NS(b=['X', Exception, 'x', Exception, 'yz'])),
7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsActionCount(ParserTestCase):
7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests the count action for an Optional"""
7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-x', action='count')]
7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '-x a', '-x b', '-x a -x b']
7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None)),
7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x', NS(x=1)),
7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ================
7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Positional tests
7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ================
7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsNone(ParserTestCase):
7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional that doesn't specify nargs"""
7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo')]
7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '-x', 'a b']
7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo='a')),
7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargs1(ParserTestCase):
7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional that specifies an nargs of 1"""
7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs=1)]
7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '-x', 'a b']
7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo=['a'])),
7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargs2(ParserTestCase):
7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional that specifies an nargs of 2"""
7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs=2)]
7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', 'a', '-x', 'a b c']
7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo=['a', 'b'])),
7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsZeroOrMore(ParserTestCase):
8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional that specifies unlimited nargs"""
8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='*')]
8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x']
8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foo=[])),
8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo=['a'])),
8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo=['a', 'b'])),
8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsZeroOrMoreDefault(ParserTestCase):
8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional that specifies unlimited nargs and a default"""
8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='*', default='bar')]
8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x']
8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foo='bar')),
8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo=['a'])),
8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo=['a', 'b'])),
8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsOneOrMore(ParserTestCase):
8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional that specifies one or more nargs"""
8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='+')]
8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '-x']
8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo=['a'])),
8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo=['a', 'b'])),
8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsOptional(ParserTestCase):
8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests an Optional Positional"""
8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='?')]
8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x', 'a b']
8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foo=None)),
8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo='a')),
8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsOptionalDefault(ParserTestCase):
8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests an Optional Positional with a default value"""
8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='?', default=42)]
8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x', 'a b']
8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foo=42)),
8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo='a')),
8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsOptionalConvertedDefault(ParserTestCase):
8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests an Optional Positional with a default value
8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    that needs to be converted to the appropriate type.
8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('foo', nargs='?', type=int, default='42'),
8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x', 'a b', '1 2']
8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foo=42)),
8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('1', NS(foo=1)),
8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsNoneNone(ParserTestCase):
8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test two Positionals that don't specify nargs"""
8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo'), Sig('bar')]
8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '-x', 'a', 'a b c']
8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar='b')),
8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsNone1(ParserTestCase):
8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with no nargs followed by one with 1"""
8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo'), Sig('bar', nargs=1)]
8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a', 'a b c']
8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar=['b'])),
8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargs2None(ParserTestCase):
8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with 2 nargs followed by one with none"""
8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs=2), Sig('bar')]
8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a', 'a b', 'a b c d']
8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo=['a', 'b'], bar='c')),
9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsNoneZeroOrMore(ParserTestCase):
9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with no nargs followed by one with unlimited"""
9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo'), Sig('bar', nargs='*')]
9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo']
9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo='a', bar=[])),
9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar=['b'])),
9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo='a', bar=['b', 'c'])),
9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsNoneOneOrMore(ParserTestCase):
9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with no nargs followed by one with one or more"""
9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo'), Sig('bar', nargs='+')]
9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a']
9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar=['b'])),
9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo='a', bar=['b', 'c'])),
9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsNoneOptional(ParserTestCase):
9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with no nargs followed by one with an Optional"""
9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo'), Sig('bar', nargs='?')]
9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a b c']
9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo='a', bar=None)),
9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar='b')),
9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsZeroOrMoreNone(ParserTestCase):
9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with unlimited nargs followed by one with none"""
9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='*'), Sig('bar')]
9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo']
9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo=[], bar='a')),
9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo=['a'], bar='b')),
9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo=['a', 'b'], bar='c')),
9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsOneOrMoreNone(ParserTestCase):
9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with one or more nargs followed by one with none"""
9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='+'), Sig('bar')]
9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a']
9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo=['a'], bar='b')),
9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo=['a', 'b'], bar='c')),
9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsOptionalNone(ParserTestCase):
9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with an Optional nargs followed by one with none"""
9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='?', default=42), Sig('bar')]
9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a b c']
9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo=42, bar='a')),
9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar='b')),
9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargs2ZeroOrMore(ParserTestCase):
9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with 2 nargs followed by one with unlimited"""
9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='*')]
9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a']
9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo=['a', 'b'], bar=[])),
9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargs2OneOrMore(ParserTestCase):
9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with 2 nargs followed by one with one or more"""
9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='+')]
9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a', 'a b']
9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargs2Optional(ParserTestCase):
9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with 2 nargs followed by one optional"""
9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='?')]
9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a', 'a b c d']
9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo=['a', 'b'], bar=None)),
9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo=['a', 'b'], bar='c')),
10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsZeroOrMore1(ParserTestCase):
10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with unlimited nargs followed by one with 1"""
10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='*'), Sig('bar', nargs=1)]
10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', ]
10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo=[], bar=['a'])),
10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo=['a'], bar=['b'])),
10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsOneOrMore1(ParserTestCase):
10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with one or more nargs followed by one with 1"""
10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='+'), Sig('bar', nargs=1)]
10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a']
10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo=['a'], bar=['b'])),
10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsOptional1(ParserTestCase):
10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a Positional with an Optional nargs followed by one with 1"""
10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs=1)]
10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a b c']
10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo=None, bar=['a'])),
10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar=['b'])),
10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsNoneZeroOrMore1(ParserTestCase):
10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test three Positionals: no nargs, unlimited nargs and 1 nargs"""
10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('foo'),
10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('bar', nargs='*'),
10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('baz', nargs=1),
10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a']
10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar=[], baz=['b'])),
10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo='a', bar=['b'], baz=['c'])),
10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsNoneOneOrMore1(ParserTestCase):
10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test three Positionals: no nargs, one or more nargs and 1 nargs"""
10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('foo'),
10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('bar', nargs='+'),
10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('baz', nargs=1),
10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a', 'b']
10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo='a', bar=['b'], baz=['c'])),
10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c d', NS(foo='a', bar=['b', 'c'], baz=['d'])),
10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsNoneOptional1(ParserTestCase):
10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test three Positionals: no nargs, optional narg and 1 nargs"""
10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('foo'),
10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('bar', nargs='?', default=0.625),
10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('baz', nargs=1),
10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a']
10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar=0.625, baz=['b'])),
10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo='a', bar='b', baz=['c'])),
10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsOptionalOptional(ParserTestCase):
10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test two optional nargs"""
10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('foo', nargs='?'),
10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('bar', nargs='?', default=42),
10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--foo', 'a b c']
10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foo=None, bar=42)),
10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo='a', bar=42)),
10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar='b')),
10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsOptionalZeroOrMore(ParserTestCase):
10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test an Optional narg followed by unlimited nargs"""
10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs='*')]
11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--foo']
11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foo=None, bar=[])),
11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo='a', bar=[])),
11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar=['b'])),
11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo='a', bar=['b', 'c'])),
11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsNargsOptionalOneOrMore(ParserTestCase):
11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test an Optional narg followed by one or more nargs"""
11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs='+')]
11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo']
11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo=None, bar=['a'])),
11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar=['b'])),
11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(foo='a', bar=['b', 'c'])),
11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsChoicesString(ParserTestCase):
11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a set of single-character choices"""
11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('spam', choices=set('abcdefg'))]
11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'h', '42', 'ef']
11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(spam='a')),
11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('g', NS(spam='g')),
11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsChoicesInt(ParserTestCase):
11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a set of integer choices"""
11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('spam', type=int, choices=range(20))]
11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'h', '42', 'ef']
11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('4', NS(spam=4)),
11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('15', NS(spam=15)),
11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsActionAppend(ParserTestCase):
11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test the 'append' action"""
11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', action='append'),
11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', action='append', nargs=2),
11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '--foo', 'a', 'a b', 'a b c d']
11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b c', NS(spam=['a', ['b', 'c']])),
11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ========================================
11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Combined optionals and positionals tests
11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ========================================
11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsNumericAndPositionals(ParserTestCase):
11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests negative number args when numeric options are present"""
11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('x', nargs='?'),
11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-4', dest='y', action='store_true'),
11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-2', '-315']
11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None, y=False)),
11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(x='a', y=False)),
11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-4', NS(x=None, y=True)),
11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-4 a', NS(x='a', y=True)),
11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsAlmostNumericAndPositionals(ParserTestCase):
11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests negative number args when almost numeric options are present"""
11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('x', nargs='?'),
11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-k4', dest='y', action='store_true'),
11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-k3']
11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None, y=False)),
11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-2', NS(x='-2', y=False)),
11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(x='a', y=False)),
11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-k4', NS(x=None, y=True)),
11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-k4 a', NS(x='a', y=True)),
11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestEmptyAndSpaceContainingArguments(ParserTestCase):
11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('x', nargs='?'),
11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-y', '--yyy', dest='y'),
11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-y']
12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ([''], NS(x='', y=None)),
12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (['a badger'], NS(x='a badger', y=None)),
12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (['-a badger'], NS(x='-a badger', y=None)),
12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (['-y', ''], NS(x=None, y='')),
12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (['-y', 'a badger'], NS(x=None, y='a badger')),
12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (['-y', '-a badger'], NS(x=None, y='-a badger')),
12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (['--yyy=a badger'], NS(x=None, y='a badger')),
12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (['--yyy=-a badger'], NS(x=None, y='-a badger')),
12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPrefixCharacterOnlyArguments(ParserTestCase):
12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prefix_chars='-+')
12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-', dest='x', nargs='?', const='badger'),
12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('+', dest='y', type=int, default=42),
12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-+-', dest='z', action='store_true'),
12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-y', '+ -']
12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None, y=42, z=False)),
12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-', NS(x='badger', y=42, z=False)),
12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('- X', NS(x='X', y=42, z=False)),
12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('+ -3', NS(x=None, y=-3, z=False)),
12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-+-', NS(x=None, y=42, z=True)),
12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('- ===', NS(x='===', y=42, z=False)),
12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestNargsZeroOrMore(ParserTestCase):
12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests specifying an args for an Optional that accepts zero or more"""
12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-x', nargs='*'), Sig('y', nargs='*')]
12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = []
12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None, y=[])),
12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x', NS(x=[], y=[])),
12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x a', NS(x=['a'], y=[])),
12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x a -- b', NS(x=['a'], y=['b'])),
12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(x=None, y=['a'])),
12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a -x', NS(x=[], y=['a'])),
12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a -x b', NS(x=['b'], y=['a'])),
12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestNargsRemainder(ParserTestCase):
12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests specifying a positional with nargs=REMAINDER"""
12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('x'), Sig('y', nargs='...'), Sig('-z')]
12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '-z', '-z Z']
12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X', NS(x='X', y=[], z=None)),
12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-z Z X', NS(x='X', y=[], z='Z')),
12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X A B -z Z', NS(x='X', y=['A', 'B', '-z', 'Z'], z=None)),
12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X Y --foo', NS(x='X', y=['Y', '--foo'], z=None)),
12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionLike(ParserTestCase):
12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests options that may or may not be arguments"""
12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', type=float),
12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-3', type=float, dest='y'),
12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('z', nargs='*'),
12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x', '-y2.5', '-xa', '-x -a',
12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                '-x -3', '-x -3.5', '-3 -3.5',
12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                '-x -2.5', '-x -2.5 a', '-3 -.5',
12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                'a x -1', '-x -1 a', '-3 -1 a']
12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None, y=None, z=[])),
12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x 2.5', NS(x=2.5, y=None, z=[])),
12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x 2.5 a', NS(x=2.5, y=None, z=['a'])),
12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-3.5', NS(x=None, y=0.5, z=[])),
12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-3-.5', NS(x=None, y=-0.5, z=[])),
12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-3 .5', NS(x=None, y=0.5, z=[])),
12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a -3.5', NS(x=None, y=0.5, z=['a'])),
12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(x=None, y=None, z=['a'])),
12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a -x 1', NS(x=1.0, y=None, z=['a'])),
12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x 1 a', NS(x=1.0, y=None, z=['a'])),
12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-3 1 a', NS(x=None, y=1.0, z=['a'])),
12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestDefaultSuppress(ParserTestCase):
12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test actions with suppressed defaults"""
12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('foo', nargs='?', default=argparse.SUPPRESS),
12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('bar', nargs='*', default=argparse.SUPPRESS),
12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--baz', action='store_true', default=argparse.SUPPRESS),
12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x']
12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS()),
12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo='a')),
12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar=['b'])),
13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz', NS(baz=True)),
13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a --baz', NS(foo='a', baz=True)),
13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestParserDefaultSuppress(ParserTestCase):
13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test actions with a parser-level default of SUPPRESS"""
13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(argument_default=argparse.SUPPRESS)
13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('foo', nargs='?'),
13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('bar', nargs='*'),
13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--baz', action='store_true'),
13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x']
13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS()),
13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo='a')),
13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar=['b'])),
13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz', NS(baz=True)),
13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a --baz', NS(foo='a', baz=True)),
13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestParserDefault42(ParserTestCase):
13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test actions with a parser-level default of 42"""
13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(argument_default=42, version='1.0')
13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('foo', nargs='?'),
13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('bar', nargs='*'),
13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--baz', action='store_true'),
13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x']
13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foo=42, bar=42, baz=42)),
13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a', NS(foo='a', bar=42, baz=42)),
13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a b', NS(foo='a', bar=['b'], baz=42)),
13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz', NS(foo=42, bar=42, baz=True)),
13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a --baz', NS(foo='a', bar=42, baz=True)),
13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestArgumentsFromFile(TempDirMixin, ParserTestCase):
13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test reading arguments from a file"""
13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def setUp(self):
13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        super(TestArgumentsFromFile, self).setUp()
13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        file_texts = [
13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ('hello', 'hello world!\n'),
13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ('recursive', '-a\n'
13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          'A\n'
13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          '@hello'),
13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ('invalid', '@no-such-path\n'),
13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ]
13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for path, text in file_texts:
13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file = open(path, 'w')
13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file.write(text)
13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file.close()
13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(fromfile_prefix_chars='@')
13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-a'),
13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('x'),
13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('y', nargs='+'),
13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['', '-b', 'X', '@invalid', '@missing']
13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X Y', NS(a=None, x='X', y=['Y'])),
13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X -a A Y Z', NS(a='A', x='X', y=['Y', 'Z'])),
13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('@hello X', NS(a=None, x='hello world!', y=['X'])),
13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X @hello', NS(a=None, x='X', y=['hello world!'])),
13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-a B @recursive Y Z', NS(a='A', x='hello world!', y=['Y', 'Z'])),
13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X @recursive Z -a B', NS(a='B', x='X', y=['hello world!', 'Z'])),
13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestArgumentsFromFileConverter(TempDirMixin, ParserTestCase):
13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test reading arguments from a file"""
13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def setUp(self):
13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        super(TestArgumentsFromFileConverter, self).setUp()
13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        file_texts = [
13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ('hello', 'hello world!\n'),
13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ]
13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for path, text in file_texts:
13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file = open(path, 'w')
13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file.write(text)
13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file.close()
13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    class FromFileConverterArgumentParser(ErrorRaisingArgumentParser):
13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def convert_arg_line_to_args(self, arg_line):
13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for arg in arg_line.split():
13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if not arg.strip():
13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    continue
13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield arg
14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_class = FromFileConverterArgumentParser
14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(fromfile_prefix_chars='@')
14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('y', nargs='+'),
14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = []
14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('@hello X', NS(y=['hello', 'world!', 'X'])),
14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =====================
14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Type conversion tests
14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =====================
14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestFileTypeRepr(TestCase):
14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_r(self):
14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        type = argparse.FileType('r')
14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual("FileType('r')", repr(type))
14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_wb_1(self):
14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        type = argparse.FileType('wb', 1)
14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual("FileType('wb', 1)", repr(type))
14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass RFile(object):
14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    seen = {}
14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, name):
14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.name = name
14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __hash__ = None
14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __eq__(self, other):
14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if other in self.seen:
14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            text = self.seen[other]
14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            text = self.seen[other] = other.read()
14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            other.close()
14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not isinstance(text, str):
14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            text = text.decode('ascii')
14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self.name == other.name == text
14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestFileTypeR(TempDirMixin, ParserTestCase):
14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test the FileType option/argument type for reading files"""
14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def setUp(self):
14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        super(TestFileTypeR, self).setUp()
14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for file_name in ['foo', 'bar']:
14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file = open(os.path.join(self.temp_dir, file_name), 'w')
14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file.write(file_name)
14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file.close()
14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.create_readonly_file('readonly')
14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', type=argparse.FileType()),
14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', type=argparse.FileType('r')),
14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x', '-x bar', 'non-existent-file.txt']
14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('foo', NS(x=None, spam=RFile('foo'))),
14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x - -', NS(x=sys.stdin, spam=sys.stdin)),
14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('readonly', NS(x=None, spam=RFile('readonly'))),
14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestFileTypeRB(TempDirMixin, ParserTestCase):
14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test the FileType option/argument type for reading files"""
14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def setUp(self):
14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        super(TestFileTypeRB, self).setUp()
14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for file_name in ['foo', 'bar']:
14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file = open(os.path.join(self.temp_dir, file_name), 'w')
14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file.write(file_name)
14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            file.close()
14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', type=argparse.FileType('rb')),
14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', type=argparse.FileType('rb')),
14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x', '-x bar']
14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('foo', NS(x=None, spam=RFile('foo'))),
14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x - -', NS(x=sys.stdin, spam=sys.stdin)),
14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass WFile(object):
14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    seen = set()
14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, name):
14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.name = name
14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __hash__ = None
15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __eq__(self, other):
15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if other not in self.seen:
15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            text = 'Check that file is writable.'
15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if 'b' in other.mode:
15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                text = text.encode('ascii')
15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            other.write(text)
15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            other.close()
15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.seen.add(other)
15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self.name == other.name
15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestFileTypeW(TempDirMixin, ParserTestCase):
15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test the FileType option/argument type for writing files"""
15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def setUp(self):
15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        super(TestFileTypeW, self).setUp()
15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.create_readonly_file('readonly')
15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', type=argparse.FileType('w')),
15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', type=argparse.FileType('w')),
15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x', '-x bar']
15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x', '-x bar', 'readonly']
15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('foo', NS(x=None, spam=WFile('foo'))),
15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))),
15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x - -', NS(x=sys.stdout, spam=sys.stdout)),
15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestFileTypeWB(TempDirMixin, ParserTestCase):
15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', type=argparse.FileType('wb')),
15374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', type=argparse.FileType('wb')),
15384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
15394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x', '-x bar']
15404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
15414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('foo', NS(x=None, spam=WFile('foo'))),
15424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
15434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))),
15444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x - -', NS(x=sys.stdout, spam=sys.stdout)),
15454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
15464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestTypeCallable(ParserTestCase):
15494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test some callables as option/argument types"""
15504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
15524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--eggs', type=complex),
15534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', type=float),
15544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
15554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['a', '42j', '--eggs a', '--eggs 2i']
15564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
15574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--eggs=42 42', NS(eggs=42, spam=42.0)),
15584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--eggs 2j -- -1.5', NS(eggs=2j, spam=-1.5)),
15594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('1024.675', NS(eggs=None, spam=1024.675)),
15604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
15614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestTypeUserDefined(ParserTestCase):
15644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a user-defined option/argument type"""
15654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    class MyType(TestCase):
15674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def __init__(self, value):
15694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.value = value
15704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        __hash__ = None
15724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def __eq__(self, other):
15744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return (type(self), self.value) == (type(other), other.value)
15754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
15774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', type=MyType),
15784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', type=MyType),
15794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
15804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = []
15814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
15824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a -x b', NS(x=MyType('b'), spam=MyType('a'))),
15834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-xf g', NS(x=MyType('f'), spam=MyType('g'))),
15844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
15854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestTypeClassicClass(ParserTestCase):
15884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a classic class type"""
15894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    class C:
15914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def __init__(self, value):
15934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.value = value
15944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        __hash__ = None
15964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def __eq__(self, other):
15984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return (type(self), self.value) == (type(other), other.value)
15994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
16014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', type=C),
16024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', type=C),
16034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
16044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = []
16054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
16064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('a -x b', NS(x=C('b'), spam=C('a'))),
16074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-xf g', NS(x=C('f'), spam=C('g'))),
16084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
16094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestTypeRegistration(TestCase):
16124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a user-defined type by registering it"""
16134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test(self):
16154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def get_my_type(string):
16174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 'my_type{%s}' % string
16184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
16204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.register('type', 'my_type', get_my_type)
16214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-x', type='my_type')
16224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('y', type='my_type')
16234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.parse_args('1'.split()),
16254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         NS(x=None, y='my_type{1}'))
16264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.parse_args('-x 1 42'.split()),
16274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         NS(x='my_type{1}', y='my_type{42}'))
16284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ============
16314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Action tests
16324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ============
16334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestActionUserDefined(ParserTestCase):
16354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a user-defined option/argument action"""
16364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    class OptionalAction(argparse.Action):
16384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def __call__(self, parser, namespace, value, option_string=None):
16404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
16414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # check destination and option string
16424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert self.dest == 'spam', 'dest: %s' % self.dest
16434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert option_string == '-s', 'flag: %s' % option_string
16444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # when option is before argument, badger=2, and when
16454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # option is after argument, badger=<whatever was set>
16464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expected_ns = NS(spam=0.25)
16474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if value in [0.125, 0.625]:
16484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    expected_ns.badger = 2
16494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                elif value in [2.0]:
16504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    expected_ns.badger = 84
16514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else:
16524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise AssertionError('value: %s' % value)
16534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert expected_ns == namespace, ('expected %s, got %s' %
16544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                  (expected_ns, namespace))
16554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            except AssertionError:
16564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                e = sys.exc_info()[1]
16574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise ArgumentParserError('opt_action failed: %s' % e)
16584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            setattr(namespace, 'spam', value)
16594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    class PositionalAction(argparse.Action):
16614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def __call__(self, parser, namespace, value, option_string=None):
16634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
16644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert option_string is None, ('option_string: %s' %
16654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                               option_string)
16664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # check destination
16674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert self.dest == 'badger', 'dest: %s' % self.dest
16684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # when argument is before option, spam=0.25, and when
16694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # option is after argument, spam=<whatever was set>
16704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expected_ns = NS(badger=2)
16714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if value in [42, 84]:
16724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    expected_ns.spam = 0.25
16734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                elif value in [1]:
16744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    expected_ns.spam = 0.625
16754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                elif value in [2]:
16764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    expected_ns.spam = 0.125
16774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else:
16784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise AssertionError('value: %s' % value)
16794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert expected_ns == namespace, ('expected %s, got %s' %
16804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                  (expected_ns, namespace))
16814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            except AssertionError:
16824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                e = sys.exc_info()[1]
16834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise ArgumentParserError('arg_action failed: %s' % e)
16844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            setattr(namespace, 'badger', value)
16854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
16874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-s', dest='spam', action=OptionalAction,
16884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            type=float, default=0.25),
16894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('badger', action=PositionalAction,
16904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            type=int, nargs='?', default=2),
16914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
16924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = []
16934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
16944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-s0.125', NS(spam=0.125, badger=2)),
16954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('42', NS(spam=0.25, badger=42)),
16964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-s 0.625 1', NS(spam=0.625, badger=1)),
16974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('84 -s2', NS(spam=2.0, badger=84)),
16984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
16994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestActionRegistration(TestCase):
17024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a user-defined action supplied by registering it"""
17034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    class MyAction(argparse.Action):
17054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def __call__(self, parser, namespace, values, option_string=None):
17074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            setattr(namespace, self.dest, 'foo[%s]' % values)
17084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test(self):
17104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
17124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.register('action', 'my_action', self.MyAction)
17134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('badger', action='my_action')
17144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.parse_args(['1']), NS(badger='foo[1]'))
17164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.parse_args(['42']), NS(badger='foo[42]'))
17174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ================
17204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Subparsers tests
17214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ================
17224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestAddSubparsers(TestCase):
17244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test the add_subparsers method"""
17254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def assertArgumentParserError(self, *args, **kwargs):
17274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(ArgumentParserError, *args, **kwargs)
17284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _get_parser(self, subparser_help=False, prefix_chars=None):
17304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # create a parser with a subparsers argument
17314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if prefix_chars:
17324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser = ErrorRaisingArgumentParser(
17334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                prog='PROG', description='main description', prefix_chars=prefix_chars)
17344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.add_argument(
17354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                prefix_chars[0] * 2 + 'foo', action='store_true', help='foo help')
17364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
17374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser = ErrorRaisingArgumentParser(
17384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                prog='PROG', description='main description')
17394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.add_argument(
17404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                '--foo', action='store_true', help='foo help')
17414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument(
17424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            'bar', type=float, help='bar help')
17434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # check that only one subparsers argument can be added
17454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        subparsers = parser.add_subparsers(help='command help')
17464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parser.add_subparsers)
17474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # add first sub-parser
17494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser1_kwargs = dict(description='1 description')
17504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if subparser_help:
17514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser1_kwargs['help'] = '1 help'
17524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser1 = subparsers.add_parser('1', **parser1_kwargs)
17534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser1.add_argument('-w', type=int, help='w help')
17544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser1.add_argument('x', choices='abc', help='x help')
17554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # add second sub-parser
17574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser2_kwargs = dict(description='2 description')
17584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if subparser_help:
17594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser2_kwargs['help'] = '2 help'
17604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser2 = subparsers.add_parser('2', **parser2_kwargs)
17614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser2.add_argument('-y', choices='123', help='y help')
17624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser2.add_argument('z', type=complex, nargs='*', help='z help')
17634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # return the main parser
17654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return parser
17664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def setUp(self):
17684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        super(TestAddSubparsers, self).setUp()
17694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.parser = self._get_parser()
17704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.command_help_parser = self._get_parser(subparser_help=True)
17714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_parse_args_failures(self):
17734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # check some failure cases:
17744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for args_str in ['', 'a', 'a a', '0.5 a', '0.5 1',
17754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         '0.5 1 -y', '0.5 2 -w']:
17764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            args = args_str.split()
17774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertArgumentParserError(self.parser.parse_args, args)
17784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_parse_args(self):
17804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # check some non-failure cases:
17814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(
17824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.parser.parse_args('0.5 1 b -w 7'.split()),
17834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            NS(foo=False, bar=0.5, w=7, x='b'),
17844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        )
17854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(
17864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.parser.parse_args('0.25 --foo 2 -y 2 3j -- -1j'.split()),
17874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            NS(foo=True, bar=0.25, y='2', z=[3j, -1j]),
17884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        )
17894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(
17904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.parser.parse_args('--foo 0.125 1 c'.split()),
17914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            NS(foo=True, bar=0.125, w=None, x='c'),
17924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        )
17934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_parse_known_args(self):
17954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(
17964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.parser.parse_known_args('0.5 1 b -w 7'.split()),
17974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (NS(foo=False, bar=0.5, w=7, x='b'), []),
17984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        )
17994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(
18004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.parser.parse_known_args('0.5 -p 1 b -w 7'.split()),
18014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (NS(foo=False, bar=0.5, w=7, x='b'), ['-p']),
18024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        )
18034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(
18044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.parser.parse_known_args('0.5 1 b -w 7 -p'.split()),
18054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (NS(foo=False, bar=0.5, w=7, x='b'), ['-p']),
18064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        )
18074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(
18084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.parser.parse_known_args('0.5 1 b -q -rs -w 7'.split()),
18094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (NS(foo=False, bar=0.5, w=7, x='b'), ['-q', '-rs']),
18104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        )
18114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(
18124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.parser.parse_known_args('0.5 -W 1 b -X Y -w 7 Z'.split()),
18134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (NS(foo=False, bar=0.5, w=7, x='b'), ['-W', '-X', 'Y', 'Z']),
18144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        )
18154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_dest(self):
18174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
18184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('--foo', action='store_true')
18194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        subparsers = parser.add_subparsers(dest='bar')
18204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser1 = subparsers.add_parser('1')
18214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser1.add_argument('baz')
18224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(foo=False, bar='1', baz='2'),
18234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args('1 2'.split()))
18244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_help(self):
18264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(self.parser.format_usage(),
18274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         'usage: PROG [-h] [--foo] bar {1,2} ...\n')
18284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(self.parser.format_help(), textwrap.dedent('''\
18294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: PROG [-h] [--foo] bar {1,2} ...
18304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            main description
18324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            positional arguments:
18344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              bar         bar help
18354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              {1,2}       command help
18364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
18384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -h, --help  show this help message and exit
18394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              --foo       foo help
18404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            '''))
18414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_help_extra_prefix_chars(self):
18434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Make sure - is still used for help if it is a non-first prefix char
18444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = self._get_parser(prefix_chars='+:-')
18454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.format_usage(),
18464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         'usage: PROG [-h] [++foo] bar {1,2} ...\n')
18474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.format_help(), textwrap.dedent('''\
18484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: PROG [-h] [++foo] bar {1,2} ...
18494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            main description
18514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            positional arguments:
18534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              bar         bar help
18544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              {1,2}       command help
18554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
18574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -h, --help  show this help message and exit
18584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              ++foo       foo help
18594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            '''))
18604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_help_alternate_prefix_chars(self):
18634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = self._get_parser(prefix_chars='+:/')
18644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.format_usage(),
18654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         'usage: PROG [+h] [++foo] bar {1,2} ...\n')
18664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.format_help(), textwrap.dedent('''\
18674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: PROG [+h] [++foo] bar {1,2} ...
18684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            main description
18704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            positional arguments:
18724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              bar         bar help
18734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              {1,2}       command help
18744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
18764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              +h, ++help  show this help message and exit
18774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              ++foo       foo help
18784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            '''))
18794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_parser_command_help(self):
18814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(self.command_help_parser.format_usage(),
18824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         'usage: PROG [-h] [--foo] bar {1,2} ...\n')
18834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(self.command_help_parser.format_help(),
18844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         textwrap.dedent('''\
18854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: PROG [-h] [--foo] bar {1,2} ...
18864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            main description
18884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            positional arguments:
18904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              bar         bar help
18914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              {1,2}       command help
18924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                1         1 help
18934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                2         2 help
18944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
18964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -h, --help  show this help message and exit
18974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              --foo       foo help
18984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            '''))
18994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_subparser_title_help(self):
19014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PROG',
19024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                            description='main description')
19034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('--foo', action='store_true', help='foo help')
19044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('bar', help='bar help')
19054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        subparsers = parser.add_subparsers(title='subcommands',
19064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                           description='command help',
19074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                           help='additional text')
19084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser1 = subparsers.add_parser('1')
19094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser2 = subparsers.add_parser('2')
19104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.format_usage(),
19114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         'usage: PROG [-h] [--foo] bar {1,2} ...\n')
19124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.format_help(), textwrap.dedent('''\
19134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: PROG [-h] [--foo] bar {1,2} ...
19144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            main description
19164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            positional arguments:
19184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              bar         bar help
19194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
19214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -h, --help  show this help message and exit
19224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              --foo       foo help
19234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            subcommands:
19254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              command help
19264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              {1,2}       additional text
19284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            '''))
19294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _test_subparser_help(self, args_str, expected_help):
19314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
19324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.parser.parse_args(args_str.split())
19334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except ArgumentParserError:
19344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            err = sys.exc_info()[1]
19354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if err.stdout != expected_help:
19364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                print(repr(expected_help))
19374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                print(repr(err.stdout))
19384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(err.stdout, expected_help)
19394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_subparser1_help(self):
19414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._test_subparser_help('5.0 1 -h', textwrap.dedent('''\
19424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: PROG bar 1 [-h] [-w W] {a,b,c}
19434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            1 description
19454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            positional arguments:
19474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              {a,b,c}     x help
19484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
19504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -h, --help  show this help message and exit
19514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -w W        w help
19524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            '''))
19534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_subparser2_help(self):
19554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._test_subparser_help('5.0 2 -h', textwrap.dedent('''\
19564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: PROG bar 2 [-h] [-y {1,2,3}] [z [z ...]]
19574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            2 description
19594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            positional arguments:
19614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              z           z help
19624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
19644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -h, --help  show this help message and exit
19654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -y {1,2,3}  y help
19664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            '''))
19674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ============
19694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Groups tests
19704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ============
19714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestPositionalsGroups(TestCase):
19734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests that order of group positionals matches construction order"""
19744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nongroup_first(self):
19764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
19774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('foo')
19784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_argument_group('g')
19794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('bar')
19804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('baz')
19814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expected = NS(foo='1', bar='2', baz='3')
19824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = parser.parse_args('1 2 3'.split())
19834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(expected, result)
19844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_group_first(self):
19864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
19874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_argument_group('xxx')
19884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('foo')
19894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('bar')
19904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('baz')
19914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expected = NS(foo='1', bar='2', baz='3')
19924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = parser.parse_args('1 2 3'.split())
19934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(expected, result)
19944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_interleaved_groups(self):
19964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
19974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_argument_group('xxx')
19984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('foo')
19994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('bar')
20004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('baz')
20014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_argument_group('yyy')
20024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('frell')
20034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expected = NS(foo='1', bar='2', baz='3', frell='4')
20044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = parser.parse_args('1 2 3 4'.split())
20054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(expected, result)
20064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ===================
20084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Parent parser tests
20094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ===================
20104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestParentParsers(TestCase):
20124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests that parsers can be created with parent parsers"""
20134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def assertArgumentParserError(self, *args, **kwargs):
20154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(ArgumentParserError, *args, **kwargs)
20164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def setUp(self):
20184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        super(TestParentParsers, self).setUp()
20194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.wxyz_parent = ErrorRaisingArgumentParser(add_help=False)
20204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.wxyz_parent.add_argument('--w')
20214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x_group = self.wxyz_parent.add_argument_group('x')
20224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x_group.add_argument('-y')
20234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.wxyz_parent.add_argument('z')
20244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.abcd_parent = ErrorRaisingArgumentParser(add_help=False)
20264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.abcd_parent.add_argument('a')
20274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.abcd_parent.add_argument('-b')
20284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c_group = self.abcd_parent.add_argument_group('c')
20294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c_group.add_argument('--d')
20304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.w_parent = ErrorRaisingArgumentParser(add_help=False)
20324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.w_parent.add_argument('--w')
20334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.z_parent = ErrorRaisingArgumentParser(add_help=False)
20354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.z_parent.add_argument('z')
20364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # parents with mutually exclusive groups
20384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.ab_mutex_parent = ErrorRaisingArgumentParser(add_help=False)
20394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = self.ab_mutex_parent.add_mutually_exclusive_group()
20404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('-a', action='store_true')
20414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('-b', action='store_true')
20424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.main_program = os.path.basename(sys.argv[0])
20444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_single_parent(self):
20464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(parents=[self.wxyz_parent])
20474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.parse_args('-y 1 2 --w 3'.split()),
20484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         NS(w='3', y='1', z='2'))
20494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_single_parent_mutex(self):
20514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._test_mutex_ab(self.ab_mutex_parent.parse_args)
20524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(parents=[self.ab_mutex_parent])
20534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._test_mutex_ab(parser.parse_args)
20544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_single_granparent_mutex(self):
20564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parents = [self.ab_mutex_parent]
20574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(add_help=False, parents=parents)
20584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(parents=[parser])
20594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._test_mutex_ab(parser.parse_args)
20604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _test_mutex_ab(self, parse_args):
20624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parse_args([]), NS(a=False, b=False))
20634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parse_args(['-a']), NS(a=True, b=False))
20644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parse_args(['-b']), NS(a=False, b=True))
20654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parse_args, ['-a', '-b'])
20664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parse_args, ['-b', '-a'])
20674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parse_args, ['-c'])
20684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parse_args, ['-a', '-c'])
20694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parse_args, ['-b', '-c'])
20704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_multiple_parents(self):
20724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parents = [self.abcd_parent, self.wxyz_parent]
20734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(parents=parents)
20744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.parse_args('--d 1 --w 2 3 4'.split()),
20754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         NS(a='3', b=None, d='1', w='2', y=None, z='4'))
20764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_multiple_parents_mutex(self):
20784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parents = [self.ab_mutex_parent, self.wxyz_parent]
20794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(parents=parents)
20804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.parse_args('-a --w 2 3'.split()),
20814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         NS(a=True, b=False, w='2', y=None, z='3'))
20824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(
20834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.parse_args, '-a --w 2 3 -b'.split())
20844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(
20854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.parse_args, '-a -b --w 2 3'.split())
20864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_conflicting_parents(self):
20884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(
20894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            argparse.ArgumentError,
20904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            argparse.ArgumentParser,
20914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parents=[self.w_parent, self.wxyz_parent])
20924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_conflicting_parents_mutex(self):
20944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(
20954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            argparse.ArgumentError,
20964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            argparse.ArgumentParser,
20974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parents=[self.abcd_parent, self.ab_mutex_parent])
20984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_same_argument_name_parents(self):
21004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parents = [self.wxyz_parent, self.z_parent]
21014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(parents=parents)
21024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.parse_args('1 2'.split()),
21034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         NS(w=None, y=None, z='2'))
21044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_subparser_parents(self):
21064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
21074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        subparsers = parser.add_subparsers()
21084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        abcde_parser = subparsers.add_parser('bar', parents=[self.abcd_parent])
21094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        abcde_parser.add_argument('e')
21104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.parse_args('bar -b 1 --d 2 3 4'.split()),
21114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         NS(a='3', b='1', d='2', e='4'))
21124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_subparser_parents_mutex(self):
21144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
21154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        subparsers = parser.add_subparsers()
21164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parents = [self.ab_mutex_parent]
21174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        abc_parser = subparsers.add_parser('foo', parents=parents)
21184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c_group = abc_parser.add_argument_group('c_group')
21194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c_group.add_argument('c')
21204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parents = [self.wxyz_parent, self.ab_mutex_parent]
21214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        wxyzabe_parser = subparsers.add_parser('bar', parents=parents)
21224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        wxyzabe_parser.add_argument('e')
21234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.parse_args('foo -a 4'.split()),
21244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         NS(a=True, b=False, c='4'))
21254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.parse_args('bar -b  --w 2 3 4'.split()),
21264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         NS(a=False, b=True, w='2', y=None, z='3', e='4'))
21274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(
21284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.parse_args, 'foo -a -b 4'.split())
21294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(
21304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.parse_args, 'bar -b -a 4'.split())
21314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_parent_help(self):
21334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parents = [self.abcd_parent, self.wxyz_parent]
21344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(parents=parents)
21354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser_help = parser.format_help()
21364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser_help, textwrap.dedent('''\
21374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: {} [-h] [-b B] [--d D] [--w W] [-y Y] a z
21384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            positional arguments:
21404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              a
21414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              z
21424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
21444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -h, --help  show this help message and exit
21454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -b B
21464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              --w W
21474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            c:
21494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              --d D
21504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            x:
21524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -y Y
21534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''.format(self.main_program)))
21544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_groups_parents(self):
21564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parent = ErrorRaisingArgumentParser(add_help=False)
21574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        g = parent.add_argument_group(title='g', description='gd')
21584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        g.add_argument('-w')
21594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        g.add_argument('-x')
21604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        m = parent.add_mutually_exclusive_group()
21614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        m.add_argument('-y')
21624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        m.add_argument('-z')
21634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(parents=[parent])
21644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(ArgumentParserError, parser.parse_args,
21664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ['-y', 'Y', '-z', 'Z'])
21674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser_help = parser.format_help()
21694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser_help, textwrap.dedent('''\
21704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: {} [-h] [-w W] [-x X] [-y Y | -z Z]
21714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
21734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -h, --help  show this help message and exit
21744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -y Y
21754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -z Z
21764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            g:
21784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              gd
21794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -w W
21814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -x X
21824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''.format(self.main_program)))
21834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ==============================
21854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Mutually exclusive group tests
21864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ==============================
21874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveGroupErrors(TestCase):
21894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_invalid_add_argument_group(self):
21914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
21924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raises = self.assertRaises
21934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raises(TypeError, parser.add_mutually_exclusive_group, title='foo')
21944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_invalid_add_argument(self):
21964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
21974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_mutually_exclusive_group()
21984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        add_argument = group.add_argument
21994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raises = self.assertRaises
22004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raises(ValueError, add_argument, '--foo', required=True)
22014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raises(ValueError, add_argument, 'bar')
22024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raises(ValueError, add_argument, 'bar', nargs='+')
22034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raises(ValueError, add_argument, 'bar', nargs=1)
22044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raises(ValueError, add_argument, 'bar', nargs=argparse.PARSER)
22054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_help(self):
22074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PROG')
22084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group1 = parser.add_mutually_exclusive_group()
22094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group1.add_argument('--foo', action='store_true')
22104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group1.add_argument('--bar', action='store_false')
22114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group2 = parser.add_mutually_exclusive_group()
22124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group2.add_argument('--soup', action='store_true')
22134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group2.add_argument('--nuts', action='store_false')
22144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expected = '''\
22154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: PROG [-h] [--foo | --bar] [--soup | --nuts]
22164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
22184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -h, --help  show this help message and exit
22194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              --foo
22204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              --bar
22214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              --soup
22224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              --nuts
22234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              '''
22244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.format_help(), textwrap.dedent(expected))
22254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass MEMixin(object):
22274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_failures_when_not_required(self):
22294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parse_args = self.get_parser(required=False).parse_args
22304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        error = ArgumentParserError
22314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for args_string in self.failures:
22324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertRaises(error, parse_args, args_string.split())
22334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_failures_when_required(self):
22354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parse_args = self.get_parser(required=True).parse_args
22364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        error = ArgumentParserError
22374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for args_string in self.failures + ['']:
22384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertRaises(error, parse_args, args_string.split())
22394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_successes_when_not_required(self):
22414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parse_args = self.get_parser(required=False).parse_args
22424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        successes = self.successes + self.successes_when_not_required
22434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for args_string, expected_ns in successes:
22444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            actual_ns = parse_args(args_string.split())
22454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(actual_ns, expected_ns)
22464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_successes_when_required(self):
22484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parse_args = self.get_parser(required=True).parse_args
22494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for args_string, expected_ns in self.successes:
22504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            actual_ns = parse_args(args_string.split())
22514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(actual_ns, expected_ns)
22524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_usage_when_not_required(self):
22544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        format_usage = self.get_parser(required=False).format_usage
22554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expected_usage = self.usage_when_not_required
22564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(format_usage(), textwrap.dedent(expected_usage))
22574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_usage_when_required(self):
22594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        format_usage = self.get_parser(required=True).format_usage
22604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expected_usage = self.usage_when_required
22614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(format_usage(), textwrap.dedent(expected_usage))
22624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_help_when_not_required(self):
22644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        format_help = self.get_parser(required=False).format_help
22654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        help = self.usage_when_not_required + self.help
22664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(format_help(), textwrap.dedent(help))
22674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_help_when_required(self):
22694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        format_help = self.get_parser(required=True).format_help
22704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        help = self.usage_when_required + self.help
22714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(format_help(), textwrap.dedent(help))
22724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveSimple(MEMixin, TestCase):
22754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_parser(self, required=None):
22774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PROG')
22784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_mutually_exclusive_group(required=required)
22794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('--bar', help='bar help')
22804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('--baz', nargs='?', const='Z', help='baz help')
22814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return parser
22824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--bar X --baz Y', '--bar X --baz']
22844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
22854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--bar X', NS(bar='X', baz=None)),
22864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--bar X --bar Z', NS(bar='Z', baz=None)),
22874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz Y', NS(bar=None, baz='Y')),
22884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz', NS(bar=None, baz='Z')),
22894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
22904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes_when_not_required = [
22914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(bar=None, baz=None)),
22924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
22934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_not_required = '''\
22954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [--bar BAR | --baz [BAZ]]
22964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
22974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_required = '''\
22984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] (--bar BAR | --baz [BAZ])
22994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
23004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = '''\
23014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
23034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help   show this help message and exit
23044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --bar BAR    bar help
23054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --baz [BAZ]  baz help
23064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
23074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveLong(MEMixin, TestCase):
23104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_parser(self, required=None):
23124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PROG')
23134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('--abcde', help='abcde help')
23144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('--fghij', help='fghij help')
23154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_mutually_exclusive_group(required=required)
23164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('--klmno', help='klmno help')
23174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('--pqrst', help='pqrst help')
23184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return parser
23194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--klmno X --pqrst Y']
23214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
23224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--klmno X', NS(abcde=None, fghij=None, klmno='X', pqrst=None)),
23234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--abcde Y --klmno X',
23244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            NS(abcde='Y', fghij=None, klmno='X', pqrst=None)),
23254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--pqrst X', NS(abcde=None, fghij=None, klmno=None, pqrst='X')),
23264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--pqrst X --fghij Y',
23274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            NS(abcde=None, fghij='Y', klmno=None, pqrst='X')),
23284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
23294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes_when_not_required = [
23304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(abcde=None, fghij=None, klmno=None, pqrst=None)),
23314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
23324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_not_required = '''\
23344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
23354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                [--klmno KLMNO | --pqrst PQRST]
23364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '''
23374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_required = '''\
23384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
23394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (--klmno KLMNO | --pqrst PQRST)
23404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '''
23414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = '''\
23424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    optional arguments:
23444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      -h, --help     show this help message and exit
23454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      --abcde ABCDE  abcde help
23464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      --fghij FGHIJ  fghij help
23474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      --klmno KLMNO  klmno help
23484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      --pqrst PQRST  pqrst help
23494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '''
23504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveFirstSuppressed(MEMixin, TestCase):
23534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_parser(self, required):
23554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PROG')
23564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_mutually_exclusive_group(required=required)
23574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('-x', help=argparse.SUPPRESS)
23584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('-y', action='store_false', help='y help')
23594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return parser
23604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-x X -y']
23624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
23634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x X', NS(x='X', y=True)),
23644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x X -x Y', NS(x='Y', y=True)),
23654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y', NS(x=None, y=False)),
23664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
23674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes_when_not_required = [
23684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(x=None, y=True)),
23694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
23704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_not_required = '''\
23724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-y]
23734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
23744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_required = '''\
23754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] -y
23764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
23774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = '''\
23784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
23804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
23814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y          y help
23824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
23834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveManySuppressed(MEMixin, TestCase):
23864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_parser(self, required):
23884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PROG')
23894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_mutually_exclusive_group(required=required)
23904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        add = group.add_argument
23914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        add('--spam', action='store_true', help=argparse.SUPPRESS)
23924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        add('--badger', action='store_false', help=argparse.SUPPRESS)
23934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        add('--bladder', help=argparse.SUPPRESS)
23944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return parser
23954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = [
23974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '--spam --badger',
23984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '--badger --bladder B',
23994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '--bladder B --spam',
24004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
24014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
24024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--spam', NS(spam=True, badger=True, bladder=None)),
24034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--badger', NS(spam=False, badger=False, bladder=None)),
24044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--bladder B', NS(spam=False, badger=True, bladder='B')),
24054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--spam --spam', NS(spam=True, badger=True, bladder=None)),
24064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
24074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes_when_not_required = [
24084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(spam=False, badger=True, bladder=None)),
24094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
24104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_required = usage_when_not_required = '''\
24124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h]
24134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
24144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = '''\
24154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
24174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
24184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
24194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveOptionalAndPositional(MEMixin, TestCase):
24224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_parser(self, required):
24244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PROG')
24254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_mutually_exclusive_group(required=required)
24264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('--foo', action='store_true', help='FOO')
24274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('--spam', help='SPAM')
24284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('badger', nargs='*', default='X', help='BADGER')
24294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return parser
24304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = [
24324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '--foo --spam S',
24334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '--spam S X',
24344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        'X --foo',
24354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        'X Y Z --spam S',
24364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '--foo X Y',
24374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
24384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
24394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--foo', NS(foo=True, spam=None, badger='X')),
24404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--spam S', NS(foo=False, spam='S', badger='X')),
24414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X', NS(foo=False, spam=None, badger=['X'])),
24424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X Y Z', NS(foo=False, spam=None, badger=['X', 'Y', 'Z'])),
24434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
24444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes_when_not_required = [
24454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(foo=False, spam=None, badger='X')),
24464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
24474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_not_required = '''\
24494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [--foo | --spam SPAM | badger [badger ...]]
24504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
24514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_required = '''\
24524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] (--foo | --spam SPAM | badger [badger ...])
24534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
24544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = '''\
24554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
24574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          badger       BADGER
24584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
24604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help   show this help message and exit
24614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo        FOO
24624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --spam SPAM  SPAM
24634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
24644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveOptionalsMixed(MEMixin, TestCase):
24674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_parser(self, required):
24694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PROG')
24704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-x', action='store_true', help='x help')
24714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_mutually_exclusive_group(required=required)
24724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('-a', action='store_true', help='a help')
24734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('-b', action='store_true', help='b help')
24744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-y', action='store_true', help='y help')
24754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('-c', action='store_true', help='c help')
24764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return parser
24774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['-a -b', '-b -c', '-a -c', '-a -b -c']
24794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
24804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-a', NS(a=True, b=False, c=False, x=False, y=False)),
24814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-b', NS(a=False, b=True, c=False, x=False, y=False)),
24824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-c', NS(a=False, b=False, c=True, x=False, y=False)),
24834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-a -x', NS(a=True, b=False, c=False, x=True, y=False)),
24844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y -b', NS(a=False, b=True, c=False, x=False, y=True)),
24854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x -y -c', NS(a=False, b=False, c=True, x=True, y=True)),
24864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
24874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes_when_not_required = [
24884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(a=False, b=False, c=False, x=False, y=False)),
24894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-x', NS(a=False, b=False, c=False, x=True, y=False)),
24904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('-y', NS(a=False, b=False, c=False, x=False, y=True)),
24914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
24924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_required = usage_when_not_required = '''\
24944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-x] [-a] [-b] [-y] [-c]
24954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
24964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = '''\
24974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
24994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
25004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x          x help
25014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -a          a help
25024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -b          b help
25034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y          y help
25044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -c          c help
25054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
25064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveInGroup(MEMixin, TestCase):
25094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_parser(self, required=None):
25114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PROG')
25124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        titled_group = parser.add_argument_group(
25134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            title='Titled group', description='Group description')
25144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        mutex_group = \
25154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            titled_group.add_mutually_exclusive_group(required=required)
25164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        mutex_group.add_argument('--bar', help='bar help')
25174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        mutex_group.add_argument('--baz', help='baz help')
25184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return parser
25194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['--bar X --baz Y', '--baz X --bar Y']
25214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
25224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--bar X', NS(bar='X', baz=None)),
25234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('--baz Y', NS(bar=None, baz='Y')),
25244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
25254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes_when_not_required = [
25264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('', NS(bar=None, baz=None)),
25274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
25284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_not_required = '''\
25304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [--bar BAR | --baz BAZ]
25314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
25324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_required = '''\
25334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] (--bar BAR | --baz BAZ)
25344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
25354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = '''\
25364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
25384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
25394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Titled group:
25414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          Group description
25424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --bar BAR   bar help
25444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --baz BAZ   baz help
25454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
25464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveOptionalsAndPositionalsMixed(MEMixin, TestCase):
25494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_parser(self, required):
25514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PROG')
25524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('x', help='x help')
25534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-y', action='store_true', help='y help')
25544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_mutually_exclusive_group(required=required)
25554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('a', nargs='?', help='a help')
25564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('-b', action='store_true', help='b help')
25574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('-c', action='store_true', help='c help')
25584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return parser
25594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    failures = ['X A -b', '-b -c', '-c X A']
25614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes = [
25624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X A', NS(a='A', b=False, c=False, x='X', y=False)),
25634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X -b', NS(a=None, b=True, c=False, x='X', y=False)),
25644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X -c', NS(a=None, b=False, c=True, x='X', y=False)),
25654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X A -y', NS(a='A', b=False, c=False, x='X', y=True)),
25664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X -y -b', NS(a=None, b=True, c=False, x='X', y=True)),
25674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
25684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    successes_when_not_required = [
25694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X', NS(a=None, b=False, c=False, x='X', y=False)),
25704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ('X -y', NS(a=None, b=False, c=False, x='X', y=True)),
25714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
25724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage_when_required = usage_when_not_required = '''\
25744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-y] [-b] [-c] x [a]
25754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
25764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = '''\
25774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
25794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          x           x help
25804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          a           a help
25814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
25834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
25844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y          y help
25854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -b          b help
25864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -c          c help
25874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
25884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =================================================
25904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Mutually exclusive group in parent parser tests
25914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =================================================
25924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass MEPBase(object):
25944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_parser(self, required=None):
25964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parent = super(MEPBase, self).get_parser(required=required)
25974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(
25984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            prog=parent.prog, add_help=False, parents=[parent])
25994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return parser
26004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveGroupErrorsParent(
26034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    MEPBase, TestMutuallyExclusiveGroupErrors):
26044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
26054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveSimpleParent(
26084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    MEPBase, TestMutuallyExclusiveSimple):
26094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
26104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveLongParent(
26134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    MEPBase, TestMutuallyExclusiveLong):
26144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
26154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveFirstSuppressedParent(
26184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    MEPBase, TestMutuallyExclusiveFirstSuppressed):
26194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
26204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveManySuppressedParent(
26234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    MEPBase, TestMutuallyExclusiveManySuppressed):
26244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
26254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveOptionalAndPositionalParent(
26284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    MEPBase, TestMutuallyExclusiveOptionalAndPositional):
26294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
26304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveOptionalsMixedParent(
26334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    MEPBase, TestMutuallyExclusiveOptionalsMixed):
26344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
26354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMutuallyExclusiveOptionalsAndPositionalsMixedParent(
26384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    MEPBase, TestMutuallyExclusiveOptionalsAndPositionalsMixed):
26394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
26404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =================
26424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Set default tests
26434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =================
26444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestSetDefaults(TestCase):
26464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_set_defaults_no_args(self):
26484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
26494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.set_defaults(x='foo')
26504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.set_defaults(y='bar', z=1)
26514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='foo', y='bar', z=1),
26524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args([]))
26534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='foo', y='bar', z=1),
26544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args([], NS()))
26554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='baz', y='bar', z=1),
26564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args([], NS(x='baz')))
26574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='baz', y='bar', z=2),
26584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args([], NS(x='baz', z=2)))
26594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_set_defaults_with_args(self):
26614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
26624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.set_defaults(x='foo', y='bar')
26634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-x', default='xfoox')
26644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='xfoox', y='bar'),
26654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args([]))
26664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='xfoox', y='bar'),
26674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args([], NS()))
26684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='baz', y='bar'),
26694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args([], NS(x='baz')))
26704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='1', y='bar'),
26714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args('-x 1'.split()))
26724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='1', y='bar'),
26734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args('-x 1'.split(), NS()))
26744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='1', y='bar'),
26754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args('-x 1'.split(), NS(x='baz')))
26764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_set_defaults_subparsers(self):
26784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
26794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.set_defaults(x='foo')
26804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        subparsers = parser.add_subparsers()
26814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser_a = subparsers.add_parser('a')
26824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser_a.set_defaults(y='bar')
26834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='foo', y='bar'),
26844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args('a'.split()))
26854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_set_defaults_parents(self):
26874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parent = ErrorRaisingArgumentParser(add_help=False)
26884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parent.set_defaults(x='foo')
26894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(parents=[parent])
26904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(x='foo'), parser.parse_args([]))
26914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_set_defaults_same_as_add_argument(self):
26934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
26944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.set_defaults(w='W', x='X', y='Y', z='Z')
26954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-w')
26964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-x', default='XX')
26974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('y', nargs='?')
26984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('z', nargs='?', default='ZZ')
26994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # defaults set previously
27014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(w='W', x='XX', y='Y', z='ZZ'),
27024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args([]))
27034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # reset defaults
27054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.set_defaults(w='WW', x='X', y='YY', z='Z')
27064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(w='WW', x='X', y='YY', z='Z'),
27074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args([]))
27084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_set_defaults_same_as_add_argument_group(self):
27104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
27114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.set_defaults(w='W', x='X', y='Y', z='Z')
27124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group = parser.add_argument_group('foo')
27134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('-w')
27144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('-x', default='XX')
27154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('y', nargs='?')
27164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group.add_argument('z', nargs='?', default='ZZ')
27174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # defaults set previously
27204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(w='W', x='XX', y='Y', z='ZZ'),
27214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args([]))
27224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # reset defaults
27244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.set_defaults(w='WW', x='X', y='YY', z='Z')
27254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(w='WW', x='X', y='YY', z='Z'),
27264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         parser.parse_args([]))
27274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =================
27294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Get default tests
27304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =================
27314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestGetDefault(TestCase):
27334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_get_default(self):
27354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
27364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(None, parser.get_default("foo"))
27374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(None, parser.get_default("bar"))
27384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument("--foo")
27404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(None, parser.get_default("foo"))
27414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(None, parser.get_default("bar"))
27424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument("--bar", type=int, default=42)
27444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(None, parser.get_default("foo"))
27454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(42, parser.get_default("bar"))
27464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.set_defaults(foo="badger")
27484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual("badger", parser.get_default("foo"))
27494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(42, parser.get_default("bar"))
27504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ==========================
27524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Namespace 'contains' tests
27534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ==========================
27544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestNamespaceContainsSimple(TestCase):
27564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_empty(self):
27584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ns = argparse.Namespace()
27594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual('' in ns, False)
27604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual('' not in ns, True)
27614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual('x' in ns, False)
27624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_non_empty(self):
27644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ns = argparse.Namespace(x=1, y=2)
27654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual('x' in ns, True)
27664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual('x' not in ns, False)
27674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual('y' in ns, True)
27684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual('' in ns, False)
27694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual('xx' in ns, False)
27704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual('z' in ns, False)
27714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =====================
27734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Help formatting tests
27744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =====================
27754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpFormattingMetaclass(type):
27774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(cls, name, bases, bodydict):
27794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if name == 'HelpTestCase':
27804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return
27814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class AddTests(object):
27834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, test_class, func_suffix, std_name):
27854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.func_suffix = func_suffix
27864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.std_name = std_name
27874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for test_func in [self.test_format,
27894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  self.test_print,
27904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  self.test_print_file]:
27914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    test_name = '%s_%s' % (test_func.__name__, func_suffix)
27924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    def test_wrapper(self, test_func=test_func):
27944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        test_func(self)
27954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    try:
27964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        test_wrapper.__name__ = test_name
27974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    except TypeError:
27984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        pass
27994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    setattr(test_class, test_name, test_wrapper)
28004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def _get_parser(self, tester):
28024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                parser = argparse.ArgumentParser(
28034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    *tester.parser_signature.args,
28044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    **tester.parser_signature.kwargs)
28054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for argument_sig in getattr(tester, 'argument_signatures', []):
28064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    parser.add_argument(*argument_sig.args,
28074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                        **argument_sig.kwargs)
28084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                group_sigs = getattr(tester, 'argument_group_signatures', [])
28094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for group_sig, argument_sigs in group_sigs:
28104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    group = parser.add_argument_group(*group_sig.args,
28114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                      **group_sig.kwargs)
28124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    for argument_sig in argument_sigs:
28134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        group.add_argument(*argument_sig.args,
28144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                           **argument_sig.kwargs)
28154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                subparsers_sigs = getattr(tester, 'subparsers_signatures', [])
28164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if subparsers_sigs:
28174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    subparsers = parser.add_subparsers()
28184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    for subparser_sig in subparsers_sigs:
28194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        subparsers.add_parser(*subparser_sig.args,
28204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                               **subparser_sig.kwargs)
28214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return parser
28224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def _test(self, tester, parser_text):
28244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expected_text = getattr(tester, self.func_suffix)
28254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expected_text = textwrap.dedent(expected_text)
28264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if expected_text != parser_text:
28274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    print(repr(expected_text))
28284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    print(repr(parser_text))
28294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    for char1, char2 in zip(expected_text, parser_text):
28304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if char1 != char2:
28314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            print('first diff: %r %r' % (char1, char2))
28324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            break
28334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                tester.assertEqual(expected_text, parser_text)
28344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test_format(self, tester):
28364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                parser = self._get_parser(tester)
28374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                format = getattr(parser, 'format_%s' % self.func_suffix)
28384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._test(tester, format())
28394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test_print(self, tester):
28414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                parser = self._get_parser(tester)
28424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                print_ = getattr(parser, 'print_%s' % self.func_suffix)
28434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                old_stream = getattr(sys, self.std_name)
28444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                setattr(sys, self.std_name, StdIOBuffer())
28454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
28464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    print_()
28474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    parser_text = getattr(sys, self.std_name).getvalue()
28484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                finally:
28494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    setattr(sys, self.std_name, old_stream)
28504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._test(tester, parser_text)
28514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test_print_file(self, tester):
28534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                parser = self._get_parser(tester)
28544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                print_ = getattr(parser, 'print_%s' % self.func_suffix)
28554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sfile = StdIOBuffer()
28564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                print_(sfile)
28574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                parser_text = sfile.getvalue()
28584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._test(tester, parser_text)
28594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # add tests for {format,print}_{usage,help,version}
28614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for func_suffix, std_name in [('usage', 'stdout'),
28624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                      ('help', 'stdout'),
28634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                      ('version', 'stderr')]:
28644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            AddTests(cls, func_suffix, std_name)
28654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbases = TestCase,
28674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmHelpTestCase = TestHelpFormattingMetaclass('HelpTestCase', bases, {})
28684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpBiggerOptionals(HelpTestCase):
28714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Make sure that argument help aligns when options are longer"""
28724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', description='DESCRIPTION',
28744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           epilog='EPILOG', version='0.1')
28754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
28764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', action='store_true', help='X HELP'),
28774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--y', help='Y HELP'),
28784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('foo', help='FOO HELP'),
28794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('bar', help='BAR HELP'),
28804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
28814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
28824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
28834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-v] [-x] [--y Y] foo bar
28844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
28854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
28864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        DESCRIPTION
28884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
28904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          foo            FOO HELP
28914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          bar            BAR HELP
28924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
28944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help     show this help message and exit
28954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -v, --version  show program's version number and exit
28964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x             X HELP
28974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --y Y          Y HELP
28984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        EPILOG
29004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '''
29014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = '''\
29024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        0.1
29034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
29044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpBiggerOptionalGroups(HelpTestCase):
29074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Make sure that argument help aligns when options are longer"""
29084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', description='DESCRIPTION',
29104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           epilog='EPILOG', version='0.1')
29114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
29124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', action='store_true', help='X HELP'),
29134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--y', help='Y HELP'),
29144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('foo', help='FOO HELP'),
29154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('bar', help='BAR HELP'),
29164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
29174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = [
29184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('GROUP TITLE', description='GROUP DESCRIPTION'), [
29194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('baz', help='BAZ HELP'),
29204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('-z', nargs='+', help='Z HELP')]),
29214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
29224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
29234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-v] [-x] [--y Y] [-z Z [Z ...]] foo bar baz
29244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
29254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
29264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        DESCRIPTION
29284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
29304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          foo            FOO HELP
29314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          bar            BAR HELP
29324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
29344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help     show this help message and exit
29354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -v, --version  show program's version number and exit
29364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x             X HELP
29374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --y Y          Y HELP
29384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        GROUP TITLE:
29404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          GROUP DESCRIPTION
29414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          baz            BAZ HELP
29434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -z Z [Z ...]   Z HELP
29444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        EPILOG
29464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '''
29474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = '''\
29484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        0.1
29494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
29504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpBiggerPositionals(HelpTestCase):
29534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Make sure that help aligns when arguments are longer"""
29544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(usage='USAGE', description='DESCRIPTION')
29564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
29574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', action='store_true', help='X HELP'),
29584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--y', help='Y HELP'),
29594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('ekiekiekifekang', help='EKI HELP'),
29604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('bar', help='BAR HELP'),
29614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
29624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
29634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
29644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: USAGE
29654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
29664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
29674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        DESCRIPTION
29694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
29714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          ekiekiekifekang  EKI HELP
29724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          bar              BAR HELP
29734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
29754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help       show this help message and exit
29764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x               X HELP
29774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --y Y            Y HELP
29784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
29794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
29814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpReformatting(HelpTestCase):
29844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Make sure that text after short names starts on the first line"""
29854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(
29874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        prog='PROG',
29884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        description='   oddly    formatted\n'
29894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    'description\n'
29904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    '\n'
29914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    'that is so long that it should go onto multiple '
29924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    'lines when wrapped')
29934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
29944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', metavar='XX', help='oddly\n'
29954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     '    formatted -x help'),
29964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('y', metavar='yyy', help='normal y help'),
29974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
29984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = [
29994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('title', description='\n'
30004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  '    oddly formatted group\n'
30014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  '\n'
30024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  'description'),
30034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         [Sig('-a', action='store_true',
30044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              help=' oddly \n'
30054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   'formatted    -a  help  \n'
30064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   '    again, so long that it should be wrapped over '
30074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   'multiple lines')]),
30084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
30094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
30104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-x XX] [-a] yyy
30114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
30124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
30134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        oddly formatted description that is so long that it should go onto \
30154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmultiple
30164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        lines when wrapped
30174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
30194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          yyy         normal y help
30204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
30224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
30234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x XX       oddly formatted -x help
30244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        title:
30264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          oddly formatted group description
30274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -a          oddly formatted -a help again, so long that it should \
30294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbe wrapped
30304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      over multiple lines
30314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
30324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
30334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpWrappingShortNames(HelpTestCase):
30364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Make sure that text after short names starts on the first line"""
30374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', description= 'D\nD' * 30)
30394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
30404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', metavar='XX', help='XHH HX' * 20),
30414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('y', metavar='yyy', help='YH YH' * 20),
30424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
30434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = [
30444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('ALPHAS'), [
30454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('-a', action='store_true', help='AHHH HHA' * 10)]),
30464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
30474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
30484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-x XX] [-a] yyy
30494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
30504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
30514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        D DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD \
30534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmDD DD DD
30544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        DD DD DD DD D
30554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
30574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          yyy         YH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH \
30584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmYHYH YHYH
30594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH
30604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
30624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
30634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x XX       XHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH \
30644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmHXXHH HXXHH
30654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HX
30664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ALPHAS:
30684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -a          AHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH \
30694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmHHAAHHH
30704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      HHAAHHH HHAAHHH HHA
30714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
30724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
30734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpWrappingLongNames(HelpTestCase):
30764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Make sure that text after long names starts on the next line"""
30774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(usage='USAGE', description= 'D D' * 30,
30794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           version='V V'*30)
30804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
30814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', metavar='X' * 25, help='XH XH' * 20),
30824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('y', metavar='y' * 25, help='YH YH' * 20),
30834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
30844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = [
30854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('ALPHAS'), [
30864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('-a', metavar='A' * 25, help='AH AH' * 20),
30874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('z', metavar='z' * 25, help='ZH ZH' * 20)]),
30884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
30894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
30904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: USAGE
30914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
30924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
30934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        D DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD \
30954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmDD DD DD
30964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        DD DD DD DD D
30974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
30994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          yyyyyyyyyyyyyyyyyyyyyyyyy
31004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                YH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH \
31014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmYHYH YHYH
31024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH
31034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
31054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help            show this help message and exit
31064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -v, --version         show program's version number and exit
31074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x XXXXXXXXXXXXXXXXXXXXXXXXX
31084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                XH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH \
31094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmXHXH XHXH
31104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XH
31114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ALPHAS:
31134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -a AAAAAAAAAAAAAAAAAAAAAAAAA
31144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                AH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH \
31154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAHAH AHAH
31164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AH
31174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          zzzzzzzzzzzzzzzzzzzzzzzzz
31184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                ZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH \
31194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmZHZH ZHZH
31204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZH
31214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
31224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = '''\
31234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        V VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV \
31244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmVV VV VV
31254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        VV VV VV VV V
31264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
31274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpUsage(HelpTestCase):
31304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test basic usage messages"""
31314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG')
31334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
31344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-w', nargs='+', help='w'),
31354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', nargs='*', help='x'),
31364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('a', help='a'),
31374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('b', help='b', nargs=2),
31384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('c', help='c', nargs='?'),
31394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
31404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = [
31414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('group'), [
31424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('-y', nargs='?', help='y'),
31434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('-z', nargs=3, help='z'),
31444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('d', help='d', nargs='*'),
31454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('e', help='e', nargs='+'),
31464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ])
31474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
31484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
31494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-w W [W ...]] [-x [X [X ...]]] [-y [Y]] [-z Z Z Z]
31504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    a b b [c] [d [d ...]] e [e ...]
31514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
31524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
31534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
31554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          a               a
31564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          b               b
31574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          c               c
31584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
31604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help      show this help message and exit
31614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -w W [W ...]    w
31624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x [X [X ...]]  x
31634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group:
31654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y [Y]          y
31664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -z Z Z Z        z
31674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          d               d
31684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          e               e
31694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
31704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
31714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpOnlyUserGroups(HelpTestCase):
31744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test basic usage messages"""
31754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', add_help=False)
31774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = []
31784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = [
31794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('xxxx'), [
31804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('-x', help='x'),
31814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('a', help='a'),
31824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ]),
31834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('yyyy'), [
31844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('b', help='b'),
31854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('-y', help='y'),
31864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ]),
31874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
31884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
31894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-x X] [-y Y] a b
31904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
31914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
31924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        xxxx:
31944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x X  x
31954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          a     a
31964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        yyyy:
31984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          b     b
31994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y Y  y
32004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
32014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
32024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpUsageLongProg(HelpTestCase):
32054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test usage messages where the prog is long"""
32064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='P' * 60)
32084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
32094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-w', metavar='W'),
32104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', metavar='X'),
32114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('a'),
32124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('b'),
32134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
32144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
32154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
32164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
32174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               [-h] [-w W] [-x X] a b
32184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
32194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
32204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
32224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          a
32234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          b
32244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
32264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
32274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -w W
32284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x X
32294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
32304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
32314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpUsageLongProgOptionsWrap(HelpTestCase):
32344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test usage messages where the prog is long and the optionals wrap"""
32354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='P' * 60)
32374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
32384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-w', metavar='W' * 25),
32394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', metavar='X' * 25),
32404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-y', metavar='Y' * 25),
32414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-z', metavar='Z' * 25),
32424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('a'),
32434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('b'),
32444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
32454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
32464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
32474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
32484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               [-h] [-w WWWWWWWWWWWWWWWWWWWWWWWWW] \
32494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm[-x XXXXXXXXXXXXXXXXXXXXXXXXX]
32504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               [-y YYYYYYYYYYYYYYYYYYYYYYYYY] [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
32514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               a b
32524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
32534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
32544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
32564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          a
32574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          b
32584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
32604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help            show this help message and exit
32614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -w WWWWWWWWWWWWWWWWWWWWWWWWW
32624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x XXXXXXXXXXXXXXXXXXXXXXXXX
32634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y YYYYYYYYYYYYYYYYYYYYYYYYY
32644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
32654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
32664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
32674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpUsageLongProgPositionalsWrap(HelpTestCase):
32704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test usage messages where the prog is long and the positionals wrap"""
32714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='P' * 60, add_help=False)
32734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
32744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('a' * 25),
32754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('b' * 25),
32764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('c' * 25),
32774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
32784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
32794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
32804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
32814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
32824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               ccccccccccccccccccccccccc
32834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
32844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
32854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
32874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          aaaaaaaaaaaaaaaaaaaaaaaaa
32884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          bbbbbbbbbbbbbbbbbbbbbbbbb
32894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          ccccccccccccccccccccccccc
32904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
32914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
32924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpUsageOptionalsWrap(HelpTestCase):
32954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test usage messages where the optionals wrap"""
32964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG')
32984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
32994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-w', metavar='W' * 25),
33004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', metavar='X' * 25),
33014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-y', metavar='Y' * 25),
33024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-z', metavar='Z' * 25),
33034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('a'),
33044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('b'),
33054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('c'),
33064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
33074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
33084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
33094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-w WWWWWWWWWWWWWWWWWWWWWWWWW] \
33104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm[-x XXXXXXXXXXXXXXXXXXXXXXXXX]
33114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    [-y YYYYYYYYYYYYYYYYYYYYYYYYY] \
33124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm[-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
33134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    a b c
33144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
33154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
33164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
33184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          a
33194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          b
33204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          c
33214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
33234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help            show this help message and exit
33244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -w WWWWWWWWWWWWWWWWWWWWWWWWW
33254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x XXXXXXXXXXXXXXXXXXXXXXXXX
33264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y YYYYYYYYYYYYYYYYYYYYYYYYY
33274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
33284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
33294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
33304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpUsagePositionalsWrap(HelpTestCase):
33334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test usage messages where the positionals wrap"""
33344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG')
33364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
33374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x'),
33384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-y'),
33394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-z'),
33404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('a' * 25),
33414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('b' * 25),
33424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('c' * 25),
33434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
33444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
33454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
33464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-x X] [-y Y] [-z Z]
33474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
33484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ccccccccccccccccccccccccc
33494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
33504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
33514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
33534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          aaaaaaaaaaaaaaaaaaaaaaaaa
33544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          bbbbbbbbbbbbbbbbbbbbbbbbb
33554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          ccccccccccccccccccccccccc
33564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
33584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help            show this help message and exit
33594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x X
33604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y Y
33614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -z Z
33624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
33634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
33644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpUsageOptionalsPositionalsWrap(HelpTestCase):
33674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test usage messages where the optionals and positionals wrap"""
33684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG')
33704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
33714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', metavar='X' * 25),
33724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-y', metavar='Y' * 25),
33734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-z', metavar='Z' * 25),
33744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('a' * 25),
33754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('b' * 25),
33764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('c' * 25),
33774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
33784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
33794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
33804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-x XXXXXXXXXXXXXXXXXXXXXXXXX] \
33814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm[-y YYYYYYYYYYYYYYYYYYYYYYYYY]
33824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
33834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
33844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ccccccccccccccccccccccccc
33854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
33864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
33874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
33894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          aaaaaaaaaaaaaaaaaaaaaaaaa
33904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          bbbbbbbbbbbbbbbbbbbbbbbbb
33914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          ccccccccccccccccccccccccc
33924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
33944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help            show this help message and exit
33954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x XXXXXXXXXXXXXXXXXXXXXXXXX
33964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y YYYYYYYYYYYYYYYYYYYYYYYYY
33974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
33984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
33994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
34004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpUsageOptionalsOnlyWrap(HelpTestCase):
34034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test usage messages where there are only optionals and they wrap"""
34044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG')
34064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
34074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', metavar='X' * 25),
34084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-y', metavar='Y' * 25),
34094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-z', metavar='Z' * 25),
34104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
34114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
34124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
34134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-x XXXXXXXXXXXXXXXXXXXXXXXXX] \
34144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm[-y YYYYYYYYYYYYYYYYYYYYYYYYY]
34154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
34164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
34174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
34184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
34204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help            show this help message and exit
34214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x XXXXXXXXXXXXXXXXXXXXXXXXX
34224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y YYYYYYYYYYYYYYYYYYYYYYYYY
34234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
34244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
34254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
34264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpUsagePositionalsOnlyWrap(HelpTestCase):
34294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test usage messages where there are only positionals and they wrap"""
34304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', add_help=False)
34324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
34334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('a' * 25),
34344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('b' * 25),
34354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('c' * 25),
34364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
34374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
34384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
34394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
34404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ccccccccccccccccccccccccc
34414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
34424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
34434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
34454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          aaaaaaaaaaaaaaaaaaaaaaaaa
34464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          bbbbbbbbbbbbbbbbbbbbbbbbb
34474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          ccccccccccccccccccccccccc
34484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
34494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
34504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpVariableExpansion(HelpTestCase):
34534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that variables are expanded properly in help messages"""
34544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG')
34564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
34574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', type=int,
34584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            help='x %(prog)s %(default)s %(type)s %%'),
34594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-y', action='store_const', default=42, const='XXX',
34604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            help='y %(prog)s %(default)s %(const)s'),
34614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo', choices='abc',
34624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            help='foo %(prog)s %(default)s %(choices)s'),
34634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--bar', default='baz', choices=[1, 2], metavar='BBB',
34644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            help='bar %(prog)s %(default)s %(dest)s'),
34654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', help='spam %(prog)s %(default)s'),
34664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('badger', default=0.5, help='badger %(prog)s %(default)s'),
34674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
34684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = [
34694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('group'), [
34704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('-a', help='a %(prog)s %(default)s'),
34714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Sig('-b', default=-1, help='b %(prog)s %(default)s'),
34724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ])
34734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
34744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = ('''\
34754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-x X] [-y] [--foo {a,b,c}] [--bar BBB] [-a A] [-b B]
34764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    spam badger
34774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ''')
34784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
34794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
34814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          spam           spam PROG None
34824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          badger         badger PROG 0.5
34834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
34854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help     show this help message and exit
34864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x X           x PROG None int %
34874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y             y PROG 42 XXX
34884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo {a,b,c}  foo PROG None a, b, c
34894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --bar BBB      bar PROG baz bar
34904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        group:
34924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -a A           a PROG None
34934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -b B           b PROG -1
34944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
34954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
34964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpVariableExpansionUsageSupplied(HelpTestCase):
34994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that variables are expanded properly when usage= is present"""
35004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', usage='%(prog)s FOO')
35024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = []
35034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
35044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = ('''\
35054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG FOO
35064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ''')
35074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
35084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
35104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
35114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
35124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
35134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpVariableExpansionNoArguments(HelpTestCase):
35164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that variables are expanded properly with no arguments"""
35174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', add_help=False)
35194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = []
35204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
35214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = ('''\
35224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG
35234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ''')
35244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage
35254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
35264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpSuppressUsage(HelpTestCase):
35294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that items can be suppressed in usage messages"""
35304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', usage=argparse.SUPPRESS)
35324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
35334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo', help='foo help'),
35344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', help='spam help'),
35354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
35364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
35374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = '''\
35384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
35394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          spam        spam help
35404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
35424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
35434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo FOO   foo help
35444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
35454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = ''
35464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
35474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpSuppressOptional(HelpTestCase):
35504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that optional arguments can be suppressed in help messages"""
35514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', add_help=False)
35534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
35544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo', help=argparse.SUPPRESS),
35554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', help='spam help'),
35564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
35574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
35584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
35594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG spam
35604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
35614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
35624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
35644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          spam  spam help
35654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
35664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
35674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpSuppressOptionalGroup(HelpTestCase):
35704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that optional groups can be suppressed in help messages"""
35714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG')
35734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
35744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo', help='foo help'),
35754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', help='spam help'),
35764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
35774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = [
35784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('group'), [Sig('--bar', help=argparse.SUPPRESS)]),
35794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
35804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
35814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [--foo FOO] spam
35824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
35834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
35844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
35864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          spam        spam help
35874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
35894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
35904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo FOO   foo help
35914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
35924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
35934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpSuppressPositional(HelpTestCase):
35964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that positional arguments can be suppressed in help messages"""
35974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG')
35994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
36004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo', help='foo help'),
36014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', help=argparse.SUPPRESS),
36024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
36034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
36044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
36054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [--foo FOO]
36064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
36074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
36084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
36104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
36114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo FOO   foo help
36124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
36134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
36144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpRequiredOptional(HelpTestCase):
36174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that required options don't look optional"""
36184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG')
36204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
36214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo', required=True, help='foo help'),
36224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
36234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
36244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
36254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] --foo FOO
36264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
36274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
36284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
36304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
36314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo FOO   foo help
36324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
36334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
36344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpAlternatePrefixChars(HelpTestCase):
36374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that options display with different prefix characters"""
36384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', prefix_chars='^;', add_help=False)
36404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
36414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('^^foo', action='store_true', help='foo help'),
36424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig(';b', ';;bar', help='bar help'),
36434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
36444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
36454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
36464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [^^foo] [;b BAR]
36474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
36484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
36494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
36514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          ^^foo              foo help
36524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          ;b BAR, ;;bar BAR  bar help
36534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
36544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
36554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpNoHelpOptional(HelpTestCase):
36584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that the --help argument can be suppressed help messages"""
36594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', add_help=False)
36614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
36624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo', help='foo help'),
36634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', help='spam help'),
36644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
36654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
36664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
36674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [--foo FOO] spam
36684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
36694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
36704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
36724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          spam       spam help
36734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
36754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo FOO  foo help
36764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
36774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
36784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpVersionOptional(HelpTestCase):
36814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that the --version argument can be suppressed help messages"""
36824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', version='1.0')
36844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
36854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo', help='foo help'),
36864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', help='spam help'),
36874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
36884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
36894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
36904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-v] [--foo FOO] spam
36914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
36924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
36934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
36954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          spam           spam help
36964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
36984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help     show this help message and exit
36994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -v, --version  show program's version number and exit
37004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo FOO      foo help
37014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
37024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = '''\
37034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        1.0
37044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
37054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpNone(HelpTestCase):
37084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test that no errors occur if no help is specified"""
37094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG')
37114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
37124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo'),
37134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam'),
37144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
37154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
37164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
37174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [--foo FOO] spam
37184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
37194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
37204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
37224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          spam
37234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
37254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
37264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo FOO
37274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
37284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
37294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpTupleMetavar(HelpTestCase):
37324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test specifying metavar as a tuple"""
37334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG')
37354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
37364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-w', help='w', nargs='+', metavar=('W1', 'W2')),
37374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-x', help='x', nargs='*', metavar=('X1', 'X2')),
37384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-y', help='y', nargs=3, metavar=('Y1', 'Y2', 'Y3')),
37394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('-z', help='z', nargs='?', metavar=('Z1', )),
37404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
37414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
37424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
37434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-w W1 [W2 ...]] [-x [X1 [X2 ...]]] [-y Y1 Y2 Y3] \
37444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm[-z [Z1]]
37454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
37464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
37474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
37494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help        show this help message and exit
37504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -w W1 [W2 ...]    w
37514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -x [X1 [X2 ...]]  x
37524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -y Y1 Y2 Y3       y
37534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -z [Z1]           z
37544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
37554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
37564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpRawText(HelpTestCase):
37594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test the RawTextHelpFormatter"""
37604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(
37624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        prog='PROG', formatter_class=argparse.RawTextHelpFormatter,
37634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        description='Keep the formatting\n'
37644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    '    exactly as it is written\n'
37654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    '\n'
37664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    'here\n')
37674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
37694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo', help='    foo help should also\n'
37704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          'appear as given here'),
37714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', help='spam help'),
37724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
37734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = [
37744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('title', description='    This text\n'
37754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  '  should be indented\n'
37764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  '    exactly like it is here\n'),
37774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         [Sig('--bar', help='bar help')]),
37784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
37794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
37804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [--foo FOO] [--bar BAR] spam
37814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
37824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
37834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Keep the formatting
37854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            exactly as it is written
37864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        here
37884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
37904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          spam        spam help
37914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
37934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
37944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo FOO       foo help should also
37954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      appear as given here
37964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        title:
37984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              This text
37994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            should be indented
38004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              exactly like it is here
38014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --bar BAR   bar help
38034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
38044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
38054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpRawDescription(HelpTestCase):
38084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test the RawTextHelpFormatter"""
38094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(
38114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        prog='PROG', formatter_class=argparse.RawDescriptionHelpFormatter,
38124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        description='Keep the formatting\n'
38134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    '    exactly as it is written\n'
38144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    '\n'
38154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    'here\n')
38164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
38184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo', help='  foo help should not\n'
38194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          '    retain this odd formatting'),
38204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', help='spam help'),
38214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
38224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = [
38234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('title', description='    This text\n'
38244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  '  should be indented\n'
38254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  '    exactly like it is here\n'),
38264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         [Sig('--bar', help='bar help')]),
38274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
38284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
38294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [--foo FOO] [--bar BAR] spam
38304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
38314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
38324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Keep the formatting
38344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            exactly as it is written
38354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        here
38374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
38394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          spam        spam help
38404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
38424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
38434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo FOO   foo help should not retain this odd formatting
38444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        title:
38464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              This text
38474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            should be indented
38484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              exactly like it is here
38494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --bar BAR   bar help
38514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
38524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
38534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpArgumentDefaults(HelpTestCase):
38564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test the ArgumentDefaultsHelpFormatter"""
38574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(
38594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        prog='PROG', formatter_class=argparse.ArgumentDefaultsHelpFormatter,
38604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        description='description')
38614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [
38634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--foo', help='foo help - oh and by the way, %(default)s'),
38644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('--bar', action='store_true', help='bar help'),
38654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('spam', help='spam help'),
38664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Sig('badger', nargs='?', default='wooden', help='badger help'),
38674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
38684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = [
38694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (Sig('title', description='description'),
38704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         [Sig('--baz', type=int, default=42, help='baz help')]),
38714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ]
38724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
38734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [--foo FOO] [--bar] [--baz BAZ] spam [badger]
38744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
38754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
38764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        description
38784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
38804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          spam        spam help
38814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          badger      badger help (default: wooden)
38824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
38844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help  show this help message and exit
38854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --foo FOO   foo help - oh and by the way, None
38864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --bar       bar help (default: False)
38874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        title:
38894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          description
38904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          --baz BAZ   baz help (default: 42)
38924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
38934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
38944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpVersionAction(HelpTestCase):
38964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test the default help for the version action"""
38974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG', description='description')
38994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_signatures = [Sig('-V', '--version', action='version', version='3.6')]
39004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    argument_group_signatures = []
39014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
39024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-V]
39034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
39044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
39054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        description
39074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
39094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help     show this help message and exit
39104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -V, --version  show program's version number and exit
39114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
39124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = ''
39134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpSubparsersOrdering(HelpTestCase):
39154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test ordering of subcommands in help matches the code"""
39164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG',
39174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           description='display some subcommands',
39184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           version='0.1')
39194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    subparsers_signatures = [Sig(name=name)
39214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             for name in ('a', 'b', 'c', 'd', 'e')]
39224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
39244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-v] {a,b,c,d,e} ...
39254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
39264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
39284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        display some subcommands
39304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
39324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          {a,b,c,d,e}
39334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
39354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help     show this help message and exit
39364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -v, --version  show program's version number and exit
39374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
39384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = '''\
39404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        0.1
39414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
39424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHelpSubparsersWithHelpOrdering(HelpTestCase):
39444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test ordering of subcommands in help matches the code"""
39454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    parser_signature = Sig(prog='PROG',
39464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           description='display some subcommands',
39474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           version='0.1')
39484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    subcommand_data = (('a', 'a subcommand help'),
39504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       ('b', 'b subcommand help'),
39514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       ('c', 'c subcommand help'),
39524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       ('d', 'd subcommand help'),
39534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       ('e', 'e subcommand help'),
39544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       )
39554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    subparsers_signatures = [Sig(name=name, help=help)
39574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             for name, help in subcommand_data]
39584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    usage = '''\
39604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage: PROG [-h] [-v] {a,b,c,d,e} ...
39614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
39624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    help = usage + '''\
39644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        display some subcommands
39664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        positional arguments:
39684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          {a,b,c,d,e}
39694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            a            a subcommand help
39704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            b            b subcommand help
39714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            c            c subcommand help
39724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            d            d subcommand help
39734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            e            e subcommand help
39744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional arguments:
39764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -h, --help     show this help message and exit
39774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          -v, --version  show program's version number and exit
39784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
39794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = '''\
39814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        0.1
39824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '''
39834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =====================================
39864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Optional/Positional constructor tests
39874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =====================================
39884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestInvalidArgumentConstructors(TestCase):
39904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test a bunch of invalid Argument constructors"""
39914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def assertTypeError(self, *args, **kwargs):
39934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
39944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, parser.add_argument,
39954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          *args, **kwargs)
39964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def assertValueError(self, *args, **kwargs):
39984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
39994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(ValueError, parser.add_argument,
40004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          *args, **kwargs)
40014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_invalid_keyword_arguments(self):
40034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTypeError('-x', bar=None)
40044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTypeError('-y', callback='foo')
40054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTypeError('-y', callback_args=())
40064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTypeError('-y', callback_kwargs={})
40074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_missing_destination(self):
40094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTypeError()
40104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for action in ['append', 'store']:
40114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTypeError(action=action)
40124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_invalid_option_strings(self):
40144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertValueError('--')
40154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertValueError('---')
40164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_invalid_type(self):
40184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertValueError('--foo', type='int')
40194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertValueError('--foo', type=(int, float))
40204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_invalid_action(self):
40224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertValueError('-x', action='foo')
40234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertValueError('foo', action='baz')
40244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertValueError('--foo', action=('store', 'append'))
40254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
40264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
40274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.add_argument("--foo", action="store-true")
40284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except ValueError:
40294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            e = sys.exc_info()[1]
40304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expected = 'unknown action'
40314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            msg = 'expected %r, found %r' % (expected, e)
40324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTrue(expected in str(e), msg)
40334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_multiple_dest(self):
40354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
40364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument(dest='foo')
40374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
40384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.add_argument('bar', dest='baz')
40394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except ValueError:
40404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            e = sys.exc_info()[1]
40414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expected = 'dest supplied twice for positional argument'
40424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            msg = 'expected %r, found %r' % (expected, e)
40434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTrue(expected in str(e), msg)
40444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_no_argument_actions(self):
40464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for action in ['store_const', 'store_true', 'store_false',
40474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       'append_const', 'count']:
40484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for attrs in [dict(type=int), dict(nargs='+'),
40494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          dict(choices='ab')]:
40504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.assertTypeError('-x', action=action, **attrs)
40514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_no_argument_no_const_actions(self):
40534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # options with zero arguments
40544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for action in ['store_true', 'store_false', 'count']:
40554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # const is always disallowed
40574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTypeError('-x', const='foo', action=action)
40584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # nargs is always disallowed
40604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTypeError('-x', nargs='*', action=action)
40614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_more_than_one_argument_actions(self):
40634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for action in ['store', 'append']:
40644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # nargs=0 is disallowed
40664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertValueError('-x', nargs=0, action=action)
40674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertValueError('spam', nargs=0, action=action)
40684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # const is disallowed with non-optional arguments
40704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for nargs in [1, '*', '+']:
40714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.assertValueError('-x', const='foo',
40724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                      nargs=nargs, action=action)
40734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.assertValueError('spam', const='foo',
40744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                      nargs=nargs, action=action)
40754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_required_const_actions(self):
40774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for action in ['store_const', 'append_const']:
40784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # nargs is always disallowed
40804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTypeError('-x', nargs='+', action=action)
40814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_parsers_action_missing_params(self):
40834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTypeError('command', action='parsers')
40844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTypeError('command', action='parsers', prog='PROG')
40854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTypeError('command', action='parsers',
40864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             parser_class=argparse.ArgumentParser)
40874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_required_positional(self):
40894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTypeError('foo', required=True)
40904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_user_defined_action(self):
40924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Success(Exception):
40944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
40954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Action(object):
40974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self,
40994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         option_strings,
41004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         dest,
41014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         const,
41024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         default,
41034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         required=False):
41044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if dest == 'spam':
41054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if const is Success:
41064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if default is Success:
41074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            raise Success()
41084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __call__(self, *args, **kwargs):
41104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
41114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
41134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(Success, parser.add_argument, '--spam',
41144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          action=Action, default=Success, const=Success)
41154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(Success, parser.add_argument, 'spam',
41164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          action=Action, default=Success, const=Success)
41174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ================================
41194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Actions returned by add_argument
41204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ================================
41214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestActionsReturned(TestCase):
41234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_dest(self):
41254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
41264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        action = parser.add_argument('--foo')
41274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(action.dest, 'foo')
41284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        action = parser.add_argument('-b', '--bar')
41294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(action.dest, 'bar')
41304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        action = parser.add_argument('-x', '-y')
41314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(action.dest, 'x')
41324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_misc(self):
41344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
41354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        action = parser.add_argument('--foo', nargs='?', const=42,
41364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     default=84, type=int, choices=[1, 2],
41374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     help='FOO', metavar='BAR', dest='baz')
41384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(action.nargs, '?')
41394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(action.const, 42)
41404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(action.default, 84)
41414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(action.type, int)
41424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(action.choices, [1, 2])
41434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(action.help, 'FOO')
41444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(action.metavar, 'BAR')
41454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(action.dest, 'baz')
41464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ================================
41494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Argument conflict handling tests
41504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ================================
41514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestConflictHandling(TestCase):
41534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_bad_type(self):
41554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(ValueError, argparse.ArgumentParser,
41564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          conflict_handler='foo')
41574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_conflict_error(self):
41594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
41604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-x')
41614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(argparse.ArgumentError,
41624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          parser.add_argument, '-x')
41634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('--spam')
41644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(argparse.ArgumentError,
41654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          parser.add_argument, '--spam')
41664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_resolve_error(self):
41684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        get_parser = argparse.ArgumentParser
41694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = get_parser(prog='PROG', conflict_handler='resolve')
41704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-x', help='OLD X')
41724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-x', help='NEW X')
41734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.format_help(), textwrap.dedent('''\
41744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: PROG [-h] [-x X]
41754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
41774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -h, --help  show this help message and exit
41784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -x X        NEW X
41794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            '''))
41804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('--spam', metavar='OLD_SPAM')
41824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('--spam', metavar='NEW_SPAM')
41834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parser.format_help(), textwrap.dedent('''\
41844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage: PROG [-h] [-x X] [--spam NEW_SPAM]
41854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional arguments:
41874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -h, --help       show this help message and exit
41884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              -x X             NEW X
41894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              --spam NEW_SPAM
41904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            '''))
41914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =============================
41944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Help and Version option tests
41954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =============================
41964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOptionalsHelpVersionActions(TestCase):
41984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test the help and version actions"""
41994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _get_error(self, func, *args, **kwargs):
42014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
42024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            func(*args, **kwargs)
42034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except ArgumentParserError:
42044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return sys.exc_info()[1]
42054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
42064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertRaises(ArgumentParserError, func, *args, **kwargs)
42074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def assertPrintHelpExit(self, parser, args_str):
42094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(
42104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.format_help(),
42114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._get_error(parser.parse_args, args_str.split()).stdout)
42124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def assertPrintVersionExit(self, parser, args_str):
42144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(
42154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.format_version(),
42164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._get_error(parser.parse_args, args_str.split()).stderr)
42174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def assertArgumentParserError(self, parser, *args):
42194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(ArgumentParserError, parser.parse_args, args)
42204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_version(self):
42224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(version='1.0')
42234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertPrintHelpExit(parser, '-h')
42244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertPrintHelpExit(parser, '--help')
42254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertPrintVersionExit(parser, '-v')
42264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertPrintVersionExit(parser, '--version')
42274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_version_format(self):
42294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PPP', version='%(prog)s 3.5')
42304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        msg = self._get_error(parser.parse_args, ['-v']).stderr
42314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual('PPP 3.5\n', msg)
42324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_version_no_help(self):
42344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(add_help=False, version='1.0')
42354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parser, '-h')
42364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parser, '--help')
42374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertPrintVersionExit(parser, '-v')
42384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertPrintVersionExit(parser, '--version')
42394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_version_action(self):
42414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='XXX')
42424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-V', action='version', version='%(prog)s 3.7')
42434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        msg = self._get_error(parser.parse_args, ['-V']).stderr
42444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual('XXX 3.7\n', msg)
42454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_no_help(self):
42474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(add_help=False)
42484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parser, '-h')
42494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parser, '--help')
42504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parser, '-v')
42514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parser, '--version')
42524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_alternate_help_version(self):
42544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser()
42554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-x', action='help')
42564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-y', action='version')
42574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertPrintHelpExit(parser, '-x')
42584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertPrintVersionExit(parser, '-y')
42594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parser, '-v')
42604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertArgumentParserError(parser, '--version')
42614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_help_version_extra_arguments(self):
42634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(version='1.0')
42644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-x', action='store_true')
42654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('y')
42664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # try all combinations of valid prefixes and suffixes
42684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        valid_prefixes = ['', '-x', 'foo', '-x bar', 'baz -x']
42694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        valid_suffixes = valid_prefixes + ['--bad-option', 'foo bar baz']
42704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for prefix in valid_prefixes:
42714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for suffix in valid_suffixes:
42724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                format = '%s %%s %s' % (prefix, suffix)
42734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertPrintHelpExit(parser, format % '-h')
42744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertPrintHelpExit(parser, format % '--help')
42754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertPrintVersionExit(parser, format % '-v')
42764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertPrintVersionExit(parser, format % '--version')
42774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ======================
42804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# str() and repr() tests
42814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ======================
42824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestStrings(TestCase):
42844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test str()  and repr() on Optionals and Positionals"""
42854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def assertStringEqual(self, obj, result_string):
42874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for func in [str, repr]:
42884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(func(obj), result_string)
42894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_optional(self):
42914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        option = argparse.Action(
42924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            option_strings=['--foo', '-a', '-b'],
42934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            dest='b',
42944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            type='int',
42954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            nargs='+',
42964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            default=42,
42974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            choices=[1, 2, 3],
42984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            help='HELP',
42994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            metavar='METAVAR')
43004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        string = (
43014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "Action(option_strings=['--foo', '-a', '-b'], dest='b', "
43024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "nargs='+', const=None, default=42, type='int', "
43034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "choices=[1, 2, 3], help='HELP', metavar='METAVAR')")
43044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertStringEqual(option, string)
43054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_argument(self):
43074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        argument = argparse.Action(
43084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            option_strings=[],
43094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            dest='x',
43104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            type=float,
43114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            nargs='?',
43124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            default=2.5,
43134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            choices=[0.5, 1.5, 2.5],
43144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            help='H HH H',
43154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            metavar='MV MV MV')
43164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        string = (
43174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "Action(option_strings=[], dest='x', nargs='?', "
43184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "const=None, default=2.5, type=%r, choices=[0.5, 1.5, 2.5], "
43194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "help='H HH H', metavar='MV MV MV')" % float)
43204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertStringEqual(argument, string)
43214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_namespace(self):
43234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ns = argparse.Namespace(foo=42, bar='spam')
43244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        string = "Namespace(bar='spam', foo=42)"
43254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertStringEqual(ns, string)
43264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_parser(self):
43284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser(prog='PROG')
43294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        string = (
43304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "ArgumentParser(prog='PROG', usage=None, description=None, "
43314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "version=None, formatter_class=%r, conflict_handler='error', "
43324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "add_help=True)" % argparse.HelpFormatter)
43334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertStringEqual(parser, string)
43344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ===============
43364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Namespace tests
43374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ===============
43384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestNamespace(TestCase):
43404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_constructor(self):
43424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ns = argparse.Namespace()
43434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(AttributeError, getattr, ns, 'x')
43444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ns = argparse.Namespace(a=42, b='spam')
43464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(ns.a, 42)
43474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(ns.b, 'spam')
43484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_equality(self):
43504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ns1 = argparse.Namespace(a=1, b=2)
43514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ns2 = argparse.Namespace(b=2, a=1)
43524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ns3 = argparse.Namespace(a=1)
43534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ns4 = argparse.Namespace(b=2)
43544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(ns1, ns2)
43564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotEqual(ns1, ns3)
43574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotEqual(ns1, ns4)
43584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotEqual(ns2, ns3)
43594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotEqual(ns2, ns4)
43604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(ns1 != ns3)
43614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(ns1 != ns4)
43624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(ns2 != ns3)
43634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(ns2 != ns4)
43644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ===================
43674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# File encoding tests
43684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ===================
43694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestEncoding(TestCase):
43714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _test_module_encoding(self, path):
43734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        path, _ = os.path.splitext(path)
43744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        path += ".py"
43754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with codecs.open(path, 'r', 'utf8') as f:
43764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            f.read()
43774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_argparse_module_encoding(self):
43794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._test_module_encoding(argparse.__file__)
43804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_test_argparse_module_encoding(self):
43824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._test_module_encoding(__file__)
43834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ===================
43854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ArgumentError tests
43864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ===================
43874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestArgumentError(TestCase):
43894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_argument_error(self):
43914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        msg = "my error here"
43924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        error = argparse.ArgumentError(None, msg)
43934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(str(error), msg)
43944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =======================
43964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ArgumentTypeError tests
43974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# =======================
43984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestArgumentTypeError(TestCase):
44004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_argument_type_error(self):
44024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def spam(string):
44044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise argparse.ArgumentTypeError('spam!')
44054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = ErrorRaisingArgumentParser(prog='PROG', add_help=False)
44074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('x', type=spam)
44084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
44094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.parse_args(['XXX'])
44104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except ArgumentParserError:
44114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expected = 'usage: PROG x\nPROG: error: argument x: spam!\n'
44124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            msg = sys.exc_info()[1].stderr
44134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(expected, msg)
44144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
44154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail()
44164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ======================
44184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# parse_known_args tests
44194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ======================
44204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestParseKnownArgs(TestCase):
44224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_optionals(self):
44244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
44254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('--foo')
44264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        args, extras = parser.parse_known_args('--foo F --bar --baz'.split())
44274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(foo='F'), args)
44284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(['--bar', '--baz'], extras)
44294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_mixed(self):
44314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
44324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('-v', nargs='?', const=1, type=int)
44334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('--spam', action='store_false')
44344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument('badger')
44354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        argv = ["B", "C", "--foo", "-v", "3", "4"]
44374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        args, extras = parser.parse_known_args(argv)
44384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(NS(v=3, spam=True, badger="B"), args)
44394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(["C", "--foo", "4"], extras)
44404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ==========================
44424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# add_argument metavar tests
44434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ==========================
44444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestAddArgumentMetavar(TestCase):
44464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    EXPECTED_MESSAGE = "length of metavar tuple does not match nargs"
44484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def do_test_no_exception(self, nargs, metavar):
44504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
44514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser.add_argument("--foo", nargs=nargs, metavar=metavar)
44524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def do_test_exception(self, nargs, metavar):
44544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parser = argparse.ArgumentParser()
44554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with self.assertRaises(ValueError) as cm:
44564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            parser.add_argument("--foo", nargs=nargs, metavar=metavar)
44574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(cm.exception.args[0], self.EXPECTED_MESSAGE)
44584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Unit tests for different values of metavar when nargs=None
44604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_None_metavar_string(self):
44624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs=None, metavar="1")
44634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_None_metavar_length0(self):
44654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs=None, metavar=tuple())
44664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_None_metavar_length1(self):
44684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs=None, metavar=("1"))
44694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_None_metavar_length2(self):
44714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs=None, metavar=("1", "2"))
44724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_None_metavar_length3(self):
44744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs=None, metavar=("1", "2", "3"))
44754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Unit tests for different values of metavar when nargs=?
44774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_optional_metavar_string(self):
44794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="?", metavar="1")
44804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_optional_metavar_length0(self):
44824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs="?", metavar=tuple())
44834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_optional_metavar_length1(self):
44854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="?", metavar=("1"))
44864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_optional_metavar_length2(self):
44884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs="?", metavar=("1", "2"))
44894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_optional_metavar_length3(self):
44914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs="?", metavar=("1", "2", "3"))
44924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Unit tests for different values of metavar when nargs=*
44944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_zeroormore_metavar_string(self):
44964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="*", metavar="1")
44974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_zeroormore_metavar_length0(self):
44994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs="*", metavar=tuple())
45004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_zeroormore_metavar_length1(self):
45024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="*", metavar=("1"))
45034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_zeroormore_metavar_length2(self):
45054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="*", metavar=("1", "2"))
45064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_zeroormore_metavar_length3(self):
45084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs="*", metavar=("1", "2", "3"))
45094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Unit tests for different values of metavar when nargs=+
45114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_oneormore_metavar_string(self):
45134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="+", metavar="1")
45144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_oneormore_metavar_length0(self):
45164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs="+", metavar=tuple())
45174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_oneormore_metavar_length1(self):
45194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="+", metavar=("1"))
45204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_oneormore_metavar_length2(self):
45224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="+", metavar=("1", "2"))
45234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_oneormore_metavar_length3(self):
45254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs="+", metavar=("1", "2", "3"))
45264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Unit tests for different values of metavar when nargs=...
45284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_remainder_metavar_string(self):
45304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="...", metavar="1")
45314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_remainder_metavar_length0(self):
45334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="...", metavar=tuple())
45344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_remainder_metavar_length1(self):
45364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="...", metavar=("1"))
45374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_remainder_metavar_length2(self):
45394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="...", metavar=("1", "2"))
45404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_remainder_metavar_length3(self):
45424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="...", metavar=("1", "2", "3"))
45434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Unit tests for different values of metavar when nargs=A...
45454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_parser_metavar_string(self):
45474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="A...", metavar="1")
45484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_parser_metavar_length0(self):
45504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs="A...", metavar=tuple())
45514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_parser_metavar_length1(self):
45534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs="A...", metavar=("1"))
45544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_parser_metavar_length2(self):
45564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs="A...", metavar=("1", "2"))
45574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_parser_metavar_length3(self):
45594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs="A...", metavar=("1", "2", "3"))
45604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Unit tests for different values of metavar when nargs=1
45624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_1_metavar_string(self):
45644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs=1, metavar="1")
45654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_1_metavar_length0(self):
45674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs=1, metavar=tuple())
45684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_1_metavar_length1(self):
45704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs=1, metavar=("1"))
45714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_1_metavar_length2(self):
45734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs=1, metavar=("1", "2"))
45744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_1_metavar_length3(self):
45764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs=1, metavar=("1", "2", "3"))
45774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Unit tests for different values of metavar when nargs=2
45794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_2_metavar_string(self):
45814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs=2, metavar="1")
45824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_2_metavar_length0(self):
45844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs=2, metavar=tuple())
45854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_2_metavar_length1(self):
45874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs=2, metavar=("1"))
45884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_2_metavar_length2(self):
45904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs=2, metavar=("1", "2"))
45914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_2_metavar_length3(self):
45934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs=2, metavar=("1", "2", "3"))
45944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Unit tests for different values of metavar when nargs=3
45964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_3_metavar_string(self):
45984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs=3, metavar="1")
45994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_3_metavar_length0(self):
46014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs=3, metavar=tuple())
46024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_3_metavar_length1(self):
46044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs=3, metavar=("1"))
46054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_3_metavar_length2(self):
46074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_exception(nargs=3, metavar=("1", "2"))
46084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_nargs_3_metavar_length3(self):
46104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.do_test_no_exception(nargs=3, metavar=("1", "2", "3"))
46114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ============================
46134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# from argparse import * tests
46144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ============================
46154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestImportStar(TestCase):
46174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test(self):
46194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for name in argparse.__all__:
46204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTrue(hasattr(argparse, name))
46214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_all_exports_everything_but_modules(self):
46234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        items = [
46244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            name
46254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for name, value in vars(argparse).items()
46264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if not name.startswith("_")
46274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if not inspect.ismodule(value)
46284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ]
46294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(sorted(items), sorted(argparse.__all__))
46304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main():
46324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # silence warnings about version argument - these are expected
46334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    with test_support.check_warnings(
46344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ('The "version" argument to ArgumentParser is deprecated.',
46354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             DeprecationWarning),
46364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ('The (format|print)_version method is deprecated',
46374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             DeprecationWarning)):
46384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_support.run_unittest(__name__)
46394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Remove global references to avoid looking like we have refleaks.
46404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    RFile.seen = {}
46414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    WFile.seen = set()
46424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == '__main__':
46464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_main()
4647