17db96d56Sopenharmony_ci# Author: Steven J. Bethard <steven.bethard@gmail.com>.
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciimport contextlib
47db96d56Sopenharmony_ciimport functools
57db96d56Sopenharmony_ciimport inspect
67db96d56Sopenharmony_ciimport io
77db96d56Sopenharmony_ciimport operator
87db96d56Sopenharmony_ciimport os
97db96d56Sopenharmony_ciimport shutil
107db96d56Sopenharmony_ciimport stat
117db96d56Sopenharmony_ciimport sys
127db96d56Sopenharmony_ciimport textwrap
137db96d56Sopenharmony_ciimport tempfile
147db96d56Sopenharmony_ciimport unittest
157db96d56Sopenharmony_ciimport argparse
167db96d56Sopenharmony_ciimport warnings
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_cifrom test.support import os_helper
197db96d56Sopenharmony_cifrom unittest import mock
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ciclass StdIOBuffer(io.TextIOWrapper):
237db96d56Sopenharmony_ci    '''Replacement for writable io.StringIO that behaves more like real file
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci    Unlike StringIO, provides a buffer attribute that holds the underlying
267db96d56Sopenharmony_ci    binary data, allowing it to replace sys.stdout/sys.stderr in more
277db96d56Sopenharmony_ci    contexts.
287db96d56Sopenharmony_ci    '''
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci    def __init__(self, initial_value='', newline='\n'):
317db96d56Sopenharmony_ci        initial_value = initial_value.encode('utf-8')
327db96d56Sopenharmony_ci        super().__init__(io.BufferedWriter(io.BytesIO(initial_value)),
337db96d56Sopenharmony_ci                         'utf-8', newline=newline)
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci    def getvalue(self):
367db96d56Sopenharmony_ci        self.flush()
377db96d56Sopenharmony_ci        return self.buffer.raw.getvalue().decode('utf-8')
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ciclass StdStreamTest(unittest.TestCase):
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci    def test_skip_invalid_stderr(self):
437db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
447db96d56Sopenharmony_ci        with (
457db96d56Sopenharmony_ci            contextlib.redirect_stderr(None),
467db96d56Sopenharmony_ci            mock.patch('argparse._sys.exit')
477db96d56Sopenharmony_ci        ):
487db96d56Sopenharmony_ci            parser.exit(status=0, message='foo')
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci    def test_skip_invalid_stdout(self):
517db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
527db96d56Sopenharmony_ci        for func in (
537db96d56Sopenharmony_ci            parser.print_usage,
547db96d56Sopenharmony_ci            parser.print_help,
557db96d56Sopenharmony_ci            functools.partial(parser.parse_args, ['-h'])
567db96d56Sopenharmony_ci        ):
577db96d56Sopenharmony_ci            with (
587db96d56Sopenharmony_ci                self.subTest(func=func),
597db96d56Sopenharmony_ci                contextlib.redirect_stdout(None),
607db96d56Sopenharmony_ci                # argparse uses stderr as a fallback
617db96d56Sopenharmony_ci                StdIOBuffer() as mocked_stderr,
627db96d56Sopenharmony_ci                contextlib.redirect_stderr(mocked_stderr),
637db96d56Sopenharmony_ci                mock.patch('argparse._sys.exit'),
647db96d56Sopenharmony_ci            ):
657db96d56Sopenharmony_ci                func()
667db96d56Sopenharmony_ci                self.assertRegex(mocked_stderr.getvalue(), r'usage:')
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ciclass TestCase(unittest.TestCase):
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci    def setUp(self):
727db96d56Sopenharmony_ci        # The tests assume that line wrapping occurs at 80 columns, but this
737db96d56Sopenharmony_ci        # behaviour can be overridden by setting the COLUMNS environment
747db96d56Sopenharmony_ci        # variable.  To ensure that this width is used, set COLUMNS to 80.
757db96d56Sopenharmony_ci        env = self.enterContext(os_helper.EnvironmentVarGuard())
767db96d56Sopenharmony_ci        env['COLUMNS'] = '80'
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci@os_helper.skip_unless_working_chmod
807db96d56Sopenharmony_ciclass TempDirMixin(object):
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci    def setUp(self):
837db96d56Sopenharmony_ci        self.temp_dir = tempfile.mkdtemp()
847db96d56Sopenharmony_ci        self.old_dir = os.getcwd()
857db96d56Sopenharmony_ci        os.chdir(self.temp_dir)
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci    def tearDown(self):
887db96d56Sopenharmony_ci        os.chdir(self.old_dir)
897db96d56Sopenharmony_ci        for root, dirs, files in os.walk(self.temp_dir, topdown=False):
907db96d56Sopenharmony_ci            for name in files:
917db96d56Sopenharmony_ci                os.chmod(os.path.join(self.temp_dir, name), stat.S_IWRITE)
927db96d56Sopenharmony_ci        shutil.rmtree(self.temp_dir, True)
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci    def create_writable_file(self, filename):
957db96d56Sopenharmony_ci        file_path = os.path.join(self.temp_dir, filename)
967db96d56Sopenharmony_ci        with open(file_path, 'w', encoding="utf-8") as file:
977db96d56Sopenharmony_ci            file.write(filename)
987db96d56Sopenharmony_ci        return file_path
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci    def create_readonly_file(self, filename):
1017db96d56Sopenharmony_ci        os.chmod(self.create_writable_file(filename), stat.S_IREAD)
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ciclass Sig(object):
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci    def __init__(self, *args, **kwargs):
1067db96d56Sopenharmony_ci        self.args = args
1077db96d56Sopenharmony_ci        self.kwargs = kwargs
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ciclass NS(object):
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci    def __init__(self, **kwargs):
1137db96d56Sopenharmony_ci        self.__dict__.update(kwargs)
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci    def __repr__(self):
1167db96d56Sopenharmony_ci        sorted_items = sorted(self.__dict__.items())
1177db96d56Sopenharmony_ci        kwarg_str = ', '.join(['%s=%r' % tup for tup in sorted_items])
1187db96d56Sopenharmony_ci        return '%s(%s)' % (type(self).__name__, kwarg_str)
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci    def __eq__(self, other):
1217db96d56Sopenharmony_ci        return vars(self) == vars(other)
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ciclass ArgumentParserError(Exception):
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci    def __init__(self, message, stdout=None, stderr=None, error_code=None):
1277db96d56Sopenharmony_ci        Exception.__init__(self, message, stdout, stderr)
1287db96d56Sopenharmony_ci        self.message = message
1297db96d56Sopenharmony_ci        self.stdout = stdout
1307db96d56Sopenharmony_ci        self.stderr = stderr
1317db96d56Sopenharmony_ci        self.error_code = error_code
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_cidef stderr_to_parser_error(parse_args, *args, **kwargs):
1357db96d56Sopenharmony_ci    # if this is being called recursively and stderr or stdout is already being
1367db96d56Sopenharmony_ci    # redirected, simply call the function and let the enclosing function
1377db96d56Sopenharmony_ci    # catch the exception
1387db96d56Sopenharmony_ci    if isinstance(sys.stderr, StdIOBuffer) or isinstance(sys.stdout, StdIOBuffer):
1397db96d56Sopenharmony_ci        return parse_args(*args, **kwargs)
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci    # if this is not being called recursively, redirect stderr and
1427db96d56Sopenharmony_ci    # use it as the ArgumentParserError message
1437db96d56Sopenharmony_ci    old_stdout = sys.stdout
1447db96d56Sopenharmony_ci    old_stderr = sys.stderr
1457db96d56Sopenharmony_ci    sys.stdout = StdIOBuffer()
1467db96d56Sopenharmony_ci    sys.stderr = StdIOBuffer()
1477db96d56Sopenharmony_ci    try:
1487db96d56Sopenharmony_ci        try:
1497db96d56Sopenharmony_ci            result = parse_args(*args, **kwargs)
1507db96d56Sopenharmony_ci            for key in list(vars(result)):
1517db96d56Sopenharmony_ci                attr = getattr(result, key)
1527db96d56Sopenharmony_ci                if attr is sys.stdout:
1537db96d56Sopenharmony_ci                    setattr(result, key, old_stdout)
1547db96d56Sopenharmony_ci                elif attr is sys.stdout.buffer:
1557db96d56Sopenharmony_ci                    setattr(result, key, getattr(old_stdout, 'buffer', BIN_STDOUT_SENTINEL))
1567db96d56Sopenharmony_ci                elif attr is sys.stderr:
1577db96d56Sopenharmony_ci                    setattr(result, key, old_stderr)
1587db96d56Sopenharmony_ci                elif attr is sys.stderr.buffer:
1597db96d56Sopenharmony_ci                    setattr(result, key, getattr(old_stderr, 'buffer', BIN_STDERR_SENTINEL))
1607db96d56Sopenharmony_ci            return result
1617db96d56Sopenharmony_ci        except SystemExit as e:
1627db96d56Sopenharmony_ci            code = e.code
1637db96d56Sopenharmony_ci            stdout = sys.stdout.getvalue()
1647db96d56Sopenharmony_ci            stderr = sys.stderr.getvalue()
1657db96d56Sopenharmony_ci            raise ArgumentParserError(
1667db96d56Sopenharmony_ci                "SystemExit", stdout, stderr, code) from None
1677db96d56Sopenharmony_ci    finally:
1687db96d56Sopenharmony_ci        sys.stdout = old_stdout
1697db96d56Sopenharmony_ci        sys.stderr = old_stderr
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ciclass ErrorRaisingArgumentParser(argparse.ArgumentParser):
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci    def parse_args(self, *args, **kwargs):
1757db96d56Sopenharmony_ci        parse_args = super(ErrorRaisingArgumentParser, self).parse_args
1767db96d56Sopenharmony_ci        return stderr_to_parser_error(parse_args, *args, **kwargs)
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci    def exit(self, *args, **kwargs):
1797db96d56Sopenharmony_ci        exit = super(ErrorRaisingArgumentParser, self).exit
1807db96d56Sopenharmony_ci        return stderr_to_parser_error(exit, *args, **kwargs)
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci    def error(self, *args, **kwargs):
1837db96d56Sopenharmony_ci        error = super(ErrorRaisingArgumentParser, self).error
1847db96d56Sopenharmony_ci        return stderr_to_parser_error(error, *args, **kwargs)
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ciclass ParserTesterMetaclass(type):
1887db96d56Sopenharmony_ci    """Adds parser tests using the class attributes.
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci    Classes of this type should specify the following attributes:
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci    argument_signatures -- a list of Sig objects which specify
1937db96d56Sopenharmony_ci        the signatures of Argument objects to be created
1947db96d56Sopenharmony_ci    failures -- a list of args lists that should cause the parser
1957db96d56Sopenharmony_ci        to fail
1967db96d56Sopenharmony_ci    successes -- a list of (initial_args, options, remaining_args) tuples
1977db96d56Sopenharmony_ci        where initial_args specifies the string args to be parsed,
1987db96d56Sopenharmony_ci        options is a dict that should match the vars() of the options
1997db96d56Sopenharmony_ci        parsed out of initial_args, and remaining_args should be any
2007db96d56Sopenharmony_ci        remaining unparsed arguments
2017db96d56Sopenharmony_ci    """
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ci    def __init__(cls, name, bases, bodydict):
2047db96d56Sopenharmony_ci        if name == 'ParserTestCase':
2057db96d56Sopenharmony_ci            return
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci        # default parser signature is empty
2087db96d56Sopenharmony_ci        if not hasattr(cls, 'parser_signature'):
2097db96d56Sopenharmony_ci            cls.parser_signature = Sig()
2107db96d56Sopenharmony_ci        if not hasattr(cls, 'parser_class'):
2117db96d56Sopenharmony_ci            cls.parser_class = ErrorRaisingArgumentParser
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci        # ---------------------------------------
2147db96d56Sopenharmony_ci        # functions for adding optional arguments
2157db96d56Sopenharmony_ci        # ---------------------------------------
2167db96d56Sopenharmony_ci        def no_groups(parser, argument_signatures):
2177db96d56Sopenharmony_ci            """Add all arguments directly to the parser"""
2187db96d56Sopenharmony_ci            for sig in argument_signatures:
2197db96d56Sopenharmony_ci                parser.add_argument(*sig.args, **sig.kwargs)
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci        def one_group(parser, argument_signatures):
2227db96d56Sopenharmony_ci            """Add all arguments under a single group in the parser"""
2237db96d56Sopenharmony_ci            group = parser.add_argument_group('foo')
2247db96d56Sopenharmony_ci            for sig in argument_signatures:
2257db96d56Sopenharmony_ci                group.add_argument(*sig.args, **sig.kwargs)
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci        def many_groups(parser, argument_signatures):
2287db96d56Sopenharmony_ci            """Add each argument in its own group to the parser"""
2297db96d56Sopenharmony_ci            for i, sig in enumerate(argument_signatures):
2307db96d56Sopenharmony_ci                group = parser.add_argument_group('foo:%i' % i)
2317db96d56Sopenharmony_ci                group.add_argument(*sig.args, **sig.kwargs)
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ci        # --------------------------
2347db96d56Sopenharmony_ci        # functions for parsing args
2357db96d56Sopenharmony_ci        # --------------------------
2367db96d56Sopenharmony_ci        def listargs(parser, args):
2377db96d56Sopenharmony_ci            """Parse the args by passing in a list"""
2387db96d56Sopenharmony_ci            return parser.parse_args(args)
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci        def sysargs(parser, args):
2417db96d56Sopenharmony_ci            """Parse the args by defaulting to sys.argv"""
2427db96d56Sopenharmony_ci            old_sys_argv = sys.argv
2437db96d56Sopenharmony_ci            sys.argv = [old_sys_argv[0]] + args
2447db96d56Sopenharmony_ci            try:
2457db96d56Sopenharmony_ci                return parser.parse_args()
2467db96d56Sopenharmony_ci            finally:
2477db96d56Sopenharmony_ci                sys.argv = old_sys_argv
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ci        # class that holds the combination of one optional argument
2507db96d56Sopenharmony_ci        # addition method and one arg parsing method
2517db96d56Sopenharmony_ci        class AddTests(object):
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci            def __init__(self, tester_cls, add_arguments, parse_args):
2547db96d56Sopenharmony_ci                self._add_arguments = add_arguments
2557db96d56Sopenharmony_ci                self._parse_args = parse_args
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci                add_arguments_name = self._add_arguments.__name__
2587db96d56Sopenharmony_ci                parse_args_name = self._parse_args.__name__
2597db96d56Sopenharmony_ci                for test_func in [self.test_failures, self.test_successes]:
2607db96d56Sopenharmony_ci                    func_name = test_func.__name__
2617db96d56Sopenharmony_ci                    names = func_name, add_arguments_name, parse_args_name
2627db96d56Sopenharmony_ci                    test_name = '_'.join(names)
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ci                    def wrapper(self, test_func=test_func):
2657db96d56Sopenharmony_ci                        test_func(self)
2667db96d56Sopenharmony_ci                    try:
2677db96d56Sopenharmony_ci                        wrapper.__name__ = test_name
2687db96d56Sopenharmony_ci                    except TypeError:
2697db96d56Sopenharmony_ci                        pass
2707db96d56Sopenharmony_ci                    setattr(tester_cls, test_name, wrapper)
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci            def _get_parser(self, tester):
2737db96d56Sopenharmony_ci                args = tester.parser_signature.args
2747db96d56Sopenharmony_ci                kwargs = tester.parser_signature.kwargs
2757db96d56Sopenharmony_ci                parser = tester.parser_class(*args, **kwargs)
2767db96d56Sopenharmony_ci                self._add_arguments(parser, tester.argument_signatures)
2777db96d56Sopenharmony_ci                return parser
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci            def test_failures(self, tester):
2807db96d56Sopenharmony_ci                parser = self._get_parser(tester)
2817db96d56Sopenharmony_ci                for args_str in tester.failures:
2827db96d56Sopenharmony_ci                    args = args_str.split()
2837db96d56Sopenharmony_ci                    with tester.assertRaises(ArgumentParserError, msg=args):
2847db96d56Sopenharmony_ci                        parser.parse_args(args)
2857db96d56Sopenharmony_ci
2867db96d56Sopenharmony_ci            def test_successes(self, tester):
2877db96d56Sopenharmony_ci                parser = self._get_parser(tester)
2887db96d56Sopenharmony_ci                for args, expected_ns in tester.successes:
2897db96d56Sopenharmony_ci                    if isinstance(args, str):
2907db96d56Sopenharmony_ci                        args = args.split()
2917db96d56Sopenharmony_ci                    result_ns = self._parse_args(parser, args)
2927db96d56Sopenharmony_ci                    tester.assertEqual(expected_ns, result_ns)
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci        # add tests for each combination of an optionals adding method
2957db96d56Sopenharmony_ci        # and an arg parsing method
2967db96d56Sopenharmony_ci        for add_arguments in [no_groups, one_group, many_groups]:
2977db96d56Sopenharmony_ci            for parse_args in [listargs, sysargs]:
2987db96d56Sopenharmony_ci                AddTests(cls, add_arguments, parse_args)
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_cibases = TestCase,
3017db96d56Sopenharmony_ciParserTestCase = ParserTesterMetaclass('ParserTestCase', bases, {})
3027db96d56Sopenharmony_ci
3037db96d56Sopenharmony_ci# ===============
3047db96d56Sopenharmony_ci# Optionals tests
3057db96d56Sopenharmony_ci# ===============
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ciclass TestOptionalsSingleDash(ParserTestCase):
3087db96d56Sopenharmony_ci    """Test an Optional with a single-dash option string"""
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci    argument_signatures = [Sig('-x')]
3117db96d56Sopenharmony_ci    failures = ['-x', 'a', '--foo', '-x --foo', '-x -y']
3127db96d56Sopenharmony_ci    successes = [
3137db96d56Sopenharmony_ci        ('', NS(x=None)),
3147db96d56Sopenharmony_ci        ('-x a', NS(x='a')),
3157db96d56Sopenharmony_ci        ('-xa', NS(x='a')),
3167db96d56Sopenharmony_ci        ('-x -1', NS(x='-1')),
3177db96d56Sopenharmony_ci        ('-x-1', NS(x='-1')),
3187db96d56Sopenharmony_ci    ]
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ciclass TestOptionalsSingleDashCombined(ParserTestCase):
3227db96d56Sopenharmony_ci    """Test an Optional with a single-dash option string"""
3237db96d56Sopenharmony_ci
3247db96d56Sopenharmony_ci    argument_signatures = [
3257db96d56Sopenharmony_ci        Sig('-x', action='store_true'),
3267db96d56Sopenharmony_ci        Sig('-yyy', action='store_const', const=42),
3277db96d56Sopenharmony_ci        Sig('-z'),
3287db96d56Sopenharmony_ci    ]
3297db96d56Sopenharmony_ci    failures = ['a', '--foo', '-xa', '-x --foo', '-x -z', '-z -x',
3307db96d56Sopenharmony_ci                '-yx', '-yz a', '-yyyx', '-yyyza', '-xyza', '-x=']
3317db96d56Sopenharmony_ci    successes = [
3327db96d56Sopenharmony_ci        ('', NS(x=False, yyy=None, z=None)),
3337db96d56Sopenharmony_ci        ('-x', NS(x=True, yyy=None, z=None)),
3347db96d56Sopenharmony_ci        ('-za', NS(x=False, yyy=None, z='a')),
3357db96d56Sopenharmony_ci        ('-z a', NS(x=False, yyy=None, z='a')),
3367db96d56Sopenharmony_ci        ('-xza', NS(x=True, yyy=None, z='a')),
3377db96d56Sopenharmony_ci        ('-xz a', NS(x=True, yyy=None, z='a')),
3387db96d56Sopenharmony_ci        ('-x -za', NS(x=True, yyy=None, z='a')),
3397db96d56Sopenharmony_ci        ('-x -z a', NS(x=True, yyy=None, z='a')),
3407db96d56Sopenharmony_ci        ('-y', NS(x=False, yyy=42, z=None)),
3417db96d56Sopenharmony_ci        ('-yyy', NS(x=False, yyy=42, z=None)),
3427db96d56Sopenharmony_ci        ('-x -yyy -za', NS(x=True, yyy=42, z='a')),
3437db96d56Sopenharmony_ci        ('-x -yyy -z a', NS(x=True, yyy=42, z='a')),
3447db96d56Sopenharmony_ci    ]
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ciclass TestOptionalsSingleDashLong(ParserTestCase):
3487db96d56Sopenharmony_ci    """Test an Optional with a multi-character single-dash option string"""
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci    argument_signatures = [Sig('-foo')]
3517db96d56Sopenharmony_ci    failures = ['-foo', 'a', '--foo', '-foo --foo', '-foo -y', '-fooa']
3527db96d56Sopenharmony_ci    successes = [
3537db96d56Sopenharmony_ci        ('', NS(foo=None)),
3547db96d56Sopenharmony_ci        ('-foo a', NS(foo='a')),
3557db96d56Sopenharmony_ci        ('-foo -1', NS(foo='-1')),
3567db96d56Sopenharmony_ci        ('-fo a', NS(foo='a')),
3577db96d56Sopenharmony_ci        ('-f a', NS(foo='a')),
3587db96d56Sopenharmony_ci    ]
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_ciclass TestOptionalsSingleDashSubsetAmbiguous(ParserTestCase):
3627db96d56Sopenharmony_ci    """Test Optionals where option strings are subsets of each other"""
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci    argument_signatures = [Sig('-f'), Sig('-foobar'), Sig('-foorab')]
3657db96d56Sopenharmony_ci    failures = ['-f', '-foo', '-fo', '-foo b', '-foob', '-fooba', '-foora']
3667db96d56Sopenharmony_ci    successes = [
3677db96d56Sopenharmony_ci        ('', NS(f=None, foobar=None, foorab=None)),
3687db96d56Sopenharmony_ci        ('-f a', NS(f='a', foobar=None, foorab=None)),
3697db96d56Sopenharmony_ci        ('-fa', NS(f='a', foobar=None, foorab=None)),
3707db96d56Sopenharmony_ci        ('-foa', NS(f='oa', foobar=None, foorab=None)),
3717db96d56Sopenharmony_ci        ('-fooa', NS(f='ooa', foobar=None, foorab=None)),
3727db96d56Sopenharmony_ci        ('-foobar a', NS(f=None, foobar='a', foorab=None)),
3737db96d56Sopenharmony_ci        ('-foorab a', NS(f=None, foobar=None, foorab='a')),
3747db96d56Sopenharmony_ci    ]
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_ciclass TestOptionalsSingleDashAmbiguous(ParserTestCase):
3787db96d56Sopenharmony_ci    """Test Optionals that partially match but are not subsets"""
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci    argument_signatures = [Sig('-foobar'), Sig('-foorab')]
3817db96d56Sopenharmony_ci    failures = ['-f', '-f a', '-fa', '-foa', '-foo', '-fo', '-foo b']
3827db96d56Sopenharmony_ci    successes = [
3837db96d56Sopenharmony_ci        ('', NS(foobar=None, foorab=None)),
3847db96d56Sopenharmony_ci        ('-foob a', NS(foobar='a', foorab=None)),
3857db96d56Sopenharmony_ci        ('-foor a', NS(foobar=None, foorab='a')),
3867db96d56Sopenharmony_ci        ('-fooba a', NS(foobar='a', foorab=None)),
3877db96d56Sopenharmony_ci        ('-foora a', NS(foobar=None, foorab='a')),
3887db96d56Sopenharmony_ci        ('-foobar a', NS(foobar='a', foorab=None)),
3897db96d56Sopenharmony_ci        ('-foorab a', NS(foobar=None, foorab='a')),
3907db96d56Sopenharmony_ci    ]
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ciclass TestOptionalsNumeric(ParserTestCase):
3947db96d56Sopenharmony_ci    """Test an Optional with a short opt string"""
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ci    argument_signatures = [Sig('-1', dest='one')]
3977db96d56Sopenharmony_ci    failures = ['-1', 'a', '-1 --foo', '-1 -y', '-1 -1', '-1 -2']
3987db96d56Sopenharmony_ci    successes = [
3997db96d56Sopenharmony_ci        ('', NS(one=None)),
4007db96d56Sopenharmony_ci        ('-1 a', NS(one='a')),
4017db96d56Sopenharmony_ci        ('-1a', NS(one='a')),
4027db96d56Sopenharmony_ci        ('-1-2', NS(one='-2')),
4037db96d56Sopenharmony_ci    ]
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_ciclass TestOptionalsDoubleDash(ParserTestCase):
4077db96d56Sopenharmony_ci    """Test an Optional with a double-dash option string"""
4087db96d56Sopenharmony_ci
4097db96d56Sopenharmony_ci    argument_signatures = [Sig('--foo')]
4107db96d56Sopenharmony_ci    failures = ['--foo', '-f', '-f a', 'a', '--foo -x', '--foo --bar']
4117db96d56Sopenharmony_ci    successes = [
4127db96d56Sopenharmony_ci        ('', NS(foo=None)),
4137db96d56Sopenharmony_ci        ('--foo a', NS(foo='a')),
4147db96d56Sopenharmony_ci        ('--foo=a', NS(foo='a')),
4157db96d56Sopenharmony_ci        ('--foo -2.5', NS(foo='-2.5')),
4167db96d56Sopenharmony_ci        ('--foo=-2.5', NS(foo='-2.5')),
4177db96d56Sopenharmony_ci    ]
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ciclass TestOptionalsDoubleDashPartialMatch(ParserTestCase):
4217db96d56Sopenharmony_ci    """Tests partial matching with a double-dash option string"""
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci    argument_signatures = [
4247db96d56Sopenharmony_ci        Sig('--badger', action='store_true'),
4257db96d56Sopenharmony_ci        Sig('--bat'),
4267db96d56Sopenharmony_ci    ]
4277db96d56Sopenharmony_ci    failures = ['--bar', '--b', '--ba', '--b=2', '--ba=4', '--badge 5']
4287db96d56Sopenharmony_ci    successes = [
4297db96d56Sopenharmony_ci        ('', NS(badger=False, bat=None)),
4307db96d56Sopenharmony_ci        ('--bat X', NS(badger=False, bat='X')),
4317db96d56Sopenharmony_ci        ('--bad', NS(badger=True, bat=None)),
4327db96d56Sopenharmony_ci        ('--badg', NS(badger=True, bat=None)),
4337db96d56Sopenharmony_ci        ('--badge', NS(badger=True, bat=None)),
4347db96d56Sopenharmony_ci        ('--badger', NS(badger=True, bat=None)),
4357db96d56Sopenharmony_ci    ]
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci
4387db96d56Sopenharmony_ciclass TestOptionalsDoubleDashPrefixMatch(ParserTestCase):
4397db96d56Sopenharmony_ci    """Tests when one double-dash option string is a prefix of another"""
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_ci    argument_signatures = [
4427db96d56Sopenharmony_ci        Sig('--badger', action='store_true'),
4437db96d56Sopenharmony_ci        Sig('--ba'),
4447db96d56Sopenharmony_ci    ]
4457db96d56Sopenharmony_ci    failures = ['--bar', '--b', '--ba', '--b=2', '--badge 5']
4467db96d56Sopenharmony_ci    successes = [
4477db96d56Sopenharmony_ci        ('', NS(badger=False, ba=None)),
4487db96d56Sopenharmony_ci        ('--ba X', NS(badger=False, ba='X')),
4497db96d56Sopenharmony_ci        ('--ba=X', NS(badger=False, ba='X')),
4507db96d56Sopenharmony_ci        ('--bad', NS(badger=True, ba=None)),
4517db96d56Sopenharmony_ci        ('--badg', NS(badger=True, ba=None)),
4527db96d56Sopenharmony_ci        ('--badge', NS(badger=True, ba=None)),
4537db96d56Sopenharmony_ci        ('--badger', NS(badger=True, ba=None)),
4547db96d56Sopenharmony_ci    ]
4557db96d56Sopenharmony_ci
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ciclass TestOptionalsSingleDoubleDash(ParserTestCase):
4587db96d56Sopenharmony_ci    """Test an Optional with single- and double-dash option strings"""
4597db96d56Sopenharmony_ci
4607db96d56Sopenharmony_ci    argument_signatures = [
4617db96d56Sopenharmony_ci        Sig('-f', action='store_true'),
4627db96d56Sopenharmony_ci        Sig('--bar'),
4637db96d56Sopenharmony_ci        Sig('-baz', action='store_const', const=42),
4647db96d56Sopenharmony_ci    ]
4657db96d56Sopenharmony_ci    failures = ['--bar', '-fbar', '-fbaz', '-bazf', '-b B', 'B']
4667db96d56Sopenharmony_ci    successes = [
4677db96d56Sopenharmony_ci        ('', NS(f=False, bar=None, baz=None)),
4687db96d56Sopenharmony_ci        ('-f', NS(f=True, bar=None, baz=None)),
4697db96d56Sopenharmony_ci        ('--ba B', NS(f=False, bar='B', baz=None)),
4707db96d56Sopenharmony_ci        ('-f --bar B', NS(f=True, bar='B', baz=None)),
4717db96d56Sopenharmony_ci        ('-f -b', NS(f=True, bar=None, baz=42)),
4727db96d56Sopenharmony_ci        ('-ba -f', NS(f=True, bar=None, baz=42)),
4737db96d56Sopenharmony_ci    ]
4747db96d56Sopenharmony_ci
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ciclass TestOptionalsAlternatePrefixChars(ParserTestCase):
4777db96d56Sopenharmony_ci    """Test an Optional with option strings with custom prefixes"""
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ci    parser_signature = Sig(prefix_chars='+:/', add_help=False)
4807db96d56Sopenharmony_ci    argument_signatures = [
4817db96d56Sopenharmony_ci        Sig('+f', action='store_true'),
4827db96d56Sopenharmony_ci        Sig('::bar'),
4837db96d56Sopenharmony_ci        Sig('/baz', action='store_const', const=42),
4847db96d56Sopenharmony_ci    ]
4857db96d56Sopenharmony_ci    failures = ['--bar', '-fbar', '-b B', 'B', '-f', '--bar B', '-baz', '-h', '--help', '+h', '::help', '/help']
4867db96d56Sopenharmony_ci    successes = [
4877db96d56Sopenharmony_ci        ('', NS(f=False, bar=None, baz=None)),
4887db96d56Sopenharmony_ci        ('+f', NS(f=True, bar=None, baz=None)),
4897db96d56Sopenharmony_ci        ('::ba B', NS(f=False, bar='B', baz=None)),
4907db96d56Sopenharmony_ci        ('+f ::bar B', NS(f=True, bar='B', baz=None)),
4917db96d56Sopenharmony_ci        ('+f /b', NS(f=True, bar=None, baz=42)),
4927db96d56Sopenharmony_ci        ('/ba +f', NS(f=True, bar=None, baz=42)),
4937db96d56Sopenharmony_ci    ]
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ciclass TestOptionalsAlternatePrefixCharsAddedHelp(ParserTestCase):
4977db96d56Sopenharmony_ci    """When ``-`` not in prefix_chars, default operators created for help
4987db96d56Sopenharmony_ci       should use the prefix_chars in use rather than - or --
4997db96d56Sopenharmony_ci       http://bugs.python.org/issue9444"""
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci    parser_signature = Sig(prefix_chars='+:/', add_help=True)
5027db96d56Sopenharmony_ci    argument_signatures = [
5037db96d56Sopenharmony_ci        Sig('+f', action='store_true'),
5047db96d56Sopenharmony_ci        Sig('::bar'),
5057db96d56Sopenharmony_ci        Sig('/baz', action='store_const', const=42),
5067db96d56Sopenharmony_ci    ]
5077db96d56Sopenharmony_ci    failures = ['--bar', '-fbar', '-b B', 'B', '-f', '--bar B', '-baz']
5087db96d56Sopenharmony_ci    successes = [
5097db96d56Sopenharmony_ci        ('', NS(f=False, bar=None, baz=None)),
5107db96d56Sopenharmony_ci        ('+f', NS(f=True, bar=None, baz=None)),
5117db96d56Sopenharmony_ci        ('::ba B', NS(f=False, bar='B', baz=None)),
5127db96d56Sopenharmony_ci        ('+f ::bar B', NS(f=True, bar='B', baz=None)),
5137db96d56Sopenharmony_ci        ('+f /b', NS(f=True, bar=None, baz=42)),
5147db96d56Sopenharmony_ci        ('/ba +f', NS(f=True, bar=None, baz=42))
5157db96d56Sopenharmony_ci    ]
5167db96d56Sopenharmony_ci
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_ciclass TestOptionalsAlternatePrefixCharsMultipleShortArgs(ParserTestCase):
5197db96d56Sopenharmony_ci    """Verify that Optionals must be called with their defined prefixes"""
5207db96d56Sopenharmony_ci
5217db96d56Sopenharmony_ci    parser_signature = Sig(prefix_chars='+-', add_help=False)
5227db96d56Sopenharmony_ci    argument_signatures = [
5237db96d56Sopenharmony_ci        Sig('-x', action='store_true'),
5247db96d56Sopenharmony_ci        Sig('+y', action='store_true'),
5257db96d56Sopenharmony_ci        Sig('+z', action='store_true'),
5267db96d56Sopenharmony_ci    ]
5277db96d56Sopenharmony_ci    failures = ['-w',
5287db96d56Sopenharmony_ci                '-xyz',
5297db96d56Sopenharmony_ci                '+x',
5307db96d56Sopenharmony_ci                '-y',
5317db96d56Sopenharmony_ci                '+xyz',
5327db96d56Sopenharmony_ci    ]
5337db96d56Sopenharmony_ci    successes = [
5347db96d56Sopenharmony_ci        ('', NS(x=False, y=False, z=False)),
5357db96d56Sopenharmony_ci        ('-x', NS(x=True, y=False, z=False)),
5367db96d56Sopenharmony_ci        ('+y -x', NS(x=True, y=True, z=False)),
5377db96d56Sopenharmony_ci        ('+yz -x', NS(x=True, y=True, z=True)),
5387db96d56Sopenharmony_ci    ]
5397db96d56Sopenharmony_ci
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ciclass TestOptionalsShortLong(ParserTestCase):
5427db96d56Sopenharmony_ci    """Test a combination of single- and double-dash option strings"""
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci    argument_signatures = [
5457db96d56Sopenharmony_ci        Sig('-v', '--verbose', '-n', '--noisy', action='store_true'),
5467db96d56Sopenharmony_ci    ]
5477db96d56Sopenharmony_ci    failures = ['--x --verbose', '-N', 'a', '-v x']
5487db96d56Sopenharmony_ci    successes = [
5497db96d56Sopenharmony_ci        ('', NS(verbose=False)),
5507db96d56Sopenharmony_ci        ('-v', NS(verbose=True)),
5517db96d56Sopenharmony_ci        ('--verbose', NS(verbose=True)),
5527db96d56Sopenharmony_ci        ('-n', NS(verbose=True)),
5537db96d56Sopenharmony_ci        ('--noisy', NS(verbose=True)),
5547db96d56Sopenharmony_ci    ]
5557db96d56Sopenharmony_ci
5567db96d56Sopenharmony_ci
5577db96d56Sopenharmony_ciclass TestOptionalsDest(ParserTestCase):
5587db96d56Sopenharmony_ci    """Tests various means of setting destination"""
5597db96d56Sopenharmony_ci
5607db96d56Sopenharmony_ci    argument_signatures = [Sig('--foo-bar'), Sig('--baz', dest='zabbaz')]
5617db96d56Sopenharmony_ci    failures = ['a']
5627db96d56Sopenharmony_ci    successes = [
5637db96d56Sopenharmony_ci        ('--foo-bar f', NS(foo_bar='f', zabbaz=None)),
5647db96d56Sopenharmony_ci        ('--baz g', NS(foo_bar=None, zabbaz='g')),
5657db96d56Sopenharmony_ci        ('--foo-bar h --baz i', NS(foo_bar='h', zabbaz='i')),
5667db96d56Sopenharmony_ci        ('--baz j --foo-bar k', NS(foo_bar='k', zabbaz='j')),
5677db96d56Sopenharmony_ci    ]
5687db96d56Sopenharmony_ci
5697db96d56Sopenharmony_ci
5707db96d56Sopenharmony_ciclass TestOptionalsDefault(ParserTestCase):
5717db96d56Sopenharmony_ci    """Tests specifying a default for an Optional"""
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci    argument_signatures = [Sig('-x'), Sig('-y', default=42)]
5747db96d56Sopenharmony_ci    failures = ['a']
5757db96d56Sopenharmony_ci    successes = [
5767db96d56Sopenharmony_ci        ('', NS(x=None, y=42)),
5777db96d56Sopenharmony_ci        ('-xx', NS(x='x', y=42)),
5787db96d56Sopenharmony_ci        ('-yy', NS(x=None, y='y')),
5797db96d56Sopenharmony_ci    ]
5807db96d56Sopenharmony_ci
5817db96d56Sopenharmony_ci
5827db96d56Sopenharmony_ciclass TestOptionalsNargsDefault(ParserTestCase):
5837db96d56Sopenharmony_ci    """Tests not specifying the number of args for an Optional"""
5847db96d56Sopenharmony_ci
5857db96d56Sopenharmony_ci    argument_signatures = [Sig('-x')]
5867db96d56Sopenharmony_ci    failures = ['a', '-x']
5877db96d56Sopenharmony_ci    successes = [
5887db96d56Sopenharmony_ci        ('', NS(x=None)),
5897db96d56Sopenharmony_ci        ('-x a', NS(x='a')),
5907db96d56Sopenharmony_ci    ]
5917db96d56Sopenharmony_ci
5927db96d56Sopenharmony_ci
5937db96d56Sopenharmony_ciclass TestOptionalsNargs1(ParserTestCase):
5947db96d56Sopenharmony_ci    """Tests specifying 1 arg for an Optional"""
5957db96d56Sopenharmony_ci
5967db96d56Sopenharmony_ci    argument_signatures = [Sig('-x', nargs=1)]
5977db96d56Sopenharmony_ci    failures = ['a', '-x']
5987db96d56Sopenharmony_ci    successes = [
5997db96d56Sopenharmony_ci        ('', NS(x=None)),
6007db96d56Sopenharmony_ci        ('-x a', NS(x=['a'])),
6017db96d56Sopenharmony_ci    ]
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci
6047db96d56Sopenharmony_ciclass TestOptionalsNargs3(ParserTestCase):
6057db96d56Sopenharmony_ci    """Tests specifying 3 args for an Optional"""
6067db96d56Sopenharmony_ci
6077db96d56Sopenharmony_ci    argument_signatures = [Sig('-x', nargs=3)]
6087db96d56Sopenharmony_ci    failures = ['a', '-x', '-x a', '-x a b', 'a -x', 'a -x b']
6097db96d56Sopenharmony_ci    successes = [
6107db96d56Sopenharmony_ci        ('', NS(x=None)),
6117db96d56Sopenharmony_ci        ('-x a b c', NS(x=['a', 'b', 'c'])),
6127db96d56Sopenharmony_ci    ]
6137db96d56Sopenharmony_ci
6147db96d56Sopenharmony_ci
6157db96d56Sopenharmony_ciclass TestOptionalsNargsOptional(ParserTestCase):
6167db96d56Sopenharmony_ci    """Tests specifying an Optional arg for an Optional"""
6177db96d56Sopenharmony_ci
6187db96d56Sopenharmony_ci    argument_signatures = [
6197db96d56Sopenharmony_ci        Sig('-w', nargs='?'),
6207db96d56Sopenharmony_ci        Sig('-x', nargs='?', const=42),
6217db96d56Sopenharmony_ci        Sig('-y', nargs='?', default='spam'),
6227db96d56Sopenharmony_ci        Sig('-z', nargs='?', type=int, const='42', default='84'),
6237db96d56Sopenharmony_ci    ]
6247db96d56Sopenharmony_ci    failures = ['2']
6257db96d56Sopenharmony_ci    successes = [
6267db96d56Sopenharmony_ci        ('', NS(w=None, x=None, y='spam', z=84)),
6277db96d56Sopenharmony_ci        ('-w', NS(w=None, x=None, y='spam', z=84)),
6287db96d56Sopenharmony_ci        ('-w 2', NS(w='2', x=None, y='spam', z=84)),
6297db96d56Sopenharmony_ci        ('-x', NS(w=None, x=42, y='spam', z=84)),
6307db96d56Sopenharmony_ci        ('-x 2', NS(w=None, x='2', y='spam', z=84)),
6317db96d56Sopenharmony_ci        ('-y', NS(w=None, x=None, y=None, z=84)),
6327db96d56Sopenharmony_ci        ('-y 2', NS(w=None, x=None, y='2', z=84)),
6337db96d56Sopenharmony_ci        ('-z', NS(w=None, x=None, y='spam', z=42)),
6347db96d56Sopenharmony_ci        ('-z 2', NS(w=None, x=None, y='spam', z=2)),
6357db96d56Sopenharmony_ci    ]
6367db96d56Sopenharmony_ci
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ciclass TestOptionalsNargsZeroOrMore(ParserTestCase):
6397db96d56Sopenharmony_ci    """Tests specifying args for an Optional that accepts zero or more"""
6407db96d56Sopenharmony_ci
6417db96d56Sopenharmony_ci    argument_signatures = [
6427db96d56Sopenharmony_ci        Sig('-x', nargs='*'),
6437db96d56Sopenharmony_ci        Sig('-y', nargs='*', default='spam'),
6447db96d56Sopenharmony_ci    ]
6457db96d56Sopenharmony_ci    failures = ['a']
6467db96d56Sopenharmony_ci    successes = [
6477db96d56Sopenharmony_ci        ('', NS(x=None, y='spam')),
6487db96d56Sopenharmony_ci        ('-x', NS(x=[], y='spam')),
6497db96d56Sopenharmony_ci        ('-x a', NS(x=['a'], y='spam')),
6507db96d56Sopenharmony_ci        ('-x a b', NS(x=['a', 'b'], y='spam')),
6517db96d56Sopenharmony_ci        ('-y', NS(x=None, y=[])),
6527db96d56Sopenharmony_ci        ('-y a', NS(x=None, y=['a'])),
6537db96d56Sopenharmony_ci        ('-y a b', NS(x=None, y=['a', 'b'])),
6547db96d56Sopenharmony_ci    ]
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ciclass TestOptionalsNargsOneOrMore(ParserTestCase):
6587db96d56Sopenharmony_ci    """Tests specifying args for an Optional that accepts one or more"""
6597db96d56Sopenharmony_ci
6607db96d56Sopenharmony_ci    argument_signatures = [
6617db96d56Sopenharmony_ci        Sig('-x', nargs='+'),
6627db96d56Sopenharmony_ci        Sig('-y', nargs='+', default='spam'),
6637db96d56Sopenharmony_ci    ]
6647db96d56Sopenharmony_ci    failures = ['a', '-x', '-y', 'a -x', 'a -y b']
6657db96d56Sopenharmony_ci    successes = [
6667db96d56Sopenharmony_ci        ('', NS(x=None, y='spam')),
6677db96d56Sopenharmony_ci        ('-x a', NS(x=['a'], y='spam')),
6687db96d56Sopenharmony_ci        ('-x a b', NS(x=['a', 'b'], y='spam')),
6697db96d56Sopenharmony_ci        ('-y a', NS(x=None, y=['a'])),
6707db96d56Sopenharmony_ci        ('-y a b', NS(x=None, y=['a', 'b'])),
6717db96d56Sopenharmony_ci    ]
6727db96d56Sopenharmony_ci
6737db96d56Sopenharmony_ci
6747db96d56Sopenharmony_ciclass TestOptionalsChoices(ParserTestCase):
6757db96d56Sopenharmony_ci    """Tests specifying the choices for an Optional"""
6767db96d56Sopenharmony_ci
6777db96d56Sopenharmony_ci    argument_signatures = [
6787db96d56Sopenharmony_ci        Sig('-f', choices='abc'),
6797db96d56Sopenharmony_ci        Sig('-g', type=int, choices=range(5))]
6807db96d56Sopenharmony_ci    failures = ['a', '-f d', '-fad', '-ga', '-g 6']
6817db96d56Sopenharmony_ci    successes = [
6827db96d56Sopenharmony_ci        ('', NS(f=None, g=None)),
6837db96d56Sopenharmony_ci        ('-f a', NS(f='a', g=None)),
6847db96d56Sopenharmony_ci        ('-f c', NS(f='c', g=None)),
6857db96d56Sopenharmony_ci        ('-g 0', NS(f=None, g=0)),
6867db96d56Sopenharmony_ci        ('-g 03', NS(f=None, g=3)),
6877db96d56Sopenharmony_ci        ('-fb -g4', NS(f='b', g=4)),
6887db96d56Sopenharmony_ci    ]
6897db96d56Sopenharmony_ci
6907db96d56Sopenharmony_ci
6917db96d56Sopenharmony_ciclass TestOptionalsRequired(ParserTestCase):
6927db96d56Sopenharmony_ci    """Tests an optional action that is required"""
6937db96d56Sopenharmony_ci
6947db96d56Sopenharmony_ci    argument_signatures = [
6957db96d56Sopenharmony_ci        Sig('-x', type=int, required=True),
6967db96d56Sopenharmony_ci    ]
6977db96d56Sopenharmony_ci    failures = ['a', '']
6987db96d56Sopenharmony_ci    successes = [
6997db96d56Sopenharmony_ci        ('-x 1', NS(x=1)),
7007db96d56Sopenharmony_ci        ('-x42', NS(x=42)),
7017db96d56Sopenharmony_ci    ]
7027db96d56Sopenharmony_ci
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ciclass TestOptionalsActionStore(ParserTestCase):
7057db96d56Sopenharmony_ci    """Tests the store action for an Optional"""
7067db96d56Sopenharmony_ci
7077db96d56Sopenharmony_ci    argument_signatures = [Sig('-x', action='store')]
7087db96d56Sopenharmony_ci    failures = ['a', 'a -x']
7097db96d56Sopenharmony_ci    successes = [
7107db96d56Sopenharmony_ci        ('', NS(x=None)),
7117db96d56Sopenharmony_ci        ('-xfoo', NS(x='foo')),
7127db96d56Sopenharmony_ci    ]
7137db96d56Sopenharmony_ci
7147db96d56Sopenharmony_ci
7157db96d56Sopenharmony_ciclass TestOptionalsActionStoreConst(ParserTestCase):
7167db96d56Sopenharmony_ci    """Tests the store_const action for an Optional"""
7177db96d56Sopenharmony_ci
7187db96d56Sopenharmony_ci    argument_signatures = [Sig('-y', action='store_const', const=object)]
7197db96d56Sopenharmony_ci    failures = ['a']
7207db96d56Sopenharmony_ci    successes = [
7217db96d56Sopenharmony_ci        ('', NS(y=None)),
7227db96d56Sopenharmony_ci        ('-y', NS(y=object)),
7237db96d56Sopenharmony_ci    ]
7247db96d56Sopenharmony_ci
7257db96d56Sopenharmony_ci
7267db96d56Sopenharmony_ciclass TestOptionalsActionStoreFalse(ParserTestCase):
7277db96d56Sopenharmony_ci    """Tests the store_false action for an Optional"""
7287db96d56Sopenharmony_ci
7297db96d56Sopenharmony_ci    argument_signatures = [Sig('-z', action='store_false')]
7307db96d56Sopenharmony_ci    failures = ['a', '-za', '-z a']
7317db96d56Sopenharmony_ci    successes = [
7327db96d56Sopenharmony_ci        ('', NS(z=True)),
7337db96d56Sopenharmony_ci        ('-z', NS(z=False)),
7347db96d56Sopenharmony_ci    ]
7357db96d56Sopenharmony_ci
7367db96d56Sopenharmony_ci
7377db96d56Sopenharmony_ciclass TestOptionalsActionStoreTrue(ParserTestCase):
7387db96d56Sopenharmony_ci    """Tests the store_true action for an Optional"""
7397db96d56Sopenharmony_ci
7407db96d56Sopenharmony_ci    argument_signatures = [Sig('--apple', action='store_true')]
7417db96d56Sopenharmony_ci    failures = ['a', '--apple=b', '--apple b']
7427db96d56Sopenharmony_ci    successes = [
7437db96d56Sopenharmony_ci        ('', NS(apple=False)),
7447db96d56Sopenharmony_ci        ('--apple', NS(apple=True)),
7457db96d56Sopenharmony_ci    ]
7467db96d56Sopenharmony_ci
7477db96d56Sopenharmony_ciclass TestBooleanOptionalAction(ParserTestCase):
7487db96d56Sopenharmony_ci    """Tests BooleanOptionalAction"""
7497db96d56Sopenharmony_ci
7507db96d56Sopenharmony_ci    argument_signatures = [Sig('--foo', action=argparse.BooleanOptionalAction)]
7517db96d56Sopenharmony_ci    failures = ['--foo bar', '--foo=bar']
7527db96d56Sopenharmony_ci    successes = [
7537db96d56Sopenharmony_ci        ('', NS(foo=None)),
7547db96d56Sopenharmony_ci        ('--foo', NS(foo=True)),
7557db96d56Sopenharmony_ci        ('--no-foo', NS(foo=False)),
7567db96d56Sopenharmony_ci        ('--foo --no-foo', NS(foo=False)),  # useful for aliases
7577db96d56Sopenharmony_ci        ('--no-foo --foo', NS(foo=True)),
7587db96d56Sopenharmony_ci    ]
7597db96d56Sopenharmony_ci
7607db96d56Sopenharmony_ci    def test_const(self):
7617db96d56Sopenharmony_ci        # See bpo-40862
7627db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
7637db96d56Sopenharmony_ci        with self.assertRaises(TypeError) as cm:
7647db96d56Sopenharmony_ci            parser.add_argument('--foo', const=True, action=argparse.BooleanOptionalAction)
7657db96d56Sopenharmony_ci
7667db96d56Sopenharmony_ci        self.assertIn("got an unexpected keyword argument 'const'", str(cm.exception))
7677db96d56Sopenharmony_ci
7687db96d56Sopenharmony_ciclass TestBooleanOptionalActionRequired(ParserTestCase):
7697db96d56Sopenharmony_ci    """Tests BooleanOptionalAction required"""
7707db96d56Sopenharmony_ci
7717db96d56Sopenharmony_ci    argument_signatures = [
7727db96d56Sopenharmony_ci        Sig('--foo', required=True, action=argparse.BooleanOptionalAction)
7737db96d56Sopenharmony_ci    ]
7747db96d56Sopenharmony_ci    failures = ['']
7757db96d56Sopenharmony_ci    successes = [
7767db96d56Sopenharmony_ci        ('--foo', NS(foo=True)),
7777db96d56Sopenharmony_ci        ('--no-foo', NS(foo=False)),
7787db96d56Sopenharmony_ci    ]
7797db96d56Sopenharmony_ci
7807db96d56Sopenharmony_ciclass TestOptionalsActionAppend(ParserTestCase):
7817db96d56Sopenharmony_ci    """Tests the append action for an Optional"""
7827db96d56Sopenharmony_ci
7837db96d56Sopenharmony_ci    argument_signatures = [Sig('--baz', action='append')]
7847db96d56Sopenharmony_ci    failures = ['a', '--baz', 'a --baz', '--baz a b']
7857db96d56Sopenharmony_ci    successes = [
7867db96d56Sopenharmony_ci        ('', NS(baz=None)),
7877db96d56Sopenharmony_ci        ('--baz a', NS(baz=['a'])),
7887db96d56Sopenharmony_ci        ('--baz a --baz b', NS(baz=['a', 'b'])),
7897db96d56Sopenharmony_ci    ]
7907db96d56Sopenharmony_ci
7917db96d56Sopenharmony_ci
7927db96d56Sopenharmony_ciclass TestOptionalsActionAppendWithDefault(ParserTestCase):
7937db96d56Sopenharmony_ci    """Tests the append action for an Optional"""
7947db96d56Sopenharmony_ci
7957db96d56Sopenharmony_ci    argument_signatures = [Sig('--baz', action='append', default=['X'])]
7967db96d56Sopenharmony_ci    failures = ['a', '--baz', 'a --baz', '--baz a b']
7977db96d56Sopenharmony_ci    successes = [
7987db96d56Sopenharmony_ci        ('', NS(baz=['X'])),
7997db96d56Sopenharmony_ci        ('--baz a', NS(baz=['X', 'a'])),
8007db96d56Sopenharmony_ci        ('--baz a --baz b', NS(baz=['X', 'a', 'b'])),
8017db96d56Sopenharmony_ci    ]
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ci
8047db96d56Sopenharmony_ciclass TestConstActionsMissingConstKwarg(ParserTestCase):
8057db96d56Sopenharmony_ci    """Tests that const gets default value of None when not provided"""
8067db96d56Sopenharmony_ci
8077db96d56Sopenharmony_ci    argument_signatures = [
8087db96d56Sopenharmony_ci        Sig('-f', action='append_const'),
8097db96d56Sopenharmony_ci        Sig('--foo', action='append_const'),
8107db96d56Sopenharmony_ci        Sig('-b', action='store_const'),
8117db96d56Sopenharmony_ci        Sig('--bar', action='store_const')
8127db96d56Sopenharmony_ci    ]
8137db96d56Sopenharmony_ci    failures = ['-f v', '--foo=bar', '--foo bar']
8147db96d56Sopenharmony_ci    successes = [
8157db96d56Sopenharmony_ci        ('', NS(f=None, foo=None, b=None, bar=None)),
8167db96d56Sopenharmony_ci        ('-f', NS(f=[None], foo=None, b=None, bar=None)),
8177db96d56Sopenharmony_ci        ('--foo', NS(f=None, foo=[None], b=None, bar=None)),
8187db96d56Sopenharmony_ci        ('-b', NS(f=None, foo=None, b=None, bar=None)),
8197db96d56Sopenharmony_ci        ('--bar', NS(f=None, foo=None, b=None, bar=None)),
8207db96d56Sopenharmony_ci    ]
8217db96d56Sopenharmony_ci
8227db96d56Sopenharmony_ci
8237db96d56Sopenharmony_ciclass TestOptionalsActionAppendConst(ParserTestCase):
8247db96d56Sopenharmony_ci    """Tests the append_const action for an Optional"""
8257db96d56Sopenharmony_ci
8267db96d56Sopenharmony_ci    argument_signatures = [
8277db96d56Sopenharmony_ci        Sig('-b', action='append_const', const=Exception),
8287db96d56Sopenharmony_ci        Sig('-c', action='append', dest='b'),
8297db96d56Sopenharmony_ci    ]
8307db96d56Sopenharmony_ci    failures = ['a', '-c', 'a -c', '-bx', '-b x']
8317db96d56Sopenharmony_ci    successes = [
8327db96d56Sopenharmony_ci        ('', NS(b=None)),
8337db96d56Sopenharmony_ci        ('-b', NS(b=[Exception])),
8347db96d56Sopenharmony_ci        ('-b -cx -b -cyz', NS(b=[Exception, 'x', Exception, 'yz'])),
8357db96d56Sopenharmony_ci    ]
8367db96d56Sopenharmony_ci
8377db96d56Sopenharmony_ci
8387db96d56Sopenharmony_ciclass TestOptionalsActionAppendConstWithDefault(ParserTestCase):
8397db96d56Sopenharmony_ci    """Tests the append_const action for an Optional"""
8407db96d56Sopenharmony_ci
8417db96d56Sopenharmony_ci    argument_signatures = [
8427db96d56Sopenharmony_ci        Sig('-b', action='append_const', const=Exception, default=['X']),
8437db96d56Sopenharmony_ci        Sig('-c', action='append', dest='b'),
8447db96d56Sopenharmony_ci    ]
8457db96d56Sopenharmony_ci    failures = ['a', '-c', 'a -c', '-bx', '-b x']
8467db96d56Sopenharmony_ci    successes = [
8477db96d56Sopenharmony_ci        ('', NS(b=['X'])),
8487db96d56Sopenharmony_ci        ('-b', NS(b=['X', Exception])),
8497db96d56Sopenharmony_ci        ('-b -cx -b -cyz', NS(b=['X', Exception, 'x', Exception, 'yz'])),
8507db96d56Sopenharmony_ci    ]
8517db96d56Sopenharmony_ci
8527db96d56Sopenharmony_ci
8537db96d56Sopenharmony_ciclass TestOptionalsActionCount(ParserTestCase):
8547db96d56Sopenharmony_ci    """Tests the count action for an Optional"""
8557db96d56Sopenharmony_ci
8567db96d56Sopenharmony_ci    argument_signatures = [Sig('-x', action='count')]
8577db96d56Sopenharmony_ci    failures = ['a', '-x a', '-x b', '-x a -x b']
8587db96d56Sopenharmony_ci    successes = [
8597db96d56Sopenharmony_ci        ('', NS(x=None)),
8607db96d56Sopenharmony_ci        ('-x', NS(x=1)),
8617db96d56Sopenharmony_ci    ]
8627db96d56Sopenharmony_ci
8637db96d56Sopenharmony_ci
8647db96d56Sopenharmony_ciclass TestOptionalsAllowLongAbbreviation(ParserTestCase):
8657db96d56Sopenharmony_ci    """Allow long options to be abbreviated unambiguously"""
8667db96d56Sopenharmony_ci
8677db96d56Sopenharmony_ci    argument_signatures = [
8687db96d56Sopenharmony_ci        Sig('--foo'),
8697db96d56Sopenharmony_ci        Sig('--foobaz'),
8707db96d56Sopenharmony_ci        Sig('--fooble', action='store_true'),
8717db96d56Sopenharmony_ci    ]
8727db96d56Sopenharmony_ci    failures = ['--foob 5', '--foob']
8737db96d56Sopenharmony_ci    successes = [
8747db96d56Sopenharmony_ci        ('', NS(foo=None, foobaz=None, fooble=False)),
8757db96d56Sopenharmony_ci        ('--foo 7', NS(foo='7', foobaz=None, fooble=False)),
8767db96d56Sopenharmony_ci        ('--fooba a', NS(foo=None, foobaz='a', fooble=False)),
8777db96d56Sopenharmony_ci        ('--foobl --foo g', NS(foo='g', foobaz=None, fooble=True)),
8787db96d56Sopenharmony_ci    ]
8797db96d56Sopenharmony_ci
8807db96d56Sopenharmony_ci
8817db96d56Sopenharmony_ciclass TestOptionalsDisallowLongAbbreviation(ParserTestCase):
8827db96d56Sopenharmony_ci    """Do not allow abbreviations of long options at all"""
8837db96d56Sopenharmony_ci
8847db96d56Sopenharmony_ci    parser_signature = Sig(allow_abbrev=False)
8857db96d56Sopenharmony_ci    argument_signatures = [
8867db96d56Sopenharmony_ci        Sig('--foo'),
8877db96d56Sopenharmony_ci        Sig('--foodle', action='store_true'),
8887db96d56Sopenharmony_ci        Sig('--foonly'),
8897db96d56Sopenharmony_ci    ]
8907db96d56Sopenharmony_ci    failures = ['-foon 3', '--foon 3', '--food', '--food --foo 2']
8917db96d56Sopenharmony_ci    successes = [
8927db96d56Sopenharmony_ci        ('', NS(foo=None, foodle=False, foonly=None)),
8937db96d56Sopenharmony_ci        ('--foo 3', NS(foo='3', foodle=False, foonly=None)),
8947db96d56Sopenharmony_ci        ('--foonly 7 --foodle --foo 2', NS(foo='2', foodle=True, foonly='7')),
8957db96d56Sopenharmony_ci    ]
8967db96d56Sopenharmony_ci
8977db96d56Sopenharmony_ci
8987db96d56Sopenharmony_ciclass TestOptionalsDisallowLongAbbreviationPrefixChars(ParserTestCase):
8997db96d56Sopenharmony_ci    """Disallowing abbreviations works with alternative prefix characters"""
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci    parser_signature = Sig(prefix_chars='+', allow_abbrev=False)
9027db96d56Sopenharmony_ci    argument_signatures = [
9037db96d56Sopenharmony_ci        Sig('++foo'),
9047db96d56Sopenharmony_ci        Sig('++foodle', action='store_true'),
9057db96d56Sopenharmony_ci        Sig('++foonly'),
9067db96d56Sopenharmony_ci    ]
9077db96d56Sopenharmony_ci    failures = ['+foon 3', '++foon 3', '++food', '++food ++foo 2']
9087db96d56Sopenharmony_ci    successes = [
9097db96d56Sopenharmony_ci        ('', NS(foo=None, foodle=False, foonly=None)),
9107db96d56Sopenharmony_ci        ('++foo 3', NS(foo='3', foodle=False, foonly=None)),
9117db96d56Sopenharmony_ci        ('++foonly 7 ++foodle ++foo 2', NS(foo='2', foodle=True, foonly='7')),
9127db96d56Sopenharmony_ci    ]
9137db96d56Sopenharmony_ci
9147db96d56Sopenharmony_ci
9157db96d56Sopenharmony_ciclass TestDisallowLongAbbreviationAllowsShortGrouping(ParserTestCase):
9167db96d56Sopenharmony_ci    """Do not allow abbreviations of long options at all"""
9177db96d56Sopenharmony_ci
9187db96d56Sopenharmony_ci    parser_signature = Sig(allow_abbrev=False)
9197db96d56Sopenharmony_ci    argument_signatures = [
9207db96d56Sopenharmony_ci        Sig('-r'),
9217db96d56Sopenharmony_ci        Sig('-c', action='count'),
9227db96d56Sopenharmony_ci    ]
9237db96d56Sopenharmony_ci    failures = ['-r', '-c -r']
9247db96d56Sopenharmony_ci    successes = [
9257db96d56Sopenharmony_ci        ('', NS(r=None, c=None)),
9267db96d56Sopenharmony_ci        ('-ra', NS(r='a', c=None)),
9277db96d56Sopenharmony_ci        ('-rcc', NS(r='cc', c=None)),
9287db96d56Sopenharmony_ci        ('-cc', NS(r=None, c=2)),
9297db96d56Sopenharmony_ci        ('-cc -ra', NS(r='a', c=2)),
9307db96d56Sopenharmony_ci        ('-ccrcc', NS(r='cc', c=2)),
9317db96d56Sopenharmony_ci    ]
9327db96d56Sopenharmony_ci
9337db96d56Sopenharmony_ci
9347db96d56Sopenharmony_ciclass TestDisallowLongAbbreviationAllowsShortGroupingPrefix(ParserTestCase):
9357db96d56Sopenharmony_ci    """Short option grouping works with custom prefix and allow_abbrev=False"""
9367db96d56Sopenharmony_ci
9377db96d56Sopenharmony_ci    parser_signature = Sig(prefix_chars='+', allow_abbrev=False)
9387db96d56Sopenharmony_ci    argument_signatures = [
9397db96d56Sopenharmony_ci        Sig('+r'),
9407db96d56Sopenharmony_ci        Sig('+c', action='count'),
9417db96d56Sopenharmony_ci    ]
9427db96d56Sopenharmony_ci    failures = ['+r', '+c +r']
9437db96d56Sopenharmony_ci    successes = [
9447db96d56Sopenharmony_ci        ('', NS(r=None, c=None)),
9457db96d56Sopenharmony_ci        ('+ra', NS(r='a', c=None)),
9467db96d56Sopenharmony_ci        ('+rcc', NS(r='cc', c=None)),
9477db96d56Sopenharmony_ci        ('+cc', NS(r=None, c=2)),
9487db96d56Sopenharmony_ci        ('+cc +ra', NS(r='a', c=2)),
9497db96d56Sopenharmony_ci        ('+ccrcc', NS(r='cc', c=2)),
9507db96d56Sopenharmony_ci    ]
9517db96d56Sopenharmony_ci
9527db96d56Sopenharmony_ci
9537db96d56Sopenharmony_ci# ================
9547db96d56Sopenharmony_ci# Positional tests
9557db96d56Sopenharmony_ci# ================
9567db96d56Sopenharmony_ci
9577db96d56Sopenharmony_ciclass TestPositionalsNargsNone(ParserTestCase):
9587db96d56Sopenharmony_ci    """Test a Positional that doesn't specify nargs"""
9597db96d56Sopenharmony_ci
9607db96d56Sopenharmony_ci    argument_signatures = [Sig('foo')]
9617db96d56Sopenharmony_ci    failures = ['', '-x', 'a b']
9627db96d56Sopenharmony_ci    successes = [
9637db96d56Sopenharmony_ci        ('a', NS(foo='a')),
9647db96d56Sopenharmony_ci    ]
9657db96d56Sopenharmony_ci
9667db96d56Sopenharmony_ci
9677db96d56Sopenharmony_ciclass TestPositionalsNargs1(ParserTestCase):
9687db96d56Sopenharmony_ci    """Test a Positional that specifies an nargs of 1"""
9697db96d56Sopenharmony_ci
9707db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs=1)]
9717db96d56Sopenharmony_ci    failures = ['', '-x', 'a b']
9727db96d56Sopenharmony_ci    successes = [
9737db96d56Sopenharmony_ci        ('a', NS(foo=['a'])),
9747db96d56Sopenharmony_ci    ]
9757db96d56Sopenharmony_ci
9767db96d56Sopenharmony_ci
9777db96d56Sopenharmony_ciclass TestPositionalsNargs2(ParserTestCase):
9787db96d56Sopenharmony_ci    """Test a Positional that specifies an nargs of 2"""
9797db96d56Sopenharmony_ci
9807db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs=2)]
9817db96d56Sopenharmony_ci    failures = ['', 'a', '-x', 'a b c']
9827db96d56Sopenharmony_ci    successes = [
9837db96d56Sopenharmony_ci        ('a b', NS(foo=['a', 'b'])),
9847db96d56Sopenharmony_ci    ]
9857db96d56Sopenharmony_ci
9867db96d56Sopenharmony_ci
9877db96d56Sopenharmony_ciclass TestPositionalsNargsZeroOrMore(ParserTestCase):
9887db96d56Sopenharmony_ci    """Test a Positional that specifies unlimited nargs"""
9897db96d56Sopenharmony_ci
9907db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='*')]
9917db96d56Sopenharmony_ci    failures = ['-x']
9927db96d56Sopenharmony_ci    successes = [
9937db96d56Sopenharmony_ci        ('', NS(foo=[])),
9947db96d56Sopenharmony_ci        ('a', NS(foo=['a'])),
9957db96d56Sopenharmony_ci        ('a b', NS(foo=['a', 'b'])),
9967db96d56Sopenharmony_ci    ]
9977db96d56Sopenharmony_ci
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_ciclass TestPositionalsNargsZeroOrMoreDefault(ParserTestCase):
10007db96d56Sopenharmony_ci    """Test a Positional that specifies unlimited nargs and a default"""
10017db96d56Sopenharmony_ci
10027db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='*', default='bar')]
10037db96d56Sopenharmony_ci    failures = ['-x']
10047db96d56Sopenharmony_ci    successes = [
10057db96d56Sopenharmony_ci        ('', NS(foo='bar')),
10067db96d56Sopenharmony_ci        ('a', NS(foo=['a'])),
10077db96d56Sopenharmony_ci        ('a b', NS(foo=['a', 'b'])),
10087db96d56Sopenharmony_ci    ]
10097db96d56Sopenharmony_ci
10107db96d56Sopenharmony_ci
10117db96d56Sopenharmony_ciclass TestPositionalsNargsOneOrMore(ParserTestCase):
10127db96d56Sopenharmony_ci    """Test a Positional that specifies one or more nargs"""
10137db96d56Sopenharmony_ci
10147db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='+')]
10157db96d56Sopenharmony_ci    failures = ['', '-x']
10167db96d56Sopenharmony_ci    successes = [
10177db96d56Sopenharmony_ci        ('a', NS(foo=['a'])),
10187db96d56Sopenharmony_ci        ('a b', NS(foo=['a', 'b'])),
10197db96d56Sopenharmony_ci    ]
10207db96d56Sopenharmony_ci
10217db96d56Sopenharmony_ci
10227db96d56Sopenharmony_ciclass TestPositionalsNargsOptional(ParserTestCase):
10237db96d56Sopenharmony_ci    """Tests an Optional Positional"""
10247db96d56Sopenharmony_ci
10257db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='?')]
10267db96d56Sopenharmony_ci    failures = ['-x', 'a b']
10277db96d56Sopenharmony_ci    successes = [
10287db96d56Sopenharmony_ci        ('', NS(foo=None)),
10297db96d56Sopenharmony_ci        ('a', NS(foo='a')),
10307db96d56Sopenharmony_ci    ]
10317db96d56Sopenharmony_ci
10327db96d56Sopenharmony_ci
10337db96d56Sopenharmony_ciclass TestPositionalsNargsOptionalDefault(ParserTestCase):
10347db96d56Sopenharmony_ci    """Tests an Optional Positional with a default value"""
10357db96d56Sopenharmony_ci
10367db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='?', default=42)]
10377db96d56Sopenharmony_ci    failures = ['-x', 'a b']
10387db96d56Sopenharmony_ci    successes = [
10397db96d56Sopenharmony_ci        ('', NS(foo=42)),
10407db96d56Sopenharmony_ci        ('a', NS(foo='a')),
10417db96d56Sopenharmony_ci    ]
10427db96d56Sopenharmony_ci
10437db96d56Sopenharmony_ci
10447db96d56Sopenharmony_ciclass TestPositionalsNargsOptionalConvertedDefault(ParserTestCase):
10457db96d56Sopenharmony_ci    """Tests an Optional Positional with a default value
10467db96d56Sopenharmony_ci    that needs to be converted to the appropriate type.
10477db96d56Sopenharmony_ci    """
10487db96d56Sopenharmony_ci
10497db96d56Sopenharmony_ci    argument_signatures = [
10507db96d56Sopenharmony_ci        Sig('foo', nargs='?', type=int, default='42'),
10517db96d56Sopenharmony_ci    ]
10527db96d56Sopenharmony_ci    failures = ['-x', 'a b', '1 2']
10537db96d56Sopenharmony_ci    successes = [
10547db96d56Sopenharmony_ci        ('', NS(foo=42)),
10557db96d56Sopenharmony_ci        ('1', NS(foo=1)),
10567db96d56Sopenharmony_ci    ]
10577db96d56Sopenharmony_ci
10587db96d56Sopenharmony_ci
10597db96d56Sopenharmony_ciclass TestPositionalsNargsNoneNone(ParserTestCase):
10607db96d56Sopenharmony_ci    """Test two Positionals that don't specify nargs"""
10617db96d56Sopenharmony_ci
10627db96d56Sopenharmony_ci    argument_signatures = [Sig('foo'), Sig('bar')]
10637db96d56Sopenharmony_ci    failures = ['', '-x', 'a', 'a b c']
10647db96d56Sopenharmony_ci    successes = [
10657db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar='b')),
10667db96d56Sopenharmony_ci    ]
10677db96d56Sopenharmony_ci
10687db96d56Sopenharmony_ci
10697db96d56Sopenharmony_ciclass TestPositionalsNargsNone1(ParserTestCase):
10707db96d56Sopenharmony_ci    """Test a Positional with no nargs followed by one with 1"""
10717db96d56Sopenharmony_ci
10727db96d56Sopenharmony_ci    argument_signatures = [Sig('foo'), Sig('bar', nargs=1)]
10737db96d56Sopenharmony_ci    failures = ['', '--foo', 'a', 'a b c']
10747db96d56Sopenharmony_ci    successes = [
10757db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar=['b'])),
10767db96d56Sopenharmony_ci    ]
10777db96d56Sopenharmony_ci
10787db96d56Sopenharmony_ci
10797db96d56Sopenharmony_ciclass TestPositionalsNargs2None(ParserTestCase):
10807db96d56Sopenharmony_ci    """Test a Positional with 2 nargs followed by one with none"""
10817db96d56Sopenharmony_ci
10827db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs=2), Sig('bar')]
10837db96d56Sopenharmony_ci    failures = ['', '--foo', 'a', 'a b', 'a b c d']
10847db96d56Sopenharmony_ci    successes = [
10857db96d56Sopenharmony_ci        ('a b c', NS(foo=['a', 'b'], bar='c')),
10867db96d56Sopenharmony_ci    ]
10877db96d56Sopenharmony_ci
10887db96d56Sopenharmony_ci
10897db96d56Sopenharmony_ciclass TestPositionalsNargsNoneZeroOrMore(ParserTestCase):
10907db96d56Sopenharmony_ci    """Test a Positional with no nargs followed by one with unlimited"""
10917db96d56Sopenharmony_ci
10927db96d56Sopenharmony_ci    argument_signatures = [Sig('foo'), Sig('bar', nargs='*')]
10937db96d56Sopenharmony_ci    failures = ['', '--foo']
10947db96d56Sopenharmony_ci    successes = [
10957db96d56Sopenharmony_ci        ('a', NS(foo='a', bar=[])),
10967db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar=['b'])),
10977db96d56Sopenharmony_ci        ('a b c', NS(foo='a', bar=['b', 'c'])),
10987db96d56Sopenharmony_ci    ]
10997db96d56Sopenharmony_ci
11007db96d56Sopenharmony_ci
11017db96d56Sopenharmony_ciclass TestPositionalsNargsNoneOneOrMore(ParserTestCase):
11027db96d56Sopenharmony_ci    """Test a Positional with no nargs followed by one with one or more"""
11037db96d56Sopenharmony_ci
11047db96d56Sopenharmony_ci    argument_signatures = [Sig('foo'), Sig('bar', nargs='+')]
11057db96d56Sopenharmony_ci    failures = ['', '--foo', 'a']
11067db96d56Sopenharmony_ci    successes = [
11077db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar=['b'])),
11087db96d56Sopenharmony_ci        ('a b c', NS(foo='a', bar=['b', 'c'])),
11097db96d56Sopenharmony_ci    ]
11107db96d56Sopenharmony_ci
11117db96d56Sopenharmony_ci
11127db96d56Sopenharmony_ciclass TestPositionalsNargsNoneOptional(ParserTestCase):
11137db96d56Sopenharmony_ci    """Test a Positional with no nargs followed by one with an Optional"""
11147db96d56Sopenharmony_ci
11157db96d56Sopenharmony_ci    argument_signatures = [Sig('foo'), Sig('bar', nargs='?')]
11167db96d56Sopenharmony_ci    failures = ['', '--foo', 'a b c']
11177db96d56Sopenharmony_ci    successes = [
11187db96d56Sopenharmony_ci        ('a', NS(foo='a', bar=None)),
11197db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar='b')),
11207db96d56Sopenharmony_ci    ]
11217db96d56Sopenharmony_ci
11227db96d56Sopenharmony_ci
11237db96d56Sopenharmony_ciclass TestPositionalsNargsZeroOrMoreNone(ParserTestCase):
11247db96d56Sopenharmony_ci    """Test a Positional with unlimited nargs followed by one with none"""
11257db96d56Sopenharmony_ci
11267db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='*'), Sig('bar')]
11277db96d56Sopenharmony_ci    failures = ['', '--foo']
11287db96d56Sopenharmony_ci    successes = [
11297db96d56Sopenharmony_ci        ('a', NS(foo=[], bar='a')),
11307db96d56Sopenharmony_ci        ('a b', NS(foo=['a'], bar='b')),
11317db96d56Sopenharmony_ci        ('a b c', NS(foo=['a', 'b'], bar='c')),
11327db96d56Sopenharmony_ci    ]
11337db96d56Sopenharmony_ci
11347db96d56Sopenharmony_ci
11357db96d56Sopenharmony_ciclass TestPositionalsNargsOneOrMoreNone(ParserTestCase):
11367db96d56Sopenharmony_ci    """Test a Positional with one or more nargs followed by one with none"""
11377db96d56Sopenharmony_ci
11387db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='+'), Sig('bar')]
11397db96d56Sopenharmony_ci    failures = ['', '--foo', 'a']
11407db96d56Sopenharmony_ci    successes = [
11417db96d56Sopenharmony_ci        ('a b', NS(foo=['a'], bar='b')),
11427db96d56Sopenharmony_ci        ('a b c', NS(foo=['a', 'b'], bar='c')),
11437db96d56Sopenharmony_ci    ]
11447db96d56Sopenharmony_ci
11457db96d56Sopenharmony_ci
11467db96d56Sopenharmony_ciclass TestPositionalsNargsOptionalNone(ParserTestCase):
11477db96d56Sopenharmony_ci    """Test a Positional with an Optional nargs followed by one with none"""
11487db96d56Sopenharmony_ci
11497db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='?', default=42), Sig('bar')]
11507db96d56Sopenharmony_ci    failures = ['', '--foo', 'a b c']
11517db96d56Sopenharmony_ci    successes = [
11527db96d56Sopenharmony_ci        ('a', NS(foo=42, bar='a')),
11537db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar='b')),
11547db96d56Sopenharmony_ci    ]
11557db96d56Sopenharmony_ci
11567db96d56Sopenharmony_ci
11577db96d56Sopenharmony_ciclass TestPositionalsNargs2ZeroOrMore(ParserTestCase):
11587db96d56Sopenharmony_ci    """Test a Positional with 2 nargs followed by one with unlimited"""
11597db96d56Sopenharmony_ci
11607db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='*')]
11617db96d56Sopenharmony_ci    failures = ['', '--foo', 'a']
11627db96d56Sopenharmony_ci    successes = [
11637db96d56Sopenharmony_ci        ('a b', NS(foo=['a', 'b'], bar=[])),
11647db96d56Sopenharmony_ci        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
11657db96d56Sopenharmony_ci    ]
11667db96d56Sopenharmony_ci
11677db96d56Sopenharmony_ci
11687db96d56Sopenharmony_ciclass TestPositionalsNargs2OneOrMore(ParserTestCase):
11697db96d56Sopenharmony_ci    """Test a Positional with 2 nargs followed by one with one or more"""
11707db96d56Sopenharmony_ci
11717db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='+')]
11727db96d56Sopenharmony_ci    failures = ['', '--foo', 'a', 'a b']
11737db96d56Sopenharmony_ci    successes = [
11747db96d56Sopenharmony_ci        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
11757db96d56Sopenharmony_ci    ]
11767db96d56Sopenharmony_ci
11777db96d56Sopenharmony_ci
11787db96d56Sopenharmony_ciclass TestPositionalsNargs2Optional(ParserTestCase):
11797db96d56Sopenharmony_ci    """Test a Positional with 2 nargs followed by one optional"""
11807db96d56Sopenharmony_ci
11817db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='?')]
11827db96d56Sopenharmony_ci    failures = ['', '--foo', 'a', 'a b c d']
11837db96d56Sopenharmony_ci    successes = [
11847db96d56Sopenharmony_ci        ('a b', NS(foo=['a', 'b'], bar=None)),
11857db96d56Sopenharmony_ci        ('a b c', NS(foo=['a', 'b'], bar='c')),
11867db96d56Sopenharmony_ci    ]
11877db96d56Sopenharmony_ci
11887db96d56Sopenharmony_ci
11897db96d56Sopenharmony_ciclass TestPositionalsNargsZeroOrMore1(ParserTestCase):
11907db96d56Sopenharmony_ci    """Test a Positional with unlimited nargs followed by one with 1"""
11917db96d56Sopenharmony_ci
11927db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='*'), Sig('bar', nargs=1)]
11937db96d56Sopenharmony_ci    failures = ['', '--foo', ]
11947db96d56Sopenharmony_ci    successes = [
11957db96d56Sopenharmony_ci        ('a', NS(foo=[], bar=['a'])),
11967db96d56Sopenharmony_ci        ('a b', NS(foo=['a'], bar=['b'])),
11977db96d56Sopenharmony_ci        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
11987db96d56Sopenharmony_ci    ]
11997db96d56Sopenharmony_ci
12007db96d56Sopenharmony_ci
12017db96d56Sopenharmony_ciclass TestPositionalsNargsOneOrMore1(ParserTestCase):
12027db96d56Sopenharmony_ci    """Test a Positional with one or more nargs followed by one with 1"""
12037db96d56Sopenharmony_ci
12047db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='+'), Sig('bar', nargs=1)]
12057db96d56Sopenharmony_ci    failures = ['', '--foo', 'a']
12067db96d56Sopenharmony_ci    successes = [
12077db96d56Sopenharmony_ci        ('a b', NS(foo=['a'], bar=['b'])),
12087db96d56Sopenharmony_ci        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
12097db96d56Sopenharmony_ci    ]
12107db96d56Sopenharmony_ci
12117db96d56Sopenharmony_ci
12127db96d56Sopenharmony_ciclass TestPositionalsNargsOptional1(ParserTestCase):
12137db96d56Sopenharmony_ci    """Test a Positional with an Optional nargs followed by one with 1"""
12147db96d56Sopenharmony_ci
12157db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs=1)]
12167db96d56Sopenharmony_ci    failures = ['', '--foo', 'a b c']
12177db96d56Sopenharmony_ci    successes = [
12187db96d56Sopenharmony_ci        ('a', NS(foo=None, bar=['a'])),
12197db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar=['b'])),
12207db96d56Sopenharmony_ci    ]
12217db96d56Sopenharmony_ci
12227db96d56Sopenharmony_ci
12237db96d56Sopenharmony_ciclass TestPositionalsNargsNoneZeroOrMore1(ParserTestCase):
12247db96d56Sopenharmony_ci    """Test three Positionals: no nargs, unlimited nargs and 1 nargs"""
12257db96d56Sopenharmony_ci
12267db96d56Sopenharmony_ci    argument_signatures = [
12277db96d56Sopenharmony_ci        Sig('foo'),
12287db96d56Sopenharmony_ci        Sig('bar', nargs='*'),
12297db96d56Sopenharmony_ci        Sig('baz', nargs=1),
12307db96d56Sopenharmony_ci    ]
12317db96d56Sopenharmony_ci    failures = ['', '--foo', 'a']
12327db96d56Sopenharmony_ci    successes = [
12337db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar=[], baz=['b'])),
12347db96d56Sopenharmony_ci        ('a b c', NS(foo='a', bar=['b'], baz=['c'])),
12357db96d56Sopenharmony_ci    ]
12367db96d56Sopenharmony_ci
12377db96d56Sopenharmony_ci
12387db96d56Sopenharmony_ciclass TestPositionalsNargsNoneOneOrMore1(ParserTestCase):
12397db96d56Sopenharmony_ci    """Test three Positionals: no nargs, one or more nargs and 1 nargs"""
12407db96d56Sopenharmony_ci
12417db96d56Sopenharmony_ci    argument_signatures = [
12427db96d56Sopenharmony_ci        Sig('foo'),
12437db96d56Sopenharmony_ci        Sig('bar', nargs='+'),
12447db96d56Sopenharmony_ci        Sig('baz', nargs=1),
12457db96d56Sopenharmony_ci    ]
12467db96d56Sopenharmony_ci    failures = ['', '--foo', 'a', 'b']
12477db96d56Sopenharmony_ci    successes = [
12487db96d56Sopenharmony_ci        ('a b c', NS(foo='a', bar=['b'], baz=['c'])),
12497db96d56Sopenharmony_ci        ('a b c d', NS(foo='a', bar=['b', 'c'], baz=['d'])),
12507db96d56Sopenharmony_ci    ]
12517db96d56Sopenharmony_ci
12527db96d56Sopenharmony_ci
12537db96d56Sopenharmony_ciclass TestPositionalsNargsNoneOptional1(ParserTestCase):
12547db96d56Sopenharmony_ci    """Test three Positionals: no nargs, optional narg and 1 nargs"""
12557db96d56Sopenharmony_ci
12567db96d56Sopenharmony_ci    argument_signatures = [
12577db96d56Sopenharmony_ci        Sig('foo'),
12587db96d56Sopenharmony_ci        Sig('bar', nargs='?', default=0.625),
12597db96d56Sopenharmony_ci        Sig('baz', nargs=1),
12607db96d56Sopenharmony_ci    ]
12617db96d56Sopenharmony_ci    failures = ['', '--foo', 'a']
12627db96d56Sopenharmony_ci    successes = [
12637db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar=0.625, baz=['b'])),
12647db96d56Sopenharmony_ci        ('a b c', NS(foo='a', bar='b', baz=['c'])),
12657db96d56Sopenharmony_ci    ]
12667db96d56Sopenharmony_ci
12677db96d56Sopenharmony_ci
12687db96d56Sopenharmony_ciclass TestPositionalsNargsOptionalOptional(ParserTestCase):
12697db96d56Sopenharmony_ci    """Test two optional nargs"""
12707db96d56Sopenharmony_ci
12717db96d56Sopenharmony_ci    argument_signatures = [
12727db96d56Sopenharmony_ci        Sig('foo', nargs='?'),
12737db96d56Sopenharmony_ci        Sig('bar', nargs='?', default=42),
12747db96d56Sopenharmony_ci    ]
12757db96d56Sopenharmony_ci    failures = ['--foo', 'a b c']
12767db96d56Sopenharmony_ci    successes = [
12777db96d56Sopenharmony_ci        ('', NS(foo=None, bar=42)),
12787db96d56Sopenharmony_ci        ('a', NS(foo='a', bar=42)),
12797db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar='b')),
12807db96d56Sopenharmony_ci    ]
12817db96d56Sopenharmony_ci
12827db96d56Sopenharmony_ci
12837db96d56Sopenharmony_ciclass TestPositionalsNargsOptionalZeroOrMore(ParserTestCase):
12847db96d56Sopenharmony_ci    """Test an Optional narg followed by unlimited nargs"""
12857db96d56Sopenharmony_ci
12867db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs='*')]
12877db96d56Sopenharmony_ci    failures = ['--foo']
12887db96d56Sopenharmony_ci    successes = [
12897db96d56Sopenharmony_ci        ('', NS(foo=None, bar=[])),
12907db96d56Sopenharmony_ci        ('a', NS(foo='a', bar=[])),
12917db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar=['b'])),
12927db96d56Sopenharmony_ci        ('a b c', NS(foo='a', bar=['b', 'c'])),
12937db96d56Sopenharmony_ci    ]
12947db96d56Sopenharmony_ci
12957db96d56Sopenharmony_ci
12967db96d56Sopenharmony_ciclass TestPositionalsNargsOptionalOneOrMore(ParserTestCase):
12977db96d56Sopenharmony_ci    """Test an Optional narg followed by one or more nargs"""
12987db96d56Sopenharmony_ci
12997db96d56Sopenharmony_ci    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs='+')]
13007db96d56Sopenharmony_ci    failures = ['', '--foo']
13017db96d56Sopenharmony_ci    successes = [
13027db96d56Sopenharmony_ci        ('a', NS(foo=None, bar=['a'])),
13037db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar=['b'])),
13047db96d56Sopenharmony_ci        ('a b c', NS(foo='a', bar=['b', 'c'])),
13057db96d56Sopenharmony_ci    ]
13067db96d56Sopenharmony_ci
13077db96d56Sopenharmony_ci
13087db96d56Sopenharmony_ciclass TestPositionalsChoicesString(ParserTestCase):
13097db96d56Sopenharmony_ci    """Test a set of single-character choices"""
13107db96d56Sopenharmony_ci
13117db96d56Sopenharmony_ci    argument_signatures = [Sig('spam', choices=set('abcdefg'))]
13127db96d56Sopenharmony_ci    failures = ['', '--foo', 'h', '42', 'ef']
13137db96d56Sopenharmony_ci    successes = [
13147db96d56Sopenharmony_ci        ('a', NS(spam='a')),
13157db96d56Sopenharmony_ci        ('g', NS(spam='g')),
13167db96d56Sopenharmony_ci    ]
13177db96d56Sopenharmony_ci
13187db96d56Sopenharmony_ci
13197db96d56Sopenharmony_ciclass TestPositionalsChoicesInt(ParserTestCase):
13207db96d56Sopenharmony_ci    """Test a set of integer choices"""
13217db96d56Sopenharmony_ci
13227db96d56Sopenharmony_ci    argument_signatures = [Sig('spam', type=int, choices=range(20))]
13237db96d56Sopenharmony_ci    failures = ['', '--foo', 'h', '42', 'ef']
13247db96d56Sopenharmony_ci    successes = [
13257db96d56Sopenharmony_ci        ('4', NS(spam=4)),
13267db96d56Sopenharmony_ci        ('15', NS(spam=15)),
13277db96d56Sopenharmony_ci    ]
13287db96d56Sopenharmony_ci
13297db96d56Sopenharmony_ci
13307db96d56Sopenharmony_ciclass TestPositionalsActionAppend(ParserTestCase):
13317db96d56Sopenharmony_ci    """Test the 'append' action"""
13327db96d56Sopenharmony_ci
13337db96d56Sopenharmony_ci    argument_signatures = [
13347db96d56Sopenharmony_ci        Sig('spam', action='append'),
13357db96d56Sopenharmony_ci        Sig('spam', action='append', nargs=2),
13367db96d56Sopenharmony_ci    ]
13377db96d56Sopenharmony_ci    failures = ['', '--foo', 'a', 'a b', 'a b c d']
13387db96d56Sopenharmony_ci    successes = [
13397db96d56Sopenharmony_ci        ('a b c', NS(spam=['a', ['b', 'c']])),
13407db96d56Sopenharmony_ci    ]
13417db96d56Sopenharmony_ci
13427db96d56Sopenharmony_ci# ========================================
13437db96d56Sopenharmony_ci# Combined optionals and positionals tests
13447db96d56Sopenharmony_ci# ========================================
13457db96d56Sopenharmony_ci
13467db96d56Sopenharmony_ciclass TestOptionalsNumericAndPositionals(ParserTestCase):
13477db96d56Sopenharmony_ci    """Tests negative number args when numeric options are present"""
13487db96d56Sopenharmony_ci
13497db96d56Sopenharmony_ci    argument_signatures = [
13507db96d56Sopenharmony_ci        Sig('x', nargs='?'),
13517db96d56Sopenharmony_ci        Sig('-4', dest='y', action='store_true'),
13527db96d56Sopenharmony_ci    ]
13537db96d56Sopenharmony_ci    failures = ['-2', '-315']
13547db96d56Sopenharmony_ci    successes = [
13557db96d56Sopenharmony_ci        ('', NS(x=None, y=False)),
13567db96d56Sopenharmony_ci        ('a', NS(x='a', y=False)),
13577db96d56Sopenharmony_ci        ('-4', NS(x=None, y=True)),
13587db96d56Sopenharmony_ci        ('-4 a', NS(x='a', y=True)),
13597db96d56Sopenharmony_ci    ]
13607db96d56Sopenharmony_ci
13617db96d56Sopenharmony_ci
13627db96d56Sopenharmony_ciclass TestOptionalsAlmostNumericAndPositionals(ParserTestCase):
13637db96d56Sopenharmony_ci    """Tests negative number args when almost numeric options are present"""
13647db96d56Sopenharmony_ci
13657db96d56Sopenharmony_ci    argument_signatures = [
13667db96d56Sopenharmony_ci        Sig('x', nargs='?'),
13677db96d56Sopenharmony_ci        Sig('-k4', dest='y', action='store_true'),
13687db96d56Sopenharmony_ci    ]
13697db96d56Sopenharmony_ci    failures = ['-k3']
13707db96d56Sopenharmony_ci    successes = [
13717db96d56Sopenharmony_ci        ('', NS(x=None, y=False)),
13727db96d56Sopenharmony_ci        ('-2', NS(x='-2', y=False)),
13737db96d56Sopenharmony_ci        ('a', NS(x='a', y=False)),
13747db96d56Sopenharmony_ci        ('-k4', NS(x=None, y=True)),
13757db96d56Sopenharmony_ci        ('-k4 a', NS(x='a', y=True)),
13767db96d56Sopenharmony_ci    ]
13777db96d56Sopenharmony_ci
13787db96d56Sopenharmony_ci
13797db96d56Sopenharmony_ciclass TestEmptyAndSpaceContainingArguments(ParserTestCase):
13807db96d56Sopenharmony_ci
13817db96d56Sopenharmony_ci    argument_signatures = [
13827db96d56Sopenharmony_ci        Sig('x', nargs='?'),
13837db96d56Sopenharmony_ci        Sig('-y', '--yyy', dest='y'),
13847db96d56Sopenharmony_ci    ]
13857db96d56Sopenharmony_ci    failures = ['-y']
13867db96d56Sopenharmony_ci    successes = [
13877db96d56Sopenharmony_ci        ([''], NS(x='', y=None)),
13887db96d56Sopenharmony_ci        (['a badger'], NS(x='a badger', y=None)),
13897db96d56Sopenharmony_ci        (['-a badger'], NS(x='-a badger', y=None)),
13907db96d56Sopenharmony_ci        (['-y', ''], NS(x=None, y='')),
13917db96d56Sopenharmony_ci        (['-y', 'a badger'], NS(x=None, y='a badger')),
13927db96d56Sopenharmony_ci        (['-y', '-a badger'], NS(x=None, y='-a badger')),
13937db96d56Sopenharmony_ci        (['--yyy=a badger'], NS(x=None, y='a badger')),
13947db96d56Sopenharmony_ci        (['--yyy=-a badger'], NS(x=None, y='-a badger')),
13957db96d56Sopenharmony_ci    ]
13967db96d56Sopenharmony_ci
13977db96d56Sopenharmony_ci
13987db96d56Sopenharmony_ciclass TestPrefixCharacterOnlyArguments(ParserTestCase):
13997db96d56Sopenharmony_ci
14007db96d56Sopenharmony_ci    parser_signature = Sig(prefix_chars='-+')
14017db96d56Sopenharmony_ci    argument_signatures = [
14027db96d56Sopenharmony_ci        Sig('-', dest='x', nargs='?', const='badger'),
14037db96d56Sopenharmony_ci        Sig('+', dest='y', type=int, default=42),
14047db96d56Sopenharmony_ci        Sig('-+-', dest='z', action='store_true'),
14057db96d56Sopenharmony_ci    ]
14067db96d56Sopenharmony_ci    failures = ['-y', '+ -']
14077db96d56Sopenharmony_ci    successes = [
14087db96d56Sopenharmony_ci        ('', NS(x=None, y=42, z=False)),
14097db96d56Sopenharmony_ci        ('-', NS(x='badger', y=42, z=False)),
14107db96d56Sopenharmony_ci        ('- X', NS(x='X', y=42, z=False)),
14117db96d56Sopenharmony_ci        ('+ -3', NS(x=None, y=-3, z=False)),
14127db96d56Sopenharmony_ci        ('-+-', NS(x=None, y=42, z=True)),
14137db96d56Sopenharmony_ci        ('- ===', NS(x='===', y=42, z=False)),
14147db96d56Sopenharmony_ci    ]
14157db96d56Sopenharmony_ci
14167db96d56Sopenharmony_ci
14177db96d56Sopenharmony_ciclass TestNargsZeroOrMore(ParserTestCase):
14187db96d56Sopenharmony_ci    """Tests specifying args for an Optional that accepts zero or more"""
14197db96d56Sopenharmony_ci
14207db96d56Sopenharmony_ci    argument_signatures = [Sig('-x', nargs='*'), Sig('y', nargs='*')]
14217db96d56Sopenharmony_ci    failures = []
14227db96d56Sopenharmony_ci    successes = [
14237db96d56Sopenharmony_ci        ('', NS(x=None, y=[])),
14247db96d56Sopenharmony_ci        ('-x', NS(x=[], y=[])),
14257db96d56Sopenharmony_ci        ('-x a', NS(x=['a'], y=[])),
14267db96d56Sopenharmony_ci        ('-x a -- b', NS(x=['a'], y=['b'])),
14277db96d56Sopenharmony_ci        ('a', NS(x=None, y=['a'])),
14287db96d56Sopenharmony_ci        ('a -x', NS(x=[], y=['a'])),
14297db96d56Sopenharmony_ci        ('a -x b', NS(x=['b'], y=['a'])),
14307db96d56Sopenharmony_ci    ]
14317db96d56Sopenharmony_ci
14327db96d56Sopenharmony_ci
14337db96d56Sopenharmony_ciclass TestNargsRemainder(ParserTestCase):
14347db96d56Sopenharmony_ci    """Tests specifying a positional with nargs=REMAINDER"""
14357db96d56Sopenharmony_ci
14367db96d56Sopenharmony_ci    argument_signatures = [Sig('x'), Sig('y', nargs='...'), Sig('-z')]
14377db96d56Sopenharmony_ci    failures = ['', '-z', '-z Z']
14387db96d56Sopenharmony_ci    successes = [
14397db96d56Sopenharmony_ci        ('X', NS(x='X', y=[], z=None)),
14407db96d56Sopenharmony_ci        ('-z Z X', NS(x='X', y=[], z='Z')),
14417db96d56Sopenharmony_ci        ('X A B -z Z', NS(x='X', y=['A', 'B', '-z', 'Z'], z=None)),
14427db96d56Sopenharmony_ci        ('X Y --foo', NS(x='X', y=['Y', '--foo'], z=None)),
14437db96d56Sopenharmony_ci    ]
14447db96d56Sopenharmony_ci
14457db96d56Sopenharmony_ci
14467db96d56Sopenharmony_ciclass TestOptionLike(ParserTestCase):
14477db96d56Sopenharmony_ci    """Tests options that may or may not be arguments"""
14487db96d56Sopenharmony_ci
14497db96d56Sopenharmony_ci    argument_signatures = [
14507db96d56Sopenharmony_ci        Sig('-x', type=float),
14517db96d56Sopenharmony_ci        Sig('-3', type=float, dest='y'),
14527db96d56Sopenharmony_ci        Sig('z', nargs='*'),
14537db96d56Sopenharmony_ci    ]
14547db96d56Sopenharmony_ci    failures = ['-x', '-y2.5', '-xa', '-x -a',
14557db96d56Sopenharmony_ci                '-x -3', '-x -3.5', '-3 -3.5',
14567db96d56Sopenharmony_ci                '-x -2.5', '-x -2.5 a', '-3 -.5',
14577db96d56Sopenharmony_ci                'a x -1', '-x -1 a', '-3 -1 a']
14587db96d56Sopenharmony_ci    successes = [
14597db96d56Sopenharmony_ci        ('', NS(x=None, y=None, z=[])),
14607db96d56Sopenharmony_ci        ('-x 2.5', NS(x=2.5, y=None, z=[])),
14617db96d56Sopenharmony_ci        ('-x 2.5 a', NS(x=2.5, y=None, z=['a'])),
14627db96d56Sopenharmony_ci        ('-3.5', NS(x=None, y=0.5, z=[])),
14637db96d56Sopenharmony_ci        ('-3-.5', NS(x=None, y=-0.5, z=[])),
14647db96d56Sopenharmony_ci        ('-3 .5', NS(x=None, y=0.5, z=[])),
14657db96d56Sopenharmony_ci        ('a -3.5', NS(x=None, y=0.5, z=['a'])),
14667db96d56Sopenharmony_ci        ('a', NS(x=None, y=None, z=['a'])),
14677db96d56Sopenharmony_ci        ('a -x 1', NS(x=1.0, y=None, z=['a'])),
14687db96d56Sopenharmony_ci        ('-x 1 a', NS(x=1.0, y=None, z=['a'])),
14697db96d56Sopenharmony_ci        ('-3 1 a', NS(x=None, y=1.0, z=['a'])),
14707db96d56Sopenharmony_ci    ]
14717db96d56Sopenharmony_ci
14727db96d56Sopenharmony_ci
14737db96d56Sopenharmony_ciclass TestDefaultSuppress(ParserTestCase):
14747db96d56Sopenharmony_ci    """Test actions with suppressed defaults"""
14757db96d56Sopenharmony_ci
14767db96d56Sopenharmony_ci    argument_signatures = [
14777db96d56Sopenharmony_ci        Sig('foo', nargs='?', default=argparse.SUPPRESS),
14787db96d56Sopenharmony_ci        Sig('bar', nargs='*', default=argparse.SUPPRESS),
14797db96d56Sopenharmony_ci        Sig('--baz', action='store_true', default=argparse.SUPPRESS),
14807db96d56Sopenharmony_ci    ]
14817db96d56Sopenharmony_ci    failures = ['-x']
14827db96d56Sopenharmony_ci    successes = [
14837db96d56Sopenharmony_ci        ('', NS()),
14847db96d56Sopenharmony_ci        ('a', NS(foo='a')),
14857db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar=['b'])),
14867db96d56Sopenharmony_ci        ('--baz', NS(baz=True)),
14877db96d56Sopenharmony_ci        ('a --baz', NS(foo='a', baz=True)),
14887db96d56Sopenharmony_ci        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
14897db96d56Sopenharmony_ci    ]
14907db96d56Sopenharmony_ci
14917db96d56Sopenharmony_ci
14927db96d56Sopenharmony_ciclass TestParserDefaultSuppress(ParserTestCase):
14937db96d56Sopenharmony_ci    """Test actions with a parser-level default of SUPPRESS"""
14947db96d56Sopenharmony_ci
14957db96d56Sopenharmony_ci    parser_signature = Sig(argument_default=argparse.SUPPRESS)
14967db96d56Sopenharmony_ci    argument_signatures = [
14977db96d56Sopenharmony_ci        Sig('foo', nargs='?'),
14987db96d56Sopenharmony_ci        Sig('bar', nargs='*'),
14997db96d56Sopenharmony_ci        Sig('--baz', action='store_true'),
15007db96d56Sopenharmony_ci    ]
15017db96d56Sopenharmony_ci    failures = ['-x']
15027db96d56Sopenharmony_ci    successes = [
15037db96d56Sopenharmony_ci        ('', NS()),
15047db96d56Sopenharmony_ci        ('a', NS(foo='a')),
15057db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar=['b'])),
15067db96d56Sopenharmony_ci        ('--baz', NS(baz=True)),
15077db96d56Sopenharmony_ci        ('a --baz', NS(foo='a', baz=True)),
15087db96d56Sopenharmony_ci        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
15097db96d56Sopenharmony_ci    ]
15107db96d56Sopenharmony_ci
15117db96d56Sopenharmony_ci
15127db96d56Sopenharmony_ciclass TestParserDefault42(ParserTestCase):
15137db96d56Sopenharmony_ci    """Test actions with a parser-level default of 42"""
15147db96d56Sopenharmony_ci
15157db96d56Sopenharmony_ci    parser_signature = Sig(argument_default=42)
15167db96d56Sopenharmony_ci    argument_signatures = [
15177db96d56Sopenharmony_ci        Sig('--version', action='version', version='1.0'),
15187db96d56Sopenharmony_ci        Sig('foo', nargs='?'),
15197db96d56Sopenharmony_ci        Sig('bar', nargs='*'),
15207db96d56Sopenharmony_ci        Sig('--baz', action='store_true'),
15217db96d56Sopenharmony_ci    ]
15227db96d56Sopenharmony_ci    failures = ['-x']
15237db96d56Sopenharmony_ci    successes = [
15247db96d56Sopenharmony_ci        ('', NS(foo=42, bar=42, baz=42, version=42)),
15257db96d56Sopenharmony_ci        ('a', NS(foo='a', bar=42, baz=42, version=42)),
15267db96d56Sopenharmony_ci        ('a b', NS(foo='a', bar=['b'], baz=42, version=42)),
15277db96d56Sopenharmony_ci        ('--baz', NS(foo=42, bar=42, baz=True, version=42)),
15287db96d56Sopenharmony_ci        ('a --baz', NS(foo='a', bar=42, baz=True, version=42)),
15297db96d56Sopenharmony_ci        ('--baz a b', NS(foo='a', bar=['b'], baz=True, version=42)),
15307db96d56Sopenharmony_ci    ]
15317db96d56Sopenharmony_ci
15327db96d56Sopenharmony_ci
15337db96d56Sopenharmony_ciclass TestArgumentsFromFile(TempDirMixin, ParserTestCase):
15347db96d56Sopenharmony_ci    """Test reading arguments from a file"""
15357db96d56Sopenharmony_ci
15367db96d56Sopenharmony_ci    def setUp(self):
15377db96d56Sopenharmony_ci        super(TestArgumentsFromFile, self).setUp()
15387db96d56Sopenharmony_ci        file_texts = [
15397db96d56Sopenharmony_ci            ('hello', 'hello world!\n'),
15407db96d56Sopenharmony_ci            ('recursive', '-a\n'
15417db96d56Sopenharmony_ci                          'A\n'
15427db96d56Sopenharmony_ci                          '@hello'),
15437db96d56Sopenharmony_ci            ('invalid', '@no-such-path\n'),
15447db96d56Sopenharmony_ci        ]
15457db96d56Sopenharmony_ci        for path, text in file_texts:
15467db96d56Sopenharmony_ci            with open(path, 'w', encoding="utf-8") as file:
15477db96d56Sopenharmony_ci                file.write(text)
15487db96d56Sopenharmony_ci
15497db96d56Sopenharmony_ci    parser_signature = Sig(fromfile_prefix_chars='@')
15507db96d56Sopenharmony_ci    argument_signatures = [
15517db96d56Sopenharmony_ci        Sig('-a'),
15527db96d56Sopenharmony_ci        Sig('x'),
15537db96d56Sopenharmony_ci        Sig('y', nargs='+'),
15547db96d56Sopenharmony_ci    ]
15557db96d56Sopenharmony_ci    failures = ['', '-b', 'X', '@invalid', '@missing']
15567db96d56Sopenharmony_ci    successes = [
15577db96d56Sopenharmony_ci        ('X Y', NS(a=None, x='X', y=['Y'])),
15587db96d56Sopenharmony_ci        ('X -a A Y Z', NS(a='A', x='X', y=['Y', 'Z'])),
15597db96d56Sopenharmony_ci        ('@hello X', NS(a=None, x='hello world!', y=['X'])),
15607db96d56Sopenharmony_ci        ('X @hello', NS(a=None, x='X', y=['hello world!'])),
15617db96d56Sopenharmony_ci        ('-a B @recursive Y Z', NS(a='A', x='hello world!', y=['Y', 'Z'])),
15627db96d56Sopenharmony_ci        ('X @recursive Z -a B', NS(a='B', x='X', y=['hello world!', 'Z'])),
15637db96d56Sopenharmony_ci        (["-a", "", "X", "Y"], NS(a='', x='X', y=['Y'])),
15647db96d56Sopenharmony_ci    ]
15657db96d56Sopenharmony_ci
15667db96d56Sopenharmony_ci
15677db96d56Sopenharmony_ciclass TestArgumentsFromFileConverter(TempDirMixin, ParserTestCase):
15687db96d56Sopenharmony_ci    """Test reading arguments from a file"""
15697db96d56Sopenharmony_ci
15707db96d56Sopenharmony_ci    def setUp(self):
15717db96d56Sopenharmony_ci        super(TestArgumentsFromFileConverter, self).setUp()
15727db96d56Sopenharmony_ci        file_texts = [
15737db96d56Sopenharmony_ci            ('hello', 'hello world!\n'),
15747db96d56Sopenharmony_ci        ]
15757db96d56Sopenharmony_ci        for path, text in file_texts:
15767db96d56Sopenharmony_ci            with open(path, 'w', encoding="utf-8") as file:
15777db96d56Sopenharmony_ci                file.write(text)
15787db96d56Sopenharmony_ci
15797db96d56Sopenharmony_ci    class FromFileConverterArgumentParser(ErrorRaisingArgumentParser):
15807db96d56Sopenharmony_ci
15817db96d56Sopenharmony_ci        def convert_arg_line_to_args(self, arg_line):
15827db96d56Sopenharmony_ci            for arg in arg_line.split():
15837db96d56Sopenharmony_ci                if not arg.strip():
15847db96d56Sopenharmony_ci                    continue
15857db96d56Sopenharmony_ci                yield arg
15867db96d56Sopenharmony_ci    parser_class = FromFileConverterArgumentParser
15877db96d56Sopenharmony_ci    parser_signature = Sig(fromfile_prefix_chars='@')
15887db96d56Sopenharmony_ci    argument_signatures = [
15897db96d56Sopenharmony_ci        Sig('y', nargs='+'),
15907db96d56Sopenharmony_ci    ]
15917db96d56Sopenharmony_ci    failures = []
15927db96d56Sopenharmony_ci    successes = [
15937db96d56Sopenharmony_ci        ('@hello X', NS(y=['hello', 'world!', 'X'])),
15947db96d56Sopenharmony_ci    ]
15957db96d56Sopenharmony_ci
15967db96d56Sopenharmony_ci
15977db96d56Sopenharmony_ci# =====================
15987db96d56Sopenharmony_ci# Type conversion tests
15997db96d56Sopenharmony_ci# =====================
16007db96d56Sopenharmony_ci
16017db96d56Sopenharmony_ciclass TestFileTypeRepr(TestCase):
16027db96d56Sopenharmony_ci
16037db96d56Sopenharmony_ci    def test_r(self):
16047db96d56Sopenharmony_ci        type = argparse.FileType('r')
16057db96d56Sopenharmony_ci        self.assertEqual("FileType('r')", repr(type))
16067db96d56Sopenharmony_ci
16077db96d56Sopenharmony_ci    def test_wb_1(self):
16087db96d56Sopenharmony_ci        type = argparse.FileType('wb', 1)
16097db96d56Sopenharmony_ci        self.assertEqual("FileType('wb', 1)", repr(type))
16107db96d56Sopenharmony_ci
16117db96d56Sopenharmony_ci    def test_r_latin(self):
16127db96d56Sopenharmony_ci        type = argparse.FileType('r', encoding='latin_1')
16137db96d56Sopenharmony_ci        self.assertEqual("FileType('r', encoding='latin_1')", repr(type))
16147db96d56Sopenharmony_ci
16157db96d56Sopenharmony_ci    def test_w_big5_ignore(self):
16167db96d56Sopenharmony_ci        type = argparse.FileType('w', encoding='big5', errors='ignore')
16177db96d56Sopenharmony_ci        self.assertEqual("FileType('w', encoding='big5', errors='ignore')",
16187db96d56Sopenharmony_ci                         repr(type))
16197db96d56Sopenharmony_ci
16207db96d56Sopenharmony_ci    def test_r_1_replace(self):
16217db96d56Sopenharmony_ci        type = argparse.FileType('r', 1, errors='replace')
16227db96d56Sopenharmony_ci        self.assertEqual("FileType('r', 1, errors='replace')", repr(type))
16237db96d56Sopenharmony_ci
16247db96d56Sopenharmony_ci
16257db96d56Sopenharmony_ciBIN_STDOUT_SENTINEL = object()
16267db96d56Sopenharmony_ciBIN_STDERR_SENTINEL = object()
16277db96d56Sopenharmony_ci
16287db96d56Sopenharmony_ci
16297db96d56Sopenharmony_ciclass StdStreamComparer:
16307db96d56Sopenharmony_ci    def __init__(self, attr):
16317db96d56Sopenharmony_ci        # We try to use the actual stdXXX.buffer attribute as our
16327db96d56Sopenharmony_ci        # marker, but but under some test environments,
16337db96d56Sopenharmony_ci        # sys.stdout/err are replaced by io.StringIO which won't have .buffer,
16347db96d56Sopenharmony_ci        # so we use a sentinel simply to show that the tests do the right thing
16357db96d56Sopenharmony_ci        # for any buffer supporting object
16367db96d56Sopenharmony_ci        self.getattr = operator.attrgetter(attr)
16377db96d56Sopenharmony_ci        if attr == 'stdout.buffer':
16387db96d56Sopenharmony_ci            self.backupattr = BIN_STDOUT_SENTINEL
16397db96d56Sopenharmony_ci        elif attr == 'stderr.buffer':
16407db96d56Sopenharmony_ci            self.backupattr = BIN_STDERR_SENTINEL
16417db96d56Sopenharmony_ci        else:
16427db96d56Sopenharmony_ci            self.backupattr = object() # Not equal to anything
16437db96d56Sopenharmony_ci
16447db96d56Sopenharmony_ci    def __eq__(self, other):
16457db96d56Sopenharmony_ci        try:
16467db96d56Sopenharmony_ci            return other == self.getattr(sys)
16477db96d56Sopenharmony_ci        except AttributeError:
16487db96d56Sopenharmony_ci            return other == self.backupattr
16497db96d56Sopenharmony_ci
16507db96d56Sopenharmony_ci
16517db96d56Sopenharmony_cieq_stdin = StdStreamComparer('stdin')
16527db96d56Sopenharmony_cieq_stdout = StdStreamComparer('stdout')
16537db96d56Sopenharmony_cieq_stderr = StdStreamComparer('stderr')
16547db96d56Sopenharmony_cieq_bstdin = StdStreamComparer('stdin.buffer')
16557db96d56Sopenharmony_cieq_bstdout = StdStreamComparer('stdout.buffer')
16567db96d56Sopenharmony_cieq_bstderr = StdStreamComparer('stderr.buffer')
16577db96d56Sopenharmony_ci
16587db96d56Sopenharmony_ci
16597db96d56Sopenharmony_ciclass RFile(object):
16607db96d56Sopenharmony_ci    seen = {}
16617db96d56Sopenharmony_ci
16627db96d56Sopenharmony_ci    def __init__(self, name):
16637db96d56Sopenharmony_ci        self.name = name
16647db96d56Sopenharmony_ci
16657db96d56Sopenharmony_ci    def __eq__(self, other):
16667db96d56Sopenharmony_ci        if other in self.seen:
16677db96d56Sopenharmony_ci            text = self.seen[other]
16687db96d56Sopenharmony_ci        else:
16697db96d56Sopenharmony_ci            text = self.seen[other] = other.read()
16707db96d56Sopenharmony_ci            other.close()
16717db96d56Sopenharmony_ci        if not isinstance(text, str):
16727db96d56Sopenharmony_ci            text = text.decode('ascii')
16737db96d56Sopenharmony_ci        return self.name == other.name == text
16747db96d56Sopenharmony_ci
16757db96d56Sopenharmony_ci
16767db96d56Sopenharmony_ciclass TestFileTypeR(TempDirMixin, ParserTestCase):
16777db96d56Sopenharmony_ci    """Test the FileType option/argument type for reading files"""
16787db96d56Sopenharmony_ci
16797db96d56Sopenharmony_ci    def setUp(self):
16807db96d56Sopenharmony_ci        super(TestFileTypeR, self).setUp()
16817db96d56Sopenharmony_ci        for file_name in ['foo', 'bar']:
16827db96d56Sopenharmony_ci            with open(os.path.join(self.temp_dir, file_name),
16837db96d56Sopenharmony_ci                      'w', encoding="utf-8") as file:
16847db96d56Sopenharmony_ci                file.write(file_name)
16857db96d56Sopenharmony_ci        self.create_readonly_file('readonly')
16867db96d56Sopenharmony_ci
16877db96d56Sopenharmony_ci    argument_signatures = [
16887db96d56Sopenharmony_ci        Sig('-x', type=argparse.FileType()),
16897db96d56Sopenharmony_ci        Sig('spam', type=argparse.FileType('r')),
16907db96d56Sopenharmony_ci    ]
16917db96d56Sopenharmony_ci    failures = ['-x', '', 'non-existent-file.txt']
16927db96d56Sopenharmony_ci    successes = [
16937db96d56Sopenharmony_ci        ('foo', NS(x=None, spam=RFile('foo'))),
16947db96d56Sopenharmony_ci        ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
16957db96d56Sopenharmony_ci        ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
16967db96d56Sopenharmony_ci        ('-x - -', NS(x=eq_stdin, spam=eq_stdin)),
16977db96d56Sopenharmony_ci        ('readonly', NS(x=None, spam=RFile('readonly'))),
16987db96d56Sopenharmony_ci    ]
16997db96d56Sopenharmony_ci
17007db96d56Sopenharmony_ciclass TestFileTypeDefaults(TempDirMixin, ParserTestCase):
17017db96d56Sopenharmony_ci    """Test that a file is not created unless the default is needed"""
17027db96d56Sopenharmony_ci    def setUp(self):
17037db96d56Sopenharmony_ci        super(TestFileTypeDefaults, self).setUp()
17047db96d56Sopenharmony_ci        file = open(os.path.join(self.temp_dir, 'good'), 'w', encoding="utf-8")
17057db96d56Sopenharmony_ci        file.write('good')
17067db96d56Sopenharmony_ci        file.close()
17077db96d56Sopenharmony_ci
17087db96d56Sopenharmony_ci    argument_signatures = [
17097db96d56Sopenharmony_ci        Sig('-c', type=argparse.FileType('r'), default='no-file.txt'),
17107db96d56Sopenharmony_ci    ]
17117db96d56Sopenharmony_ci    # should provoke no such file error
17127db96d56Sopenharmony_ci    failures = ['']
17137db96d56Sopenharmony_ci    # should not provoke error because default file is created
17147db96d56Sopenharmony_ci    successes = [('-c good', NS(c=RFile('good')))]
17157db96d56Sopenharmony_ci
17167db96d56Sopenharmony_ci
17177db96d56Sopenharmony_ciclass TestFileTypeRB(TempDirMixin, ParserTestCase):
17187db96d56Sopenharmony_ci    """Test the FileType option/argument type for reading files"""
17197db96d56Sopenharmony_ci
17207db96d56Sopenharmony_ci    def setUp(self):
17217db96d56Sopenharmony_ci        super(TestFileTypeRB, self).setUp()
17227db96d56Sopenharmony_ci        for file_name in ['foo', 'bar']:
17237db96d56Sopenharmony_ci            with open(os.path.join(self.temp_dir, file_name),
17247db96d56Sopenharmony_ci                      'w', encoding="utf-8") as file:
17257db96d56Sopenharmony_ci                file.write(file_name)
17267db96d56Sopenharmony_ci
17277db96d56Sopenharmony_ci    argument_signatures = [
17287db96d56Sopenharmony_ci        Sig('-x', type=argparse.FileType('rb')),
17297db96d56Sopenharmony_ci        Sig('spam', type=argparse.FileType('rb')),
17307db96d56Sopenharmony_ci    ]
17317db96d56Sopenharmony_ci    failures = ['-x', '']
17327db96d56Sopenharmony_ci    successes = [
17337db96d56Sopenharmony_ci        ('foo', NS(x=None, spam=RFile('foo'))),
17347db96d56Sopenharmony_ci        ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
17357db96d56Sopenharmony_ci        ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
17367db96d56Sopenharmony_ci        ('-x - -', NS(x=eq_bstdin, spam=eq_bstdin)),
17377db96d56Sopenharmony_ci    ]
17387db96d56Sopenharmony_ci
17397db96d56Sopenharmony_ci
17407db96d56Sopenharmony_ciclass WFile(object):
17417db96d56Sopenharmony_ci    seen = set()
17427db96d56Sopenharmony_ci
17437db96d56Sopenharmony_ci    def __init__(self, name):
17447db96d56Sopenharmony_ci        self.name = name
17457db96d56Sopenharmony_ci
17467db96d56Sopenharmony_ci    def __eq__(self, other):
17477db96d56Sopenharmony_ci        if other not in self.seen:
17487db96d56Sopenharmony_ci            text = 'Check that file is writable.'
17497db96d56Sopenharmony_ci            if 'b' in other.mode:
17507db96d56Sopenharmony_ci                text = text.encode('ascii')
17517db96d56Sopenharmony_ci            other.write(text)
17527db96d56Sopenharmony_ci            other.close()
17537db96d56Sopenharmony_ci            self.seen.add(other)
17547db96d56Sopenharmony_ci        return self.name == other.name
17557db96d56Sopenharmony_ci
17567db96d56Sopenharmony_ci
17577db96d56Sopenharmony_ci@os_helper.skip_if_dac_override
17587db96d56Sopenharmony_ciclass TestFileTypeW(TempDirMixin, ParserTestCase):
17597db96d56Sopenharmony_ci    """Test the FileType option/argument type for writing files"""
17607db96d56Sopenharmony_ci
17617db96d56Sopenharmony_ci    def setUp(self):
17627db96d56Sopenharmony_ci        super().setUp()
17637db96d56Sopenharmony_ci        self.create_readonly_file('readonly')
17647db96d56Sopenharmony_ci        self.create_writable_file('writable')
17657db96d56Sopenharmony_ci
17667db96d56Sopenharmony_ci    argument_signatures = [
17677db96d56Sopenharmony_ci        Sig('-x', type=argparse.FileType('w')),
17687db96d56Sopenharmony_ci        Sig('spam', type=argparse.FileType('w')),
17697db96d56Sopenharmony_ci    ]
17707db96d56Sopenharmony_ci    failures = ['-x', '', 'readonly']
17717db96d56Sopenharmony_ci    successes = [
17727db96d56Sopenharmony_ci        ('foo', NS(x=None, spam=WFile('foo'))),
17737db96d56Sopenharmony_ci        ('writable', NS(x=None, spam=WFile('writable'))),
17747db96d56Sopenharmony_ci        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
17757db96d56Sopenharmony_ci        ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))),
17767db96d56Sopenharmony_ci        ('-x - -', NS(x=eq_stdout, spam=eq_stdout)),
17777db96d56Sopenharmony_ci    ]
17787db96d56Sopenharmony_ci
17797db96d56Sopenharmony_ci
17807db96d56Sopenharmony_ci@os_helper.skip_if_dac_override
17817db96d56Sopenharmony_ciclass TestFileTypeX(TempDirMixin, ParserTestCase):
17827db96d56Sopenharmony_ci    """Test the FileType option/argument type for writing new files only"""
17837db96d56Sopenharmony_ci
17847db96d56Sopenharmony_ci    def setUp(self):
17857db96d56Sopenharmony_ci        super().setUp()
17867db96d56Sopenharmony_ci        self.create_readonly_file('readonly')
17877db96d56Sopenharmony_ci        self.create_writable_file('writable')
17887db96d56Sopenharmony_ci
17897db96d56Sopenharmony_ci    argument_signatures = [
17907db96d56Sopenharmony_ci        Sig('-x', type=argparse.FileType('x')),
17917db96d56Sopenharmony_ci        Sig('spam', type=argparse.FileType('x')),
17927db96d56Sopenharmony_ci    ]
17937db96d56Sopenharmony_ci    failures = ['-x', '', 'readonly', 'writable']
17947db96d56Sopenharmony_ci    successes = [
17957db96d56Sopenharmony_ci        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
17967db96d56Sopenharmony_ci        ('-x - -', NS(x=eq_stdout, spam=eq_stdout)),
17977db96d56Sopenharmony_ci    ]
17987db96d56Sopenharmony_ci
17997db96d56Sopenharmony_ci
18007db96d56Sopenharmony_ci@os_helper.skip_if_dac_override
18017db96d56Sopenharmony_ciclass TestFileTypeWB(TempDirMixin, ParserTestCase):
18027db96d56Sopenharmony_ci    """Test the FileType option/argument type for writing binary files"""
18037db96d56Sopenharmony_ci
18047db96d56Sopenharmony_ci    argument_signatures = [
18057db96d56Sopenharmony_ci        Sig('-x', type=argparse.FileType('wb')),
18067db96d56Sopenharmony_ci        Sig('spam', type=argparse.FileType('wb')),
18077db96d56Sopenharmony_ci    ]
18087db96d56Sopenharmony_ci    failures = ['-x', '']
18097db96d56Sopenharmony_ci    successes = [
18107db96d56Sopenharmony_ci        ('foo', NS(x=None, spam=WFile('foo'))),
18117db96d56Sopenharmony_ci        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
18127db96d56Sopenharmony_ci        ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))),
18137db96d56Sopenharmony_ci        ('-x - -', NS(x=eq_bstdout, spam=eq_bstdout)),
18147db96d56Sopenharmony_ci    ]
18157db96d56Sopenharmony_ci
18167db96d56Sopenharmony_ci
18177db96d56Sopenharmony_ci@os_helper.skip_if_dac_override
18187db96d56Sopenharmony_ciclass TestFileTypeXB(TestFileTypeX):
18197db96d56Sopenharmony_ci    "Test the FileType option/argument type for writing new binary files only"
18207db96d56Sopenharmony_ci
18217db96d56Sopenharmony_ci    argument_signatures = [
18227db96d56Sopenharmony_ci        Sig('-x', type=argparse.FileType('xb')),
18237db96d56Sopenharmony_ci        Sig('spam', type=argparse.FileType('xb')),
18247db96d56Sopenharmony_ci    ]
18257db96d56Sopenharmony_ci    successes = [
18267db96d56Sopenharmony_ci        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
18277db96d56Sopenharmony_ci        ('-x - -', NS(x=eq_bstdout, spam=eq_bstdout)),
18287db96d56Sopenharmony_ci    ]
18297db96d56Sopenharmony_ci
18307db96d56Sopenharmony_ci
18317db96d56Sopenharmony_ciclass TestFileTypeOpenArgs(TestCase):
18327db96d56Sopenharmony_ci    """Test that open (the builtin) is correctly called"""
18337db96d56Sopenharmony_ci
18347db96d56Sopenharmony_ci    def test_open_args(self):
18357db96d56Sopenharmony_ci        FT = argparse.FileType
18367db96d56Sopenharmony_ci        cases = [
18377db96d56Sopenharmony_ci            (FT('rb'), ('rb', -1, None, None)),
18387db96d56Sopenharmony_ci            (FT('w', 1), ('w', 1, None, None)),
18397db96d56Sopenharmony_ci            (FT('w', errors='replace'), ('w', -1, None, 'replace')),
18407db96d56Sopenharmony_ci            (FT('wb', encoding='big5'), ('wb', -1, 'big5', None)),
18417db96d56Sopenharmony_ci            (FT('w', 0, 'l1', 'strict'), ('w', 0, 'l1', 'strict')),
18427db96d56Sopenharmony_ci        ]
18437db96d56Sopenharmony_ci        with mock.patch('builtins.open') as m:
18447db96d56Sopenharmony_ci            for type, args in cases:
18457db96d56Sopenharmony_ci                type('foo')
18467db96d56Sopenharmony_ci                m.assert_called_with('foo', *args)
18477db96d56Sopenharmony_ci
18487db96d56Sopenharmony_ci
18497db96d56Sopenharmony_ciclass TestFileTypeMissingInitialization(TestCase):
18507db96d56Sopenharmony_ci    """
18517db96d56Sopenharmony_ci    Test that add_argument throws an error if FileType class
18527db96d56Sopenharmony_ci    object was passed instead of instance of FileType
18537db96d56Sopenharmony_ci    """
18547db96d56Sopenharmony_ci
18557db96d56Sopenharmony_ci    def test(self):
18567db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
18577db96d56Sopenharmony_ci        with self.assertRaises(ValueError) as cm:
18587db96d56Sopenharmony_ci            parser.add_argument('-x', type=argparse.FileType)
18597db96d56Sopenharmony_ci
18607db96d56Sopenharmony_ci        self.assertEqual(
18617db96d56Sopenharmony_ci            '%r is a FileType class object, instance of it must be passed'
18627db96d56Sopenharmony_ci            % (argparse.FileType,),
18637db96d56Sopenharmony_ci            str(cm.exception)
18647db96d56Sopenharmony_ci        )
18657db96d56Sopenharmony_ci
18667db96d56Sopenharmony_ci
18677db96d56Sopenharmony_ciclass TestTypeCallable(ParserTestCase):
18687db96d56Sopenharmony_ci    """Test some callables as option/argument types"""
18697db96d56Sopenharmony_ci
18707db96d56Sopenharmony_ci    argument_signatures = [
18717db96d56Sopenharmony_ci        Sig('--eggs', type=complex),
18727db96d56Sopenharmony_ci        Sig('spam', type=float),
18737db96d56Sopenharmony_ci    ]
18747db96d56Sopenharmony_ci    failures = ['a', '42j', '--eggs a', '--eggs 2i']
18757db96d56Sopenharmony_ci    successes = [
18767db96d56Sopenharmony_ci        ('--eggs=42 42', NS(eggs=42, spam=42.0)),
18777db96d56Sopenharmony_ci        ('--eggs 2j -- -1.5', NS(eggs=2j, spam=-1.5)),
18787db96d56Sopenharmony_ci        ('1024.675', NS(eggs=None, spam=1024.675)),
18797db96d56Sopenharmony_ci    ]
18807db96d56Sopenharmony_ci
18817db96d56Sopenharmony_ci
18827db96d56Sopenharmony_ciclass TestTypeUserDefined(ParserTestCase):
18837db96d56Sopenharmony_ci    """Test a user-defined option/argument type"""
18847db96d56Sopenharmony_ci
18857db96d56Sopenharmony_ci    class MyType(TestCase):
18867db96d56Sopenharmony_ci
18877db96d56Sopenharmony_ci        def __init__(self, value):
18887db96d56Sopenharmony_ci            self.value = value
18897db96d56Sopenharmony_ci
18907db96d56Sopenharmony_ci        def __eq__(self, other):
18917db96d56Sopenharmony_ci            return (type(self), self.value) == (type(other), other.value)
18927db96d56Sopenharmony_ci
18937db96d56Sopenharmony_ci    argument_signatures = [
18947db96d56Sopenharmony_ci        Sig('-x', type=MyType),
18957db96d56Sopenharmony_ci        Sig('spam', type=MyType),
18967db96d56Sopenharmony_ci    ]
18977db96d56Sopenharmony_ci    failures = []
18987db96d56Sopenharmony_ci    successes = [
18997db96d56Sopenharmony_ci        ('a -x b', NS(x=MyType('b'), spam=MyType('a'))),
19007db96d56Sopenharmony_ci        ('-xf g', NS(x=MyType('f'), spam=MyType('g'))),
19017db96d56Sopenharmony_ci    ]
19027db96d56Sopenharmony_ci
19037db96d56Sopenharmony_ci
19047db96d56Sopenharmony_ciclass TestTypeClassicClass(ParserTestCase):
19057db96d56Sopenharmony_ci    """Test a classic class type"""
19067db96d56Sopenharmony_ci
19077db96d56Sopenharmony_ci    class C:
19087db96d56Sopenharmony_ci
19097db96d56Sopenharmony_ci        def __init__(self, value):
19107db96d56Sopenharmony_ci            self.value = value
19117db96d56Sopenharmony_ci
19127db96d56Sopenharmony_ci        def __eq__(self, other):
19137db96d56Sopenharmony_ci            return (type(self), self.value) == (type(other), other.value)
19147db96d56Sopenharmony_ci
19157db96d56Sopenharmony_ci    argument_signatures = [
19167db96d56Sopenharmony_ci        Sig('-x', type=C),
19177db96d56Sopenharmony_ci        Sig('spam', type=C),
19187db96d56Sopenharmony_ci    ]
19197db96d56Sopenharmony_ci    failures = []
19207db96d56Sopenharmony_ci    successes = [
19217db96d56Sopenharmony_ci        ('a -x b', NS(x=C('b'), spam=C('a'))),
19227db96d56Sopenharmony_ci        ('-xf g', NS(x=C('f'), spam=C('g'))),
19237db96d56Sopenharmony_ci    ]
19247db96d56Sopenharmony_ci
19257db96d56Sopenharmony_ci
19267db96d56Sopenharmony_ciclass TestTypeRegistration(TestCase):
19277db96d56Sopenharmony_ci    """Test a user-defined type by registering it"""
19287db96d56Sopenharmony_ci
19297db96d56Sopenharmony_ci    def test(self):
19307db96d56Sopenharmony_ci
19317db96d56Sopenharmony_ci        def get_my_type(string):
19327db96d56Sopenharmony_ci            return 'my_type{%s}' % string
19337db96d56Sopenharmony_ci
19347db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
19357db96d56Sopenharmony_ci        parser.register('type', 'my_type', get_my_type)
19367db96d56Sopenharmony_ci        parser.add_argument('-x', type='my_type')
19377db96d56Sopenharmony_ci        parser.add_argument('y', type='my_type')
19387db96d56Sopenharmony_ci
19397db96d56Sopenharmony_ci        self.assertEqual(parser.parse_args('1'.split()),
19407db96d56Sopenharmony_ci                         NS(x=None, y='my_type{1}'))
19417db96d56Sopenharmony_ci        self.assertEqual(parser.parse_args('-x 1 42'.split()),
19427db96d56Sopenharmony_ci                         NS(x='my_type{1}', y='my_type{42}'))
19437db96d56Sopenharmony_ci
19447db96d56Sopenharmony_ci
19457db96d56Sopenharmony_ci# ============
19467db96d56Sopenharmony_ci# Action tests
19477db96d56Sopenharmony_ci# ============
19487db96d56Sopenharmony_ci
19497db96d56Sopenharmony_ciclass TestActionUserDefined(ParserTestCase):
19507db96d56Sopenharmony_ci    """Test a user-defined option/argument action"""
19517db96d56Sopenharmony_ci
19527db96d56Sopenharmony_ci    class OptionalAction(argparse.Action):
19537db96d56Sopenharmony_ci
19547db96d56Sopenharmony_ci        def __call__(self, parser, namespace, value, option_string=None):
19557db96d56Sopenharmony_ci            try:
19567db96d56Sopenharmony_ci                # check destination and option string
19577db96d56Sopenharmony_ci                assert self.dest == 'spam', 'dest: %s' % self.dest
19587db96d56Sopenharmony_ci                assert option_string == '-s', 'flag: %s' % option_string
19597db96d56Sopenharmony_ci                # when option is before argument, badger=2, and when
19607db96d56Sopenharmony_ci                # option is after argument, badger=<whatever was set>
19617db96d56Sopenharmony_ci                expected_ns = NS(spam=0.25)
19627db96d56Sopenharmony_ci                if value in [0.125, 0.625]:
19637db96d56Sopenharmony_ci                    expected_ns.badger = 2
19647db96d56Sopenharmony_ci                elif value in [2.0]:
19657db96d56Sopenharmony_ci                    expected_ns.badger = 84
19667db96d56Sopenharmony_ci                else:
19677db96d56Sopenharmony_ci                    raise AssertionError('value: %s' % value)
19687db96d56Sopenharmony_ci                assert expected_ns == namespace, ('expected %s, got %s' %
19697db96d56Sopenharmony_ci                                                  (expected_ns, namespace))
19707db96d56Sopenharmony_ci            except AssertionError as e:
19717db96d56Sopenharmony_ci                raise ArgumentParserError('opt_action failed: %s' % e)
19727db96d56Sopenharmony_ci            setattr(namespace, 'spam', value)
19737db96d56Sopenharmony_ci
19747db96d56Sopenharmony_ci    class PositionalAction(argparse.Action):
19757db96d56Sopenharmony_ci
19767db96d56Sopenharmony_ci        def __call__(self, parser, namespace, value, option_string=None):
19777db96d56Sopenharmony_ci            try:
19787db96d56Sopenharmony_ci                assert option_string is None, ('option_string: %s' %
19797db96d56Sopenharmony_ci                                               option_string)
19807db96d56Sopenharmony_ci                # check destination
19817db96d56Sopenharmony_ci                assert self.dest == 'badger', 'dest: %s' % self.dest
19827db96d56Sopenharmony_ci                # when argument is before option, spam=0.25, and when
19837db96d56Sopenharmony_ci                # option is after argument, spam=<whatever was set>
19847db96d56Sopenharmony_ci                expected_ns = NS(badger=2)
19857db96d56Sopenharmony_ci                if value in [42, 84]:
19867db96d56Sopenharmony_ci                    expected_ns.spam = 0.25
19877db96d56Sopenharmony_ci                elif value in [1]:
19887db96d56Sopenharmony_ci                    expected_ns.spam = 0.625
19897db96d56Sopenharmony_ci                elif value in [2]:
19907db96d56Sopenharmony_ci                    expected_ns.spam = 0.125
19917db96d56Sopenharmony_ci                else:
19927db96d56Sopenharmony_ci                    raise AssertionError('value: %s' % value)
19937db96d56Sopenharmony_ci                assert expected_ns == namespace, ('expected %s, got %s' %
19947db96d56Sopenharmony_ci                                                  (expected_ns, namespace))
19957db96d56Sopenharmony_ci            except AssertionError as e:
19967db96d56Sopenharmony_ci                raise ArgumentParserError('arg_action failed: %s' % e)
19977db96d56Sopenharmony_ci            setattr(namespace, 'badger', value)
19987db96d56Sopenharmony_ci
19997db96d56Sopenharmony_ci    argument_signatures = [
20007db96d56Sopenharmony_ci        Sig('-s', dest='spam', action=OptionalAction,
20017db96d56Sopenharmony_ci            type=float, default=0.25),
20027db96d56Sopenharmony_ci        Sig('badger', action=PositionalAction,
20037db96d56Sopenharmony_ci            type=int, nargs='?', default=2),
20047db96d56Sopenharmony_ci    ]
20057db96d56Sopenharmony_ci    failures = []
20067db96d56Sopenharmony_ci    successes = [
20077db96d56Sopenharmony_ci        ('-s0.125', NS(spam=0.125, badger=2)),
20087db96d56Sopenharmony_ci        ('42', NS(spam=0.25, badger=42)),
20097db96d56Sopenharmony_ci        ('-s 0.625 1', NS(spam=0.625, badger=1)),
20107db96d56Sopenharmony_ci        ('84 -s2', NS(spam=2.0, badger=84)),
20117db96d56Sopenharmony_ci    ]
20127db96d56Sopenharmony_ci
20137db96d56Sopenharmony_ci
20147db96d56Sopenharmony_ciclass TestActionRegistration(TestCase):
20157db96d56Sopenharmony_ci    """Test a user-defined action supplied by registering it"""
20167db96d56Sopenharmony_ci
20177db96d56Sopenharmony_ci    class MyAction(argparse.Action):
20187db96d56Sopenharmony_ci
20197db96d56Sopenharmony_ci        def __call__(self, parser, namespace, values, option_string=None):
20207db96d56Sopenharmony_ci            setattr(namespace, self.dest, 'foo[%s]' % values)
20217db96d56Sopenharmony_ci
20227db96d56Sopenharmony_ci    def test(self):
20237db96d56Sopenharmony_ci
20247db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
20257db96d56Sopenharmony_ci        parser.register('action', 'my_action', self.MyAction)
20267db96d56Sopenharmony_ci        parser.add_argument('badger', action='my_action')
20277db96d56Sopenharmony_ci
20287db96d56Sopenharmony_ci        self.assertEqual(parser.parse_args(['1']), NS(badger='foo[1]'))
20297db96d56Sopenharmony_ci        self.assertEqual(parser.parse_args(['42']), NS(badger='foo[42]'))
20307db96d56Sopenharmony_ci
20317db96d56Sopenharmony_ci
20327db96d56Sopenharmony_ciclass TestActionExtend(ParserTestCase):
20337db96d56Sopenharmony_ci    argument_signatures = [
20347db96d56Sopenharmony_ci        Sig('--foo', action="extend", nargs="+", type=str),
20357db96d56Sopenharmony_ci    ]
20367db96d56Sopenharmony_ci    failures = ()
20377db96d56Sopenharmony_ci    successes = [
20387db96d56Sopenharmony_ci        ('--foo f1 --foo f2 f3 f4', NS(foo=['f1', 'f2', 'f3', 'f4'])),
20397db96d56Sopenharmony_ci    ]
20407db96d56Sopenharmony_ci
20417db96d56Sopenharmony_ci# ================
20427db96d56Sopenharmony_ci# Subparsers tests
20437db96d56Sopenharmony_ci# ================
20447db96d56Sopenharmony_ci
20457db96d56Sopenharmony_ciclass TestAddSubparsers(TestCase):
20467db96d56Sopenharmony_ci    """Test the add_subparsers method"""
20477db96d56Sopenharmony_ci
20487db96d56Sopenharmony_ci    def assertArgumentParserError(self, *args, **kwargs):
20497db96d56Sopenharmony_ci        self.assertRaises(ArgumentParserError, *args, **kwargs)
20507db96d56Sopenharmony_ci
20517db96d56Sopenharmony_ci    def _get_parser(self, subparser_help=False, prefix_chars=None,
20527db96d56Sopenharmony_ci                    aliases=False):
20537db96d56Sopenharmony_ci        # create a parser with a subparsers argument
20547db96d56Sopenharmony_ci        if prefix_chars:
20557db96d56Sopenharmony_ci            parser = ErrorRaisingArgumentParser(
20567db96d56Sopenharmony_ci                prog='PROG', description='main description', prefix_chars=prefix_chars)
20577db96d56Sopenharmony_ci            parser.add_argument(
20587db96d56Sopenharmony_ci                prefix_chars[0] * 2 + 'foo', action='store_true', help='foo help')
20597db96d56Sopenharmony_ci        else:
20607db96d56Sopenharmony_ci            parser = ErrorRaisingArgumentParser(
20617db96d56Sopenharmony_ci                prog='PROG', description='main description')
20627db96d56Sopenharmony_ci            parser.add_argument(
20637db96d56Sopenharmony_ci                '--foo', action='store_true', help='foo help')
20647db96d56Sopenharmony_ci        parser.add_argument(
20657db96d56Sopenharmony_ci            'bar', type=float, help='bar help')
20667db96d56Sopenharmony_ci
20677db96d56Sopenharmony_ci        # check that only one subparsers argument can be added
20687db96d56Sopenharmony_ci        subparsers_kwargs = {'required': False}
20697db96d56Sopenharmony_ci        if aliases:
20707db96d56Sopenharmony_ci            subparsers_kwargs['metavar'] = 'COMMAND'
20717db96d56Sopenharmony_ci            subparsers_kwargs['title'] = 'commands'
20727db96d56Sopenharmony_ci        else:
20737db96d56Sopenharmony_ci            subparsers_kwargs['help'] = 'command help'
20747db96d56Sopenharmony_ci        subparsers = parser.add_subparsers(**subparsers_kwargs)
20757db96d56Sopenharmony_ci        self.assertArgumentParserError(parser.add_subparsers)
20767db96d56Sopenharmony_ci
20777db96d56Sopenharmony_ci        # add first sub-parser
20787db96d56Sopenharmony_ci        parser1_kwargs = dict(description='1 description')
20797db96d56Sopenharmony_ci        if subparser_help:
20807db96d56Sopenharmony_ci            parser1_kwargs['help'] = '1 help'
20817db96d56Sopenharmony_ci        if aliases:
20827db96d56Sopenharmony_ci            parser1_kwargs['aliases'] = ['1alias1', '1alias2']
20837db96d56Sopenharmony_ci        parser1 = subparsers.add_parser('1', **parser1_kwargs)
20847db96d56Sopenharmony_ci        parser1.add_argument('-w', type=int, help='w help')
20857db96d56Sopenharmony_ci        parser1.add_argument('x', choices='abc', help='x help')
20867db96d56Sopenharmony_ci
20877db96d56Sopenharmony_ci        # add second sub-parser
20887db96d56Sopenharmony_ci        parser2_kwargs = dict(description='2 description')
20897db96d56Sopenharmony_ci        if subparser_help:
20907db96d56Sopenharmony_ci            parser2_kwargs['help'] = '2 help'
20917db96d56Sopenharmony_ci        parser2 = subparsers.add_parser('2', **parser2_kwargs)
20927db96d56Sopenharmony_ci        parser2.add_argument('-y', choices='123', help='y help')
20937db96d56Sopenharmony_ci        parser2.add_argument('z', type=complex, nargs='*', help='z help')
20947db96d56Sopenharmony_ci
20957db96d56Sopenharmony_ci        # add third sub-parser
20967db96d56Sopenharmony_ci        parser3_kwargs = dict(description='3 description')
20977db96d56Sopenharmony_ci        if subparser_help:
20987db96d56Sopenharmony_ci            parser3_kwargs['help'] = '3 help'
20997db96d56Sopenharmony_ci        parser3 = subparsers.add_parser('3', **parser3_kwargs)
21007db96d56Sopenharmony_ci        parser3.add_argument('t', type=int, help='t help')
21017db96d56Sopenharmony_ci        parser3.add_argument('u', nargs='...', help='u help')
21027db96d56Sopenharmony_ci
21037db96d56Sopenharmony_ci        # return the main parser
21047db96d56Sopenharmony_ci        return parser
21057db96d56Sopenharmony_ci
21067db96d56Sopenharmony_ci    def setUp(self):
21077db96d56Sopenharmony_ci        super().setUp()
21087db96d56Sopenharmony_ci        self.parser = self._get_parser()
21097db96d56Sopenharmony_ci        self.command_help_parser = self._get_parser(subparser_help=True)
21107db96d56Sopenharmony_ci
21117db96d56Sopenharmony_ci    def test_parse_args_failures(self):
21127db96d56Sopenharmony_ci        # check some failure cases:
21137db96d56Sopenharmony_ci        for args_str in ['', 'a', 'a a', '0.5 a', '0.5 1',
21147db96d56Sopenharmony_ci                         '0.5 1 -y', '0.5 2 -w']:
21157db96d56Sopenharmony_ci            args = args_str.split()
21167db96d56Sopenharmony_ci            self.assertArgumentParserError(self.parser.parse_args, args)
21177db96d56Sopenharmony_ci
21187db96d56Sopenharmony_ci    def test_parse_args(self):
21197db96d56Sopenharmony_ci        # check some non-failure cases:
21207db96d56Sopenharmony_ci        self.assertEqual(
21217db96d56Sopenharmony_ci            self.parser.parse_args('0.5 1 b -w 7'.split()),
21227db96d56Sopenharmony_ci            NS(foo=False, bar=0.5, w=7, x='b'),
21237db96d56Sopenharmony_ci        )
21247db96d56Sopenharmony_ci        self.assertEqual(
21257db96d56Sopenharmony_ci            self.parser.parse_args('0.25 --foo 2 -y 2 3j -- -1j'.split()),
21267db96d56Sopenharmony_ci            NS(foo=True, bar=0.25, y='2', z=[3j, -1j]),
21277db96d56Sopenharmony_ci        )
21287db96d56Sopenharmony_ci        self.assertEqual(
21297db96d56Sopenharmony_ci            self.parser.parse_args('--foo 0.125 1 c'.split()),
21307db96d56Sopenharmony_ci            NS(foo=True, bar=0.125, w=None, x='c'),
21317db96d56Sopenharmony_ci        )
21327db96d56Sopenharmony_ci        self.assertEqual(
21337db96d56Sopenharmony_ci            self.parser.parse_args('-1.5 3 11 -- a --foo 7 -- b'.split()),
21347db96d56Sopenharmony_ci            NS(foo=False, bar=-1.5, t=11, u=['a', '--foo', '7', '--', 'b']),
21357db96d56Sopenharmony_ci        )
21367db96d56Sopenharmony_ci
21377db96d56Sopenharmony_ci    def test_parse_known_args(self):
21387db96d56Sopenharmony_ci        self.assertEqual(
21397db96d56Sopenharmony_ci            self.parser.parse_known_args('0.5 1 b -w 7'.split()),
21407db96d56Sopenharmony_ci            (NS(foo=False, bar=0.5, w=7, x='b'), []),
21417db96d56Sopenharmony_ci        )
21427db96d56Sopenharmony_ci        self.assertEqual(
21437db96d56Sopenharmony_ci            self.parser.parse_known_args('0.5 -p 1 b -w 7'.split()),
21447db96d56Sopenharmony_ci            (NS(foo=False, bar=0.5, w=7, x='b'), ['-p']),
21457db96d56Sopenharmony_ci        )
21467db96d56Sopenharmony_ci        self.assertEqual(
21477db96d56Sopenharmony_ci            self.parser.parse_known_args('0.5 1 b -w 7 -p'.split()),
21487db96d56Sopenharmony_ci            (NS(foo=False, bar=0.5, w=7, x='b'), ['-p']),
21497db96d56Sopenharmony_ci        )
21507db96d56Sopenharmony_ci        self.assertEqual(
21517db96d56Sopenharmony_ci            self.parser.parse_known_args('0.5 1 b -q -rs -w 7'.split()),
21527db96d56Sopenharmony_ci            (NS(foo=False, bar=0.5, w=7, x='b'), ['-q', '-rs']),
21537db96d56Sopenharmony_ci        )
21547db96d56Sopenharmony_ci        self.assertEqual(
21557db96d56Sopenharmony_ci            self.parser.parse_known_args('0.5 -W 1 b -X Y -w 7 Z'.split()),
21567db96d56Sopenharmony_ci            (NS(foo=False, bar=0.5, w=7, x='b'), ['-W', '-X', 'Y', 'Z']),
21577db96d56Sopenharmony_ci        )
21587db96d56Sopenharmony_ci
21597db96d56Sopenharmony_ci    def test_dest(self):
21607db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
21617db96d56Sopenharmony_ci        parser.add_argument('--foo', action='store_true')
21627db96d56Sopenharmony_ci        subparsers = parser.add_subparsers(dest='bar')
21637db96d56Sopenharmony_ci        parser1 = subparsers.add_parser('1')
21647db96d56Sopenharmony_ci        parser1.add_argument('baz')
21657db96d56Sopenharmony_ci        self.assertEqual(NS(foo=False, bar='1', baz='2'),
21667db96d56Sopenharmony_ci                         parser.parse_args('1 2'.split()))
21677db96d56Sopenharmony_ci
21687db96d56Sopenharmony_ci    def _test_required_subparsers(self, parser):
21697db96d56Sopenharmony_ci        # Should parse the sub command
21707db96d56Sopenharmony_ci        ret = parser.parse_args(['run'])
21717db96d56Sopenharmony_ci        self.assertEqual(ret.command, 'run')
21727db96d56Sopenharmony_ci
21737db96d56Sopenharmony_ci        # Error when the command is missing
21747db96d56Sopenharmony_ci        self.assertArgumentParserError(parser.parse_args, ())
21757db96d56Sopenharmony_ci
21767db96d56Sopenharmony_ci    def test_required_subparsers_via_attribute(self):
21777db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
21787db96d56Sopenharmony_ci        subparsers = parser.add_subparsers(dest='command')
21797db96d56Sopenharmony_ci        subparsers.required = True
21807db96d56Sopenharmony_ci        subparsers.add_parser('run')
21817db96d56Sopenharmony_ci        self._test_required_subparsers(parser)
21827db96d56Sopenharmony_ci
21837db96d56Sopenharmony_ci    def test_required_subparsers_via_kwarg(self):
21847db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
21857db96d56Sopenharmony_ci        subparsers = parser.add_subparsers(dest='command', required=True)
21867db96d56Sopenharmony_ci        subparsers.add_parser('run')
21877db96d56Sopenharmony_ci        self._test_required_subparsers(parser)
21887db96d56Sopenharmony_ci
21897db96d56Sopenharmony_ci    def test_required_subparsers_default(self):
21907db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
21917db96d56Sopenharmony_ci        subparsers = parser.add_subparsers(dest='command')
21927db96d56Sopenharmony_ci        subparsers.add_parser('run')
21937db96d56Sopenharmony_ci        # No error here
21947db96d56Sopenharmony_ci        ret = parser.parse_args(())
21957db96d56Sopenharmony_ci        self.assertIsNone(ret.command)
21967db96d56Sopenharmony_ci
21977db96d56Sopenharmony_ci    def test_required_subparsers_no_destination_error(self):
21987db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
21997db96d56Sopenharmony_ci        subparsers = parser.add_subparsers(required=True)
22007db96d56Sopenharmony_ci        subparsers.add_parser('foo')
22017db96d56Sopenharmony_ci        subparsers.add_parser('bar')
22027db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as excinfo:
22037db96d56Sopenharmony_ci            parser.parse_args(())
22047db96d56Sopenharmony_ci        self.assertRegex(
22057db96d56Sopenharmony_ci            excinfo.exception.stderr,
22067db96d56Sopenharmony_ci            'error: the following arguments are required: {foo,bar}\n$'
22077db96d56Sopenharmony_ci        )
22087db96d56Sopenharmony_ci
22097db96d56Sopenharmony_ci    def test_wrong_argument_subparsers_no_destination_error(self):
22107db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
22117db96d56Sopenharmony_ci        subparsers = parser.add_subparsers(required=True)
22127db96d56Sopenharmony_ci        subparsers.add_parser('foo')
22137db96d56Sopenharmony_ci        subparsers.add_parser('bar')
22147db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as excinfo:
22157db96d56Sopenharmony_ci            parser.parse_args(('baz',))
22167db96d56Sopenharmony_ci        self.assertRegex(
22177db96d56Sopenharmony_ci            excinfo.exception.stderr,
22187db96d56Sopenharmony_ci            r"error: argument {foo,bar}: invalid choice: 'baz' \(choose from 'foo', 'bar'\)\n$"
22197db96d56Sopenharmony_ci        )
22207db96d56Sopenharmony_ci
22217db96d56Sopenharmony_ci    def test_optional_subparsers(self):
22227db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
22237db96d56Sopenharmony_ci        subparsers = parser.add_subparsers(dest='command', required=False)
22247db96d56Sopenharmony_ci        subparsers.add_parser('run')
22257db96d56Sopenharmony_ci        # No error here
22267db96d56Sopenharmony_ci        ret = parser.parse_args(())
22277db96d56Sopenharmony_ci        self.assertIsNone(ret.command)
22287db96d56Sopenharmony_ci
22297db96d56Sopenharmony_ci    def test_help(self):
22307db96d56Sopenharmony_ci        self.assertEqual(self.parser.format_usage(),
22317db96d56Sopenharmony_ci                         'usage: PROG [-h] [--foo] bar {1,2,3} ...\n')
22327db96d56Sopenharmony_ci        self.assertEqual(self.parser.format_help(), textwrap.dedent('''\
22337db96d56Sopenharmony_ci            usage: PROG [-h] [--foo] bar {1,2,3} ...
22347db96d56Sopenharmony_ci
22357db96d56Sopenharmony_ci            main description
22367db96d56Sopenharmony_ci
22377db96d56Sopenharmony_ci            positional arguments:
22387db96d56Sopenharmony_ci              bar         bar help
22397db96d56Sopenharmony_ci              {1,2,3}     command help
22407db96d56Sopenharmony_ci
22417db96d56Sopenharmony_ci            options:
22427db96d56Sopenharmony_ci              -h, --help  show this help message and exit
22437db96d56Sopenharmony_ci              --foo       foo help
22447db96d56Sopenharmony_ci            '''))
22457db96d56Sopenharmony_ci
22467db96d56Sopenharmony_ci    def test_help_extra_prefix_chars(self):
22477db96d56Sopenharmony_ci        # Make sure - is still used for help if it is a non-first prefix char
22487db96d56Sopenharmony_ci        parser = self._get_parser(prefix_chars='+:-')
22497db96d56Sopenharmony_ci        self.assertEqual(parser.format_usage(),
22507db96d56Sopenharmony_ci                         'usage: PROG [-h] [++foo] bar {1,2,3} ...\n')
22517db96d56Sopenharmony_ci        self.assertEqual(parser.format_help(), textwrap.dedent('''\
22527db96d56Sopenharmony_ci            usage: PROG [-h] [++foo] bar {1,2,3} ...
22537db96d56Sopenharmony_ci
22547db96d56Sopenharmony_ci            main description
22557db96d56Sopenharmony_ci
22567db96d56Sopenharmony_ci            positional arguments:
22577db96d56Sopenharmony_ci              bar         bar help
22587db96d56Sopenharmony_ci              {1,2,3}     command help
22597db96d56Sopenharmony_ci
22607db96d56Sopenharmony_ci            options:
22617db96d56Sopenharmony_ci              -h, --help  show this help message and exit
22627db96d56Sopenharmony_ci              ++foo       foo help
22637db96d56Sopenharmony_ci            '''))
22647db96d56Sopenharmony_ci
22657db96d56Sopenharmony_ci    def test_help_non_breaking_spaces(self):
22667db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(
22677db96d56Sopenharmony_ci            prog='PROG', description='main description')
22687db96d56Sopenharmony_ci        parser.add_argument(
22697db96d56Sopenharmony_ci            "--non-breaking", action='store_false',
22707db96d56Sopenharmony_ci            help='help message containing non-breaking spaces shall not '
22717db96d56Sopenharmony_ci            'wrap\N{NO-BREAK SPACE}at non-breaking spaces')
22727db96d56Sopenharmony_ci        self.assertEqual(parser.format_help(), textwrap.dedent('''\
22737db96d56Sopenharmony_ci            usage: PROG [-h] [--non-breaking]
22747db96d56Sopenharmony_ci
22757db96d56Sopenharmony_ci            main description
22767db96d56Sopenharmony_ci
22777db96d56Sopenharmony_ci            options:
22787db96d56Sopenharmony_ci              -h, --help      show this help message and exit
22797db96d56Sopenharmony_ci              --non-breaking  help message containing non-breaking spaces shall not
22807db96d56Sopenharmony_ci                              wrap\N{NO-BREAK SPACE}at non-breaking spaces
22817db96d56Sopenharmony_ci        '''))
22827db96d56Sopenharmony_ci
22837db96d56Sopenharmony_ci    def test_help_blank(self):
22847db96d56Sopenharmony_ci        # Issue 24444
22857db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(
22867db96d56Sopenharmony_ci            prog='PROG', description='main description')
22877db96d56Sopenharmony_ci        parser.add_argument(
22887db96d56Sopenharmony_ci            'foo',
22897db96d56Sopenharmony_ci            help='    ')
22907db96d56Sopenharmony_ci        self.assertEqual(parser.format_help(), textwrap.dedent('''\
22917db96d56Sopenharmony_ci            usage: PROG [-h] foo
22927db96d56Sopenharmony_ci
22937db96d56Sopenharmony_ci            main description
22947db96d56Sopenharmony_ci
22957db96d56Sopenharmony_ci            positional arguments:
22967db96d56Sopenharmony_ci              foo         \n
22977db96d56Sopenharmony_ci            options:
22987db96d56Sopenharmony_ci              -h, --help  show this help message and exit
22997db96d56Sopenharmony_ci        '''))
23007db96d56Sopenharmony_ci
23017db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(
23027db96d56Sopenharmony_ci            prog='PROG', description='main description')
23037db96d56Sopenharmony_ci        parser.add_argument(
23047db96d56Sopenharmony_ci            'foo', choices=[],
23057db96d56Sopenharmony_ci            help='%(choices)s')
23067db96d56Sopenharmony_ci        self.assertEqual(parser.format_help(), textwrap.dedent('''\
23077db96d56Sopenharmony_ci            usage: PROG [-h] {}
23087db96d56Sopenharmony_ci
23097db96d56Sopenharmony_ci            main description
23107db96d56Sopenharmony_ci
23117db96d56Sopenharmony_ci            positional arguments:
23127db96d56Sopenharmony_ci              {}          \n
23137db96d56Sopenharmony_ci            options:
23147db96d56Sopenharmony_ci              -h, --help  show this help message and exit
23157db96d56Sopenharmony_ci        '''))
23167db96d56Sopenharmony_ci
23177db96d56Sopenharmony_ci    def test_help_alternate_prefix_chars(self):
23187db96d56Sopenharmony_ci        parser = self._get_parser(prefix_chars='+:/')
23197db96d56Sopenharmony_ci        self.assertEqual(parser.format_usage(),
23207db96d56Sopenharmony_ci                         'usage: PROG [+h] [++foo] bar {1,2,3} ...\n')
23217db96d56Sopenharmony_ci        self.assertEqual(parser.format_help(), textwrap.dedent('''\
23227db96d56Sopenharmony_ci            usage: PROG [+h] [++foo] bar {1,2,3} ...
23237db96d56Sopenharmony_ci
23247db96d56Sopenharmony_ci            main description
23257db96d56Sopenharmony_ci
23267db96d56Sopenharmony_ci            positional arguments:
23277db96d56Sopenharmony_ci              bar         bar help
23287db96d56Sopenharmony_ci              {1,2,3}     command help
23297db96d56Sopenharmony_ci
23307db96d56Sopenharmony_ci            options:
23317db96d56Sopenharmony_ci              +h, ++help  show this help message and exit
23327db96d56Sopenharmony_ci              ++foo       foo help
23337db96d56Sopenharmony_ci            '''))
23347db96d56Sopenharmony_ci
23357db96d56Sopenharmony_ci    def test_parser_command_help(self):
23367db96d56Sopenharmony_ci        self.assertEqual(self.command_help_parser.format_usage(),
23377db96d56Sopenharmony_ci                         'usage: PROG [-h] [--foo] bar {1,2,3} ...\n')
23387db96d56Sopenharmony_ci        self.assertEqual(self.command_help_parser.format_help(),
23397db96d56Sopenharmony_ci                         textwrap.dedent('''\
23407db96d56Sopenharmony_ci            usage: PROG [-h] [--foo] bar {1,2,3} ...
23417db96d56Sopenharmony_ci
23427db96d56Sopenharmony_ci            main description
23437db96d56Sopenharmony_ci
23447db96d56Sopenharmony_ci            positional arguments:
23457db96d56Sopenharmony_ci              bar         bar help
23467db96d56Sopenharmony_ci              {1,2,3}     command help
23477db96d56Sopenharmony_ci                1         1 help
23487db96d56Sopenharmony_ci                2         2 help
23497db96d56Sopenharmony_ci                3         3 help
23507db96d56Sopenharmony_ci
23517db96d56Sopenharmony_ci            options:
23527db96d56Sopenharmony_ci              -h, --help  show this help message and exit
23537db96d56Sopenharmony_ci              --foo       foo help
23547db96d56Sopenharmony_ci            '''))
23557db96d56Sopenharmony_ci
23567db96d56Sopenharmony_ci    def test_subparser_title_help(self):
23577db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG',
23587db96d56Sopenharmony_ci                                            description='main description')
23597db96d56Sopenharmony_ci        parser.add_argument('--foo', action='store_true', help='foo help')
23607db96d56Sopenharmony_ci        parser.add_argument('bar', help='bar help')
23617db96d56Sopenharmony_ci        subparsers = parser.add_subparsers(title='subcommands',
23627db96d56Sopenharmony_ci                                           description='command help',
23637db96d56Sopenharmony_ci                                           help='additional text')
23647db96d56Sopenharmony_ci        parser1 = subparsers.add_parser('1')
23657db96d56Sopenharmony_ci        parser2 = subparsers.add_parser('2')
23667db96d56Sopenharmony_ci        self.assertEqual(parser.format_usage(),
23677db96d56Sopenharmony_ci                         'usage: PROG [-h] [--foo] bar {1,2} ...\n')
23687db96d56Sopenharmony_ci        self.assertEqual(parser.format_help(), textwrap.dedent('''\
23697db96d56Sopenharmony_ci            usage: PROG [-h] [--foo] bar {1,2} ...
23707db96d56Sopenharmony_ci
23717db96d56Sopenharmony_ci            main description
23727db96d56Sopenharmony_ci
23737db96d56Sopenharmony_ci            positional arguments:
23747db96d56Sopenharmony_ci              bar         bar help
23757db96d56Sopenharmony_ci
23767db96d56Sopenharmony_ci            options:
23777db96d56Sopenharmony_ci              -h, --help  show this help message and exit
23787db96d56Sopenharmony_ci              --foo       foo help
23797db96d56Sopenharmony_ci
23807db96d56Sopenharmony_ci            subcommands:
23817db96d56Sopenharmony_ci              command help
23827db96d56Sopenharmony_ci
23837db96d56Sopenharmony_ci              {1,2}       additional text
23847db96d56Sopenharmony_ci            '''))
23857db96d56Sopenharmony_ci
23867db96d56Sopenharmony_ci    def _test_subparser_help(self, args_str, expected_help):
23877db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
23887db96d56Sopenharmony_ci            self.parser.parse_args(args_str.split())
23897db96d56Sopenharmony_ci        self.assertEqual(expected_help, cm.exception.stdout)
23907db96d56Sopenharmony_ci
23917db96d56Sopenharmony_ci    def test_subparser1_help(self):
23927db96d56Sopenharmony_ci        self._test_subparser_help('5.0 1 -h', textwrap.dedent('''\
23937db96d56Sopenharmony_ci            usage: PROG bar 1 [-h] [-w W] {a,b,c}
23947db96d56Sopenharmony_ci
23957db96d56Sopenharmony_ci            1 description
23967db96d56Sopenharmony_ci
23977db96d56Sopenharmony_ci            positional arguments:
23987db96d56Sopenharmony_ci              {a,b,c}     x help
23997db96d56Sopenharmony_ci
24007db96d56Sopenharmony_ci            options:
24017db96d56Sopenharmony_ci              -h, --help  show this help message and exit
24027db96d56Sopenharmony_ci              -w W        w help
24037db96d56Sopenharmony_ci            '''))
24047db96d56Sopenharmony_ci
24057db96d56Sopenharmony_ci    def test_subparser2_help(self):
24067db96d56Sopenharmony_ci        self._test_subparser_help('5.0 2 -h', textwrap.dedent('''\
24077db96d56Sopenharmony_ci            usage: PROG bar 2 [-h] [-y {1,2,3}] [z ...]
24087db96d56Sopenharmony_ci
24097db96d56Sopenharmony_ci            2 description
24107db96d56Sopenharmony_ci
24117db96d56Sopenharmony_ci            positional arguments:
24127db96d56Sopenharmony_ci              z           z help
24137db96d56Sopenharmony_ci
24147db96d56Sopenharmony_ci            options:
24157db96d56Sopenharmony_ci              -h, --help  show this help message and exit
24167db96d56Sopenharmony_ci              -y {1,2,3}  y help
24177db96d56Sopenharmony_ci            '''))
24187db96d56Sopenharmony_ci
24197db96d56Sopenharmony_ci    def test_alias_invocation(self):
24207db96d56Sopenharmony_ci        parser = self._get_parser(aliases=True)
24217db96d56Sopenharmony_ci        self.assertEqual(
24227db96d56Sopenharmony_ci            parser.parse_known_args('0.5 1alias1 b'.split()),
24237db96d56Sopenharmony_ci            (NS(foo=False, bar=0.5, w=None, x='b'), []),
24247db96d56Sopenharmony_ci        )
24257db96d56Sopenharmony_ci        self.assertEqual(
24267db96d56Sopenharmony_ci            parser.parse_known_args('0.5 1alias2 b'.split()),
24277db96d56Sopenharmony_ci            (NS(foo=False, bar=0.5, w=None, x='b'), []),
24287db96d56Sopenharmony_ci        )
24297db96d56Sopenharmony_ci
24307db96d56Sopenharmony_ci    def test_error_alias_invocation(self):
24317db96d56Sopenharmony_ci        parser = self._get_parser(aliases=True)
24327db96d56Sopenharmony_ci        self.assertArgumentParserError(parser.parse_args,
24337db96d56Sopenharmony_ci                                       '0.5 1alias3 b'.split())
24347db96d56Sopenharmony_ci
24357db96d56Sopenharmony_ci    def test_alias_help(self):
24367db96d56Sopenharmony_ci        parser = self._get_parser(aliases=True, subparser_help=True)
24377db96d56Sopenharmony_ci        self.maxDiff = None
24387db96d56Sopenharmony_ci        self.assertEqual(parser.format_help(), textwrap.dedent("""\
24397db96d56Sopenharmony_ci            usage: PROG [-h] [--foo] bar COMMAND ...
24407db96d56Sopenharmony_ci
24417db96d56Sopenharmony_ci            main description
24427db96d56Sopenharmony_ci
24437db96d56Sopenharmony_ci            positional arguments:
24447db96d56Sopenharmony_ci              bar                   bar help
24457db96d56Sopenharmony_ci
24467db96d56Sopenharmony_ci            options:
24477db96d56Sopenharmony_ci              -h, --help            show this help message and exit
24487db96d56Sopenharmony_ci              --foo                 foo help
24497db96d56Sopenharmony_ci
24507db96d56Sopenharmony_ci            commands:
24517db96d56Sopenharmony_ci              COMMAND
24527db96d56Sopenharmony_ci                1 (1alias1, 1alias2)
24537db96d56Sopenharmony_ci                                    1 help
24547db96d56Sopenharmony_ci                2                   2 help
24557db96d56Sopenharmony_ci                3                   3 help
24567db96d56Sopenharmony_ci            """))
24577db96d56Sopenharmony_ci
24587db96d56Sopenharmony_ci# ============
24597db96d56Sopenharmony_ci# Groups tests
24607db96d56Sopenharmony_ci# ============
24617db96d56Sopenharmony_ci
24627db96d56Sopenharmony_ciclass TestPositionalsGroups(TestCase):
24637db96d56Sopenharmony_ci    """Tests that order of group positionals matches construction order"""
24647db96d56Sopenharmony_ci
24657db96d56Sopenharmony_ci    def test_nongroup_first(self):
24667db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
24677db96d56Sopenharmony_ci        parser.add_argument('foo')
24687db96d56Sopenharmony_ci        group = parser.add_argument_group('g')
24697db96d56Sopenharmony_ci        group.add_argument('bar')
24707db96d56Sopenharmony_ci        parser.add_argument('baz')
24717db96d56Sopenharmony_ci        expected = NS(foo='1', bar='2', baz='3')
24727db96d56Sopenharmony_ci        result = parser.parse_args('1 2 3'.split())
24737db96d56Sopenharmony_ci        self.assertEqual(expected, result)
24747db96d56Sopenharmony_ci
24757db96d56Sopenharmony_ci    def test_group_first(self):
24767db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
24777db96d56Sopenharmony_ci        group = parser.add_argument_group('xxx')
24787db96d56Sopenharmony_ci        group.add_argument('foo')
24797db96d56Sopenharmony_ci        parser.add_argument('bar')
24807db96d56Sopenharmony_ci        parser.add_argument('baz')
24817db96d56Sopenharmony_ci        expected = NS(foo='1', bar='2', baz='3')
24827db96d56Sopenharmony_ci        result = parser.parse_args('1 2 3'.split())
24837db96d56Sopenharmony_ci        self.assertEqual(expected, result)
24847db96d56Sopenharmony_ci
24857db96d56Sopenharmony_ci    def test_interleaved_groups(self):
24867db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
24877db96d56Sopenharmony_ci        group = parser.add_argument_group('xxx')
24887db96d56Sopenharmony_ci        parser.add_argument('foo')
24897db96d56Sopenharmony_ci        group.add_argument('bar')
24907db96d56Sopenharmony_ci        parser.add_argument('baz')
24917db96d56Sopenharmony_ci        group = parser.add_argument_group('yyy')
24927db96d56Sopenharmony_ci        group.add_argument('frell')
24937db96d56Sopenharmony_ci        expected = NS(foo='1', bar='2', baz='3', frell='4')
24947db96d56Sopenharmony_ci        result = parser.parse_args('1 2 3 4'.split())
24957db96d56Sopenharmony_ci        self.assertEqual(expected, result)
24967db96d56Sopenharmony_ci
24977db96d56Sopenharmony_ci# ===================
24987db96d56Sopenharmony_ci# Parent parser tests
24997db96d56Sopenharmony_ci# ===================
25007db96d56Sopenharmony_ci
25017db96d56Sopenharmony_ciclass TestParentParsers(TestCase):
25027db96d56Sopenharmony_ci    """Tests that parsers can be created with parent parsers"""
25037db96d56Sopenharmony_ci
25047db96d56Sopenharmony_ci    def assertArgumentParserError(self, *args, **kwargs):
25057db96d56Sopenharmony_ci        self.assertRaises(ArgumentParserError, *args, **kwargs)
25067db96d56Sopenharmony_ci
25077db96d56Sopenharmony_ci    def setUp(self):
25087db96d56Sopenharmony_ci        super().setUp()
25097db96d56Sopenharmony_ci        self.wxyz_parent = ErrorRaisingArgumentParser(add_help=False)
25107db96d56Sopenharmony_ci        self.wxyz_parent.add_argument('--w')
25117db96d56Sopenharmony_ci        x_group = self.wxyz_parent.add_argument_group('x')
25127db96d56Sopenharmony_ci        x_group.add_argument('-y')
25137db96d56Sopenharmony_ci        self.wxyz_parent.add_argument('z')
25147db96d56Sopenharmony_ci
25157db96d56Sopenharmony_ci        self.abcd_parent = ErrorRaisingArgumentParser(add_help=False)
25167db96d56Sopenharmony_ci        self.abcd_parent.add_argument('a')
25177db96d56Sopenharmony_ci        self.abcd_parent.add_argument('-b')
25187db96d56Sopenharmony_ci        c_group = self.abcd_parent.add_argument_group('c')
25197db96d56Sopenharmony_ci        c_group.add_argument('--d')
25207db96d56Sopenharmony_ci
25217db96d56Sopenharmony_ci        self.w_parent = ErrorRaisingArgumentParser(add_help=False)
25227db96d56Sopenharmony_ci        self.w_parent.add_argument('--w')
25237db96d56Sopenharmony_ci
25247db96d56Sopenharmony_ci        self.z_parent = ErrorRaisingArgumentParser(add_help=False)
25257db96d56Sopenharmony_ci        self.z_parent.add_argument('z')
25267db96d56Sopenharmony_ci
25277db96d56Sopenharmony_ci        # parents with mutually exclusive groups
25287db96d56Sopenharmony_ci        self.ab_mutex_parent = ErrorRaisingArgumentParser(add_help=False)
25297db96d56Sopenharmony_ci        group = self.ab_mutex_parent.add_mutually_exclusive_group()
25307db96d56Sopenharmony_ci        group.add_argument('-a', action='store_true')
25317db96d56Sopenharmony_ci        group.add_argument('-b', action='store_true')
25327db96d56Sopenharmony_ci
25337db96d56Sopenharmony_ci        self.main_program = os.path.basename(sys.argv[0])
25347db96d56Sopenharmony_ci
25357db96d56Sopenharmony_ci    def test_single_parent(self):
25367db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(parents=[self.wxyz_parent])
25377db96d56Sopenharmony_ci        self.assertEqual(parser.parse_args('-y 1 2 --w 3'.split()),
25387db96d56Sopenharmony_ci                         NS(w='3', y='1', z='2'))
25397db96d56Sopenharmony_ci
25407db96d56Sopenharmony_ci    def test_single_parent_mutex(self):
25417db96d56Sopenharmony_ci        self._test_mutex_ab(self.ab_mutex_parent.parse_args)
25427db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(parents=[self.ab_mutex_parent])
25437db96d56Sopenharmony_ci        self._test_mutex_ab(parser.parse_args)
25447db96d56Sopenharmony_ci
25457db96d56Sopenharmony_ci    def test_single_granparent_mutex(self):
25467db96d56Sopenharmony_ci        parents = [self.ab_mutex_parent]
25477db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(add_help=False, parents=parents)
25487db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(parents=[parser])
25497db96d56Sopenharmony_ci        self._test_mutex_ab(parser.parse_args)
25507db96d56Sopenharmony_ci
25517db96d56Sopenharmony_ci    def _test_mutex_ab(self, parse_args):
25527db96d56Sopenharmony_ci        self.assertEqual(parse_args([]), NS(a=False, b=False))
25537db96d56Sopenharmony_ci        self.assertEqual(parse_args(['-a']), NS(a=True, b=False))
25547db96d56Sopenharmony_ci        self.assertEqual(parse_args(['-b']), NS(a=False, b=True))
25557db96d56Sopenharmony_ci        self.assertArgumentParserError(parse_args, ['-a', '-b'])
25567db96d56Sopenharmony_ci        self.assertArgumentParserError(parse_args, ['-b', '-a'])
25577db96d56Sopenharmony_ci        self.assertArgumentParserError(parse_args, ['-c'])
25587db96d56Sopenharmony_ci        self.assertArgumentParserError(parse_args, ['-a', '-c'])
25597db96d56Sopenharmony_ci        self.assertArgumentParserError(parse_args, ['-b', '-c'])
25607db96d56Sopenharmony_ci
25617db96d56Sopenharmony_ci    def test_multiple_parents(self):
25627db96d56Sopenharmony_ci        parents = [self.abcd_parent, self.wxyz_parent]
25637db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(parents=parents)
25647db96d56Sopenharmony_ci        self.assertEqual(parser.parse_args('--d 1 --w 2 3 4'.split()),
25657db96d56Sopenharmony_ci                         NS(a='3', b=None, d='1', w='2', y=None, z='4'))
25667db96d56Sopenharmony_ci
25677db96d56Sopenharmony_ci    def test_multiple_parents_mutex(self):
25687db96d56Sopenharmony_ci        parents = [self.ab_mutex_parent, self.wxyz_parent]
25697db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(parents=parents)
25707db96d56Sopenharmony_ci        self.assertEqual(parser.parse_args('-a --w 2 3'.split()),
25717db96d56Sopenharmony_ci                         NS(a=True, b=False, w='2', y=None, z='3'))
25727db96d56Sopenharmony_ci        self.assertArgumentParserError(
25737db96d56Sopenharmony_ci            parser.parse_args, '-a --w 2 3 -b'.split())
25747db96d56Sopenharmony_ci        self.assertArgumentParserError(
25757db96d56Sopenharmony_ci            parser.parse_args, '-a -b --w 2 3'.split())
25767db96d56Sopenharmony_ci
25777db96d56Sopenharmony_ci    def test_conflicting_parents(self):
25787db96d56Sopenharmony_ci        self.assertRaises(
25797db96d56Sopenharmony_ci            argparse.ArgumentError,
25807db96d56Sopenharmony_ci            argparse.ArgumentParser,
25817db96d56Sopenharmony_ci            parents=[self.w_parent, self.wxyz_parent])
25827db96d56Sopenharmony_ci
25837db96d56Sopenharmony_ci    def test_conflicting_parents_mutex(self):
25847db96d56Sopenharmony_ci        self.assertRaises(
25857db96d56Sopenharmony_ci            argparse.ArgumentError,
25867db96d56Sopenharmony_ci            argparse.ArgumentParser,
25877db96d56Sopenharmony_ci            parents=[self.abcd_parent, self.ab_mutex_parent])
25887db96d56Sopenharmony_ci
25897db96d56Sopenharmony_ci    def test_same_argument_name_parents(self):
25907db96d56Sopenharmony_ci        parents = [self.wxyz_parent, self.z_parent]
25917db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(parents=parents)
25927db96d56Sopenharmony_ci        self.assertEqual(parser.parse_args('1 2'.split()),
25937db96d56Sopenharmony_ci                         NS(w=None, y=None, z='2'))
25947db96d56Sopenharmony_ci
25957db96d56Sopenharmony_ci    def test_subparser_parents(self):
25967db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
25977db96d56Sopenharmony_ci        subparsers = parser.add_subparsers()
25987db96d56Sopenharmony_ci        abcde_parser = subparsers.add_parser('bar', parents=[self.abcd_parent])
25997db96d56Sopenharmony_ci        abcde_parser.add_argument('e')
26007db96d56Sopenharmony_ci        self.assertEqual(parser.parse_args('bar -b 1 --d 2 3 4'.split()),
26017db96d56Sopenharmony_ci                         NS(a='3', b='1', d='2', e='4'))
26027db96d56Sopenharmony_ci
26037db96d56Sopenharmony_ci    def test_subparser_parents_mutex(self):
26047db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
26057db96d56Sopenharmony_ci        subparsers = parser.add_subparsers()
26067db96d56Sopenharmony_ci        parents = [self.ab_mutex_parent]
26077db96d56Sopenharmony_ci        abc_parser = subparsers.add_parser('foo', parents=parents)
26087db96d56Sopenharmony_ci        c_group = abc_parser.add_argument_group('c_group')
26097db96d56Sopenharmony_ci        c_group.add_argument('c')
26107db96d56Sopenharmony_ci        parents = [self.wxyz_parent, self.ab_mutex_parent]
26117db96d56Sopenharmony_ci        wxyzabe_parser = subparsers.add_parser('bar', parents=parents)
26127db96d56Sopenharmony_ci        wxyzabe_parser.add_argument('e')
26137db96d56Sopenharmony_ci        self.assertEqual(parser.parse_args('foo -a 4'.split()),
26147db96d56Sopenharmony_ci                         NS(a=True, b=False, c='4'))
26157db96d56Sopenharmony_ci        self.assertEqual(parser.parse_args('bar -b  --w 2 3 4'.split()),
26167db96d56Sopenharmony_ci                         NS(a=False, b=True, w='2', y=None, z='3', e='4'))
26177db96d56Sopenharmony_ci        self.assertArgumentParserError(
26187db96d56Sopenharmony_ci            parser.parse_args, 'foo -a -b 4'.split())
26197db96d56Sopenharmony_ci        self.assertArgumentParserError(
26207db96d56Sopenharmony_ci            parser.parse_args, 'bar -b -a 4'.split())
26217db96d56Sopenharmony_ci
26227db96d56Sopenharmony_ci    def test_parent_help(self):
26237db96d56Sopenharmony_ci        parents = [self.abcd_parent, self.wxyz_parent]
26247db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(parents=parents)
26257db96d56Sopenharmony_ci        parser_help = parser.format_help()
26267db96d56Sopenharmony_ci        progname = self.main_program
26277db96d56Sopenharmony_ci        self.assertEqual(parser_help, textwrap.dedent('''\
26287db96d56Sopenharmony_ci            usage: {}{}[-h] [-b B] [--d D] [--w W] [-y Y] a z
26297db96d56Sopenharmony_ci
26307db96d56Sopenharmony_ci            positional arguments:
26317db96d56Sopenharmony_ci              a
26327db96d56Sopenharmony_ci              z
26337db96d56Sopenharmony_ci
26347db96d56Sopenharmony_ci            options:
26357db96d56Sopenharmony_ci              -h, --help  show this help message and exit
26367db96d56Sopenharmony_ci              -b B
26377db96d56Sopenharmony_ci              --w W
26387db96d56Sopenharmony_ci
26397db96d56Sopenharmony_ci            c:
26407db96d56Sopenharmony_ci              --d D
26417db96d56Sopenharmony_ci
26427db96d56Sopenharmony_ci            x:
26437db96d56Sopenharmony_ci              -y Y
26447db96d56Sopenharmony_ci        '''.format(progname, ' ' if progname else '' )))
26457db96d56Sopenharmony_ci
26467db96d56Sopenharmony_ci    def test_groups_parents(self):
26477db96d56Sopenharmony_ci        parent = ErrorRaisingArgumentParser(add_help=False)
26487db96d56Sopenharmony_ci        g = parent.add_argument_group(title='g', description='gd')
26497db96d56Sopenharmony_ci        g.add_argument('-w')
26507db96d56Sopenharmony_ci        g.add_argument('-x')
26517db96d56Sopenharmony_ci        m = parent.add_mutually_exclusive_group()
26527db96d56Sopenharmony_ci        m.add_argument('-y')
26537db96d56Sopenharmony_ci        m.add_argument('-z')
26547db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(parents=[parent])
26557db96d56Sopenharmony_ci
26567db96d56Sopenharmony_ci        self.assertRaises(ArgumentParserError, parser.parse_args,
26577db96d56Sopenharmony_ci            ['-y', 'Y', '-z', 'Z'])
26587db96d56Sopenharmony_ci
26597db96d56Sopenharmony_ci        parser_help = parser.format_help()
26607db96d56Sopenharmony_ci        progname = self.main_program
26617db96d56Sopenharmony_ci        self.assertEqual(parser_help, textwrap.dedent('''\
26627db96d56Sopenharmony_ci            usage: {}{}[-h] [-w W] [-x X] [-y Y | -z Z]
26637db96d56Sopenharmony_ci
26647db96d56Sopenharmony_ci            options:
26657db96d56Sopenharmony_ci              -h, --help  show this help message and exit
26667db96d56Sopenharmony_ci              -y Y
26677db96d56Sopenharmony_ci              -z Z
26687db96d56Sopenharmony_ci
26697db96d56Sopenharmony_ci            g:
26707db96d56Sopenharmony_ci              gd
26717db96d56Sopenharmony_ci
26727db96d56Sopenharmony_ci              -w W
26737db96d56Sopenharmony_ci              -x X
26747db96d56Sopenharmony_ci        '''.format(progname, ' ' if progname else '' )))
26757db96d56Sopenharmony_ci
26767db96d56Sopenharmony_ci# ==============================
26777db96d56Sopenharmony_ci# Mutually exclusive group tests
26787db96d56Sopenharmony_ci# ==============================
26797db96d56Sopenharmony_ci
26807db96d56Sopenharmony_ciclass TestMutuallyExclusiveGroupErrors(TestCase):
26817db96d56Sopenharmony_ci
26827db96d56Sopenharmony_ci    def test_invalid_add_argument_group(self):
26837db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
26847db96d56Sopenharmony_ci        raises = self.assertRaises
26857db96d56Sopenharmony_ci        raises(TypeError, parser.add_mutually_exclusive_group, title='foo')
26867db96d56Sopenharmony_ci
26877db96d56Sopenharmony_ci    def test_invalid_add_argument(self):
26887db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
26897db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group()
26907db96d56Sopenharmony_ci        add_argument = group.add_argument
26917db96d56Sopenharmony_ci        raises = self.assertRaises
26927db96d56Sopenharmony_ci        raises(ValueError, add_argument, '--foo', required=True)
26937db96d56Sopenharmony_ci        raises(ValueError, add_argument, 'bar')
26947db96d56Sopenharmony_ci        raises(ValueError, add_argument, 'bar', nargs='+')
26957db96d56Sopenharmony_ci        raises(ValueError, add_argument, 'bar', nargs=1)
26967db96d56Sopenharmony_ci        raises(ValueError, add_argument, 'bar', nargs=argparse.PARSER)
26977db96d56Sopenharmony_ci
26987db96d56Sopenharmony_ci    def test_help(self):
26997db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
27007db96d56Sopenharmony_ci        group1 = parser.add_mutually_exclusive_group()
27017db96d56Sopenharmony_ci        group1.add_argument('--foo', action='store_true')
27027db96d56Sopenharmony_ci        group1.add_argument('--bar', action='store_false')
27037db96d56Sopenharmony_ci        group2 = parser.add_mutually_exclusive_group()
27047db96d56Sopenharmony_ci        group2.add_argument('--soup', action='store_true')
27057db96d56Sopenharmony_ci        group2.add_argument('--nuts', action='store_false')
27067db96d56Sopenharmony_ci        expected = '''\
27077db96d56Sopenharmony_ci            usage: PROG [-h] [--foo | --bar] [--soup | --nuts]
27087db96d56Sopenharmony_ci
27097db96d56Sopenharmony_ci            options:
27107db96d56Sopenharmony_ci              -h, --help  show this help message and exit
27117db96d56Sopenharmony_ci              --foo
27127db96d56Sopenharmony_ci              --bar
27137db96d56Sopenharmony_ci              --soup
27147db96d56Sopenharmony_ci              --nuts
27157db96d56Sopenharmony_ci              '''
27167db96d56Sopenharmony_ci        self.assertEqual(parser.format_help(), textwrap.dedent(expected))
27177db96d56Sopenharmony_ci
27187db96d56Sopenharmony_ci    def test_empty_group(self):
27197db96d56Sopenharmony_ci        # See issue 26952
27207db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
27217db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group()
27227db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
27237db96d56Sopenharmony_ci            parser.parse_args(['-h'])
27247db96d56Sopenharmony_ci
27257db96d56Sopenharmony_ciclass MEMixin(object):
27267db96d56Sopenharmony_ci
27277db96d56Sopenharmony_ci    def test_failures_when_not_required(self):
27287db96d56Sopenharmony_ci        parse_args = self.get_parser(required=False).parse_args
27297db96d56Sopenharmony_ci        error = ArgumentParserError
27307db96d56Sopenharmony_ci        for args_string in self.failures:
27317db96d56Sopenharmony_ci            self.assertRaises(error, parse_args, args_string.split())
27327db96d56Sopenharmony_ci
27337db96d56Sopenharmony_ci    def test_failures_when_required(self):
27347db96d56Sopenharmony_ci        parse_args = self.get_parser(required=True).parse_args
27357db96d56Sopenharmony_ci        error = ArgumentParserError
27367db96d56Sopenharmony_ci        for args_string in self.failures + ['']:
27377db96d56Sopenharmony_ci            self.assertRaises(error, parse_args, args_string.split())
27387db96d56Sopenharmony_ci
27397db96d56Sopenharmony_ci    def test_successes_when_not_required(self):
27407db96d56Sopenharmony_ci        parse_args = self.get_parser(required=False).parse_args
27417db96d56Sopenharmony_ci        successes = self.successes + self.successes_when_not_required
27427db96d56Sopenharmony_ci        for args_string, expected_ns in successes:
27437db96d56Sopenharmony_ci            actual_ns = parse_args(args_string.split())
27447db96d56Sopenharmony_ci            self.assertEqual(actual_ns, expected_ns)
27457db96d56Sopenharmony_ci
27467db96d56Sopenharmony_ci    def test_successes_when_required(self):
27477db96d56Sopenharmony_ci        parse_args = self.get_parser(required=True).parse_args
27487db96d56Sopenharmony_ci        for args_string, expected_ns in self.successes:
27497db96d56Sopenharmony_ci            actual_ns = parse_args(args_string.split())
27507db96d56Sopenharmony_ci            self.assertEqual(actual_ns, expected_ns)
27517db96d56Sopenharmony_ci
27527db96d56Sopenharmony_ci    def test_usage_when_not_required(self):
27537db96d56Sopenharmony_ci        format_usage = self.get_parser(required=False).format_usage
27547db96d56Sopenharmony_ci        expected_usage = self.usage_when_not_required
27557db96d56Sopenharmony_ci        self.assertEqual(format_usage(), textwrap.dedent(expected_usage))
27567db96d56Sopenharmony_ci
27577db96d56Sopenharmony_ci    def test_usage_when_required(self):
27587db96d56Sopenharmony_ci        format_usage = self.get_parser(required=True).format_usage
27597db96d56Sopenharmony_ci        expected_usage = self.usage_when_required
27607db96d56Sopenharmony_ci        self.assertEqual(format_usage(), textwrap.dedent(expected_usage))
27617db96d56Sopenharmony_ci
27627db96d56Sopenharmony_ci    def test_help_when_not_required(self):
27637db96d56Sopenharmony_ci        format_help = self.get_parser(required=False).format_help
27647db96d56Sopenharmony_ci        help = self.usage_when_not_required + self.help
27657db96d56Sopenharmony_ci        self.assertEqual(format_help(), textwrap.dedent(help))
27667db96d56Sopenharmony_ci
27677db96d56Sopenharmony_ci    def test_help_when_required(self):
27687db96d56Sopenharmony_ci        format_help = self.get_parser(required=True).format_help
27697db96d56Sopenharmony_ci        help = self.usage_when_required + self.help
27707db96d56Sopenharmony_ci        self.assertEqual(format_help(), textwrap.dedent(help))
27717db96d56Sopenharmony_ci
27727db96d56Sopenharmony_ci
27737db96d56Sopenharmony_ciclass TestMutuallyExclusiveSimple(MEMixin, TestCase):
27747db96d56Sopenharmony_ci
27757db96d56Sopenharmony_ci    def get_parser(self, required=None):
27767db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
27777db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group(required=required)
27787db96d56Sopenharmony_ci        group.add_argument('--bar', help='bar help')
27797db96d56Sopenharmony_ci        group.add_argument('--baz', nargs='?', const='Z', help='baz help')
27807db96d56Sopenharmony_ci        return parser
27817db96d56Sopenharmony_ci
27827db96d56Sopenharmony_ci    failures = ['--bar X --baz Y', '--bar X --baz']
27837db96d56Sopenharmony_ci    successes = [
27847db96d56Sopenharmony_ci        ('--bar X', NS(bar='X', baz=None)),
27857db96d56Sopenharmony_ci        ('--bar X --bar Z', NS(bar='Z', baz=None)),
27867db96d56Sopenharmony_ci        ('--baz Y', NS(bar=None, baz='Y')),
27877db96d56Sopenharmony_ci        ('--baz', NS(bar=None, baz='Z')),
27887db96d56Sopenharmony_ci    ]
27897db96d56Sopenharmony_ci    successes_when_not_required = [
27907db96d56Sopenharmony_ci        ('', NS(bar=None, baz=None)),
27917db96d56Sopenharmony_ci    ]
27927db96d56Sopenharmony_ci
27937db96d56Sopenharmony_ci    usage_when_not_required = '''\
27947db96d56Sopenharmony_ci        usage: PROG [-h] [--bar BAR | --baz [BAZ]]
27957db96d56Sopenharmony_ci        '''
27967db96d56Sopenharmony_ci    usage_when_required = '''\
27977db96d56Sopenharmony_ci        usage: PROG [-h] (--bar BAR | --baz [BAZ])
27987db96d56Sopenharmony_ci        '''
27997db96d56Sopenharmony_ci    help = '''\
28007db96d56Sopenharmony_ci
28017db96d56Sopenharmony_ci        options:
28027db96d56Sopenharmony_ci          -h, --help   show this help message and exit
28037db96d56Sopenharmony_ci          --bar BAR    bar help
28047db96d56Sopenharmony_ci          --baz [BAZ]  baz help
28057db96d56Sopenharmony_ci        '''
28067db96d56Sopenharmony_ci
28077db96d56Sopenharmony_ci
28087db96d56Sopenharmony_ciclass TestMutuallyExclusiveLong(MEMixin, TestCase):
28097db96d56Sopenharmony_ci
28107db96d56Sopenharmony_ci    def get_parser(self, required=None):
28117db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
28127db96d56Sopenharmony_ci        parser.add_argument('--abcde', help='abcde help')
28137db96d56Sopenharmony_ci        parser.add_argument('--fghij', help='fghij help')
28147db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group(required=required)
28157db96d56Sopenharmony_ci        group.add_argument('--klmno', help='klmno help')
28167db96d56Sopenharmony_ci        group.add_argument('--pqrst', help='pqrst help')
28177db96d56Sopenharmony_ci        return parser
28187db96d56Sopenharmony_ci
28197db96d56Sopenharmony_ci    failures = ['--klmno X --pqrst Y']
28207db96d56Sopenharmony_ci    successes = [
28217db96d56Sopenharmony_ci        ('--klmno X', NS(abcde=None, fghij=None, klmno='X', pqrst=None)),
28227db96d56Sopenharmony_ci        ('--abcde Y --klmno X',
28237db96d56Sopenharmony_ci            NS(abcde='Y', fghij=None, klmno='X', pqrst=None)),
28247db96d56Sopenharmony_ci        ('--pqrst X', NS(abcde=None, fghij=None, klmno=None, pqrst='X')),
28257db96d56Sopenharmony_ci        ('--pqrst X --fghij Y',
28267db96d56Sopenharmony_ci            NS(abcde=None, fghij='Y', klmno=None, pqrst='X')),
28277db96d56Sopenharmony_ci    ]
28287db96d56Sopenharmony_ci    successes_when_not_required = [
28297db96d56Sopenharmony_ci        ('', NS(abcde=None, fghij=None, klmno=None, pqrst=None)),
28307db96d56Sopenharmony_ci    ]
28317db96d56Sopenharmony_ci
28327db96d56Sopenharmony_ci    usage_when_not_required = '''\
28337db96d56Sopenharmony_ci    usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
28347db96d56Sopenharmony_ci                [--klmno KLMNO | --pqrst PQRST]
28357db96d56Sopenharmony_ci    '''
28367db96d56Sopenharmony_ci    usage_when_required = '''\
28377db96d56Sopenharmony_ci    usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
28387db96d56Sopenharmony_ci                (--klmno KLMNO | --pqrst PQRST)
28397db96d56Sopenharmony_ci    '''
28407db96d56Sopenharmony_ci    help = '''\
28417db96d56Sopenharmony_ci
28427db96d56Sopenharmony_ci    options:
28437db96d56Sopenharmony_ci      -h, --help     show this help message and exit
28447db96d56Sopenharmony_ci      --abcde ABCDE  abcde help
28457db96d56Sopenharmony_ci      --fghij FGHIJ  fghij help
28467db96d56Sopenharmony_ci      --klmno KLMNO  klmno help
28477db96d56Sopenharmony_ci      --pqrst PQRST  pqrst help
28487db96d56Sopenharmony_ci    '''
28497db96d56Sopenharmony_ci
28507db96d56Sopenharmony_ci
28517db96d56Sopenharmony_ciclass TestMutuallyExclusiveFirstSuppressed(MEMixin, TestCase):
28527db96d56Sopenharmony_ci
28537db96d56Sopenharmony_ci    def get_parser(self, required):
28547db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
28557db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group(required=required)
28567db96d56Sopenharmony_ci        group.add_argument('-x', help=argparse.SUPPRESS)
28577db96d56Sopenharmony_ci        group.add_argument('-y', action='store_false', help='y help')
28587db96d56Sopenharmony_ci        return parser
28597db96d56Sopenharmony_ci
28607db96d56Sopenharmony_ci    failures = ['-x X -y']
28617db96d56Sopenharmony_ci    successes = [
28627db96d56Sopenharmony_ci        ('-x X', NS(x='X', y=True)),
28637db96d56Sopenharmony_ci        ('-x X -x Y', NS(x='Y', y=True)),
28647db96d56Sopenharmony_ci        ('-y', NS(x=None, y=False)),
28657db96d56Sopenharmony_ci    ]
28667db96d56Sopenharmony_ci    successes_when_not_required = [
28677db96d56Sopenharmony_ci        ('', NS(x=None, y=True)),
28687db96d56Sopenharmony_ci    ]
28697db96d56Sopenharmony_ci
28707db96d56Sopenharmony_ci    usage_when_not_required = '''\
28717db96d56Sopenharmony_ci        usage: PROG [-h] [-y]
28727db96d56Sopenharmony_ci        '''
28737db96d56Sopenharmony_ci    usage_when_required = '''\
28747db96d56Sopenharmony_ci        usage: PROG [-h] -y
28757db96d56Sopenharmony_ci        '''
28767db96d56Sopenharmony_ci    help = '''\
28777db96d56Sopenharmony_ci
28787db96d56Sopenharmony_ci        options:
28797db96d56Sopenharmony_ci          -h, --help  show this help message and exit
28807db96d56Sopenharmony_ci          -y          y help
28817db96d56Sopenharmony_ci        '''
28827db96d56Sopenharmony_ci
28837db96d56Sopenharmony_ci
28847db96d56Sopenharmony_ciclass TestMutuallyExclusiveManySuppressed(MEMixin, TestCase):
28857db96d56Sopenharmony_ci
28867db96d56Sopenharmony_ci    def get_parser(self, required):
28877db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
28887db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group(required=required)
28897db96d56Sopenharmony_ci        add = group.add_argument
28907db96d56Sopenharmony_ci        add('--spam', action='store_true', help=argparse.SUPPRESS)
28917db96d56Sopenharmony_ci        add('--badger', action='store_false', help=argparse.SUPPRESS)
28927db96d56Sopenharmony_ci        add('--bladder', help=argparse.SUPPRESS)
28937db96d56Sopenharmony_ci        return parser
28947db96d56Sopenharmony_ci
28957db96d56Sopenharmony_ci    failures = [
28967db96d56Sopenharmony_ci        '--spam --badger',
28977db96d56Sopenharmony_ci        '--badger --bladder B',
28987db96d56Sopenharmony_ci        '--bladder B --spam',
28997db96d56Sopenharmony_ci    ]
29007db96d56Sopenharmony_ci    successes = [
29017db96d56Sopenharmony_ci        ('--spam', NS(spam=True, badger=True, bladder=None)),
29027db96d56Sopenharmony_ci        ('--badger', NS(spam=False, badger=False, bladder=None)),
29037db96d56Sopenharmony_ci        ('--bladder B', NS(spam=False, badger=True, bladder='B')),
29047db96d56Sopenharmony_ci        ('--spam --spam', NS(spam=True, badger=True, bladder=None)),
29057db96d56Sopenharmony_ci    ]
29067db96d56Sopenharmony_ci    successes_when_not_required = [
29077db96d56Sopenharmony_ci        ('', NS(spam=False, badger=True, bladder=None)),
29087db96d56Sopenharmony_ci    ]
29097db96d56Sopenharmony_ci
29107db96d56Sopenharmony_ci    usage_when_required = usage_when_not_required = '''\
29117db96d56Sopenharmony_ci        usage: PROG [-h]
29127db96d56Sopenharmony_ci        '''
29137db96d56Sopenharmony_ci    help = '''\
29147db96d56Sopenharmony_ci
29157db96d56Sopenharmony_ci        options:
29167db96d56Sopenharmony_ci          -h, --help  show this help message and exit
29177db96d56Sopenharmony_ci        '''
29187db96d56Sopenharmony_ci
29197db96d56Sopenharmony_ci
29207db96d56Sopenharmony_ciclass TestMutuallyExclusiveOptionalAndPositional(MEMixin, TestCase):
29217db96d56Sopenharmony_ci
29227db96d56Sopenharmony_ci    def get_parser(self, required):
29237db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
29247db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group(required=required)
29257db96d56Sopenharmony_ci        group.add_argument('--foo', action='store_true', help='FOO')
29267db96d56Sopenharmony_ci        group.add_argument('--spam', help='SPAM')
29277db96d56Sopenharmony_ci        group.add_argument('badger', nargs='*', default='X', help='BADGER')
29287db96d56Sopenharmony_ci        return parser
29297db96d56Sopenharmony_ci
29307db96d56Sopenharmony_ci    failures = [
29317db96d56Sopenharmony_ci        '--foo --spam S',
29327db96d56Sopenharmony_ci        '--spam S X',
29337db96d56Sopenharmony_ci        'X --foo',
29347db96d56Sopenharmony_ci        'X Y Z --spam S',
29357db96d56Sopenharmony_ci        '--foo X Y',
29367db96d56Sopenharmony_ci    ]
29377db96d56Sopenharmony_ci    successes = [
29387db96d56Sopenharmony_ci        ('--foo', NS(foo=True, spam=None, badger='X')),
29397db96d56Sopenharmony_ci        ('--spam S', NS(foo=False, spam='S', badger='X')),
29407db96d56Sopenharmony_ci        ('X', NS(foo=False, spam=None, badger=['X'])),
29417db96d56Sopenharmony_ci        ('X Y Z', NS(foo=False, spam=None, badger=['X', 'Y', 'Z'])),
29427db96d56Sopenharmony_ci    ]
29437db96d56Sopenharmony_ci    successes_when_not_required = [
29447db96d56Sopenharmony_ci        ('', NS(foo=False, spam=None, badger='X')),
29457db96d56Sopenharmony_ci    ]
29467db96d56Sopenharmony_ci
29477db96d56Sopenharmony_ci    usage_when_not_required = '''\
29487db96d56Sopenharmony_ci        usage: PROG [-h] [--foo | --spam SPAM | badger ...]
29497db96d56Sopenharmony_ci        '''
29507db96d56Sopenharmony_ci    usage_when_required = '''\
29517db96d56Sopenharmony_ci        usage: PROG [-h] (--foo | --spam SPAM | badger ...)
29527db96d56Sopenharmony_ci        '''
29537db96d56Sopenharmony_ci    help = '''\
29547db96d56Sopenharmony_ci
29557db96d56Sopenharmony_ci        positional arguments:
29567db96d56Sopenharmony_ci          badger       BADGER
29577db96d56Sopenharmony_ci
29587db96d56Sopenharmony_ci        options:
29597db96d56Sopenharmony_ci          -h, --help   show this help message and exit
29607db96d56Sopenharmony_ci          --foo        FOO
29617db96d56Sopenharmony_ci          --spam SPAM  SPAM
29627db96d56Sopenharmony_ci        '''
29637db96d56Sopenharmony_ci
29647db96d56Sopenharmony_ci
29657db96d56Sopenharmony_ciclass TestMutuallyExclusiveOptionalsMixed(MEMixin, TestCase):
29667db96d56Sopenharmony_ci
29677db96d56Sopenharmony_ci    def get_parser(self, required):
29687db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
29697db96d56Sopenharmony_ci        parser.add_argument('-x', action='store_true', help='x help')
29707db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group(required=required)
29717db96d56Sopenharmony_ci        group.add_argument('-a', action='store_true', help='a help')
29727db96d56Sopenharmony_ci        group.add_argument('-b', action='store_true', help='b help')
29737db96d56Sopenharmony_ci        parser.add_argument('-y', action='store_true', help='y help')
29747db96d56Sopenharmony_ci        group.add_argument('-c', action='store_true', help='c help')
29757db96d56Sopenharmony_ci        return parser
29767db96d56Sopenharmony_ci
29777db96d56Sopenharmony_ci    failures = ['-a -b', '-b -c', '-a -c', '-a -b -c']
29787db96d56Sopenharmony_ci    successes = [
29797db96d56Sopenharmony_ci        ('-a', NS(a=True, b=False, c=False, x=False, y=False)),
29807db96d56Sopenharmony_ci        ('-b', NS(a=False, b=True, c=False, x=False, y=False)),
29817db96d56Sopenharmony_ci        ('-c', NS(a=False, b=False, c=True, x=False, y=False)),
29827db96d56Sopenharmony_ci        ('-a -x', NS(a=True, b=False, c=False, x=True, y=False)),
29837db96d56Sopenharmony_ci        ('-y -b', NS(a=False, b=True, c=False, x=False, y=True)),
29847db96d56Sopenharmony_ci        ('-x -y -c', NS(a=False, b=False, c=True, x=True, y=True)),
29857db96d56Sopenharmony_ci    ]
29867db96d56Sopenharmony_ci    successes_when_not_required = [
29877db96d56Sopenharmony_ci        ('', NS(a=False, b=False, c=False, x=False, y=False)),
29887db96d56Sopenharmony_ci        ('-x', NS(a=False, b=False, c=False, x=True, y=False)),
29897db96d56Sopenharmony_ci        ('-y', NS(a=False, b=False, c=False, x=False, y=True)),
29907db96d56Sopenharmony_ci    ]
29917db96d56Sopenharmony_ci
29927db96d56Sopenharmony_ci    usage_when_required = usage_when_not_required = '''\
29937db96d56Sopenharmony_ci        usage: PROG [-h] [-x] [-a] [-b] [-y] [-c]
29947db96d56Sopenharmony_ci        '''
29957db96d56Sopenharmony_ci    help = '''\
29967db96d56Sopenharmony_ci
29977db96d56Sopenharmony_ci        options:
29987db96d56Sopenharmony_ci          -h, --help  show this help message and exit
29997db96d56Sopenharmony_ci          -x          x help
30007db96d56Sopenharmony_ci          -a          a help
30017db96d56Sopenharmony_ci          -b          b help
30027db96d56Sopenharmony_ci          -y          y help
30037db96d56Sopenharmony_ci          -c          c help
30047db96d56Sopenharmony_ci        '''
30057db96d56Sopenharmony_ci
30067db96d56Sopenharmony_ci
30077db96d56Sopenharmony_ciclass TestMutuallyExclusiveInGroup(MEMixin, TestCase):
30087db96d56Sopenharmony_ci
30097db96d56Sopenharmony_ci    def get_parser(self, required=None):
30107db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
30117db96d56Sopenharmony_ci        titled_group = parser.add_argument_group(
30127db96d56Sopenharmony_ci            title='Titled group', description='Group description')
30137db96d56Sopenharmony_ci        mutex_group = \
30147db96d56Sopenharmony_ci            titled_group.add_mutually_exclusive_group(required=required)
30157db96d56Sopenharmony_ci        mutex_group.add_argument('--bar', help='bar help')
30167db96d56Sopenharmony_ci        mutex_group.add_argument('--baz', help='baz help')
30177db96d56Sopenharmony_ci        return parser
30187db96d56Sopenharmony_ci
30197db96d56Sopenharmony_ci    failures = ['--bar X --baz Y', '--baz X --bar Y']
30207db96d56Sopenharmony_ci    successes = [
30217db96d56Sopenharmony_ci        ('--bar X', NS(bar='X', baz=None)),
30227db96d56Sopenharmony_ci        ('--baz Y', NS(bar=None, baz='Y')),
30237db96d56Sopenharmony_ci    ]
30247db96d56Sopenharmony_ci    successes_when_not_required = [
30257db96d56Sopenharmony_ci        ('', NS(bar=None, baz=None)),
30267db96d56Sopenharmony_ci    ]
30277db96d56Sopenharmony_ci
30287db96d56Sopenharmony_ci    usage_when_not_required = '''\
30297db96d56Sopenharmony_ci        usage: PROG [-h] [--bar BAR | --baz BAZ]
30307db96d56Sopenharmony_ci        '''
30317db96d56Sopenharmony_ci    usage_when_required = '''\
30327db96d56Sopenharmony_ci        usage: PROG [-h] (--bar BAR | --baz BAZ)
30337db96d56Sopenharmony_ci        '''
30347db96d56Sopenharmony_ci    help = '''\
30357db96d56Sopenharmony_ci
30367db96d56Sopenharmony_ci        options:
30377db96d56Sopenharmony_ci          -h, --help  show this help message and exit
30387db96d56Sopenharmony_ci
30397db96d56Sopenharmony_ci        Titled group:
30407db96d56Sopenharmony_ci          Group description
30417db96d56Sopenharmony_ci
30427db96d56Sopenharmony_ci          --bar BAR   bar help
30437db96d56Sopenharmony_ci          --baz BAZ   baz help
30447db96d56Sopenharmony_ci        '''
30457db96d56Sopenharmony_ci
30467db96d56Sopenharmony_ci
30477db96d56Sopenharmony_ciclass TestMutuallyExclusiveOptionalsAndPositionalsMixed(MEMixin, TestCase):
30487db96d56Sopenharmony_ci
30497db96d56Sopenharmony_ci    def get_parser(self, required):
30507db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
30517db96d56Sopenharmony_ci        parser.add_argument('x', help='x help')
30527db96d56Sopenharmony_ci        parser.add_argument('-y', action='store_true', help='y help')
30537db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group(required=required)
30547db96d56Sopenharmony_ci        group.add_argument('a', nargs='?', help='a help')
30557db96d56Sopenharmony_ci        group.add_argument('-b', action='store_true', help='b help')
30567db96d56Sopenharmony_ci        group.add_argument('-c', action='store_true', help='c help')
30577db96d56Sopenharmony_ci        return parser
30587db96d56Sopenharmony_ci
30597db96d56Sopenharmony_ci    failures = ['X A -b', '-b -c', '-c X A']
30607db96d56Sopenharmony_ci    successes = [
30617db96d56Sopenharmony_ci        ('X A', NS(a='A', b=False, c=False, x='X', y=False)),
30627db96d56Sopenharmony_ci        ('X -b', NS(a=None, b=True, c=False, x='X', y=False)),
30637db96d56Sopenharmony_ci        ('X -c', NS(a=None, b=False, c=True, x='X', y=False)),
30647db96d56Sopenharmony_ci        ('X A -y', NS(a='A', b=False, c=False, x='X', y=True)),
30657db96d56Sopenharmony_ci        ('X -y -b', NS(a=None, b=True, c=False, x='X', y=True)),
30667db96d56Sopenharmony_ci    ]
30677db96d56Sopenharmony_ci    successes_when_not_required = [
30687db96d56Sopenharmony_ci        ('X', NS(a=None, b=False, c=False, x='X', y=False)),
30697db96d56Sopenharmony_ci        ('X -y', NS(a=None, b=False, c=False, x='X', y=True)),
30707db96d56Sopenharmony_ci    ]
30717db96d56Sopenharmony_ci
30727db96d56Sopenharmony_ci    usage_when_required = usage_when_not_required = '''\
30737db96d56Sopenharmony_ci        usage: PROG [-h] [-y] [-b] [-c] x [a]
30747db96d56Sopenharmony_ci        '''
30757db96d56Sopenharmony_ci    help = '''\
30767db96d56Sopenharmony_ci
30777db96d56Sopenharmony_ci        positional arguments:
30787db96d56Sopenharmony_ci          x           x help
30797db96d56Sopenharmony_ci          a           a help
30807db96d56Sopenharmony_ci
30817db96d56Sopenharmony_ci        options:
30827db96d56Sopenharmony_ci          -h, --help  show this help message and exit
30837db96d56Sopenharmony_ci          -y          y help
30847db96d56Sopenharmony_ci          -b          b help
30857db96d56Sopenharmony_ci          -c          c help
30867db96d56Sopenharmony_ci        '''
30877db96d56Sopenharmony_ci
30887db96d56Sopenharmony_ciclass TestMutuallyExclusiveNested(MEMixin, TestCase):
30897db96d56Sopenharmony_ci
30907db96d56Sopenharmony_ci    # Nesting mutually exclusive groups is an undocumented feature
30917db96d56Sopenharmony_ci    # that came about by accident through inheritance and has been
30927db96d56Sopenharmony_ci    # the source of many bugs. It is deprecated and this test should
30937db96d56Sopenharmony_ci    # eventually be removed along with it.
30947db96d56Sopenharmony_ci
30957db96d56Sopenharmony_ci    def get_parser(self, required):
30967db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
30977db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group(required=required)
30987db96d56Sopenharmony_ci        group.add_argument('-a')
30997db96d56Sopenharmony_ci        group.add_argument('-b')
31007db96d56Sopenharmony_ci        with warnings.catch_warnings():
31017db96d56Sopenharmony_ci            warnings.simplefilter('ignore', DeprecationWarning)
31027db96d56Sopenharmony_ci            group2 = group.add_mutually_exclusive_group(required=required)
31037db96d56Sopenharmony_ci        group2.add_argument('-c')
31047db96d56Sopenharmony_ci        group2.add_argument('-d')
31057db96d56Sopenharmony_ci        with warnings.catch_warnings():
31067db96d56Sopenharmony_ci            warnings.simplefilter('ignore', DeprecationWarning)
31077db96d56Sopenharmony_ci            group3 = group2.add_mutually_exclusive_group(required=required)
31087db96d56Sopenharmony_ci        group3.add_argument('-e')
31097db96d56Sopenharmony_ci        group3.add_argument('-f')
31107db96d56Sopenharmony_ci        return parser
31117db96d56Sopenharmony_ci
31127db96d56Sopenharmony_ci    usage_when_not_required = '''\
31137db96d56Sopenharmony_ci        usage: PROG [-h] [-a A | -b B | [-c C | -d D | [-e E | -f F]]]
31147db96d56Sopenharmony_ci        '''
31157db96d56Sopenharmony_ci    usage_when_required = '''\
31167db96d56Sopenharmony_ci        usage: PROG [-h] (-a A | -b B | (-c C | -d D | (-e E | -f F)))
31177db96d56Sopenharmony_ci        '''
31187db96d56Sopenharmony_ci
31197db96d56Sopenharmony_ci    help = '''\
31207db96d56Sopenharmony_ci
31217db96d56Sopenharmony_ci        options:
31227db96d56Sopenharmony_ci          -h, --help  show this help message and exit
31237db96d56Sopenharmony_ci          -a A
31247db96d56Sopenharmony_ci          -b B
31257db96d56Sopenharmony_ci          -c C
31267db96d56Sopenharmony_ci          -d D
31277db96d56Sopenharmony_ci          -e E
31287db96d56Sopenharmony_ci          -f F
31297db96d56Sopenharmony_ci        '''
31307db96d56Sopenharmony_ci
31317db96d56Sopenharmony_ci    # We are only interested in testing the behavior of format_usage().
31327db96d56Sopenharmony_ci    test_failures_when_not_required = None
31337db96d56Sopenharmony_ci    test_failures_when_required = None
31347db96d56Sopenharmony_ci    test_successes_when_not_required = None
31357db96d56Sopenharmony_ci    test_successes_when_required = None
31367db96d56Sopenharmony_ci
31377db96d56Sopenharmony_ci# =================================================
31387db96d56Sopenharmony_ci# Mutually exclusive group in parent parser tests
31397db96d56Sopenharmony_ci# =================================================
31407db96d56Sopenharmony_ci
31417db96d56Sopenharmony_ciclass MEPBase(object):
31427db96d56Sopenharmony_ci
31437db96d56Sopenharmony_ci    def get_parser(self, required=None):
31447db96d56Sopenharmony_ci        parent = super(MEPBase, self).get_parser(required=required)
31457db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(
31467db96d56Sopenharmony_ci            prog=parent.prog, add_help=False, parents=[parent])
31477db96d56Sopenharmony_ci        return parser
31487db96d56Sopenharmony_ci
31497db96d56Sopenharmony_ci
31507db96d56Sopenharmony_ciclass TestMutuallyExclusiveGroupErrorsParent(
31517db96d56Sopenharmony_ci    MEPBase, TestMutuallyExclusiveGroupErrors):
31527db96d56Sopenharmony_ci    pass
31537db96d56Sopenharmony_ci
31547db96d56Sopenharmony_ci
31557db96d56Sopenharmony_ciclass TestMutuallyExclusiveSimpleParent(
31567db96d56Sopenharmony_ci    MEPBase, TestMutuallyExclusiveSimple):
31577db96d56Sopenharmony_ci    pass
31587db96d56Sopenharmony_ci
31597db96d56Sopenharmony_ci
31607db96d56Sopenharmony_ciclass TestMutuallyExclusiveLongParent(
31617db96d56Sopenharmony_ci    MEPBase, TestMutuallyExclusiveLong):
31627db96d56Sopenharmony_ci    pass
31637db96d56Sopenharmony_ci
31647db96d56Sopenharmony_ci
31657db96d56Sopenharmony_ciclass TestMutuallyExclusiveFirstSuppressedParent(
31667db96d56Sopenharmony_ci    MEPBase, TestMutuallyExclusiveFirstSuppressed):
31677db96d56Sopenharmony_ci    pass
31687db96d56Sopenharmony_ci
31697db96d56Sopenharmony_ci
31707db96d56Sopenharmony_ciclass TestMutuallyExclusiveManySuppressedParent(
31717db96d56Sopenharmony_ci    MEPBase, TestMutuallyExclusiveManySuppressed):
31727db96d56Sopenharmony_ci    pass
31737db96d56Sopenharmony_ci
31747db96d56Sopenharmony_ci
31757db96d56Sopenharmony_ciclass TestMutuallyExclusiveOptionalAndPositionalParent(
31767db96d56Sopenharmony_ci    MEPBase, TestMutuallyExclusiveOptionalAndPositional):
31777db96d56Sopenharmony_ci    pass
31787db96d56Sopenharmony_ci
31797db96d56Sopenharmony_ci
31807db96d56Sopenharmony_ciclass TestMutuallyExclusiveOptionalsMixedParent(
31817db96d56Sopenharmony_ci    MEPBase, TestMutuallyExclusiveOptionalsMixed):
31827db96d56Sopenharmony_ci    pass
31837db96d56Sopenharmony_ci
31847db96d56Sopenharmony_ci
31857db96d56Sopenharmony_ciclass TestMutuallyExclusiveOptionalsAndPositionalsMixedParent(
31867db96d56Sopenharmony_ci    MEPBase, TestMutuallyExclusiveOptionalsAndPositionalsMixed):
31877db96d56Sopenharmony_ci    pass
31887db96d56Sopenharmony_ci
31897db96d56Sopenharmony_ci# =================
31907db96d56Sopenharmony_ci# Set default tests
31917db96d56Sopenharmony_ci# =================
31927db96d56Sopenharmony_ci
31937db96d56Sopenharmony_ciclass TestSetDefaults(TestCase):
31947db96d56Sopenharmony_ci
31957db96d56Sopenharmony_ci    def test_set_defaults_no_args(self):
31967db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
31977db96d56Sopenharmony_ci        parser.set_defaults(x='foo')
31987db96d56Sopenharmony_ci        parser.set_defaults(y='bar', z=1)
31997db96d56Sopenharmony_ci        self.assertEqual(NS(x='foo', y='bar', z=1),
32007db96d56Sopenharmony_ci                         parser.parse_args([]))
32017db96d56Sopenharmony_ci        self.assertEqual(NS(x='foo', y='bar', z=1),
32027db96d56Sopenharmony_ci                         parser.parse_args([], NS()))
32037db96d56Sopenharmony_ci        self.assertEqual(NS(x='baz', y='bar', z=1),
32047db96d56Sopenharmony_ci                         parser.parse_args([], NS(x='baz')))
32057db96d56Sopenharmony_ci        self.assertEqual(NS(x='baz', y='bar', z=2),
32067db96d56Sopenharmony_ci                         parser.parse_args([], NS(x='baz', z=2)))
32077db96d56Sopenharmony_ci
32087db96d56Sopenharmony_ci    def test_set_defaults_with_args(self):
32097db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
32107db96d56Sopenharmony_ci        parser.set_defaults(x='foo', y='bar')
32117db96d56Sopenharmony_ci        parser.add_argument('-x', default='xfoox')
32127db96d56Sopenharmony_ci        self.assertEqual(NS(x='xfoox', y='bar'),
32137db96d56Sopenharmony_ci                         parser.parse_args([]))
32147db96d56Sopenharmony_ci        self.assertEqual(NS(x='xfoox', y='bar'),
32157db96d56Sopenharmony_ci                         parser.parse_args([], NS()))
32167db96d56Sopenharmony_ci        self.assertEqual(NS(x='baz', y='bar'),
32177db96d56Sopenharmony_ci                         parser.parse_args([], NS(x='baz')))
32187db96d56Sopenharmony_ci        self.assertEqual(NS(x='1', y='bar'),
32197db96d56Sopenharmony_ci                         parser.parse_args('-x 1'.split()))
32207db96d56Sopenharmony_ci        self.assertEqual(NS(x='1', y='bar'),
32217db96d56Sopenharmony_ci                         parser.parse_args('-x 1'.split(), NS()))
32227db96d56Sopenharmony_ci        self.assertEqual(NS(x='1', y='bar'),
32237db96d56Sopenharmony_ci                         parser.parse_args('-x 1'.split(), NS(x='baz')))
32247db96d56Sopenharmony_ci
32257db96d56Sopenharmony_ci    def test_set_defaults_subparsers(self):
32267db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
32277db96d56Sopenharmony_ci        parser.set_defaults(x='foo')
32287db96d56Sopenharmony_ci        subparsers = parser.add_subparsers()
32297db96d56Sopenharmony_ci        parser_a = subparsers.add_parser('a')
32307db96d56Sopenharmony_ci        parser_a.set_defaults(y='bar')
32317db96d56Sopenharmony_ci        self.assertEqual(NS(x='foo', y='bar'),
32327db96d56Sopenharmony_ci                         parser.parse_args('a'.split()))
32337db96d56Sopenharmony_ci
32347db96d56Sopenharmony_ci    def test_set_defaults_parents(self):
32357db96d56Sopenharmony_ci        parent = ErrorRaisingArgumentParser(add_help=False)
32367db96d56Sopenharmony_ci        parent.set_defaults(x='foo')
32377db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(parents=[parent])
32387db96d56Sopenharmony_ci        self.assertEqual(NS(x='foo'), parser.parse_args([]))
32397db96d56Sopenharmony_ci
32407db96d56Sopenharmony_ci    def test_set_defaults_on_parent_and_subparser(self):
32417db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
32427db96d56Sopenharmony_ci        xparser = parser.add_subparsers().add_parser('X')
32437db96d56Sopenharmony_ci        parser.set_defaults(foo=1)
32447db96d56Sopenharmony_ci        xparser.set_defaults(foo=2)
32457db96d56Sopenharmony_ci        self.assertEqual(NS(foo=2), parser.parse_args(['X']))
32467db96d56Sopenharmony_ci
32477db96d56Sopenharmony_ci    def test_set_defaults_same_as_add_argument(self):
32487db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
32497db96d56Sopenharmony_ci        parser.set_defaults(w='W', x='X', y='Y', z='Z')
32507db96d56Sopenharmony_ci        parser.add_argument('-w')
32517db96d56Sopenharmony_ci        parser.add_argument('-x', default='XX')
32527db96d56Sopenharmony_ci        parser.add_argument('y', nargs='?')
32537db96d56Sopenharmony_ci        parser.add_argument('z', nargs='?', default='ZZ')
32547db96d56Sopenharmony_ci
32557db96d56Sopenharmony_ci        # defaults set previously
32567db96d56Sopenharmony_ci        self.assertEqual(NS(w='W', x='XX', y='Y', z='ZZ'),
32577db96d56Sopenharmony_ci                         parser.parse_args([]))
32587db96d56Sopenharmony_ci
32597db96d56Sopenharmony_ci        # reset defaults
32607db96d56Sopenharmony_ci        parser.set_defaults(w='WW', x='X', y='YY', z='Z')
32617db96d56Sopenharmony_ci        self.assertEqual(NS(w='WW', x='X', y='YY', z='Z'),
32627db96d56Sopenharmony_ci                         parser.parse_args([]))
32637db96d56Sopenharmony_ci
32647db96d56Sopenharmony_ci    def test_set_defaults_same_as_add_argument_group(self):
32657db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
32667db96d56Sopenharmony_ci        parser.set_defaults(w='W', x='X', y='Y', z='Z')
32677db96d56Sopenharmony_ci        group = parser.add_argument_group('foo')
32687db96d56Sopenharmony_ci        group.add_argument('-w')
32697db96d56Sopenharmony_ci        group.add_argument('-x', default='XX')
32707db96d56Sopenharmony_ci        group.add_argument('y', nargs='?')
32717db96d56Sopenharmony_ci        group.add_argument('z', nargs='?', default='ZZ')
32727db96d56Sopenharmony_ci
32737db96d56Sopenharmony_ci
32747db96d56Sopenharmony_ci        # defaults set previously
32757db96d56Sopenharmony_ci        self.assertEqual(NS(w='W', x='XX', y='Y', z='ZZ'),
32767db96d56Sopenharmony_ci                         parser.parse_args([]))
32777db96d56Sopenharmony_ci
32787db96d56Sopenharmony_ci        # reset defaults
32797db96d56Sopenharmony_ci        parser.set_defaults(w='WW', x='X', y='YY', z='Z')
32807db96d56Sopenharmony_ci        self.assertEqual(NS(w='WW', x='X', y='YY', z='Z'),
32817db96d56Sopenharmony_ci                         parser.parse_args([]))
32827db96d56Sopenharmony_ci
32837db96d56Sopenharmony_ci# =================
32847db96d56Sopenharmony_ci# Get default tests
32857db96d56Sopenharmony_ci# =================
32867db96d56Sopenharmony_ci
32877db96d56Sopenharmony_ciclass TestGetDefault(TestCase):
32887db96d56Sopenharmony_ci
32897db96d56Sopenharmony_ci    def test_get_default(self):
32907db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
32917db96d56Sopenharmony_ci        self.assertIsNone(parser.get_default("foo"))
32927db96d56Sopenharmony_ci        self.assertIsNone(parser.get_default("bar"))
32937db96d56Sopenharmony_ci
32947db96d56Sopenharmony_ci        parser.add_argument("--foo")
32957db96d56Sopenharmony_ci        self.assertIsNone(parser.get_default("foo"))
32967db96d56Sopenharmony_ci        self.assertIsNone(parser.get_default("bar"))
32977db96d56Sopenharmony_ci
32987db96d56Sopenharmony_ci        parser.add_argument("--bar", type=int, default=42)
32997db96d56Sopenharmony_ci        self.assertIsNone(parser.get_default("foo"))
33007db96d56Sopenharmony_ci        self.assertEqual(42, parser.get_default("bar"))
33017db96d56Sopenharmony_ci
33027db96d56Sopenharmony_ci        parser.set_defaults(foo="badger")
33037db96d56Sopenharmony_ci        self.assertEqual("badger", parser.get_default("foo"))
33047db96d56Sopenharmony_ci        self.assertEqual(42, parser.get_default("bar"))
33057db96d56Sopenharmony_ci
33067db96d56Sopenharmony_ci# ==========================
33077db96d56Sopenharmony_ci# Namespace 'contains' tests
33087db96d56Sopenharmony_ci# ==========================
33097db96d56Sopenharmony_ci
33107db96d56Sopenharmony_ciclass TestNamespaceContainsSimple(TestCase):
33117db96d56Sopenharmony_ci
33127db96d56Sopenharmony_ci    def test_empty(self):
33137db96d56Sopenharmony_ci        ns = argparse.Namespace()
33147db96d56Sopenharmony_ci        self.assertNotIn('', ns)
33157db96d56Sopenharmony_ci        self.assertNotIn('x', ns)
33167db96d56Sopenharmony_ci
33177db96d56Sopenharmony_ci    def test_non_empty(self):
33187db96d56Sopenharmony_ci        ns = argparse.Namespace(x=1, y=2)
33197db96d56Sopenharmony_ci        self.assertNotIn('', ns)
33207db96d56Sopenharmony_ci        self.assertIn('x', ns)
33217db96d56Sopenharmony_ci        self.assertIn('y', ns)
33227db96d56Sopenharmony_ci        self.assertNotIn('xx', ns)
33237db96d56Sopenharmony_ci        self.assertNotIn('z', ns)
33247db96d56Sopenharmony_ci
33257db96d56Sopenharmony_ci# =====================
33267db96d56Sopenharmony_ci# Help formatting tests
33277db96d56Sopenharmony_ci# =====================
33287db96d56Sopenharmony_ci
33297db96d56Sopenharmony_ciclass TestHelpFormattingMetaclass(type):
33307db96d56Sopenharmony_ci
33317db96d56Sopenharmony_ci    def __init__(cls, name, bases, bodydict):
33327db96d56Sopenharmony_ci        if name == 'HelpTestCase':
33337db96d56Sopenharmony_ci            return
33347db96d56Sopenharmony_ci
33357db96d56Sopenharmony_ci        class AddTests(object):
33367db96d56Sopenharmony_ci
33377db96d56Sopenharmony_ci            def __init__(self, test_class, func_suffix, std_name):
33387db96d56Sopenharmony_ci                self.func_suffix = func_suffix
33397db96d56Sopenharmony_ci                self.std_name = std_name
33407db96d56Sopenharmony_ci
33417db96d56Sopenharmony_ci                for test_func in [self.test_format,
33427db96d56Sopenharmony_ci                                  self.test_print,
33437db96d56Sopenharmony_ci                                  self.test_print_file]:
33447db96d56Sopenharmony_ci                    test_name = '%s_%s' % (test_func.__name__, func_suffix)
33457db96d56Sopenharmony_ci
33467db96d56Sopenharmony_ci                    def test_wrapper(self, test_func=test_func):
33477db96d56Sopenharmony_ci                        test_func(self)
33487db96d56Sopenharmony_ci                    try:
33497db96d56Sopenharmony_ci                        test_wrapper.__name__ = test_name
33507db96d56Sopenharmony_ci                    except TypeError:
33517db96d56Sopenharmony_ci                        pass
33527db96d56Sopenharmony_ci                    setattr(test_class, test_name, test_wrapper)
33537db96d56Sopenharmony_ci
33547db96d56Sopenharmony_ci            def _get_parser(self, tester):
33557db96d56Sopenharmony_ci                parser = argparse.ArgumentParser(
33567db96d56Sopenharmony_ci                    *tester.parser_signature.args,
33577db96d56Sopenharmony_ci                    **tester.parser_signature.kwargs)
33587db96d56Sopenharmony_ci                for argument_sig in getattr(tester, 'argument_signatures', []):
33597db96d56Sopenharmony_ci                    parser.add_argument(*argument_sig.args,
33607db96d56Sopenharmony_ci                                        **argument_sig.kwargs)
33617db96d56Sopenharmony_ci                group_sigs = getattr(tester, 'argument_group_signatures', [])
33627db96d56Sopenharmony_ci                for group_sig, argument_sigs in group_sigs:
33637db96d56Sopenharmony_ci                    group = parser.add_argument_group(*group_sig.args,
33647db96d56Sopenharmony_ci                                                      **group_sig.kwargs)
33657db96d56Sopenharmony_ci                    for argument_sig in argument_sigs:
33667db96d56Sopenharmony_ci                        group.add_argument(*argument_sig.args,
33677db96d56Sopenharmony_ci                                           **argument_sig.kwargs)
33687db96d56Sopenharmony_ci                subparsers_sigs = getattr(tester, 'subparsers_signatures', [])
33697db96d56Sopenharmony_ci                if subparsers_sigs:
33707db96d56Sopenharmony_ci                    subparsers = parser.add_subparsers()
33717db96d56Sopenharmony_ci                    for subparser_sig in subparsers_sigs:
33727db96d56Sopenharmony_ci                        subparsers.add_parser(*subparser_sig.args,
33737db96d56Sopenharmony_ci                                               **subparser_sig.kwargs)
33747db96d56Sopenharmony_ci                return parser
33757db96d56Sopenharmony_ci
33767db96d56Sopenharmony_ci            def _test(self, tester, parser_text):
33777db96d56Sopenharmony_ci                expected_text = getattr(tester, self.func_suffix)
33787db96d56Sopenharmony_ci                expected_text = textwrap.dedent(expected_text)
33797db96d56Sopenharmony_ci                tester.maxDiff = None
33807db96d56Sopenharmony_ci                tester.assertEqual(expected_text, parser_text)
33817db96d56Sopenharmony_ci
33827db96d56Sopenharmony_ci            def test_format(self, tester):
33837db96d56Sopenharmony_ci                parser = self._get_parser(tester)
33847db96d56Sopenharmony_ci                format = getattr(parser, 'format_%s' % self.func_suffix)
33857db96d56Sopenharmony_ci                self._test(tester, format())
33867db96d56Sopenharmony_ci
33877db96d56Sopenharmony_ci            def test_print(self, tester):
33887db96d56Sopenharmony_ci                parser = self._get_parser(tester)
33897db96d56Sopenharmony_ci                print_ = getattr(parser, 'print_%s' % self.func_suffix)
33907db96d56Sopenharmony_ci                old_stream = getattr(sys, self.std_name)
33917db96d56Sopenharmony_ci                setattr(sys, self.std_name, StdIOBuffer())
33927db96d56Sopenharmony_ci                try:
33937db96d56Sopenharmony_ci                    print_()
33947db96d56Sopenharmony_ci                    parser_text = getattr(sys, self.std_name).getvalue()
33957db96d56Sopenharmony_ci                finally:
33967db96d56Sopenharmony_ci                    setattr(sys, self.std_name, old_stream)
33977db96d56Sopenharmony_ci                self._test(tester, parser_text)
33987db96d56Sopenharmony_ci
33997db96d56Sopenharmony_ci            def test_print_file(self, tester):
34007db96d56Sopenharmony_ci                parser = self._get_parser(tester)
34017db96d56Sopenharmony_ci                print_ = getattr(parser, 'print_%s' % self.func_suffix)
34027db96d56Sopenharmony_ci                sfile = StdIOBuffer()
34037db96d56Sopenharmony_ci                print_(sfile)
34047db96d56Sopenharmony_ci                parser_text = sfile.getvalue()
34057db96d56Sopenharmony_ci                self._test(tester, parser_text)
34067db96d56Sopenharmony_ci
34077db96d56Sopenharmony_ci        # add tests for {format,print}_{usage,help}
34087db96d56Sopenharmony_ci        for func_suffix, std_name in [('usage', 'stdout'),
34097db96d56Sopenharmony_ci                                      ('help', 'stdout')]:
34107db96d56Sopenharmony_ci            AddTests(cls, func_suffix, std_name)
34117db96d56Sopenharmony_ci
34127db96d56Sopenharmony_cibases = TestCase,
34137db96d56Sopenharmony_ciHelpTestCase = TestHelpFormattingMetaclass('HelpTestCase', bases, {})
34147db96d56Sopenharmony_ci
34157db96d56Sopenharmony_ci
34167db96d56Sopenharmony_ciclass TestHelpBiggerOptionals(HelpTestCase):
34177db96d56Sopenharmony_ci    """Make sure that argument help aligns when options are longer"""
34187db96d56Sopenharmony_ci
34197db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', description='DESCRIPTION',
34207db96d56Sopenharmony_ci                           epilog='EPILOG')
34217db96d56Sopenharmony_ci    argument_signatures = [
34227db96d56Sopenharmony_ci        Sig('-v', '--version', action='version', version='0.1'),
34237db96d56Sopenharmony_ci        Sig('-x', action='store_true', help='X HELP'),
34247db96d56Sopenharmony_ci        Sig('--y', help='Y HELP'),
34257db96d56Sopenharmony_ci        Sig('foo', help='FOO HELP'),
34267db96d56Sopenharmony_ci        Sig('bar', help='BAR HELP'),
34277db96d56Sopenharmony_ci    ]
34287db96d56Sopenharmony_ci    argument_group_signatures = []
34297db96d56Sopenharmony_ci    usage = '''\
34307db96d56Sopenharmony_ci        usage: PROG [-h] [-v] [-x] [--y Y] foo bar
34317db96d56Sopenharmony_ci        '''
34327db96d56Sopenharmony_ci    help = usage + '''\
34337db96d56Sopenharmony_ci
34347db96d56Sopenharmony_ci        DESCRIPTION
34357db96d56Sopenharmony_ci
34367db96d56Sopenharmony_ci        positional arguments:
34377db96d56Sopenharmony_ci          foo            FOO HELP
34387db96d56Sopenharmony_ci          bar            BAR HELP
34397db96d56Sopenharmony_ci
34407db96d56Sopenharmony_ci        options:
34417db96d56Sopenharmony_ci          -h, --help     show this help message and exit
34427db96d56Sopenharmony_ci          -v, --version  show program's version number and exit
34437db96d56Sopenharmony_ci          -x             X HELP
34447db96d56Sopenharmony_ci          --y Y          Y HELP
34457db96d56Sopenharmony_ci
34467db96d56Sopenharmony_ci        EPILOG
34477db96d56Sopenharmony_ci    '''
34487db96d56Sopenharmony_ci    version = '''\
34497db96d56Sopenharmony_ci        0.1
34507db96d56Sopenharmony_ci        '''
34517db96d56Sopenharmony_ci
34527db96d56Sopenharmony_ciclass TestShortColumns(HelpTestCase):
34537db96d56Sopenharmony_ci    '''Test extremely small number of columns.
34547db96d56Sopenharmony_ci
34557db96d56Sopenharmony_ci    TestCase prevents "COLUMNS" from being too small in the tests themselves,
34567db96d56Sopenharmony_ci    but we don't want any exceptions thrown in such cases. Only ugly representation.
34577db96d56Sopenharmony_ci    '''
34587db96d56Sopenharmony_ci    def setUp(self):
34597db96d56Sopenharmony_ci        env = self.enterContext(os_helper.EnvironmentVarGuard())
34607db96d56Sopenharmony_ci        env.set("COLUMNS", '15')
34617db96d56Sopenharmony_ci
34627db96d56Sopenharmony_ci    parser_signature            = TestHelpBiggerOptionals.parser_signature
34637db96d56Sopenharmony_ci    argument_signatures         = TestHelpBiggerOptionals.argument_signatures
34647db96d56Sopenharmony_ci    argument_group_signatures   = TestHelpBiggerOptionals.argument_group_signatures
34657db96d56Sopenharmony_ci    usage = '''\
34667db96d56Sopenharmony_ci        usage: PROG
34677db96d56Sopenharmony_ci               [-h]
34687db96d56Sopenharmony_ci               [-v]
34697db96d56Sopenharmony_ci               [-x]
34707db96d56Sopenharmony_ci               [--y Y]
34717db96d56Sopenharmony_ci               foo
34727db96d56Sopenharmony_ci               bar
34737db96d56Sopenharmony_ci        '''
34747db96d56Sopenharmony_ci    help = usage + '''\
34757db96d56Sopenharmony_ci
34767db96d56Sopenharmony_ci        DESCRIPTION
34777db96d56Sopenharmony_ci
34787db96d56Sopenharmony_ci        positional arguments:
34797db96d56Sopenharmony_ci          foo
34807db96d56Sopenharmony_ci            FOO HELP
34817db96d56Sopenharmony_ci          bar
34827db96d56Sopenharmony_ci            BAR HELP
34837db96d56Sopenharmony_ci
34847db96d56Sopenharmony_ci        options:
34857db96d56Sopenharmony_ci          -h, --help
34867db96d56Sopenharmony_ci            show this
34877db96d56Sopenharmony_ci            help
34887db96d56Sopenharmony_ci            message and
34897db96d56Sopenharmony_ci            exit
34907db96d56Sopenharmony_ci          -v, --version
34917db96d56Sopenharmony_ci            show
34927db96d56Sopenharmony_ci            program's
34937db96d56Sopenharmony_ci            version
34947db96d56Sopenharmony_ci            number and
34957db96d56Sopenharmony_ci            exit
34967db96d56Sopenharmony_ci          -x
34977db96d56Sopenharmony_ci            X HELP
34987db96d56Sopenharmony_ci          --y Y
34997db96d56Sopenharmony_ci            Y HELP
35007db96d56Sopenharmony_ci
35017db96d56Sopenharmony_ci        EPILOG
35027db96d56Sopenharmony_ci    '''
35037db96d56Sopenharmony_ci    version                     = TestHelpBiggerOptionals.version
35047db96d56Sopenharmony_ci
35057db96d56Sopenharmony_ci
35067db96d56Sopenharmony_ciclass TestHelpBiggerOptionalGroups(HelpTestCase):
35077db96d56Sopenharmony_ci    """Make sure that argument help aligns when options are longer"""
35087db96d56Sopenharmony_ci
35097db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', description='DESCRIPTION',
35107db96d56Sopenharmony_ci                           epilog='EPILOG')
35117db96d56Sopenharmony_ci    argument_signatures = [
35127db96d56Sopenharmony_ci        Sig('-v', '--version', action='version', version='0.1'),
35137db96d56Sopenharmony_ci        Sig('-x', action='store_true', help='X HELP'),
35147db96d56Sopenharmony_ci        Sig('--y', help='Y HELP'),
35157db96d56Sopenharmony_ci        Sig('foo', help='FOO HELP'),
35167db96d56Sopenharmony_ci        Sig('bar', help='BAR HELP'),
35177db96d56Sopenharmony_ci    ]
35187db96d56Sopenharmony_ci    argument_group_signatures = [
35197db96d56Sopenharmony_ci        (Sig('GROUP TITLE', description='GROUP DESCRIPTION'), [
35207db96d56Sopenharmony_ci            Sig('baz', help='BAZ HELP'),
35217db96d56Sopenharmony_ci            Sig('-z', nargs='+', help='Z HELP')]),
35227db96d56Sopenharmony_ci    ]
35237db96d56Sopenharmony_ci    usage = '''\
35247db96d56Sopenharmony_ci        usage: PROG [-h] [-v] [-x] [--y Y] [-z Z [Z ...]] foo bar baz
35257db96d56Sopenharmony_ci        '''
35267db96d56Sopenharmony_ci    help = usage + '''\
35277db96d56Sopenharmony_ci
35287db96d56Sopenharmony_ci        DESCRIPTION
35297db96d56Sopenharmony_ci
35307db96d56Sopenharmony_ci        positional arguments:
35317db96d56Sopenharmony_ci          foo            FOO HELP
35327db96d56Sopenharmony_ci          bar            BAR HELP
35337db96d56Sopenharmony_ci
35347db96d56Sopenharmony_ci        options:
35357db96d56Sopenharmony_ci          -h, --help     show this help message and exit
35367db96d56Sopenharmony_ci          -v, --version  show program's version number and exit
35377db96d56Sopenharmony_ci          -x             X HELP
35387db96d56Sopenharmony_ci          --y Y          Y HELP
35397db96d56Sopenharmony_ci
35407db96d56Sopenharmony_ci        GROUP TITLE:
35417db96d56Sopenharmony_ci          GROUP DESCRIPTION
35427db96d56Sopenharmony_ci
35437db96d56Sopenharmony_ci          baz            BAZ HELP
35447db96d56Sopenharmony_ci          -z Z [Z ...]   Z HELP
35457db96d56Sopenharmony_ci
35467db96d56Sopenharmony_ci        EPILOG
35477db96d56Sopenharmony_ci    '''
35487db96d56Sopenharmony_ci    version = '''\
35497db96d56Sopenharmony_ci        0.1
35507db96d56Sopenharmony_ci        '''
35517db96d56Sopenharmony_ci
35527db96d56Sopenharmony_ci
35537db96d56Sopenharmony_ciclass TestHelpBiggerPositionals(HelpTestCase):
35547db96d56Sopenharmony_ci    """Make sure that help aligns when arguments are longer"""
35557db96d56Sopenharmony_ci
35567db96d56Sopenharmony_ci    parser_signature = Sig(usage='USAGE', description='DESCRIPTION')
35577db96d56Sopenharmony_ci    argument_signatures = [
35587db96d56Sopenharmony_ci        Sig('-x', action='store_true', help='X HELP'),
35597db96d56Sopenharmony_ci        Sig('--y', help='Y HELP'),
35607db96d56Sopenharmony_ci        Sig('ekiekiekifekang', help='EKI HELP'),
35617db96d56Sopenharmony_ci        Sig('bar', help='BAR HELP'),
35627db96d56Sopenharmony_ci    ]
35637db96d56Sopenharmony_ci    argument_group_signatures = []
35647db96d56Sopenharmony_ci    usage = '''\
35657db96d56Sopenharmony_ci        usage: USAGE
35667db96d56Sopenharmony_ci        '''
35677db96d56Sopenharmony_ci    help = usage + '''\
35687db96d56Sopenharmony_ci
35697db96d56Sopenharmony_ci        DESCRIPTION
35707db96d56Sopenharmony_ci
35717db96d56Sopenharmony_ci        positional arguments:
35727db96d56Sopenharmony_ci          ekiekiekifekang  EKI HELP
35737db96d56Sopenharmony_ci          bar              BAR HELP
35747db96d56Sopenharmony_ci
35757db96d56Sopenharmony_ci        options:
35767db96d56Sopenharmony_ci          -h, --help       show this help message and exit
35777db96d56Sopenharmony_ci          -x               X HELP
35787db96d56Sopenharmony_ci          --y Y            Y HELP
35797db96d56Sopenharmony_ci        '''
35807db96d56Sopenharmony_ci
35817db96d56Sopenharmony_ci    version = ''
35827db96d56Sopenharmony_ci
35837db96d56Sopenharmony_ci
35847db96d56Sopenharmony_ciclass TestHelpReformatting(HelpTestCase):
35857db96d56Sopenharmony_ci    """Make sure that text after short names starts on the first line"""
35867db96d56Sopenharmony_ci
35877db96d56Sopenharmony_ci    parser_signature = Sig(
35887db96d56Sopenharmony_ci        prog='PROG',
35897db96d56Sopenharmony_ci        description='   oddly    formatted\n'
35907db96d56Sopenharmony_ci                    'description\n'
35917db96d56Sopenharmony_ci                    '\n'
35927db96d56Sopenharmony_ci                    'that is so long that it should go onto multiple '
35937db96d56Sopenharmony_ci                    'lines when wrapped')
35947db96d56Sopenharmony_ci    argument_signatures = [
35957db96d56Sopenharmony_ci        Sig('-x', metavar='XX', help='oddly\n'
35967db96d56Sopenharmony_ci                                     '    formatted -x help'),
35977db96d56Sopenharmony_ci        Sig('y', metavar='yyy', help='normal y help'),
35987db96d56Sopenharmony_ci    ]
35997db96d56Sopenharmony_ci    argument_group_signatures = [
36007db96d56Sopenharmony_ci        (Sig('title', description='\n'
36017db96d56Sopenharmony_ci                                  '    oddly formatted group\n'
36027db96d56Sopenharmony_ci                                  '\n'
36037db96d56Sopenharmony_ci                                  'description'),
36047db96d56Sopenharmony_ci         [Sig('-a', action='store_true',
36057db96d56Sopenharmony_ci              help=' oddly \n'
36067db96d56Sopenharmony_ci                   'formatted    -a  help  \n'
36077db96d56Sopenharmony_ci                   '    again, so long that it should be wrapped over '
36087db96d56Sopenharmony_ci                   'multiple lines')]),
36097db96d56Sopenharmony_ci    ]
36107db96d56Sopenharmony_ci    usage = '''\
36117db96d56Sopenharmony_ci        usage: PROG [-h] [-x XX] [-a] yyy
36127db96d56Sopenharmony_ci        '''
36137db96d56Sopenharmony_ci    help = usage + '''\
36147db96d56Sopenharmony_ci
36157db96d56Sopenharmony_ci        oddly formatted description that is so long that it should go onto \
36167db96d56Sopenharmony_cimultiple
36177db96d56Sopenharmony_ci        lines when wrapped
36187db96d56Sopenharmony_ci
36197db96d56Sopenharmony_ci        positional arguments:
36207db96d56Sopenharmony_ci          yyy         normal y help
36217db96d56Sopenharmony_ci
36227db96d56Sopenharmony_ci        options:
36237db96d56Sopenharmony_ci          -h, --help  show this help message and exit
36247db96d56Sopenharmony_ci          -x XX       oddly formatted -x help
36257db96d56Sopenharmony_ci
36267db96d56Sopenharmony_ci        title:
36277db96d56Sopenharmony_ci          oddly formatted group description
36287db96d56Sopenharmony_ci
36297db96d56Sopenharmony_ci          -a          oddly formatted -a help again, so long that it should \
36307db96d56Sopenharmony_cibe wrapped
36317db96d56Sopenharmony_ci                      over multiple lines
36327db96d56Sopenharmony_ci        '''
36337db96d56Sopenharmony_ci    version = ''
36347db96d56Sopenharmony_ci
36357db96d56Sopenharmony_ci
36367db96d56Sopenharmony_ciclass TestHelpWrappingShortNames(HelpTestCase):
36377db96d56Sopenharmony_ci    """Make sure that text after short names starts on the first line"""
36387db96d56Sopenharmony_ci
36397db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', description= 'D\nD' * 30)
36407db96d56Sopenharmony_ci    argument_signatures = [
36417db96d56Sopenharmony_ci        Sig('-x', metavar='XX', help='XHH HX' * 20),
36427db96d56Sopenharmony_ci        Sig('y', metavar='yyy', help='YH YH' * 20),
36437db96d56Sopenharmony_ci    ]
36447db96d56Sopenharmony_ci    argument_group_signatures = [
36457db96d56Sopenharmony_ci        (Sig('ALPHAS'), [
36467db96d56Sopenharmony_ci            Sig('-a', action='store_true', help='AHHH HHA' * 10)]),
36477db96d56Sopenharmony_ci    ]
36487db96d56Sopenharmony_ci    usage = '''\
36497db96d56Sopenharmony_ci        usage: PROG [-h] [-x XX] [-a] yyy
36507db96d56Sopenharmony_ci        '''
36517db96d56Sopenharmony_ci    help = usage + '''\
36527db96d56Sopenharmony_ci
36537db96d56Sopenharmony_ci        D DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD \
36547db96d56Sopenharmony_ciDD DD DD
36557db96d56Sopenharmony_ci        DD DD DD DD D
36567db96d56Sopenharmony_ci
36577db96d56Sopenharmony_ci        positional arguments:
36587db96d56Sopenharmony_ci          yyy         YH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH \
36597db96d56Sopenharmony_ciYHYH YHYH
36607db96d56Sopenharmony_ci                      YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH
36617db96d56Sopenharmony_ci
36627db96d56Sopenharmony_ci        options:
36637db96d56Sopenharmony_ci          -h, --help  show this help message and exit
36647db96d56Sopenharmony_ci          -x XX       XHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH \
36657db96d56Sopenharmony_ciHXXHH HXXHH
36667db96d56Sopenharmony_ci                      HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HX
36677db96d56Sopenharmony_ci
36687db96d56Sopenharmony_ci        ALPHAS:
36697db96d56Sopenharmony_ci          -a          AHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH \
36707db96d56Sopenharmony_ciHHAAHHH
36717db96d56Sopenharmony_ci                      HHAAHHH HHAAHHH HHA
36727db96d56Sopenharmony_ci        '''
36737db96d56Sopenharmony_ci    version = ''
36747db96d56Sopenharmony_ci
36757db96d56Sopenharmony_ci
36767db96d56Sopenharmony_ciclass TestHelpWrappingLongNames(HelpTestCase):
36777db96d56Sopenharmony_ci    """Make sure that text after long names starts on the next line"""
36787db96d56Sopenharmony_ci
36797db96d56Sopenharmony_ci    parser_signature = Sig(usage='USAGE', description= 'D D' * 30)
36807db96d56Sopenharmony_ci    argument_signatures = [
36817db96d56Sopenharmony_ci        Sig('-v', '--version', action='version', version='V V' * 30),
36827db96d56Sopenharmony_ci        Sig('-x', metavar='X' * 25, help='XH XH' * 20),
36837db96d56Sopenharmony_ci        Sig('y', metavar='y' * 25, help='YH YH' * 20),
36847db96d56Sopenharmony_ci    ]
36857db96d56Sopenharmony_ci    argument_group_signatures = [
36867db96d56Sopenharmony_ci        (Sig('ALPHAS'), [
36877db96d56Sopenharmony_ci            Sig('-a', metavar='A' * 25, help='AH AH' * 20),
36887db96d56Sopenharmony_ci            Sig('z', metavar='z' * 25, help='ZH ZH' * 20)]),
36897db96d56Sopenharmony_ci    ]
36907db96d56Sopenharmony_ci    usage = '''\
36917db96d56Sopenharmony_ci        usage: USAGE
36927db96d56Sopenharmony_ci        '''
36937db96d56Sopenharmony_ci    help = usage + '''\
36947db96d56Sopenharmony_ci
36957db96d56Sopenharmony_ci        D DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD \
36967db96d56Sopenharmony_ciDD DD DD
36977db96d56Sopenharmony_ci        DD DD DD DD D
36987db96d56Sopenharmony_ci
36997db96d56Sopenharmony_ci        positional arguments:
37007db96d56Sopenharmony_ci          yyyyyyyyyyyyyyyyyyyyyyyyy
37017db96d56Sopenharmony_ci                                YH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH \
37027db96d56Sopenharmony_ciYHYH YHYH
37037db96d56Sopenharmony_ci                                YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH
37047db96d56Sopenharmony_ci
37057db96d56Sopenharmony_ci        options:
37067db96d56Sopenharmony_ci          -h, --help            show this help message and exit
37077db96d56Sopenharmony_ci          -v, --version         show program's version number and exit
37087db96d56Sopenharmony_ci          -x XXXXXXXXXXXXXXXXXXXXXXXXX
37097db96d56Sopenharmony_ci                                XH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH \
37107db96d56Sopenharmony_ciXHXH XHXH
37117db96d56Sopenharmony_ci                                XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XH
37127db96d56Sopenharmony_ci
37137db96d56Sopenharmony_ci        ALPHAS:
37147db96d56Sopenharmony_ci          -a AAAAAAAAAAAAAAAAAAAAAAAAA
37157db96d56Sopenharmony_ci                                AH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH \
37167db96d56Sopenharmony_ciAHAH AHAH
37177db96d56Sopenharmony_ci                                AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AH
37187db96d56Sopenharmony_ci          zzzzzzzzzzzzzzzzzzzzzzzzz
37197db96d56Sopenharmony_ci                                ZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH \
37207db96d56Sopenharmony_ciZHZH ZHZH
37217db96d56Sopenharmony_ci                                ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZH
37227db96d56Sopenharmony_ci        '''
37237db96d56Sopenharmony_ci    version = '''\
37247db96d56Sopenharmony_ci        V VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV \
37257db96d56Sopenharmony_ciVV VV VV
37267db96d56Sopenharmony_ci        VV VV VV VV V
37277db96d56Sopenharmony_ci        '''
37287db96d56Sopenharmony_ci
37297db96d56Sopenharmony_ci
37307db96d56Sopenharmony_ciclass TestHelpUsage(HelpTestCase):
37317db96d56Sopenharmony_ci    """Test basic usage messages"""
37327db96d56Sopenharmony_ci
37337db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
37347db96d56Sopenharmony_ci    argument_signatures = [
37357db96d56Sopenharmony_ci        Sig('-w', nargs='+', help='w'),
37367db96d56Sopenharmony_ci        Sig('-x', nargs='*', help='x'),
37377db96d56Sopenharmony_ci        Sig('a', help='a'),
37387db96d56Sopenharmony_ci        Sig('b', help='b', nargs=2),
37397db96d56Sopenharmony_ci        Sig('c', help='c', nargs='?'),
37407db96d56Sopenharmony_ci        Sig('--foo', help='Whether to foo', action=argparse.BooleanOptionalAction),
37417db96d56Sopenharmony_ci        Sig('--bar', help='Whether to bar', default=True,
37427db96d56Sopenharmony_ci                     action=argparse.BooleanOptionalAction),
37437db96d56Sopenharmony_ci        Sig('-f', '--foobar', '--barfoo', action=argparse.BooleanOptionalAction),
37447db96d56Sopenharmony_ci        Sig('--bazz', action=argparse.BooleanOptionalAction,
37457db96d56Sopenharmony_ci                      default=argparse.SUPPRESS, help='Bazz!'),
37467db96d56Sopenharmony_ci    ]
37477db96d56Sopenharmony_ci    argument_group_signatures = [
37487db96d56Sopenharmony_ci        (Sig('group'), [
37497db96d56Sopenharmony_ci            Sig('-y', nargs='?', help='y'),
37507db96d56Sopenharmony_ci            Sig('-z', nargs=3, help='z'),
37517db96d56Sopenharmony_ci            Sig('d', help='d', nargs='*'),
37527db96d56Sopenharmony_ci            Sig('e', help='e', nargs='+'),
37537db96d56Sopenharmony_ci        ])
37547db96d56Sopenharmony_ci    ]
37557db96d56Sopenharmony_ci    usage = '''\
37567db96d56Sopenharmony_ci        usage: PROG [-h] [-w W [W ...]] [-x [X ...]] [--foo | --no-foo]
37577db96d56Sopenharmony_ci                    [--bar | --no-bar]
37587db96d56Sopenharmony_ci                    [-f | --foobar | --no-foobar | --barfoo | --no-barfoo]
37597db96d56Sopenharmony_ci                    [--bazz | --no-bazz] [-y [Y]] [-z Z Z Z]
37607db96d56Sopenharmony_ci                    a b b [c] [d ...] e [e ...]
37617db96d56Sopenharmony_ci        '''
37627db96d56Sopenharmony_ci    help = usage + '''\
37637db96d56Sopenharmony_ci
37647db96d56Sopenharmony_ci        positional arguments:
37657db96d56Sopenharmony_ci          a                     a
37667db96d56Sopenharmony_ci          b                     b
37677db96d56Sopenharmony_ci          c                     c
37687db96d56Sopenharmony_ci
37697db96d56Sopenharmony_ci        options:
37707db96d56Sopenharmony_ci          -h, --help            show this help message and exit
37717db96d56Sopenharmony_ci          -w W [W ...]          w
37727db96d56Sopenharmony_ci          -x [X ...]            x
37737db96d56Sopenharmony_ci          --foo, --no-foo       Whether to foo
37747db96d56Sopenharmony_ci          --bar, --no-bar       Whether to bar
37757db96d56Sopenharmony_ci          -f, --foobar, --no-foobar, --barfoo, --no-barfoo
37767db96d56Sopenharmony_ci          --bazz, --no-bazz     Bazz!
37777db96d56Sopenharmony_ci
37787db96d56Sopenharmony_ci        group:
37797db96d56Sopenharmony_ci          -y [Y]                y
37807db96d56Sopenharmony_ci          -z Z Z Z              z
37817db96d56Sopenharmony_ci          d                     d
37827db96d56Sopenharmony_ci          e                     e
37837db96d56Sopenharmony_ci        '''
37847db96d56Sopenharmony_ci    version = ''
37857db96d56Sopenharmony_ci
37867db96d56Sopenharmony_ci
37877db96d56Sopenharmony_ciclass TestHelpUsageWithParentheses(HelpTestCase):
37887db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
37897db96d56Sopenharmony_ci    argument_signatures = [
37907db96d56Sopenharmony_ci        Sig('positional', metavar='(example) positional'),
37917db96d56Sopenharmony_ci        Sig('-p', '--optional', metavar='{1 (option A), 2 (option B)}'),
37927db96d56Sopenharmony_ci    ]
37937db96d56Sopenharmony_ci
37947db96d56Sopenharmony_ci    usage = '''\
37957db96d56Sopenharmony_ci        usage: PROG [-h] [-p {1 (option A), 2 (option B)}] (example) positional
37967db96d56Sopenharmony_ci        '''
37977db96d56Sopenharmony_ci    help = usage + '''\
37987db96d56Sopenharmony_ci
37997db96d56Sopenharmony_ci        positional arguments:
38007db96d56Sopenharmony_ci          (example) positional
38017db96d56Sopenharmony_ci
38027db96d56Sopenharmony_ci        options:
38037db96d56Sopenharmony_ci          -h, --help            show this help message and exit
38047db96d56Sopenharmony_ci          -p {1 (option A), 2 (option B)}, --optional {1 (option A), 2 (option B)}
38057db96d56Sopenharmony_ci        '''
38067db96d56Sopenharmony_ci    version = ''
38077db96d56Sopenharmony_ci
38087db96d56Sopenharmony_ci
38097db96d56Sopenharmony_ciclass TestHelpOnlyUserGroups(HelpTestCase):
38107db96d56Sopenharmony_ci    """Test basic usage messages"""
38117db96d56Sopenharmony_ci
38127db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', add_help=False)
38137db96d56Sopenharmony_ci    argument_signatures = []
38147db96d56Sopenharmony_ci    argument_group_signatures = [
38157db96d56Sopenharmony_ci        (Sig('xxxx'), [
38167db96d56Sopenharmony_ci            Sig('-x', help='x'),
38177db96d56Sopenharmony_ci            Sig('a', help='a'),
38187db96d56Sopenharmony_ci        ]),
38197db96d56Sopenharmony_ci        (Sig('yyyy'), [
38207db96d56Sopenharmony_ci            Sig('b', help='b'),
38217db96d56Sopenharmony_ci            Sig('-y', help='y'),
38227db96d56Sopenharmony_ci        ]),
38237db96d56Sopenharmony_ci    ]
38247db96d56Sopenharmony_ci    usage = '''\
38257db96d56Sopenharmony_ci        usage: PROG [-x X] [-y Y] a b
38267db96d56Sopenharmony_ci        '''
38277db96d56Sopenharmony_ci    help = usage + '''\
38287db96d56Sopenharmony_ci
38297db96d56Sopenharmony_ci        xxxx:
38307db96d56Sopenharmony_ci          -x X  x
38317db96d56Sopenharmony_ci          a     a
38327db96d56Sopenharmony_ci
38337db96d56Sopenharmony_ci        yyyy:
38347db96d56Sopenharmony_ci          b     b
38357db96d56Sopenharmony_ci          -y Y  y
38367db96d56Sopenharmony_ci        '''
38377db96d56Sopenharmony_ci    version = ''
38387db96d56Sopenharmony_ci
38397db96d56Sopenharmony_ci
38407db96d56Sopenharmony_ciclass TestHelpUsageLongProg(HelpTestCase):
38417db96d56Sopenharmony_ci    """Test usage messages where the prog is long"""
38427db96d56Sopenharmony_ci
38437db96d56Sopenharmony_ci    parser_signature = Sig(prog='P' * 60)
38447db96d56Sopenharmony_ci    argument_signatures = [
38457db96d56Sopenharmony_ci        Sig('-w', metavar='W'),
38467db96d56Sopenharmony_ci        Sig('-x', metavar='X'),
38477db96d56Sopenharmony_ci        Sig('a'),
38487db96d56Sopenharmony_ci        Sig('b'),
38497db96d56Sopenharmony_ci    ]
38507db96d56Sopenharmony_ci    argument_group_signatures = []
38517db96d56Sopenharmony_ci    usage = '''\
38527db96d56Sopenharmony_ci        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
38537db96d56Sopenharmony_ci               [-h] [-w W] [-x X] a b
38547db96d56Sopenharmony_ci        '''
38557db96d56Sopenharmony_ci    help = usage + '''\
38567db96d56Sopenharmony_ci
38577db96d56Sopenharmony_ci        positional arguments:
38587db96d56Sopenharmony_ci          a
38597db96d56Sopenharmony_ci          b
38607db96d56Sopenharmony_ci
38617db96d56Sopenharmony_ci        options:
38627db96d56Sopenharmony_ci          -h, --help  show this help message and exit
38637db96d56Sopenharmony_ci          -w W
38647db96d56Sopenharmony_ci          -x X
38657db96d56Sopenharmony_ci        '''
38667db96d56Sopenharmony_ci    version = ''
38677db96d56Sopenharmony_ci
38687db96d56Sopenharmony_ci
38697db96d56Sopenharmony_ciclass TestHelpUsageLongProgOptionsWrap(HelpTestCase):
38707db96d56Sopenharmony_ci    """Test usage messages where the prog is long and the optionals wrap"""
38717db96d56Sopenharmony_ci
38727db96d56Sopenharmony_ci    parser_signature = Sig(prog='P' * 60)
38737db96d56Sopenharmony_ci    argument_signatures = [
38747db96d56Sopenharmony_ci        Sig('-w', metavar='W' * 25),
38757db96d56Sopenharmony_ci        Sig('-x', metavar='X' * 25),
38767db96d56Sopenharmony_ci        Sig('-y', metavar='Y' * 25),
38777db96d56Sopenharmony_ci        Sig('-z', metavar='Z' * 25),
38787db96d56Sopenharmony_ci        Sig('a'),
38797db96d56Sopenharmony_ci        Sig('b'),
38807db96d56Sopenharmony_ci    ]
38817db96d56Sopenharmony_ci    argument_group_signatures = []
38827db96d56Sopenharmony_ci    usage = '''\
38837db96d56Sopenharmony_ci        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
38847db96d56Sopenharmony_ci               [-h] [-w WWWWWWWWWWWWWWWWWWWWWWWWW] \
38857db96d56Sopenharmony_ci[-x XXXXXXXXXXXXXXXXXXXXXXXXX]
38867db96d56Sopenharmony_ci               [-y YYYYYYYYYYYYYYYYYYYYYYYYY] [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
38877db96d56Sopenharmony_ci               a b
38887db96d56Sopenharmony_ci        '''
38897db96d56Sopenharmony_ci    help = usage + '''\
38907db96d56Sopenharmony_ci
38917db96d56Sopenharmony_ci        positional arguments:
38927db96d56Sopenharmony_ci          a
38937db96d56Sopenharmony_ci          b
38947db96d56Sopenharmony_ci
38957db96d56Sopenharmony_ci        options:
38967db96d56Sopenharmony_ci          -h, --help            show this help message and exit
38977db96d56Sopenharmony_ci          -w WWWWWWWWWWWWWWWWWWWWWWWWW
38987db96d56Sopenharmony_ci          -x XXXXXXXXXXXXXXXXXXXXXXXXX
38997db96d56Sopenharmony_ci          -y YYYYYYYYYYYYYYYYYYYYYYYYY
39007db96d56Sopenharmony_ci          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
39017db96d56Sopenharmony_ci        '''
39027db96d56Sopenharmony_ci    version = ''
39037db96d56Sopenharmony_ci
39047db96d56Sopenharmony_ci
39057db96d56Sopenharmony_ciclass TestHelpUsageLongProgPositionalsWrap(HelpTestCase):
39067db96d56Sopenharmony_ci    """Test usage messages where the prog is long and the positionals wrap"""
39077db96d56Sopenharmony_ci
39087db96d56Sopenharmony_ci    parser_signature = Sig(prog='P' * 60, add_help=False)
39097db96d56Sopenharmony_ci    argument_signatures = [
39107db96d56Sopenharmony_ci        Sig('a' * 25),
39117db96d56Sopenharmony_ci        Sig('b' * 25),
39127db96d56Sopenharmony_ci        Sig('c' * 25),
39137db96d56Sopenharmony_ci    ]
39147db96d56Sopenharmony_ci    argument_group_signatures = []
39157db96d56Sopenharmony_ci    usage = '''\
39167db96d56Sopenharmony_ci        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
39177db96d56Sopenharmony_ci               aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
39187db96d56Sopenharmony_ci               ccccccccccccccccccccccccc
39197db96d56Sopenharmony_ci        '''
39207db96d56Sopenharmony_ci    help = usage + '''\
39217db96d56Sopenharmony_ci
39227db96d56Sopenharmony_ci        positional arguments:
39237db96d56Sopenharmony_ci          aaaaaaaaaaaaaaaaaaaaaaaaa
39247db96d56Sopenharmony_ci          bbbbbbbbbbbbbbbbbbbbbbbbb
39257db96d56Sopenharmony_ci          ccccccccccccccccccccccccc
39267db96d56Sopenharmony_ci        '''
39277db96d56Sopenharmony_ci    version = ''
39287db96d56Sopenharmony_ci
39297db96d56Sopenharmony_ci
39307db96d56Sopenharmony_ciclass TestHelpUsageOptionalsWrap(HelpTestCase):
39317db96d56Sopenharmony_ci    """Test usage messages where the optionals wrap"""
39327db96d56Sopenharmony_ci
39337db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
39347db96d56Sopenharmony_ci    argument_signatures = [
39357db96d56Sopenharmony_ci        Sig('-w', metavar='W' * 25),
39367db96d56Sopenharmony_ci        Sig('-x', metavar='X' * 25),
39377db96d56Sopenharmony_ci        Sig('-y', metavar='Y' * 25),
39387db96d56Sopenharmony_ci        Sig('-z', metavar='Z' * 25),
39397db96d56Sopenharmony_ci        Sig('a'),
39407db96d56Sopenharmony_ci        Sig('b'),
39417db96d56Sopenharmony_ci        Sig('c'),
39427db96d56Sopenharmony_ci    ]
39437db96d56Sopenharmony_ci    argument_group_signatures = []
39447db96d56Sopenharmony_ci    usage = '''\
39457db96d56Sopenharmony_ci        usage: PROG [-h] [-w WWWWWWWWWWWWWWWWWWWWWWWWW] \
39467db96d56Sopenharmony_ci[-x XXXXXXXXXXXXXXXXXXXXXXXXX]
39477db96d56Sopenharmony_ci                    [-y YYYYYYYYYYYYYYYYYYYYYYYYY] \
39487db96d56Sopenharmony_ci[-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
39497db96d56Sopenharmony_ci                    a b c
39507db96d56Sopenharmony_ci        '''
39517db96d56Sopenharmony_ci    help = usage + '''\
39527db96d56Sopenharmony_ci
39537db96d56Sopenharmony_ci        positional arguments:
39547db96d56Sopenharmony_ci          a
39557db96d56Sopenharmony_ci          b
39567db96d56Sopenharmony_ci          c
39577db96d56Sopenharmony_ci
39587db96d56Sopenharmony_ci        options:
39597db96d56Sopenharmony_ci          -h, --help            show this help message and exit
39607db96d56Sopenharmony_ci          -w WWWWWWWWWWWWWWWWWWWWWWWWW
39617db96d56Sopenharmony_ci          -x XXXXXXXXXXXXXXXXXXXXXXXXX
39627db96d56Sopenharmony_ci          -y YYYYYYYYYYYYYYYYYYYYYYYYY
39637db96d56Sopenharmony_ci          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
39647db96d56Sopenharmony_ci        '''
39657db96d56Sopenharmony_ci    version = ''
39667db96d56Sopenharmony_ci
39677db96d56Sopenharmony_ci
39687db96d56Sopenharmony_ciclass TestHelpUsagePositionalsWrap(HelpTestCase):
39697db96d56Sopenharmony_ci    """Test usage messages where the positionals wrap"""
39707db96d56Sopenharmony_ci
39717db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
39727db96d56Sopenharmony_ci    argument_signatures = [
39737db96d56Sopenharmony_ci        Sig('-x'),
39747db96d56Sopenharmony_ci        Sig('-y'),
39757db96d56Sopenharmony_ci        Sig('-z'),
39767db96d56Sopenharmony_ci        Sig('a' * 25),
39777db96d56Sopenharmony_ci        Sig('b' * 25),
39787db96d56Sopenharmony_ci        Sig('c' * 25),
39797db96d56Sopenharmony_ci    ]
39807db96d56Sopenharmony_ci    argument_group_signatures = []
39817db96d56Sopenharmony_ci    usage = '''\
39827db96d56Sopenharmony_ci        usage: PROG [-h] [-x X] [-y Y] [-z Z]
39837db96d56Sopenharmony_ci                    aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
39847db96d56Sopenharmony_ci                    ccccccccccccccccccccccccc
39857db96d56Sopenharmony_ci        '''
39867db96d56Sopenharmony_ci    help = usage + '''\
39877db96d56Sopenharmony_ci
39887db96d56Sopenharmony_ci        positional arguments:
39897db96d56Sopenharmony_ci          aaaaaaaaaaaaaaaaaaaaaaaaa
39907db96d56Sopenharmony_ci          bbbbbbbbbbbbbbbbbbbbbbbbb
39917db96d56Sopenharmony_ci          ccccccccccccccccccccccccc
39927db96d56Sopenharmony_ci
39937db96d56Sopenharmony_ci        options:
39947db96d56Sopenharmony_ci          -h, --help            show this help message and exit
39957db96d56Sopenharmony_ci          -x X
39967db96d56Sopenharmony_ci          -y Y
39977db96d56Sopenharmony_ci          -z Z
39987db96d56Sopenharmony_ci        '''
39997db96d56Sopenharmony_ci    version = ''
40007db96d56Sopenharmony_ci
40017db96d56Sopenharmony_ci
40027db96d56Sopenharmony_ciclass TestHelpUsageOptionalsPositionalsWrap(HelpTestCase):
40037db96d56Sopenharmony_ci    """Test usage messages where the optionals and positionals wrap"""
40047db96d56Sopenharmony_ci
40057db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
40067db96d56Sopenharmony_ci    argument_signatures = [
40077db96d56Sopenharmony_ci        Sig('-x', metavar='X' * 25),
40087db96d56Sopenharmony_ci        Sig('-y', metavar='Y' * 25),
40097db96d56Sopenharmony_ci        Sig('-z', metavar='Z' * 25),
40107db96d56Sopenharmony_ci        Sig('a' * 25),
40117db96d56Sopenharmony_ci        Sig('b' * 25),
40127db96d56Sopenharmony_ci        Sig('c' * 25),
40137db96d56Sopenharmony_ci    ]
40147db96d56Sopenharmony_ci    argument_group_signatures = []
40157db96d56Sopenharmony_ci    usage = '''\
40167db96d56Sopenharmony_ci        usage: PROG [-h] [-x XXXXXXXXXXXXXXXXXXXXXXXXX] \
40177db96d56Sopenharmony_ci[-y YYYYYYYYYYYYYYYYYYYYYYYYY]
40187db96d56Sopenharmony_ci                    [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
40197db96d56Sopenharmony_ci                    aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
40207db96d56Sopenharmony_ci                    ccccccccccccccccccccccccc
40217db96d56Sopenharmony_ci        '''
40227db96d56Sopenharmony_ci    help = usage + '''\
40237db96d56Sopenharmony_ci
40247db96d56Sopenharmony_ci        positional arguments:
40257db96d56Sopenharmony_ci          aaaaaaaaaaaaaaaaaaaaaaaaa
40267db96d56Sopenharmony_ci          bbbbbbbbbbbbbbbbbbbbbbbbb
40277db96d56Sopenharmony_ci          ccccccccccccccccccccccccc
40287db96d56Sopenharmony_ci
40297db96d56Sopenharmony_ci        options:
40307db96d56Sopenharmony_ci          -h, --help            show this help message and exit
40317db96d56Sopenharmony_ci          -x XXXXXXXXXXXXXXXXXXXXXXXXX
40327db96d56Sopenharmony_ci          -y YYYYYYYYYYYYYYYYYYYYYYYYY
40337db96d56Sopenharmony_ci          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
40347db96d56Sopenharmony_ci        '''
40357db96d56Sopenharmony_ci    version = ''
40367db96d56Sopenharmony_ci
40377db96d56Sopenharmony_ci
40387db96d56Sopenharmony_ciclass TestHelpUsageOptionalsOnlyWrap(HelpTestCase):
40397db96d56Sopenharmony_ci    """Test usage messages where there are only optionals and they wrap"""
40407db96d56Sopenharmony_ci
40417db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
40427db96d56Sopenharmony_ci    argument_signatures = [
40437db96d56Sopenharmony_ci        Sig('-x', metavar='X' * 25),
40447db96d56Sopenharmony_ci        Sig('-y', metavar='Y' * 25),
40457db96d56Sopenharmony_ci        Sig('-z', metavar='Z' * 25),
40467db96d56Sopenharmony_ci    ]
40477db96d56Sopenharmony_ci    argument_group_signatures = []
40487db96d56Sopenharmony_ci    usage = '''\
40497db96d56Sopenharmony_ci        usage: PROG [-h] [-x XXXXXXXXXXXXXXXXXXXXXXXXX] \
40507db96d56Sopenharmony_ci[-y YYYYYYYYYYYYYYYYYYYYYYYYY]
40517db96d56Sopenharmony_ci                    [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
40527db96d56Sopenharmony_ci        '''
40537db96d56Sopenharmony_ci    help = usage + '''\
40547db96d56Sopenharmony_ci
40557db96d56Sopenharmony_ci        options:
40567db96d56Sopenharmony_ci          -h, --help            show this help message and exit
40577db96d56Sopenharmony_ci          -x XXXXXXXXXXXXXXXXXXXXXXXXX
40587db96d56Sopenharmony_ci          -y YYYYYYYYYYYYYYYYYYYYYYYYY
40597db96d56Sopenharmony_ci          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
40607db96d56Sopenharmony_ci        '''
40617db96d56Sopenharmony_ci    version = ''
40627db96d56Sopenharmony_ci
40637db96d56Sopenharmony_ci
40647db96d56Sopenharmony_ciclass TestHelpUsagePositionalsOnlyWrap(HelpTestCase):
40657db96d56Sopenharmony_ci    """Test usage messages where there are only positionals and they wrap"""
40667db96d56Sopenharmony_ci
40677db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', add_help=False)
40687db96d56Sopenharmony_ci    argument_signatures = [
40697db96d56Sopenharmony_ci        Sig('a' * 25),
40707db96d56Sopenharmony_ci        Sig('b' * 25),
40717db96d56Sopenharmony_ci        Sig('c' * 25),
40727db96d56Sopenharmony_ci    ]
40737db96d56Sopenharmony_ci    argument_group_signatures = []
40747db96d56Sopenharmony_ci    usage = '''\
40757db96d56Sopenharmony_ci        usage: PROG aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
40767db96d56Sopenharmony_ci                    ccccccccccccccccccccccccc
40777db96d56Sopenharmony_ci        '''
40787db96d56Sopenharmony_ci    help = usage + '''\
40797db96d56Sopenharmony_ci
40807db96d56Sopenharmony_ci        positional arguments:
40817db96d56Sopenharmony_ci          aaaaaaaaaaaaaaaaaaaaaaaaa
40827db96d56Sopenharmony_ci          bbbbbbbbbbbbbbbbbbbbbbbbb
40837db96d56Sopenharmony_ci          ccccccccccccccccccccccccc
40847db96d56Sopenharmony_ci        '''
40857db96d56Sopenharmony_ci    version = ''
40867db96d56Sopenharmony_ci
40877db96d56Sopenharmony_ci
40887db96d56Sopenharmony_ciclass TestHelpVariableExpansion(HelpTestCase):
40897db96d56Sopenharmony_ci    """Test that variables are expanded properly in help messages"""
40907db96d56Sopenharmony_ci
40917db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
40927db96d56Sopenharmony_ci    argument_signatures = [
40937db96d56Sopenharmony_ci        Sig('-x', type=int,
40947db96d56Sopenharmony_ci            help='x %(prog)s %(default)s %(type)s %%'),
40957db96d56Sopenharmony_ci        Sig('-y', action='store_const', default=42, const='XXX',
40967db96d56Sopenharmony_ci            help='y %(prog)s %(default)s %(const)s'),
40977db96d56Sopenharmony_ci        Sig('--foo', choices='abc',
40987db96d56Sopenharmony_ci            help='foo %(prog)s %(default)s %(choices)s'),
40997db96d56Sopenharmony_ci        Sig('--bar', default='baz', choices=[1, 2], metavar='BBB',
41007db96d56Sopenharmony_ci            help='bar %(prog)s %(default)s %(dest)s'),
41017db96d56Sopenharmony_ci        Sig('spam', help='spam %(prog)s %(default)s'),
41027db96d56Sopenharmony_ci        Sig('badger', default=0.5, help='badger %(prog)s %(default)s'),
41037db96d56Sopenharmony_ci    ]
41047db96d56Sopenharmony_ci    argument_group_signatures = [
41057db96d56Sopenharmony_ci        (Sig('group'), [
41067db96d56Sopenharmony_ci            Sig('-a', help='a %(prog)s %(default)s'),
41077db96d56Sopenharmony_ci            Sig('-b', default=-1, help='b %(prog)s %(default)s'),
41087db96d56Sopenharmony_ci        ])
41097db96d56Sopenharmony_ci    ]
41107db96d56Sopenharmony_ci    usage = ('''\
41117db96d56Sopenharmony_ci        usage: PROG [-h] [-x X] [-y] [--foo {a,b,c}] [--bar BBB] [-a A] [-b B]
41127db96d56Sopenharmony_ci                    spam badger
41137db96d56Sopenharmony_ci        ''')
41147db96d56Sopenharmony_ci    help = usage + '''\
41157db96d56Sopenharmony_ci
41167db96d56Sopenharmony_ci        positional arguments:
41177db96d56Sopenharmony_ci          spam           spam PROG None
41187db96d56Sopenharmony_ci          badger         badger PROG 0.5
41197db96d56Sopenharmony_ci
41207db96d56Sopenharmony_ci        options:
41217db96d56Sopenharmony_ci          -h, --help     show this help message and exit
41227db96d56Sopenharmony_ci          -x X           x PROG None int %
41237db96d56Sopenharmony_ci          -y             y PROG 42 XXX
41247db96d56Sopenharmony_ci          --foo {a,b,c}  foo PROG None a, b, c
41257db96d56Sopenharmony_ci          --bar BBB      bar PROG baz bar
41267db96d56Sopenharmony_ci
41277db96d56Sopenharmony_ci        group:
41287db96d56Sopenharmony_ci          -a A           a PROG None
41297db96d56Sopenharmony_ci          -b B           b PROG -1
41307db96d56Sopenharmony_ci        '''
41317db96d56Sopenharmony_ci    version = ''
41327db96d56Sopenharmony_ci
41337db96d56Sopenharmony_ci
41347db96d56Sopenharmony_ciclass TestHelpVariableExpansionUsageSupplied(HelpTestCase):
41357db96d56Sopenharmony_ci    """Test that variables are expanded properly when usage= is present"""
41367db96d56Sopenharmony_ci
41377db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', usage='%(prog)s FOO')
41387db96d56Sopenharmony_ci    argument_signatures = []
41397db96d56Sopenharmony_ci    argument_group_signatures = []
41407db96d56Sopenharmony_ci    usage = ('''\
41417db96d56Sopenharmony_ci        usage: PROG FOO
41427db96d56Sopenharmony_ci        ''')
41437db96d56Sopenharmony_ci    help = usage + '''\
41447db96d56Sopenharmony_ci
41457db96d56Sopenharmony_ci        options:
41467db96d56Sopenharmony_ci          -h, --help  show this help message and exit
41477db96d56Sopenharmony_ci        '''
41487db96d56Sopenharmony_ci    version = ''
41497db96d56Sopenharmony_ci
41507db96d56Sopenharmony_ci
41517db96d56Sopenharmony_ciclass TestHelpVariableExpansionNoArguments(HelpTestCase):
41527db96d56Sopenharmony_ci    """Test that variables are expanded properly with no arguments"""
41537db96d56Sopenharmony_ci
41547db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', add_help=False)
41557db96d56Sopenharmony_ci    argument_signatures = []
41567db96d56Sopenharmony_ci    argument_group_signatures = []
41577db96d56Sopenharmony_ci    usage = ('''\
41587db96d56Sopenharmony_ci        usage: PROG
41597db96d56Sopenharmony_ci        ''')
41607db96d56Sopenharmony_ci    help = usage
41617db96d56Sopenharmony_ci    version = ''
41627db96d56Sopenharmony_ci
41637db96d56Sopenharmony_ci
41647db96d56Sopenharmony_ciclass TestHelpSuppressUsage(HelpTestCase):
41657db96d56Sopenharmony_ci    """Test that items can be suppressed in usage messages"""
41667db96d56Sopenharmony_ci
41677db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', usage=argparse.SUPPRESS)
41687db96d56Sopenharmony_ci    argument_signatures = [
41697db96d56Sopenharmony_ci        Sig('--foo', help='foo help'),
41707db96d56Sopenharmony_ci        Sig('spam', help='spam help'),
41717db96d56Sopenharmony_ci    ]
41727db96d56Sopenharmony_ci    argument_group_signatures = []
41737db96d56Sopenharmony_ci    help = '''\
41747db96d56Sopenharmony_ci        positional arguments:
41757db96d56Sopenharmony_ci          spam        spam help
41767db96d56Sopenharmony_ci
41777db96d56Sopenharmony_ci        options:
41787db96d56Sopenharmony_ci          -h, --help  show this help message and exit
41797db96d56Sopenharmony_ci          --foo FOO   foo help
41807db96d56Sopenharmony_ci        '''
41817db96d56Sopenharmony_ci    usage = ''
41827db96d56Sopenharmony_ci    version = ''
41837db96d56Sopenharmony_ci
41847db96d56Sopenharmony_ci
41857db96d56Sopenharmony_ciclass TestHelpSuppressOptional(HelpTestCase):
41867db96d56Sopenharmony_ci    """Test that optional arguments can be suppressed in help messages"""
41877db96d56Sopenharmony_ci
41887db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', add_help=False)
41897db96d56Sopenharmony_ci    argument_signatures = [
41907db96d56Sopenharmony_ci        Sig('--foo', help=argparse.SUPPRESS),
41917db96d56Sopenharmony_ci        Sig('spam', help='spam help'),
41927db96d56Sopenharmony_ci    ]
41937db96d56Sopenharmony_ci    argument_group_signatures = []
41947db96d56Sopenharmony_ci    usage = '''\
41957db96d56Sopenharmony_ci        usage: PROG spam
41967db96d56Sopenharmony_ci        '''
41977db96d56Sopenharmony_ci    help = usage + '''\
41987db96d56Sopenharmony_ci
41997db96d56Sopenharmony_ci        positional arguments:
42007db96d56Sopenharmony_ci          spam  spam help
42017db96d56Sopenharmony_ci        '''
42027db96d56Sopenharmony_ci    version = ''
42037db96d56Sopenharmony_ci
42047db96d56Sopenharmony_ci
42057db96d56Sopenharmony_ciclass TestHelpSuppressOptionalGroup(HelpTestCase):
42067db96d56Sopenharmony_ci    """Test that optional groups can be suppressed in help messages"""
42077db96d56Sopenharmony_ci
42087db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
42097db96d56Sopenharmony_ci    argument_signatures = [
42107db96d56Sopenharmony_ci        Sig('--foo', help='foo help'),
42117db96d56Sopenharmony_ci        Sig('spam', help='spam help'),
42127db96d56Sopenharmony_ci    ]
42137db96d56Sopenharmony_ci    argument_group_signatures = [
42147db96d56Sopenharmony_ci        (Sig('group'), [Sig('--bar', help=argparse.SUPPRESS)]),
42157db96d56Sopenharmony_ci    ]
42167db96d56Sopenharmony_ci    usage = '''\
42177db96d56Sopenharmony_ci        usage: PROG [-h] [--foo FOO] spam
42187db96d56Sopenharmony_ci        '''
42197db96d56Sopenharmony_ci    help = usage + '''\
42207db96d56Sopenharmony_ci
42217db96d56Sopenharmony_ci        positional arguments:
42227db96d56Sopenharmony_ci          spam        spam help
42237db96d56Sopenharmony_ci
42247db96d56Sopenharmony_ci        options:
42257db96d56Sopenharmony_ci          -h, --help  show this help message and exit
42267db96d56Sopenharmony_ci          --foo FOO   foo help
42277db96d56Sopenharmony_ci        '''
42287db96d56Sopenharmony_ci    version = ''
42297db96d56Sopenharmony_ci
42307db96d56Sopenharmony_ci
42317db96d56Sopenharmony_ciclass TestHelpSuppressPositional(HelpTestCase):
42327db96d56Sopenharmony_ci    """Test that positional arguments can be suppressed in help messages"""
42337db96d56Sopenharmony_ci
42347db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
42357db96d56Sopenharmony_ci    argument_signatures = [
42367db96d56Sopenharmony_ci        Sig('--foo', help='foo help'),
42377db96d56Sopenharmony_ci        Sig('spam', help=argparse.SUPPRESS),
42387db96d56Sopenharmony_ci    ]
42397db96d56Sopenharmony_ci    argument_group_signatures = []
42407db96d56Sopenharmony_ci    usage = '''\
42417db96d56Sopenharmony_ci        usage: PROG [-h] [--foo FOO]
42427db96d56Sopenharmony_ci        '''
42437db96d56Sopenharmony_ci    help = usage + '''\
42447db96d56Sopenharmony_ci
42457db96d56Sopenharmony_ci        options:
42467db96d56Sopenharmony_ci          -h, --help  show this help message and exit
42477db96d56Sopenharmony_ci          --foo FOO   foo help
42487db96d56Sopenharmony_ci        '''
42497db96d56Sopenharmony_ci    version = ''
42507db96d56Sopenharmony_ci
42517db96d56Sopenharmony_ci
42527db96d56Sopenharmony_ciclass TestHelpRequiredOptional(HelpTestCase):
42537db96d56Sopenharmony_ci    """Test that required options don't look optional"""
42547db96d56Sopenharmony_ci
42557db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
42567db96d56Sopenharmony_ci    argument_signatures = [
42577db96d56Sopenharmony_ci        Sig('--foo', required=True, help='foo help'),
42587db96d56Sopenharmony_ci    ]
42597db96d56Sopenharmony_ci    argument_group_signatures = []
42607db96d56Sopenharmony_ci    usage = '''\
42617db96d56Sopenharmony_ci        usage: PROG [-h] --foo FOO
42627db96d56Sopenharmony_ci        '''
42637db96d56Sopenharmony_ci    help = usage + '''\
42647db96d56Sopenharmony_ci
42657db96d56Sopenharmony_ci        options:
42667db96d56Sopenharmony_ci          -h, --help  show this help message and exit
42677db96d56Sopenharmony_ci          --foo FOO   foo help
42687db96d56Sopenharmony_ci        '''
42697db96d56Sopenharmony_ci    version = ''
42707db96d56Sopenharmony_ci
42717db96d56Sopenharmony_ci
42727db96d56Sopenharmony_ciclass TestHelpAlternatePrefixChars(HelpTestCase):
42737db96d56Sopenharmony_ci    """Test that options display with different prefix characters"""
42747db96d56Sopenharmony_ci
42757db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', prefix_chars='^;', add_help=False)
42767db96d56Sopenharmony_ci    argument_signatures = [
42777db96d56Sopenharmony_ci        Sig('^^foo', action='store_true', help='foo help'),
42787db96d56Sopenharmony_ci        Sig(';b', ';;bar', help='bar help'),
42797db96d56Sopenharmony_ci    ]
42807db96d56Sopenharmony_ci    argument_group_signatures = []
42817db96d56Sopenharmony_ci    usage = '''\
42827db96d56Sopenharmony_ci        usage: PROG [^^foo] [;b BAR]
42837db96d56Sopenharmony_ci        '''
42847db96d56Sopenharmony_ci    help = usage + '''\
42857db96d56Sopenharmony_ci
42867db96d56Sopenharmony_ci        options:
42877db96d56Sopenharmony_ci          ^^foo              foo help
42887db96d56Sopenharmony_ci          ;b BAR, ;;bar BAR  bar help
42897db96d56Sopenharmony_ci        '''
42907db96d56Sopenharmony_ci    version = ''
42917db96d56Sopenharmony_ci
42927db96d56Sopenharmony_ci
42937db96d56Sopenharmony_ciclass TestHelpNoHelpOptional(HelpTestCase):
42947db96d56Sopenharmony_ci    """Test that the --help argument can be suppressed help messages"""
42957db96d56Sopenharmony_ci
42967db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', add_help=False)
42977db96d56Sopenharmony_ci    argument_signatures = [
42987db96d56Sopenharmony_ci        Sig('--foo', help='foo help'),
42997db96d56Sopenharmony_ci        Sig('spam', help='spam help'),
43007db96d56Sopenharmony_ci    ]
43017db96d56Sopenharmony_ci    argument_group_signatures = []
43027db96d56Sopenharmony_ci    usage = '''\
43037db96d56Sopenharmony_ci        usage: PROG [--foo FOO] spam
43047db96d56Sopenharmony_ci        '''
43057db96d56Sopenharmony_ci    help = usage + '''\
43067db96d56Sopenharmony_ci
43077db96d56Sopenharmony_ci        positional arguments:
43087db96d56Sopenharmony_ci          spam       spam help
43097db96d56Sopenharmony_ci
43107db96d56Sopenharmony_ci        options:
43117db96d56Sopenharmony_ci          --foo FOO  foo help
43127db96d56Sopenharmony_ci        '''
43137db96d56Sopenharmony_ci    version = ''
43147db96d56Sopenharmony_ci
43157db96d56Sopenharmony_ci
43167db96d56Sopenharmony_ciclass TestHelpNone(HelpTestCase):
43177db96d56Sopenharmony_ci    """Test that no errors occur if no help is specified"""
43187db96d56Sopenharmony_ci
43197db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
43207db96d56Sopenharmony_ci    argument_signatures = [
43217db96d56Sopenharmony_ci        Sig('--foo'),
43227db96d56Sopenharmony_ci        Sig('spam'),
43237db96d56Sopenharmony_ci    ]
43247db96d56Sopenharmony_ci    argument_group_signatures = []
43257db96d56Sopenharmony_ci    usage = '''\
43267db96d56Sopenharmony_ci        usage: PROG [-h] [--foo FOO] spam
43277db96d56Sopenharmony_ci        '''
43287db96d56Sopenharmony_ci    help = usage + '''\
43297db96d56Sopenharmony_ci
43307db96d56Sopenharmony_ci        positional arguments:
43317db96d56Sopenharmony_ci          spam
43327db96d56Sopenharmony_ci
43337db96d56Sopenharmony_ci        options:
43347db96d56Sopenharmony_ci          -h, --help  show this help message and exit
43357db96d56Sopenharmony_ci          --foo FOO
43367db96d56Sopenharmony_ci        '''
43377db96d56Sopenharmony_ci    version = ''
43387db96d56Sopenharmony_ci
43397db96d56Sopenharmony_ci
43407db96d56Sopenharmony_ciclass TestHelpTupleMetavar(HelpTestCase):
43417db96d56Sopenharmony_ci    """Test specifying metavar as a tuple"""
43427db96d56Sopenharmony_ci
43437db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
43447db96d56Sopenharmony_ci    argument_signatures = [
43457db96d56Sopenharmony_ci        Sig('-w', help='w', nargs='+', metavar=('W1', 'W2')),
43467db96d56Sopenharmony_ci        Sig('-x', help='x', nargs='*', metavar=('X1', 'X2')),
43477db96d56Sopenharmony_ci        Sig('-y', help='y', nargs=3, metavar=('Y1', 'Y2', 'Y3')),
43487db96d56Sopenharmony_ci        Sig('-z', help='z', nargs='?', metavar=('Z1', )),
43497db96d56Sopenharmony_ci    ]
43507db96d56Sopenharmony_ci    argument_group_signatures = []
43517db96d56Sopenharmony_ci    usage = '''\
43527db96d56Sopenharmony_ci        usage: PROG [-h] [-w W1 [W2 ...]] [-x [X1 [X2 ...]]] [-y Y1 Y2 Y3] \
43537db96d56Sopenharmony_ci[-z [Z1]]
43547db96d56Sopenharmony_ci        '''
43557db96d56Sopenharmony_ci    help = usage + '''\
43567db96d56Sopenharmony_ci
43577db96d56Sopenharmony_ci        options:
43587db96d56Sopenharmony_ci          -h, --help        show this help message and exit
43597db96d56Sopenharmony_ci          -w W1 [W2 ...]    w
43607db96d56Sopenharmony_ci          -x [X1 [X2 ...]]  x
43617db96d56Sopenharmony_ci          -y Y1 Y2 Y3       y
43627db96d56Sopenharmony_ci          -z [Z1]           z
43637db96d56Sopenharmony_ci        '''
43647db96d56Sopenharmony_ci    version = ''
43657db96d56Sopenharmony_ci
43667db96d56Sopenharmony_ci
43677db96d56Sopenharmony_ciclass TestHelpRawText(HelpTestCase):
43687db96d56Sopenharmony_ci    """Test the RawTextHelpFormatter"""
43697db96d56Sopenharmony_ci
43707db96d56Sopenharmony_ci    parser_signature = Sig(
43717db96d56Sopenharmony_ci        prog='PROG', formatter_class=argparse.RawTextHelpFormatter,
43727db96d56Sopenharmony_ci        description='Keep the formatting\n'
43737db96d56Sopenharmony_ci                    '    exactly as it is written\n'
43747db96d56Sopenharmony_ci                    '\n'
43757db96d56Sopenharmony_ci                    'here\n')
43767db96d56Sopenharmony_ci
43777db96d56Sopenharmony_ci    argument_signatures = [
43787db96d56Sopenharmony_ci        Sig('--foo', help='    foo help should also\n'
43797db96d56Sopenharmony_ci                          'appear as given here'),
43807db96d56Sopenharmony_ci        Sig('spam', help='spam help'),
43817db96d56Sopenharmony_ci    ]
43827db96d56Sopenharmony_ci    argument_group_signatures = [
43837db96d56Sopenharmony_ci        (Sig('title', description='    This text\n'
43847db96d56Sopenharmony_ci                                  '  should be indented\n'
43857db96d56Sopenharmony_ci                                  '    exactly like it is here\n'),
43867db96d56Sopenharmony_ci         [Sig('--bar', help='bar help')]),
43877db96d56Sopenharmony_ci    ]
43887db96d56Sopenharmony_ci    usage = '''\
43897db96d56Sopenharmony_ci        usage: PROG [-h] [--foo FOO] [--bar BAR] spam
43907db96d56Sopenharmony_ci        '''
43917db96d56Sopenharmony_ci    help = usage + '''\
43927db96d56Sopenharmony_ci
43937db96d56Sopenharmony_ci        Keep the formatting
43947db96d56Sopenharmony_ci            exactly as it is written
43957db96d56Sopenharmony_ci
43967db96d56Sopenharmony_ci        here
43977db96d56Sopenharmony_ci
43987db96d56Sopenharmony_ci        positional arguments:
43997db96d56Sopenharmony_ci          spam        spam help
44007db96d56Sopenharmony_ci
44017db96d56Sopenharmony_ci        options:
44027db96d56Sopenharmony_ci          -h, --help  show this help message and exit
44037db96d56Sopenharmony_ci          --foo FOO       foo help should also
44047db96d56Sopenharmony_ci                      appear as given here
44057db96d56Sopenharmony_ci
44067db96d56Sopenharmony_ci        title:
44077db96d56Sopenharmony_ci              This text
44087db96d56Sopenharmony_ci            should be indented
44097db96d56Sopenharmony_ci              exactly like it is here
44107db96d56Sopenharmony_ci
44117db96d56Sopenharmony_ci          --bar BAR   bar help
44127db96d56Sopenharmony_ci        '''
44137db96d56Sopenharmony_ci    version = ''
44147db96d56Sopenharmony_ci
44157db96d56Sopenharmony_ci
44167db96d56Sopenharmony_ciclass TestHelpRawDescription(HelpTestCase):
44177db96d56Sopenharmony_ci    """Test the RawTextHelpFormatter"""
44187db96d56Sopenharmony_ci
44197db96d56Sopenharmony_ci    parser_signature = Sig(
44207db96d56Sopenharmony_ci        prog='PROG', formatter_class=argparse.RawDescriptionHelpFormatter,
44217db96d56Sopenharmony_ci        description='Keep the formatting\n'
44227db96d56Sopenharmony_ci                    '    exactly as it is written\n'
44237db96d56Sopenharmony_ci                    '\n'
44247db96d56Sopenharmony_ci                    'here\n')
44257db96d56Sopenharmony_ci
44267db96d56Sopenharmony_ci    argument_signatures = [
44277db96d56Sopenharmony_ci        Sig('--foo', help='  foo help should not\n'
44287db96d56Sopenharmony_ci                          '    retain this odd formatting'),
44297db96d56Sopenharmony_ci        Sig('spam', help='spam help'),
44307db96d56Sopenharmony_ci    ]
44317db96d56Sopenharmony_ci    argument_group_signatures = [
44327db96d56Sopenharmony_ci        (Sig('title', description='    This text\n'
44337db96d56Sopenharmony_ci                                  '  should be indented\n'
44347db96d56Sopenharmony_ci                                  '    exactly like it is here\n'),
44357db96d56Sopenharmony_ci         [Sig('--bar', help='bar help')]),
44367db96d56Sopenharmony_ci    ]
44377db96d56Sopenharmony_ci    usage = '''\
44387db96d56Sopenharmony_ci        usage: PROG [-h] [--foo FOO] [--bar BAR] spam
44397db96d56Sopenharmony_ci        '''
44407db96d56Sopenharmony_ci    help = usage + '''\
44417db96d56Sopenharmony_ci
44427db96d56Sopenharmony_ci        Keep the formatting
44437db96d56Sopenharmony_ci            exactly as it is written
44447db96d56Sopenharmony_ci
44457db96d56Sopenharmony_ci        here
44467db96d56Sopenharmony_ci
44477db96d56Sopenharmony_ci        positional arguments:
44487db96d56Sopenharmony_ci          spam        spam help
44497db96d56Sopenharmony_ci
44507db96d56Sopenharmony_ci        options:
44517db96d56Sopenharmony_ci          -h, --help  show this help message and exit
44527db96d56Sopenharmony_ci          --foo FOO   foo help should not retain this odd formatting
44537db96d56Sopenharmony_ci
44547db96d56Sopenharmony_ci        title:
44557db96d56Sopenharmony_ci              This text
44567db96d56Sopenharmony_ci            should be indented
44577db96d56Sopenharmony_ci              exactly like it is here
44587db96d56Sopenharmony_ci
44597db96d56Sopenharmony_ci          --bar BAR   bar help
44607db96d56Sopenharmony_ci        '''
44617db96d56Sopenharmony_ci    version = ''
44627db96d56Sopenharmony_ci
44637db96d56Sopenharmony_ci
44647db96d56Sopenharmony_ciclass TestHelpArgumentDefaults(HelpTestCase):
44657db96d56Sopenharmony_ci    """Test the ArgumentDefaultsHelpFormatter"""
44667db96d56Sopenharmony_ci
44677db96d56Sopenharmony_ci    parser_signature = Sig(
44687db96d56Sopenharmony_ci        prog='PROG', formatter_class=argparse.ArgumentDefaultsHelpFormatter,
44697db96d56Sopenharmony_ci        description='description')
44707db96d56Sopenharmony_ci
44717db96d56Sopenharmony_ci    argument_signatures = [
44727db96d56Sopenharmony_ci        Sig('--foo', help='foo help - oh and by the way, %(default)s'),
44737db96d56Sopenharmony_ci        Sig('--bar', action='store_true', help='bar help'),
44747db96d56Sopenharmony_ci        Sig('--taz', action=argparse.BooleanOptionalAction,
44757db96d56Sopenharmony_ci            help='Whether to taz it', default=True),
44767db96d56Sopenharmony_ci        Sig('--corge', action=argparse.BooleanOptionalAction,
44777db96d56Sopenharmony_ci            help='Whether to corge it', default=argparse.SUPPRESS),
44787db96d56Sopenharmony_ci        Sig('--quux', help="Set the quux", default=42),
44797db96d56Sopenharmony_ci        Sig('spam', help='spam help'),
44807db96d56Sopenharmony_ci        Sig('badger', nargs='?', default='wooden', help='badger help'),
44817db96d56Sopenharmony_ci    ]
44827db96d56Sopenharmony_ci    argument_group_signatures = [
44837db96d56Sopenharmony_ci        (Sig('title', description='description'),
44847db96d56Sopenharmony_ci         [Sig('--baz', type=int, default=42, help='baz help')]),
44857db96d56Sopenharmony_ci    ]
44867db96d56Sopenharmony_ci    usage = '''\
44877db96d56Sopenharmony_ci        usage: PROG [-h] [--foo FOO] [--bar] [--taz | --no-taz] [--corge | --no-corge]
44887db96d56Sopenharmony_ci                    [--quux QUUX] [--baz BAZ]
44897db96d56Sopenharmony_ci                    spam [badger]
44907db96d56Sopenharmony_ci        '''
44917db96d56Sopenharmony_ci    help = usage + '''\
44927db96d56Sopenharmony_ci
44937db96d56Sopenharmony_ci        description
44947db96d56Sopenharmony_ci
44957db96d56Sopenharmony_ci        positional arguments:
44967db96d56Sopenharmony_ci          spam                 spam help
44977db96d56Sopenharmony_ci          badger               badger help (default: wooden)
44987db96d56Sopenharmony_ci
44997db96d56Sopenharmony_ci        options:
45007db96d56Sopenharmony_ci          -h, --help           show this help message and exit
45017db96d56Sopenharmony_ci          --foo FOO            foo help - oh and by the way, None
45027db96d56Sopenharmony_ci          --bar                bar help (default: False)
45037db96d56Sopenharmony_ci          --taz, --no-taz      Whether to taz it (default: True)
45047db96d56Sopenharmony_ci          --corge, --no-corge  Whether to corge it
45057db96d56Sopenharmony_ci          --quux QUUX          Set the quux (default: 42)
45067db96d56Sopenharmony_ci
45077db96d56Sopenharmony_ci        title:
45087db96d56Sopenharmony_ci          description
45097db96d56Sopenharmony_ci
45107db96d56Sopenharmony_ci          --baz BAZ            baz help (default: 42)
45117db96d56Sopenharmony_ci        '''
45127db96d56Sopenharmony_ci    version = ''
45137db96d56Sopenharmony_ci
45147db96d56Sopenharmony_ciclass TestHelpVersionAction(HelpTestCase):
45157db96d56Sopenharmony_ci    """Test the default help for the version action"""
45167db96d56Sopenharmony_ci
45177db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', description='description')
45187db96d56Sopenharmony_ci    argument_signatures = [Sig('-V', '--version', action='version', version='3.6')]
45197db96d56Sopenharmony_ci    argument_group_signatures = []
45207db96d56Sopenharmony_ci    usage = '''\
45217db96d56Sopenharmony_ci        usage: PROG [-h] [-V]
45227db96d56Sopenharmony_ci        '''
45237db96d56Sopenharmony_ci    help = usage + '''\
45247db96d56Sopenharmony_ci
45257db96d56Sopenharmony_ci        description
45267db96d56Sopenharmony_ci
45277db96d56Sopenharmony_ci        options:
45287db96d56Sopenharmony_ci          -h, --help     show this help message and exit
45297db96d56Sopenharmony_ci          -V, --version  show program's version number and exit
45307db96d56Sopenharmony_ci        '''
45317db96d56Sopenharmony_ci    version = ''
45327db96d56Sopenharmony_ci
45337db96d56Sopenharmony_ci
45347db96d56Sopenharmony_ciclass TestHelpVersionActionSuppress(HelpTestCase):
45357db96d56Sopenharmony_ci    """Test that the --version argument can be suppressed in help messages"""
45367db96d56Sopenharmony_ci
45377db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG')
45387db96d56Sopenharmony_ci    argument_signatures = [
45397db96d56Sopenharmony_ci        Sig('-v', '--version', action='version', version='1.0',
45407db96d56Sopenharmony_ci            help=argparse.SUPPRESS),
45417db96d56Sopenharmony_ci        Sig('--foo', help='foo help'),
45427db96d56Sopenharmony_ci        Sig('spam', help='spam help'),
45437db96d56Sopenharmony_ci    ]
45447db96d56Sopenharmony_ci    argument_group_signatures = []
45457db96d56Sopenharmony_ci    usage = '''\
45467db96d56Sopenharmony_ci        usage: PROG [-h] [--foo FOO] spam
45477db96d56Sopenharmony_ci        '''
45487db96d56Sopenharmony_ci    help = usage + '''\
45497db96d56Sopenharmony_ci
45507db96d56Sopenharmony_ci        positional arguments:
45517db96d56Sopenharmony_ci          spam        spam help
45527db96d56Sopenharmony_ci
45537db96d56Sopenharmony_ci        options:
45547db96d56Sopenharmony_ci          -h, --help  show this help message and exit
45557db96d56Sopenharmony_ci          --foo FOO   foo help
45567db96d56Sopenharmony_ci        '''
45577db96d56Sopenharmony_ci
45587db96d56Sopenharmony_ci
45597db96d56Sopenharmony_ciclass TestHelpSubparsersOrdering(HelpTestCase):
45607db96d56Sopenharmony_ci    """Test ordering of subcommands in help matches the code"""
45617db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG',
45627db96d56Sopenharmony_ci                           description='display some subcommands')
45637db96d56Sopenharmony_ci    argument_signatures = [Sig('-v', '--version', action='version', version='0.1')]
45647db96d56Sopenharmony_ci
45657db96d56Sopenharmony_ci    subparsers_signatures = [Sig(name=name)
45667db96d56Sopenharmony_ci                             for name in ('a', 'b', 'c', 'd', 'e')]
45677db96d56Sopenharmony_ci
45687db96d56Sopenharmony_ci    usage = '''\
45697db96d56Sopenharmony_ci        usage: PROG [-h] [-v] {a,b,c,d,e} ...
45707db96d56Sopenharmony_ci        '''
45717db96d56Sopenharmony_ci
45727db96d56Sopenharmony_ci    help = usage + '''\
45737db96d56Sopenharmony_ci
45747db96d56Sopenharmony_ci        display some subcommands
45757db96d56Sopenharmony_ci
45767db96d56Sopenharmony_ci        positional arguments:
45777db96d56Sopenharmony_ci          {a,b,c,d,e}
45787db96d56Sopenharmony_ci
45797db96d56Sopenharmony_ci        options:
45807db96d56Sopenharmony_ci          -h, --help     show this help message and exit
45817db96d56Sopenharmony_ci          -v, --version  show program's version number and exit
45827db96d56Sopenharmony_ci        '''
45837db96d56Sopenharmony_ci
45847db96d56Sopenharmony_ci    version = '''\
45857db96d56Sopenharmony_ci        0.1
45867db96d56Sopenharmony_ci        '''
45877db96d56Sopenharmony_ci
45887db96d56Sopenharmony_ciclass TestHelpSubparsersWithHelpOrdering(HelpTestCase):
45897db96d56Sopenharmony_ci    """Test ordering of subcommands in help matches the code"""
45907db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG',
45917db96d56Sopenharmony_ci                           description='display some subcommands')
45927db96d56Sopenharmony_ci    argument_signatures = [Sig('-v', '--version', action='version', version='0.1')]
45937db96d56Sopenharmony_ci
45947db96d56Sopenharmony_ci    subcommand_data = (('a', 'a subcommand help'),
45957db96d56Sopenharmony_ci                       ('b', 'b subcommand help'),
45967db96d56Sopenharmony_ci                       ('c', 'c subcommand help'),
45977db96d56Sopenharmony_ci                       ('d', 'd subcommand help'),
45987db96d56Sopenharmony_ci                       ('e', 'e subcommand help'),
45997db96d56Sopenharmony_ci                       )
46007db96d56Sopenharmony_ci
46017db96d56Sopenharmony_ci    subparsers_signatures = [Sig(name=name, help=help)
46027db96d56Sopenharmony_ci                             for name, help in subcommand_data]
46037db96d56Sopenharmony_ci
46047db96d56Sopenharmony_ci    usage = '''\
46057db96d56Sopenharmony_ci        usage: PROG [-h] [-v] {a,b,c,d,e} ...
46067db96d56Sopenharmony_ci        '''
46077db96d56Sopenharmony_ci
46087db96d56Sopenharmony_ci    help = usage + '''\
46097db96d56Sopenharmony_ci
46107db96d56Sopenharmony_ci        display some subcommands
46117db96d56Sopenharmony_ci
46127db96d56Sopenharmony_ci        positional arguments:
46137db96d56Sopenharmony_ci          {a,b,c,d,e}
46147db96d56Sopenharmony_ci            a            a subcommand help
46157db96d56Sopenharmony_ci            b            b subcommand help
46167db96d56Sopenharmony_ci            c            c subcommand help
46177db96d56Sopenharmony_ci            d            d subcommand help
46187db96d56Sopenharmony_ci            e            e subcommand help
46197db96d56Sopenharmony_ci
46207db96d56Sopenharmony_ci        options:
46217db96d56Sopenharmony_ci          -h, --help     show this help message and exit
46227db96d56Sopenharmony_ci          -v, --version  show program's version number and exit
46237db96d56Sopenharmony_ci        '''
46247db96d56Sopenharmony_ci
46257db96d56Sopenharmony_ci    version = '''\
46267db96d56Sopenharmony_ci        0.1
46277db96d56Sopenharmony_ci        '''
46287db96d56Sopenharmony_ci
46297db96d56Sopenharmony_ci
46307db96d56Sopenharmony_ci
46317db96d56Sopenharmony_ciclass TestHelpMetavarTypeFormatter(HelpTestCase):
46327db96d56Sopenharmony_ci
46337db96d56Sopenharmony_ci    def custom_type(string):
46347db96d56Sopenharmony_ci        return string
46357db96d56Sopenharmony_ci
46367db96d56Sopenharmony_ci    parser_signature = Sig(prog='PROG', description='description',
46377db96d56Sopenharmony_ci                           formatter_class=argparse.MetavarTypeHelpFormatter)
46387db96d56Sopenharmony_ci    argument_signatures = [Sig('a', type=int),
46397db96d56Sopenharmony_ci                           Sig('-b', type=custom_type),
46407db96d56Sopenharmony_ci                           Sig('-c', type=float, metavar='SOME FLOAT')]
46417db96d56Sopenharmony_ci    argument_group_signatures = []
46427db96d56Sopenharmony_ci    usage = '''\
46437db96d56Sopenharmony_ci        usage: PROG [-h] [-b custom_type] [-c SOME FLOAT] int
46447db96d56Sopenharmony_ci        '''
46457db96d56Sopenharmony_ci    help = usage + '''\
46467db96d56Sopenharmony_ci
46477db96d56Sopenharmony_ci        description
46487db96d56Sopenharmony_ci
46497db96d56Sopenharmony_ci        positional arguments:
46507db96d56Sopenharmony_ci          int
46517db96d56Sopenharmony_ci
46527db96d56Sopenharmony_ci        options:
46537db96d56Sopenharmony_ci          -h, --help      show this help message and exit
46547db96d56Sopenharmony_ci          -b custom_type
46557db96d56Sopenharmony_ci          -c SOME FLOAT
46567db96d56Sopenharmony_ci        '''
46577db96d56Sopenharmony_ci    version = ''
46587db96d56Sopenharmony_ci
46597db96d56Sopenharmony_ci
46607db96d56Sopenharmony_ci# =====================================
46617db96d56Sopenharmony_ci# Optional/Positional constructor tests
46627db96d56Sopenharmony_ci# =====================================
46637db96d56Sopenharmony_ci
46647db96d56Sopenharmony_ciclass TestInvalidArgumentConstructors(TestCase):
46657db96d56Sopenharmony_ci    """Test a bunch of invalid Argument constructors"""
46667db96d56Sopenharmony_ci
46677db96d56Sopenharmony_ci    def assertTypeError(self, *args, **kwargs):
46687db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
46697db96d56Sopenharmony_ci        self.assertRaises(TypeError, parser.add_argument,
46707db96d56Sopenharmony_ci                          *args, **kwargs)
46717db96d56Sopenharmony_ci
46727db96d56Sopenharmony_ci    def assertValueError(self, *args, **kwargs):
46737db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
46747db96d56Sopenharmony_ci        self.assertRaises(ValueError, parser.add_argument,
46757db96d56Sopenharmony_ci                          *args, **kwargs)
46767db96d56Sopenharmony_ci
46777db96d56Sopenharmony_ci    def test_invalid_keyword_arguments(self):
46787db96d56Sopenharmony_ci        self.assertTypeError('-x', bar=None)
46797db96d56Sopenharmony_ci        self.assertTypeError('-y', callback='foo')
46807db96d56Sopenharmony_ci        self.assertTypeError('-y', callback_args=())
46817db96d56Sopenharmony_ci        self.assertTypeError('-y', callback_kwargs={})
46827db96d56Sopenharmony_ci
46837db96d56Sopenharmony_ci    def test_missing_destination(self):
46847db96d56Sopenharmony_ci        self.assertTypeError()
46857db96d56Sopenharmony_ci        for action in ['append', 'store']:
46867db96d56Sopenharmony_ci            self.assertTypeError(action=action)
46877db96d56Sopenharmony_ci
46887db96d56Sopenharmony_ci    def test_invalid_option_strings(self):
46897db96d56Sopenharmony_ci        self.assertValueError('--')
46907db96d56Sopenharmony_ci        self.assertValueError('---')
46917db96d56Sopenharmony_ci
46927db96d56Sopenharmony_ci    def test_invalid_type(self):
46937db96d56Sopenharmony_ci        self.assertValueError('--foo', type='int')
46947db96d56Sopenharmony_ci        self.assertValueError('--foo', type=(int, float))
46957db96d56Sopenharmony_ci
46967db96d56Sopenharmony_ci    def test_invalid_action(self):
46977db96d56Sopenharmony_ci        self.assertValueError('-x', action='foo')
46987db96d56Sopenharmony_ci        self.assertValueError('foo', action='baz')
46997db96d56Sopenharmony_ci        self.assertValueError('--foo', action=('store', 'append'))
47007db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
47017db96d56Sopenharmony_ci        with self.assertRaises(ValueError) as cm:
47027db96d56Sopenharmony_ci            parser.add_argument("--foo", action="store-true")
47037db96d56Sopenharmony_ci        self.assertIn('unknown action', str(cm.exception))
47047db96d56Sopenharmony_ci
47057db96d56Sopenharmony_ci    def test_multiple_dest(self):
47067db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
47077db96d56Sopenharmony_ci        parser.add_argument(dest='foo')
47087db96d56Sopenharmony_ci        with self.assertRaises(ValueError) as cm:
47097db96d56Sopenharmony_ci            parser.add_argument('bar', dest='baz')
47107db96d56Sopenharmony_ci        self.assertIn('dest supplied twice for positional argument',
47117db96d56Sopenharmony_ci                      str(cm.exception))
47127db96d56Sopenharmony_ci
47137db96d56Sopenharmony_ci    def test_no_argument_actions(self):
47147db96d56Sopenharmony_ci        for action in ['store_const', 'store_true', 'store_false',
47157db96d56Sopenharmony_ci                       'append_const', 'count']:
47167db96d56Sopenharmony_ci            for attrs in [dict(type=int), dict(nargs='+'),
47177db96d56Sopenharmony_ci                          dict(choices='ab')]:
47187db96d56Sopenharmony_ci                self.assertTypeError('-x', action=action, **attrs)
47197db96d56Sopenharmony_ci
47207db96d56Sopenharmony_ci    def test_no_argument_no_const_actions(self):
47217db96d56Sopenharmony_ci        # options with zero arguments
47227db96d56Sopenharmony_ci        for action in ['store_true', 'store_false', 'count']:
47237db96d56Sopenharmony_ci
47247db96d56Sopenharmony_ci            # const is always disallowed
47257db96d56Sopenharmony_ci            self.assertTypeError('-x', const='foo', action=action)
47267db96d56Sopenharmony_ci
47277db96d56Sopenharmony_ci            # nargs is always disallowed
47287db96d56Sopenharmony_ci            self.assertTypeError('-x', nargs='*', action=action)
47297db96d56Sopenharmony_ci
47307db96d56Sopenharmony_ci    def test_more_than_one_argument_actions(self):
47317db96d56Sopenharmony_ci        for action in ['store', 'append']:
47327db96d56Sopenharmony_ci
47337db96d56Sopenharmony_ci            # nargs=0 is disallowed
47347db96d56Sopenharmony_ci            self.assertValueError('-x', nargs=0, action=action)
47357db96d56Sopenharmony_ci            self.assertValueError('spam', nargs=0, action=action)
47367db96d56Sopenharmony_ci
47377db96d56Sopenharmony_ci            # const is disallowed with non-optional arguments
47387db96d56Sopenharmony_ci            for nargs in [1, '*', '+']:
47397db96d56Sopenharmony_ci                self.assertValueError('-x', const='foo',
47407db96d56Sopenharmony_ci                                      nargs=nargs, action=action)
47417db96d56Sopenharmony_ci                self.assertValueError('spam', const='foo',
47427db96d56Sopenharmony_ci                                      nargs=nargs, action=action)
47437db96d56Sopenharmony_ci
47447db96d56Sopenharmony_ci    def test_required_const_actions(self):
47457db96d56Sopenharmony_ci        for action in ['store_const', 'append_const']:
47467db96d56Sopenharmony_ci
47477db96d56Sopenharmony_ci            # nargs is always disallowed
47487db96d56Sopenharmony_ci            self.assertTypeError('-x', nargs='+', action=action)
47497db96d56Sopenharmony_ci
47507db96d56Sopenharmony_ci    def test_parsers_action_missing_params(self):
47517db96d56Sopenharmony_ci        self.assertTypeError('command', action='parsers')
47527db96d56Sopenharmony_ci        self.assertTypeError('command', action='parsers', prog='PROG')
47537db96d56Sopenharmony_ci        self.assertTypeError('command', action='parsers',
47547db96d56Sopenharmony_ci                             parser_class=argparse.ArgumentParser)
47557db96d56Sopenharmony_ci
47567db96d56Sopenharmony_ci    def test_required_positional(self):
47577db96d56Sopenharmony_ci        self.assertTypeError('foo', required=True)
47587db96d56Sopenharmony_ci
47597db96d56Sopenharmony_ci    def test_user_defined_action(self):
47607db96d56Sopenharmony_ci
47617db96d56Sopenharmony_ci        class Success(Exception):
47627db96d56Sopenharmony_ci            pass
47637db96d56Sopenharmony_ci
47647db96d56Sopenharmony_ci        class Action(object):
47657db96d56Sopenharmony_ci
47667db96d56Sopenharmony_ci            def __init__(self,
47677db96d56Sopenharmony_ci                         option_strings,
47687db96d56Sopenharmony_ci                         dest,
47697db96d56Sopenharmony_ci                         const,
47707db96d56Sopenharmony_ci                         default,
47717db96d56Sopenharmony_ci                         required=False):
47727db96d56Sopenharmony_ci                if dest == 'spam':
47737db96d56Sopenharmony_ci                    if const is Success:
47747db96d56Sopenharmony_ci                        if default is Success:
47757db96d56Sopenharmony_ci                            raise Success()
47767db96d56Sopenharmony_ci
47777db96d56Sopenharmony_ci            def __call__(self, *args, **kwargs):
47787db96d56Sopenharmony_ci                pass
47797db96d56Sopenharmony_ci
47807db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
47817db96d56Sopenharmony_ci        self.assertRaises(Success, parser.add_argument, '--spam',
47827db96d56Sopenharmony_ci                          action=Action, default=Success, const=Success)
47837db96d56Sopenharmony_ci        self.assertRaises(Success, parser.add_argument, 'spam',
47847db96d56Sopenharmony_ci                          action=Action, default=Success, const=Success)
47857db96d56Sopenharmony_ci
47867db96d56Sopenharmony_ci# ================================
47877db96d56Sopenharmony_ci# Actions returned by add_argument
47887db96d56Sopenharmony_ci# ================================
47897db96d56Sopenharmony_ci
47907db96d56Sopenharmony_ciclass TestActionsReturned(TestCase):
47917db96d56Sopenharmony_ci
47927db96d56Sopenharmony_ci    def test_dest(self):
47937db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
47947db96d56Sopenharmony_ci        action = parser.add_argument('--foo')
47957db96d56Sopenharmony_ci        self.assertEqual(action.dest, 'foo')
47967db96d56Sopenharmony_ci        action = parser.add_argument('-b', '--bar')
47977db96d56Sopenharmony_ci        self.assertEqual(action.dest, 'bar')
47987db96d56Sopenharmony_ci        action = parser.add_argument('-x', '-y')
47997db96d56Sopenharmony_ci        self.assertEqual(action.dest, 'x')
48007db96d56Sopenharmony_ci
48017db96d56Sopenharmony_ci    def test_misc(self):
48027db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
48037db96d56Sopenharmony_ci        action = parser.add_argument('--foo', nargs='?', const=42,
48047db96d56Sopenharmony_ci                                     default=84, type=int, choices=[1, 2],
48057db96d56Sopenharmony_ci                                     help='FOO', metavar='BAR', dest='baz')
48067db96d56Sopenharmony_ci        self.assertEqual(action.nargs, '?')
48077db96d56Sopenharmony_ci        self.assertEqual(action.const, 42)
48087db96d56Sopenharmony_ci        self.assertEqual(action.default, 84)
48097db96d56Sopenharmony_ci        self.assertEqual(action.type, int)
48107db96d56Sopenharmony_ci        self.assertEqual(action.choices, [1, 2])
48117db96d56Sopenharmony_ci        self.assertEqual(action.help, 'FOO')
48127db96d56Sopenharmony_ci        self.assertEqual(action.metavar, 'BAR')
48137db96d56Sopenharmony_ci        self.assertEqual(action.dest, 'baz')
48147db96d56Sopenharmony_ci
48157db96d56Sopenharmony_ci
48167db96d56Sopenharmony_ci# ================================
48177db96d56Sopenharmony_ci# Argument conflict handling tests
48187db96d56Sopenharmony_ci# ================================
48197db96d56Sopenharmony_ci
48207db96d56Sopenharmony_ciclass TestConflictHandling(TestCase):
48217db96d56Sopenharmony_ci
48227db96d56Sopenharmony_ci    def test_bad_type(self):
48237db96d56Sopenharmony_ci        self.assertRaises(ValueError, argparse.ArgumentParser,
48247db96d56Sopenharmony_ci                          conflict_handler='foo')
48257db96d56Sopenharmony_ci
48267db96d56Sopenharmony_ci    def test_conflict_error(self):
48277db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
48287db96d56Sopenharmony_ci        parser.add_argument('-x')
48297db96d56Sopenharmony_ci        self.assertRaises(argparse.ArgumentError,
48307db96d56Sopenharmony_ci                          parser.add_argument, '-x')
48317db96d56Sopenharmony_ci        parser.add_argument('--spam')
48327db96d56Sopenharmony_ci        self.assertRaises(argparse.ArgumentError,
48337db96d56Sopenharmony_ci                          parser.add_argument, '--spam')
48347db96d56Sopenharmony_ci
48357db96d56Sopenharmony_ci    def test_resolve_error(self):
48367db96d56Sopenharmony_ci        get_parser = argparse.ArgumentParser
48377db96d56Sopenharmony_ci        parser = get_parser(prog='PROG', conflict_handler='resolve')
48387db96d56Sopenharmony_ci
48397db96d56Sopenharmony_ci        parser.add_argument('-x', help='OLD X')
48407db96d56Sopenharmony_ci        parser.add_argument('-x', help='NEW X')
48417db96d56Sopenharmony_ci        self.assertEqual(parser.format_help(), textwrap.dedent('''\
48427db96d56Sopenharmony_ci            usage: PROG [-h] [-x X]
48437db96d56Sopenharmony_ci
48447db96d56Sopenharmony_ci            options:
48457db96d56Sopenharmony_ci              -h, --help  show this help message and exit
48467db96d56Sopenharmony_ci              -x X        NEW X
48477db96d56Sopenharmony_ci            '''))
48487db96d56Sopenharmony_ci
48497db96d56Sopenharmony_ci        parser.add_argument('--spam', metavar='OLD_SPAM')
48507db96d56Sopenharmony_ci        parser.add_argument('--spam', metavar='NEW_SPAM')
48517db96d56Sopenharmony_ci        self.assertEqual(parser.format_help(), textwrap.dedent('''\
48527db96d56Sopenharmony_ci            usage: PROG [-h] [-x X] [--spam NEW_SPAM]
48537db96d56Sopenharmony_ci
48547db96d56Sopenharmony_ci            options:
48557db96d56Sopenharmony_ci              -h, --help       show this help message and exit
48567db96d56Sopenharmony_ci              -x X             NEW X
48577db96d56Sopenharmony_ci              --spam NEW_SPAM
48587db96d56Sopenharmony_ci            '''))
48597db96d56Sopenharmony_ci
48607db96d56Sopenharmony_ci    def test_subparser_conflict(self):
48617db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
48627db96d56Sopenharmony_ci        sp = parser.add_subparsers()
48637db96d56Sopenharmony_ci        sp.add_parser('fullname', aliases=['alias'])
48647db96d56Sopenharmony_ci        self.assertRaises(argparse.ArgumentError,
48657db96d56Sopenharmony_ci                          sp.add_parser, 'fullname')
48667db96d56Sopenharmony_ci        self.assertRaises(argparse.ArgumentError,
48677db96d56Sopenharmony_ci                          sp.add_parser, 'alias')
48687db96d56Sopenharmony_ci        self.assertRaises(argparse.ArgumentError,
48697db96d56Sopenharmony_ci                          sp.add_parser, 'other', aliases=['fullname'])
48707db96d56Sopenharmony_ci        self.assertRaises(argparse.ArgumentError,
48717db96d56Sopenharmony_ci                          sp.add_parser, 'other', aliases=['alias'])
48727db96d56Sopenharmony_ci
48737db96d56Sopenharmony_ci
48747db96d56Sopenharmony_ci# =============================
48757db96d56Sopenharmony_ci# Help and Version option tests
48767db96d56Sopenharmony_ci# =============================
48777db96d56Sopenharmony_ci
48787db96d56Sopenharmony_ciclass TestOptionalsHelpVersionActions(TestCase):
48797db96d56Sopenharmony_ci    """Test the help and version actions"""
48807db96d56Sopenharmony_ci
48817db96d56Sopenharmony_ci    def assertPrintHelpExit(self, parser, args_str):
48827db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
48837db96d56Sopenharmony_ci            parser.parse_args(args_str.split())
48847db96d56Sopenharmony_ci        self.assertEqual(parser.format_help(), cm.exception.stdout)
48857db96d56Sopenharmony_ci
48867db96d56Sopenharmony_ci    def assertArgumentParserError(self, parser, *args):
48877db96d56Sopenharmony_ci        self.assertRaises(ArgumentParserError, parser.parse_args, args)
48887db96d56Sopenharmony_ci
48897db96d56Sopenharmony_ci    def test_version(self):
48907db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
48917db96d56Sopenharmony_ci        parser.add_argument('-v', '--version', action='version', version='1.0')
48927db96d56Sopenharmony_ci        self.assertPrintHelpExit(parser, '-h')
48937db96d56Sopenharmony_ci        self.assertPrintHelpExit(parser, '--help')
48947db96d56Sopenharmony_ci        self.assertRaises(AttributeError, getattr, parser, 'format_version')
48957db96d56Sopenharmony_ci
48967db96d56Sopenharmony_ci    def test_version_format(self):
48977db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PPP')
48987db96d56Sopenharmony_ci        parser.add_argument('-v', '--version', action='version', version='%(prog)s 3.5')
48997db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
49007db96d56Sopenharmony_ci            parser.parse_args(['-v'])
49017db96d56Sopenharmony_ci        self.assertEqual('PPP 3.5\n', cm.exception.stdout)
49027db96d56Sopenharmony_ci
49037db96d56Sopenharmony_ci    def test_version_no_help(self):
49047db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(add_help=False)
49057db96d56Sopenharmony_ci        parser.add_argument('-v', '--version', action='version', version='1.0')
49067db96d56Sopenharmony_ci        self.assertArgumentParserError(parser, '-h')
49077db96d56Sopenharmony_ci        self.assertArgumentParserError(parser, '--help')
49087db96d56Sopenharmony_ci        self.assertRaises(AttributeError, getattr, parser, 'format_version')
49097db96d56Sopenharmony_ci
49107db96d56Sopenharmony_ci    def test_version_action(self):
49117db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='XXX')
49127db96d56Sopenharmony_ci        parser.add_argument('-V', action='version', version='%(prog)s 3.7')
49137db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
49147db96d56Sopenharmony_ci            parser.parse_args(['-V'])
49157db96d56Sopenharmony_ci        self.assertEqual('XXX 3.7\n', cm.exception.stdout)
49167db96d56Sopenharmony_ci
49177db96d56Sopenharmony_ci    def test_no_help(self):
49187db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(add_help=False)
49197db96d56Sopenharmony_ci        self.assertArgumentParserError(parser, '-h')
49207db96d56Sopenharmony_ci        self.assertArgumentParserError(parser, '--help')
49217db96d56Sopenharmony_ci        self.assertArgumentParserError(parser, '-v')
49227db96d56Sopenharmony_ci        self.assertArgumentParserError(parser, '--version')
49237db96d56Sopenharmony_ci
49247db96d56Sopenharmony_ci    def test_alternate_help_version(self):
49257db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
49267db96d56Sopenharmony_ci        parser.add_argument('-x', action='help')
49277db96d56Sopenharmony_ci        parser.add_argument('-y', action='version')
49287db96d56Sopenharmony_ci        self.assertPrintHelpExit(parser, '-x')
49297db96d56Sopenharmony_ci        self.assertArgumentParserError(parser, '-v')
49307db96d56Sopenharmony_ci        self.assertArgumentParserError(parser, '--version')
49317db96d56Sopenharmony_ci        self.assertRaises(AttributeError, getattr, parser, 'format_version')
49327db96d56Sopenharmony_ci
49337db96d56Sopenharmony_ci    def test_help_version_extra_arguments(self):
49347db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser()
49357db96d56Sopenharmony_ci        parser.add_argument('--version', action='version', version='1.0')
49367db96d56Sopenharmony_ci        parser.add_argument('-x', action='store_true')
49377db96d56Sopenharmony_ci        parser.add_argument('y')
49387db96d56Sopenharmony_ci
49397db96d56Sopenharmony_ci        # try all combinations of valid prefixes and suffixes
49407db96d56Sopenharmony_ci        valid_prefixes = ['', '-x', 'foo', '-x bar', 'baz -x']
49417db96d56Sopenharmony_ci        valid_suffixes = valid_prefixes + ['--bad-option', 'foo bar baz']
49427db96d56Sopenharmony_ci        for prefix in valid_prefixes:
49437db96d56Sopenharmony_ci            for suffix in valid_suffixes:
49447db96d56Sopenharmony_ci                format = '%s %%s %s' % (prefix, suffix)
49457db96d56Sopenharmony_ci            self.assertPrintHelpExit(parser, format % '-h')
49467db96d56Sopenharmony_ci            self.assertPrintHelpExit(parser, format % '--help')
49477db96d56Sopenharmony_ci            self.assertRaises(AttributeError, getattr, parser, 'format_version')
49487db96d56Sopenharmony_ci
49497db96d56Sopenharmony_ci
49507db96d56Sopenharmony_ci# ======================
49517db96d56Sopenharmony_ci# str() and repr() tests
49527db96d56Sopenharmony_ci# ======================
49537db96d56Sopenharmony_ci
49547db96d56Sopenharmony_ciclass TestStrings(TestCase):
49557db96d56Sopenharmony_ci    """Test str()  and repr() on Optionals and Positionals"""
49567db96d56Sopenharmony_ci
49577db96d56Sopenharmony_ci    def assertStringEqual(self, obj, result_string):
49587db96d56Sopenharmony_ci        for func in [str, repr]:
49597db96d56Sopenharmony_ci            self.assertEqual(func(obj), result_string)
49607db96d56Sopenharmony_ci
49617db96d56Sopenharmony_ci    def test_optional(self):
49627db96d56Sopenharmony_ci        option = argparse.Action(
49637db96d56Sopenharmony_ci            option_strings=['--foo', '-a', '-b'],
49647db96d56Sopenharmony_ci            dest='b',
49657db96d56Sopenharmony_ci            type='int',
49667db96d56Sopenharmony_ci            nargs='+',
49677db96d56Sopenharmony_ci            default=42,
49687db96d56Sopenharmony_ci            choices=[1, 2, 3],
49697db96d56Sopenharmony_ci            required=False,
49707db96d56Sopenharmony_ci            help='HELP',
49717db96d56Sopenharmony_ci            metavar='METAVAR')
49727db96d56Sopenharmony_ci        string = (
49737db96d56Sopenharmony_ci            "Action(option_strings=['--foo', '-a', '-b'], dest='b', "
49747db96d56Sopenharmony_ci            "nargs='+', const=None, default=42, type='int', "
49757db96d56Sopenharmony_ci            "choices=[1, 2, 3], required=False, help='HELP', metavar='METAVAR')")
49767db96d56Sopenharmony_ci        self.assertStringEqual(option, string)
49777db96d56Sopenharmony_ci
49787db96d56Sopenharmony_ci    def test_argument(self):
49797db96d56Sopenharmony_ci        argument = argparse.Action(
49807db96d56Sopenharmony_ci            option_strings=[],
49817db96d56Sopenharmony_ci            dest='x',
49827db96d56Sopenharmony_ci            type=float,
49837db96d56Sopenharmony_ci            nargs='?',
49847db96d56Sopenharmony_ci            default=2.5,
49857db96d56Sopenharmony_ci            choices=[0.5, 1.5, 2.5],
49867db96d56Sopenharmony_ci            required=True,
49877db96d56Sopenharmony_ci            help='H HH H',
49887db96d56Sopenharmony_ci            metavar='MV MV MV')
49897db96d56Sopenharmony_ci        string = (
49907db96d56Sopenharmony_ci            "Action(option_strings=[], dest='x', nargs='?', "
49917db96d56Sopenharmony_ci            "const=None, default=2.5, type=%r, choices=[0.5, 1.5, 2.5], "
49927db96d56Sopenharmony_ci            "required=True, help='H HH H', metavar='MV MV MV')" % float)
49937db96d56Sopenharmony_ci        self.assertStringEqual(argument, string)
49947db96d56Sopenharmony_ci
49957db96d56Sopenharmony_ci    def test_namespace(self):
49967db96d56Sopenharmony_ci        ns = argparse.Namespace(foo=42, bar='spam')
49977db96d56Sopenharmony_ci        string = "Namespace(foo=42, bar='spam')"
49987db96d56Sopenharmony_ci        self.assertStringEqual(ns, string)
49997db96d56Sopenharmony_ci
50007db96d56Sopenharmony_ci    def test_namespace_starkwargs_notidentifier(self):
50017db96d56Sopenharmony_ci        ns = argparse.Namespace(**{'"': 'quote'})
50027db96d56Sopenharmony_ci        string = """Namespace(**{'"': 'quote'})"""
50037db96d56Sopenharmony_ci        self.assertStringEqual(ns, string)
50047db96d56Sopenharmony_ci
50057db96d56Sopenharmony_ci    def test_namespace_kwargs_and_starkwargs_notidentifier(self):
50067db96d56Sopenharmony_ci        ns = argparse.Namespace(a=1, **{'"': 'quote'})
50077db96d56Sopenharmony_ci        string = """Namespace(a=1, **{'"': 'quote'})"""
50087db96d56Sopenharmony_ci        self.assertStringEqual(ns, string)
50097db96d56Sopenharmony_ci
50107db96d56Sopenharmony_ci    def test_namespace_starkwargs_identifier(self):
50117db96d56Sopenharmony_ci        ns = argparse.Namespace(**{'valid': True})
50127db96d56Sopenharmony_ci        string = "Namespace(valid=True)"
50137db96d56Sopenharmony_ci        self.assertStringEqual(ns, string)
50147db96d56Sopenharmony_ci
50157db96d56Sopenharmony_ci    def test_parser(self):
50167db96d56Sopenharmony_ci        parser = argparse.ArgumentParser(prog='PROG')
50177db96d56Sopenharmony_ci        string = (
50187db96d56Sopenharmony_ci            "ArgumentParser(prog='PROG', usage=None, description=None, "
50197db96d56Sopenharmony_ci            "formatter_class=%r, conflict_handler='error', "
50207db96d56Sopenharmony_ci            "add_help=True)" % argparse.HelpFormatter)
50217db96d56Sopenharmony_ci        self.assertStringEqual(parser, string)
50227db96d56Sopenharmony_ci
50237db96d56Sopenharmony_ci# ===============
50247db96d56Sopenharmony_ci# Namespace tests
50257db96d56Sopenharmony_ci# ===============
50267db96d56Sopenharmony_ci
50277db96d56Sopenharmony_ciclass TestNamespace(TestCase):
50287db96d56Sopenharmony_ci
50297db96d56Sopenharmony_ci    def test_constructor(self):
50307db96d56Sopenharmony_ci        ns = argparse.Namespace()
50317db96d56Sopenharmony_ci        self.assertRaises(AttributeError, getattr, ns, 'x')
50327db96d56Sopenharmony_ci
50337db96d56Sopenharmony_ci        ns = argparse.Namespace(a=42, b='spam')
50347db96d56Sopenharmony_ci        self.assertEqual(ns.a, 42)
50357db96d56Sopenharmony_ci        self.assertEqual(ns.b, 'spam')
50367db96d56Sopenharmony_ci
50377db96d56Sopenharmony_ci    def test_equality(self):
50387db96d56Sopenharmony_ci        ns1 = argparse.Namespace(a=1, b=2)
50397db96d56Sopenharmony_ci        ns2 = argparse.Namespace(b=2, a=1)
50407db96d56Sopenharmony_ci        ns3 = argparse.Namespace(a=1)
50417db96d56Sopenharmony_ci        ns4 = argparse.Namespace(b=2)
50427db96d56Sopenharmony_ci
50437db96d56Sopenharmony_ci        self.assertEqual(ns1, ns2)
50447db96d56Sopenharmony_ci        self.assertNotEqual(ns1, ns3)
50457db96d56Sopenharmony_ci        self.assertNotEqual(ns1, ns4)
50467db96d56Sopenharmony_ci        self.assertNotEqual(ns2, ns3)
50477db96d56Sopenharmony_ci        self.assertNotEqual(ns2, ns4)
50487db96d56Sopenharmony_ci        self.assertTrue(ns1 != ns3)
50497db96d56Sopenharmony_ci        self.assertTrue(ns1 != ns4)
50507db96d56Sopenharmony_ci        self.assertTrue(ns2 != ns3)
50517db96d56Sopenharmony_ci        self.assertTrue(ns2 != ns4)
50527db96d56Sopenharmony_ci
50537db96d56Sopenharmony_ci    def test_equality_returns_notimplemented(self):
50547db96d56Sopenharmony_ci        # See issue 21481
50557db96d56Sopenharmony_ci        ns = argparse.Namespace(a=1, b=2)
50567db96d56Sopenharmony_ci        self.assertIs(ns.__eq__(None), NotImplemented)
50577db96d56Sopenharmony_ci        self.assertIs(ns.__ne__(None), NotImplemented)
50587db96d56Sopenharmony_ci
50597db96d56Sopenharmony_ci
50607db96d56Sopenharmony_ci# ===================
50617db96d56Sopenharmony_ci# File encoding tests
50627db96d56Sopenharmony_ci# ===================
50637db96d56Sopenharmony_ci
50647db96d56Sopenharmony_ciclass TestEncoding(TestCase):
50657db96d56Sopenharmony_ci
50667db96d56Sopenharmony_ci    def _test_module_encoding(self, path):
50677db96d56Sopenharmony_ci        path, _ = os.path.splitext(path)
50687db96d56Sopenharmony_ci        path += ".py"
50697db96d56Sopenharmony_ci        with open(path, 'r', encoding='utf-8') as f:
50707db96d56Sopenharmony_ci            f.read()
50717db96d56Sopenharmony_ci
50727db96d56Sopenharmony_ci    def test_argparse_module_encoding(self):
50737db96d56Sopenharmony_ci        self._test_module_encoding(argparse.__file__)
50747db96d56Sopenharmony_ci
50757db96d56Sopenharmony_ci    def test_test_argparse_module_encoding(self):
50767db96d56Sopenharmony_ci        self._test_module_encoding(__file__)
50777db96d56Sopenharmony_ci
50787db96d56Sopenharmony_ci# ===================
50797db96d56Sopenharmony_ci# ArgumentError tests
50807db96d56Sopenharmony_ci# ===================
50817db96d56Sopenharmony_ci
50827db96d56Sopenharmony_ciclass TestArgumentError(TestCase):
50837db96d56Sopenharmony_ci
50847db96d56Sopenharmony_ci    def test_argument_error(self):
50857db96d56Sopenharmony_ci        msg = "my error here"
50867db96d56Sopenharmony_ci        error = argparse.ArgumentError(None, msg)
50877db96d56Sopenharmony_ci        self.assertEqual(str(error), msg)
50887db96d56Sopenharmony_ci
50897db96d56Sopenharmony_ci# =======================
50907db96d56Sopenharmony_ci# ArgumentTypeError tests
50917db96d56Sopenharmony_ci# =======================
50927db96d56Sopenharmony_ci
50937db96d56Sopenharmony_ciclass TestArgumentTypeError(TestCase):
50947db96d56Sopenharmony_ci
50957db96d56Sopenharmony_ci    def test_argument_type_error(self):
50967db96d56Sopenharmony_ci
50977db96d56Sopenharmony_ci        def spam(string):
50987db96d56Sopenharmony_ci            raise argparse.ArgumentTypeError('spam!')
50997db96d56Sopenharmony_ci
51007db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG', add_help=False)
51017db96d56Sopenharmony_ci        parser.add_argument('x', type=spam)
51027db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
51037db96d56Sopenharmony_ci            parser.parse_args(['XXX'])
51047db96d56Sopenharmony_ci        self.assertEqual('usage: PROG x\nPROG: error: argument x: spam!\n',
51057db96d56Sopenharmony_ci                         cm.exception.stderr)
51067db96d56Sopenharmony_ci
51077db96d56Sopenharmony_ci# =========================
51087db96d56Sopenharmony_ci# MessageContentError tests
51097db96d56Sopenharmony_ci# =========================
51107db96d56Sopenharmony_ci
51117db96d56Sopenharmony_ciclass TestMessageContentError(TestCase):
51127db96d56Sopenharmony_ci
51137db96d56Sopenharmony_ci    def test_missing_argument_name_in_message(self):
51147db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG', usage='')
51157db96d56Sopenharmony_ci        parser.add_argument('req_pos', type=str)
51167db96d56Sopenharmony_ci        parser.add_argument('-req_opt', type=int, required=True)
51177db96d56Sopenharmony_ci        parser.add_argument('need_one', type=str, nargs='+')
51187db96d56Sopenharmony_ci
51197db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
51207db96d56Sopenharmony_ci            parser.parse_args([])
51217db96d56Sopenharmony_ci        msg = str(cm.exception)
51227db96d56Sopenharmony_ci        self.assertRegex(msg, 'req_pos')
51237db96d56Sopenharmony_ci        self.assertRegex(msg, 'req_opt')
51247db96d56Sopenharmony_ci        self.assertRegex(msg, 'need_one')
51257db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
51267db96d56Sopenharmony_ci            parser.parse_args(['myXargument'])
51277db96d56Sopenharmony_ci        msg = str(cm.exception)
51287db96d56Sopenharmony_ci        self.assertNotIn(msg, 'req_pos')
51297db96d56Sopenharmony_ci        self.assertRegex(msg, 'req_opt')
51307db96d56Sopenharmony_ci        self.assertRegex(msg, 'need_one')
51317db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
51327db96d56Sopenharmony_ci            parser.parse_args(['myXargument', '-req_opt=1'])
51337db96d56Sopenharmony_ci        msg = str(cm.exception)
51347db96d56Sopenharmony_ci        self.assertNotIn(msg, 'req_pos')
51357db96d56Sopenharmony_ci        self.assertNotIn(msg, 'req_opt')
51367db96d56Sopenharmony_ci        self.assertRegex(msg, 'need_one')
51377db96d56Sopenharmony_ci
51387db96d56Sopenharmony_ci    def test_optional_optional_not_in_message(self):
51397db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG', usage='')
51407db96d56Sopenharmony_ci        parser.add_argument('req_pos', type=str)
51417db96d56Sopenharmony_ci        parser.add_argument('--req_opt', type=int, required=True)
51427db96d56Sopenharmony_ci        parser.add_argument('--opt_opt', type=bool, nargs='?',
51437db96d56Sopenharmony_ci                            default=True)
51447db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
51457db96d56Sopenharmony_ci            parser.parse_args([])
51467db96d56Sopenharmony_ci        msg = str(cm.exception)
51477db96d56Sopenharmony_ci        self.assertRegex(msg, 'req_pos')
51487db96d56Sopenharmony_ci        self.assertRegex(msg, 'req_opt')
51497db96d56Sopenharmony_ci        self.assertNotIn(msg, 'opt_opt')
51507db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
51517db96d56Sopenharmony_ci            parser.parse_args(['--req_opt=1'])
51527db96d56Sopenharmony_ci        msg = str(cm.exception)
51537db96d56Sopenharmony_ci        self.assertRegex(msg, 'req_pos')
51547db96d56Sopenharmony_ci        self.assertNotIn(msg, 'req_opt')
51557db96d56Sopenharmony_ci        self.assertNotIn(msg, 'opt_opt')
51567db96d56Sopenharmony_ci
51577db96d56Sopenharmony_ci    def test_optional_positional_not_in_message(self):
51587db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG', usage='')
51597db96d56Sopenharmony_ci        parser.add_argument('req_pos')
51607db96d56Sopenharmony_ci        parser.add_argument('optional_positional', nargs='?', default='eggs')
51617db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
51627db96d56Sopenharmony_ci            parser.parse_args([])
51637db96d56Sopenharmony_ci        msg = str(cm.exception)
51647db96d56Sopenharmony_ci        self.assertRegex(msg, 'req_pos')
51657db96d56Sopenharmony_ci        self.assertNotIn(msg, 'optional_positional')
51667db96d56Sopenharmony_ci
51677db96d56Sopenharmony_ci
51687db96d56Sopenharmony_ci# ================================================
51697db96d56Sopenharmony_ci# Check that the type function is called only once
51707db96d56Sopenharmony_ci# ================================================
51717db96d56Sopenharmony_ci
51727db96d56Sopenharmony_ciclass TestTypeFunctionCallOnlyOnce(TestCase):
51737db96d56Sopenharmony_ci
51747db96d56Sopenharmony_ci    def test_type_function_call_only_once(self):
51757db96d56Sopenharmony_ci        def spam(string_to_convert):
51767db96d56Sopenharmony_ci            self.assertEqual(string_to_convert, 'spam!')
51777db96d56Sopenharmony_ci            return 'foo_converted'
51787db96d56Sopenharmony_ci
51797db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
51807db96d56Sopenharmony_ci        parser.add_argument('--foo', type=spam, default='bar')
51817db96d56Sopenharmony_ci        args = parser.parse_args('--foo spam!'.split())
51827db96d56Sopenharmony_ci        self.assertEqual(NS(foo='foo_converted'), args)
51837db96d56Sopenharmony_ci
51847db96d56Sopenharmony_ci# ==================================================================
51857db96d56Sopenharmony_ci# Check semantics regarding the default argument and type conversion
51867db96d56Sopenharmony_ci# ==================================================================
51877db96d56Sopenharmony_ci
51887db96d56Sopenharmony_ciclass TestTypeFunctionCalledOnDefault(TestCase):
51897db96d56Sopenharmony_ci
51907db96d56Sopenharmony_ci    def test_type_function_call_with_non_string_default(self):
51917db96d56Sopenharmony_ci        def spam(int_to_convert):
51927db96d56Sopenharmony_ci            self.assertEqual(int_to_convert, 0)
51937db96d56Sopenharmony_ci            return 'foo_converted'
51947db96d56Sopenharmony_ci
51957db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
51967db96d56Sopenharmony_ci        parser.add_argument('--foo', type=spam, default=0)
51977db96d56Sopenharmony_ci        args = parser.parse_args([])
51987db96d56Sopenharmony_ci        # foo should *not* be converted because its default is not a string.
51997db96d56Sopenharmony_ci        self.assertEqual(NS(foo=0), args)
52007db96d56Sopenharmony_ci
52017db96d56Sopenharmony_ci    def test_type_function_call_with_string_default(self):
52027db96d56Sopenharmony_ci        def spam(int_to_convert):
52037db96d56Sopenharmony_ci            return 'foo_converted'
52047db96d56Sopenharmony_ci
52057db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
52067db96d56Sopenharmony_ci        parser.add_argument('--foo', type=spam, default='0')
52077db96d56Sopenharmony_ci        args = parser.parse_args([])
52087db96d56Sopenharmony_ci        # foo is converted because its default is a string.
52097db96d56Sopenharmony_ci        self.assertEqual(NS(foo='foo_converted'), args)
52107db96d56Sopenharmony_ci
52117db96d56Sopenharmony_ci    def test_no_double_type_conversion_of_default(self):
52127db96d56Sopenharmony_ci        def extend(str_to_convert):
52137db96d56Sopenharmony_ci            return str_to_convert + '*'
52147db96d56Sopenharmony_ci
52157db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
52167db96d56Sopenharmony_ci        parser.add_argument('--test', type=extend, default='*')
52177db96d56Sopenharmony_ci        args = parser.parse_args([])
52187db96d56Sopenharmony_ci        # The test argument will be two stars, one coming from the default
52197db96d56Sopenharmony_ci        # value and one coming from the type conversion being called exactly
52207db96d56Sopenharmony_ci        # once.
52217db96d56Sopenharmony_ci        self.assertEqual(NS(test='**'), args)
52227db96d56Sopenharmony_ci
52237db96d56Sopenharmony_ci    def test_issue_15906(self):
52247db96d56Sopenharmony_ci        # Issue #15906: When action='append', type=str, default=[] are
52257db96d56Sopenharmony_ci        # providing, the dest value was the string representation "[]" when it
52267db96d56Sopenharmony_ci        # should have been an empty list.
52277db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
52287db96d56Sopenharmony_ci        parser.add_argument('--test', dest='test', type=str,
52297db96d56Sopenharmony_ci                            default=[], action='append')
52307db96d56Sopenharmony_ci        args = parser.parse_args([])
52317db96d56Sopenharmony_ci        self.assertEqual(args.test, [])
52327db96d56Sopenharmony_ci
52337db96d56Sopenharmony_ci# ======================
52347db96d56Sopenharmony_ci# parse_known_args tests
52357db96d56Sopenharmony_ci# ======================
52367db96d56Sopenharmony_ci
52377db96d56Sopenharmony_ciclass TestParseKnownArgs(TestCase):
52387db96d56Sopenharmony_ci
52397db96d56Sopenharmony_ci    def test_arguments_tuple(self):
52407db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
52417db96d56Sopenharmony_ci        parser.parse_args(())
52427db96d56Sopenharmony_ci
52437db96d56Sopenharmony_ci    def test_arguments_list(self):
52447db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
52457db96d56Sopenharmony_ci        parser.parse_args([])
52467db96d56Sopenharmony_ci
52477db96d56Sopenharmony_ci    def test_arguments_tuple_positional(self):
52487db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
52497db96d56Sopenharmony_ci        parser.add_argument('x')
52507db96d56Sopenharmony_ci        parser.parse_args(('x',))
52517db96d56Sopenharmony_ci
52527db96d56Sopenharmony_ci    def test_arguments_list_positional(self):
52537db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
52547db96d56Sopenharmony_ci        parser.add_argument('x')
52557db96d56Sopenharmony_ci        parser.parse_args(['x'])
52567db96d56Sopenharmony_ci
52577db96d56Sopenharmony_ci    def test_optionals(self):
52587db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
52597db96d56Sopenharmony_ci        parser.add_argument('--foo')
52607db96d56Sopenharmony_ci        args, extras = parser.parse_known_args('--foo F --bar --baz'.split())
52617db96d56Sopenharmony_ci        self.assertEqual(NS(foo='F'), args)
52627db96d56Sopenharmony_ci        self.assertEqual(['--bar', '--baz'], extras)
52637db96d56Sopenharmony_ci
52647db96d56Sopenharmony_ci    def test_mixed(self):
52657db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
52667db96d56Sopenharmony_ci        parser.add_argument('-v', nargs='?', const=1, type=int)
52677db96d56Sopenharmony_ci        parser.add_argument('--spam', action='store_false')
52687db96d56Sopenharmony_ci        parser.add_argument('badger')
52697db96d56Sopenharmony_ci
52707db96d56Sopenharmony_ci        argv = ["B", "C", "--foo", "-v", "3", "4"]
52717db96d56Sopenharmony_ci        args, extras = parser.parse_known_args(argv)
52727db96d56Sopenharmony_ci        self.assertEqual(NS(v=3, spam=True, badger="B"), args)
52737db96d56Sopenharmony_ci        self.assertEqual(["C", "--foo", "4"], extras)
52747db96d56Sopenharmony_ci
52757db96d56Sopenharmony_ci# ===========================
52767db96d56Sopenharmony_ci# parse_intermixed_args tests
52777db96d56Sopenharmony_ci# ===========================
52787db96d56Sopenharmony_ci
52797db96d56Sopenharmony_ciclass TestIntermixedArgs(TestCase):
52807db96d56Sopenharmony_ci    def test_basic(self):
52817db96d56Sopenharmony_ci        # test parsing intermixed optionals and positionals
52827db96d56Sopenharmony_ci        parser = argparse.ArgumentParser(prog='PROG')
52837db96d56Sopenharmony_ci        parser.add_argument('--foo', dest='foo')
52847db96d56Sopenharmony_ci        bar = parser.add_argument('--bar', dest='bar', required=True)
52857db96d56Sopenharmony_ci        parser.add_argument('cmd')
52867db96d56Sopenharmony_ci        parser.add_argument('rest', nargs='*', type=int)
52877db96d56Sopenharmony_ci        argv = 'cmd --foo x 1 --bar y 2 3'.split()
52887db96d56Sopenharmony_ci        args = parser.parse_intermixed_args(argv)
52897db96d56Sopenharmony_ci        # rest gets [1,2,3] despite the foo and bar strings
52907db96d56Sopenharmony_ci        self.assertEqual(NS(bar='y', cmd='cmd', foo='x', rest=[1, 2, 3]), args)
52917db96d56Sopenharmony_ci
52927db96d56Sopenharmony_ci        args, extras = parser.parse_known_args(argv)
52937db96d56Sopenharmony_ci        # cannot parse the '1,2,3'
52947db96d56Sopenharmony_ci        self.assertEqual(NS(bar='y', cmd='cmd', foo='x', rest=[]), args)
52957db96d56Sopenharmony_ci        self.assertEqual(["1", "2", "3"], extras)
52967db96d56Sopenharmony_ci
52977db96d56Sopenharmony_ci        argv = 'cmd --foo x 1 --error 2 --bar y 3'.split()
52987db96d56Sopenharmony_ci        args, extras = parser.parse_known_intermixed_args(argv)
52997db96d56Sopenharmony_ci        # unknown optionals go into extras
53007db96d56Sopenharmony_ci        self.assertEqual(NS(bar='y', cmd='cmd', foo='x', rest=[1]), args)
53017db96d56Sopenharmony_ci        self.assertEqual(['--error', '2', '3'], extras)
53027db96d56Sopenharmony_ci
53037db96d56Sopenharmony_ci        # restores attributes that were temporarily changed
53047db96d56Sopenharmony_ci        self.assertIsNone(parser.usage)
53057db96d56Sopenharmony_ci        self.assertEqual(bar.required, True)
53067db96d56Sopenharmony_ci
53077db96d56Sopenharmony_ci    def test_remainder(self):
53087db96d56Sopenharmony_ci        # Intermixed and remainder are incompatible
53097db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
53107db96d56Sopenharmony_ci        parser.add_argument('-z')
53117db96d56Sopenharmony_ci        parser.add_argument('x')
53127db96d56Sopenharmony_ci        parser.add_argument('y', nargs='...')
53137db96d56Sopenharmony_ci        argv = 'X A B -z Z'.split()
53147db96d56Sopenharmony_ci        # intermixed fails with '...' (also 'A...')
53157db96d56Sopenharmony_ci        # self.assertRaises(TypeError, parser.parse_intermixed_args, argv)
53167db96d56Sopenharmony_ci        with self.assertRaises(TypeError) as cm:
53177db96d56Sopenharmony_ci            parser.parse_intermixed_args(argv)
53187db96d56Sopenharmony_ci        self.assertRegex(str(cm.exception), r'\.\.\.')
53197db96d56Sopenharmony_ci
53207db96d56Sopenharmony_ci    def test_exclusive(self):
53217db96d56Sopenharmony_ci        # mutually exclusive group; intermixed works fine
53227db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
53237db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group(required=True)
53247db96d56Sopenharmony_ci        group.add_argument('--foo', action='store_true', help='FOO')
53257db96d56Sopenharmony_ci        group.add_argument('--spam', help='SPAM')
53267db96d56Sopenharmony_ci        parser.add_argument('badger', nargs='*', default='X', help='BADGER')
53277db96d56Sopenharmony_ci        args = parser.parse_intermixed_args('1 --foo 2'.split())
53287db96d56Sopenharmony_ci        self.assertEqual(NS(badger=['1', '2'], foo=True, spam=None), args)
53297db96d56Sopenharmony_ci        self.assertRaises(ArgumentParserError, parser.parse_intermixed_args, '1 2'.split())
53307db96d56Sopenharmony_ci        self.assertEqual(group.required, True)
53317db96d56Sopenharmony_ci
53327db96d56Sopenharmony_ci    def test_exclusive_incompatible(self):
53337db96d56Sopenharmony_ci        # mutually exclusive group including positional - fail
53347db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG')
53357db96d56Sopenharmony_ci        group = parser.add_mutually_exclusive_group(required=True)
53367db96d56Sopenharmony_ci        group.add_argument('--foo', action='store_true', help='FOO')
53377db96d56Sopenharmony_ci        group.add_argument('--spam', help='SPAM')
53387db96d56Sopenharmony_ci        group.add_argument('badger', nargs='*', default='X', help='BADGER')
53397db96d56Sopenharmony_ci        self.assertRaises(TypeError, parser.parse_intermixed_args, [])
53407db96d56Sopenharmony_ci        self.assertEqual(group.required, True)
53417db96d56Sopenharmony_ci
53427db96d56Sopenharmony_ciclass TestIntermixedMessageContentError(TestCase):
53437db96d56Sopenharmony_ci    # case where Intermixed gives different error message
53447db96d56Sopenharmony_ci    # error is raised by 1st parsing step
53457db96d56Sopenharmony_ci    def test_missing_argument_name_in_message(self):
53467db96d56Sopenharmony_ci        parser = ErrorRaisingArgumentParser(prog='PROG', usage='')
53477db96d56Sopenharmony_ci        parser.add_argument('req_pos', type=str)
53487db96d56Sopenharmony_ci        parser.add_argument('-req_opt', type=int, required=True)
53497db96d56Sopenharmony_ci
53507db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
53517db96d56Sopenharmony_ci            parser.parse_args([])
53527db96d56Sopenharmony_ci        msg = str(cm.exception)
53537db96d56Sopenharmony_ci        self.assertRegex(msg, 'req_pos')
53547db96d56Sopenharmony_ci        self.assertRegex(msg, 'req_opt')
53557db96d56Sopenharmony_ci
53567db96d56Sopenharmony_ci        with self.assertRaises(ArgumentParserError) as cm:
53577db96d56Sopenharmony_ci            parser.parse_intermixed_args([])
53587db96d56Sopenharmony_ci        msg = str(cm.exception)
53597db96d56Sopenharmony_ci        self.assertNotRegex(msg, 'req_pos')
53607db96d56Sopenharmony_ci        self.assertRegex(msg, 'req_opt')
53617db96d56Sopenharmony_ci
53627db96d56Sopenharmony_ci# ==========================
53637db96d56Sopenharmony_ci# add_argument metavar tests
53647db96d56Sopenharmony_ci# ==========================
53657db96d56Sopenharmony_ci
53667db96d56Sopenharmony_ciclass TestAddArgumentMetavar(TestCase):
53677db96d56Sopenharmony_ci
53687db96d56Sopenharmony_ci    EXPECTED_MESSAGE = "length of metavar tuple does not match nargs"
53697db96d56Sopenharmony_ci
53707db96d56Sopenharmony_ci    def do_test_no_exception(self, nargs, metavar):
53717db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
53727db96d56Sopenharmony_ci        parser.add_argument("--foo", nargs=nargs, metavar=metavar)
53737db96d56Sopenharmony_ci
53747db96d56Sopenharmony_ci    def do_test_exception(self, nargs, metavar):
53757db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
53767db96d56Sopenharmony_ci        with self.assertRaises(ValueError) as cm:
53777db96d56Sopenharmony_ci            parser.add_argument("--foo", nargs=nargs, metavar=metavar)
53787db96d56Sopenharmony_ci        self.assertEqual(cm.exception.args[0], self.EXPECTED_MESSAGE)
53797db96d56Sopenharmony_ci
53807db96d56Sopenharmony_ci    # Unit tests for different values of metavar when nargs=None
53817db96d56Sopenharmony_ci
53827db96d56Sopenharmony_ci    def test_nargs_None_metavar_string(self):
53837db96d56Sopenharmony_ci        self.do_test_no_exception(nargs=None, metavar="1")
53847db96d56Sopenharmony_ci
53857db96d56Sopenharmony_ci    def test_nargs_None_metavar_length0(self):
53867db96d56Sopenharmony_ci        self.do_test_exception(nargs=None, metavar=tuple())
53877db96d56Sopenharmony_ci
53887db96d56Sopenharmony_ci    def test_nargs_None_metavar_length1(self):
53897db96d56Sopenharmony_ci        self.do_test_no_exception(nargs=None, metavar=("1",))
53907db96d56Sopenharmony_ci
53917db96d56Sopenharmony_ci    def test_nargs_None_metavar_length2(self):
53927db96d56Sopenharmony_ci        self.do_test_exception(nargs=None, metavar=("1", "2"))
53937db96d56Sopenharmony_ci
53947db96d56Sopenharmony_ci    def test_nargs_None_metavar_length3(self):
53957db96d56Sopenharmony_ci        self.do_test_exception(nargs=None, metavar=("1", "2", "3"))
53967db96d56Sopenharmony_ci
53977db96d56Sopenharmony_ci    # Unit tests for different values of metavar when nargs=?
53987db96d56Sopenharmony_ci
53997db96d56Sopenharmony_ci    def test_nargs_optional_metavar_string(self):
54007db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="?", metavar="1")
54017db96d56Sopenharmony_ci
54027db96d56Sopenharmony_ci    def test_nargs_optional_metavar_length0(self):
54037db96d56Sopenharmony_ci        self.do_test_exception(nargs="?", metavar=tuple())
54047db96d56Sopenharmony_ci
54057db96d56Sopenharmony_ci    def test_nargs_optional_metavar_length1(self):
54067db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="?", metavar=("1",))
54077db96d56Sopenharmony_ci
54087db96d56Sopenharmony_ci    def test_nargs_optional_metavar_length2(self):
54097db96d56Sopenharmony_ci        self.do_test_exception(nargs="?", metavar=("1", "2"))
54107db96d56Sopenharmony_ci
54117db96d56Sopenharmony_ci    def test_nargs_optional_metavar_length3(self):
54127db96d56Sopenharmony_ci        self.do_test_exception(nargs="?", metavar=("1", "2", "3"))
54137db96d56Sopenharmony_ci
54147db96d56Sopenharmony_ci    # Unit tests for different values of metavar when nargs=*
54157db96d56Sopenharmony_ci
54167db96d56Sopenharmony_ci    def test_nargs_zeroormore_metavar_string(self):
54177db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="*", metavar="1")
54187db96d56Sopenharmony_ci
54197db96d56Sopenharmony_ci    def test_nargs_zeroormore_metavar_length0(self):
54207db96d56Sopenharmony_ci        self.do_test_exception(nargs="*", metavar=tuple())
54217db96d56Sopenharmony_ci
54227db96d56Sopenharmony_ci    def test_nargs_zeroormore_metavar_length1(self):
54237db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="*", metavar=("1",))
54247db96d56Sopenharmony_ci
54257db96d56Sopenharmony_ci    def test_nargs_zeroormore_metavar_length2(self):
54267db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="*", metavar=("1", "2"))
54277db96d56Sopenharmony_ci
54287db96d56Sopenharmony_ci    def test_nargs_zeroormore_metavar_length3(self):
54297db96d56Sopenharmony_ci        self.do_test_exception(nargs="*", metavar=("1", "2", "3"))
54307db96d56Sopenharmony_ci
54317db96d56Sopenharmony_ci    # Unit tests for different values of metavar when nargs=+
54327db96d56Sopenharmony_ci
54337db96d56Sopenharmony_ci    def test_nargs_oneormore_metavar_string(self):
54347db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="+", metavar="1")
54357db96d56Sopenharmony_ci
54367db96d56Sopenharmony_ci    def test_nargs_oneormore_metavar_length0(self):
54377db96d56Sopenharmony_ci        self.do_test_exception(nargs="+", metavar=tuple())
54387db96d56Sopenharmony_ci
54397db96d56Sopenharmony_ci    def test_nargs_oneormore_metavar_length1(self):
54407db96d56Sopenharmony_ci        self.do_test_exception(nargs="+", metavar=("1",))
54417db96d56Sopenharmony_ci
54427db96d56Sopenharmony_ci    def test_nargs_oneormore_metavar_length2(self):
54437db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="+", metavar=("1", "2"))
54447db96d56Sopenharmony_ci
54457db96d56Sopenharmony_ci    def test_nargs_oneormore_metavar_length3(self):
54467db96d56Sopenharmony_ci        self.do_test_exception(nargs="+", metavar=("1", "2", "3"))
54477db96d56Sopenharmony_ci
54487db96d56Sopenharmony_ci    # Unit tests for different values of metavar when nargs=...
54497db96d56Sopenharmony_ci
54507db96d56Sopenharmony_ci    def test_nargs_remainder_metavar_string(self):
54517db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="...", metavar="1")
54527db96d56Sopenharmony_ci
54537db96d56Sopenharmony_ci    def test_nargs_remainder_metavar_length0(self):
54547db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="...", metavar=tuple())
54557db96d56Sopenharmony_ci
54567db96d56Sopenharmony_ci    def test_nargs_remainder_metavar_length1(self):
54577db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="...", metavar=("1",))
54587db96d56Sopenharmony_ci
54597db96d56Sopenharmony_ci    def test_nargs_remainder_metavar_length2(self):
54607db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="...", metavar=("1", "2"))
54617db96d56Sopenharmony_ci
54627db96d56Sopenharmony_ci    def test_nargs_remainder_metavar_length3(self):
54637db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="...", metavar=("1", "2", "3"))
54647db96d56Sopenharmony_ci
54657db96d56Sopenharmony_ci    # Unit tests for different values of metavar when nargs=A...
54667db96d56Sopenharmony_ci
54677db96d56Sopenharmony_ci    def test_nargs_parser_metavar_string(self):
54687db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="A...", metavar="1")
54697db96d56Sopenharmony_ci
54707db96d56Sopenharmony_ci    def test_nargs_parser_metavar_length0(self):
54717db96d56Sopenharmony_ci        self.do_test_exception(nargs="A...", metavar=tuple())
54727db96d56Sopenharmony_ci
54737db96d56Sopenharmony_ci    def test_nargs_parser_metavar_length1(self):
54747db96d56Sopenharmony_ci        self.do_test_no_exception(nargs="A...", metavar=("1",))
54757db96d56Sopenharmony_ci
54767db96d56Sopenharmony_ci    def test_nargs_parser_metavar_length2(self):
54777db96d56Sopenharmony_ci        self.do_test_exception(nargs="A...", metavar=("1", "2"))
54787db96d56Sopenharmony_ci
54797db96d56Sopenharmony_ci    def test_nargs_parser_metavar_length3(self):
54807db96d56Sopenharmony_ci        self.do_test_exception(nargs="A...", metavar=("1", "2", "3"))
54817db96d56Sopenharmony_ci
54827db96d56Sopenharmony_ci    # Unit tests for different values of metavar when nargs=1
54837db96d56Sopenharmony_ci
54847db96d56Sopenharmony_ci    def test_nargs_1_metavar_string(self):
54857db96d56Sopenharmony_ci        self.do_test_no_exception(nargs=1, metavar="1")
54867db96d56Sopenharmony_ci
54877db96d56Sopenharmony_ci    def test_nargs_1_metavar_length0(self):
54887db96d56Sopenharmony_ci        self.do_test_exception(nargs=1, metavar=tuple())
54897db96d56Sopenharmony_ci
54907db96d56Sopenharmony_ci    def test_nargs_1_metavar_length1(self):
54917db96d56Sopenharmony_ci        self.do_test_no_exception(nargs=1, metavar=("1",))
54927db96d56Sopenharmony_ci
54937db96d56Sopenharmony_ci    def test_nargs_1_metavar_length2(self):
54947db96d56Sopenharmony_ci        self.do_test_exception(nargs=1, metavar=("1", "2"))
54957db96d56Sopenharmony_ci
54967db96d56Sopenharmony_ci    def test_nargs_1_metavar_length3(self):
54977db96d56Sopenharmony_ci        self.do_test_exception(nargs=1, metavar=("1", "2", "3"))
54987db96d56Sopenharmony_ci
54997db96d56Sopenharmony_ci    # Unit tests for different values of metavar when nargs=2
55007db96d56Sopenharmony_ci
55017db96d56Sopenharmony_ci    def test_nargs_2_metavar_string(self):
55027db96d56Sopenharmony_ci        self.do_test_no_exception(nargs=2, metavar="1")
55037db96d56Sopenharmony_ci
55047db96d56Sopenharmony_ci    def test_nargs_2_metavar_length0(self):
55057db96d56Sopenharmony_ci        self.do_test_exception(nargs=2, metavar=tuple())
55067db96d56Sopenharmony_ci
55077db96d56Sopenharmony_ci    def test_nargs_2_metavar_length1(self):
55087db96d56Sopenharmony_ci        self.do_test_exception(nargs=2, metavar=("1",))
55097db96d56Sopenharmony_ci
55107db96d56Sopenharmony_ci    def test_nargs_2_metavar_length2(self):
55117db96d56Sopenharmony_ci        self.do_test_no_exception(nargs=2, metavar=("1", "2"))
55127db96d56Sopenharmony_ci
55137db96d56Sopenharmony_ci    def test_nargs_2_metavar_length3(self):
55147db96d56Sopenharmony_ci        self.do_test_exception(nargs=2, metavar=("1", "2", "3"))
55157db96d56Sopenharmony_ci
55167db96d56Sopenharmony_ci    # Unit tests for different values of metavar when nargs=3
55177db96d56Sopenharmony_ci
55187db96d56Sopenharmony_ci    def test_nargs_3_metavar_string(self):
55197db96d56Sopenharmony_ci        self.do_test_no_exception(nargs=3, metavar="1")
55207db96d56Sopenharmony_ci
55217db96d56Sopenharmony_ci    def test_nargs_3_metavar_length0(self):
55227db96d56Sopenharmony_ci        self.do_test_exception(nargs=3, metavar=tuple())
55237db96d56Sopenharmony_ci
55247db96d56Sopenharmony_ci    def test_nargs_3_metavar_length1(self):
55257db96d56Sopenharmony_ci        self.do_test_exception(nargs=3, metavar=("1",))
55267db96d56Sopenharmony_ci
55277db96d56Sopenharmony_ci    def test_nargs_3_metavar_length2(self):
55287db96d56Sopenharmony_ci        self.do_test_exception(nargs=3, metavar=("1", "2"))
55297db96d56Sopenharmony_ci
55307db96d56Sopenharmony_ci    def test_nargs_3_metavar_length3(self):
55317db96d56Sopenharmony_ci        self.do_test_no_exception(nargs=3, metavar=("1", "2", "3"))
55327db96d56Sopenharmony_ci
55337db96d56Sopenharmony_ci
55347db96d56Sopenharmony_ciclass TestInvalidNargs(TestCase):
55357db96d56Sopenharmony_ci
55367db96d56Sopenharmony_ci    EXPECTED_INVALID_MESSAGE = "invalid nargs value"
55377db96d56Sopenharmony_ci    EXPECTED_RANGE_MESSAGE = ("nargs for store actions must be != 0; if you "
55387db96d56Sopenharmony_ci                              "have nothing to store, actions such as store "
55397db96d56Sopenharmony_ci                              "true or store const may be more appropriate")
55407db96d56Sopenharmony_ci
55417db96d56Sopenharmony_ci    def do_test_range_exception(self, nargs):
55427db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
55437db96d56Sopenharmony_ci        with self.assertRaises(ValueError) as cm:
55447db96d56Sopenharmony_ci            parser.add_argument("--foo", nargs=nargs)
55457db96d56Sopenharmony_ci        self.assertEqual(cm.exception.args[0], self.EXPECTED_RANGE_MESSAGE)
55467db96d56Sopenharmony_ci
55477db96d56Sopenharmony_ci    def do_test_invalid_exception(self, nargs):
55487db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
55497db96d56Sopenharmony_ci        with self.assertRaises(ValueError) as cm:
55507db96d56Sopenharmony_ci            parser.add_argument("--foo", nargs=nargs)
55517db96d56Sopenharmony_ci        self.assertEqual(cm.exception.args[0], self.EXPECTED_INVALID_MESSAGE)
55527db96d56Sopenharmony_ci
55537db96d56Sopenharmony_ci    # Unit tests for different values of nargs
55547db96d56Sopenharmony_ci
55557db96d56Sopenharmony_ci    def test_nargs_alphabetic(self):
55567db96d56Sopenharmony_ci        self.do_test_invalid_exception(nargs='a')
55577db96d56Sopenharmony_ci        self.do_test_invalid_exception(nargs="abcd")
55587db96d56Sopenharmony_ci
55597db96d56Sopenharmony_ci    def test_nargs_zero(self):
55607db96d56Sopenharmony_ci        self.do_test_range_exception(nargs=0)
55617db96d56Sopenharmony_ci
55627db96d56Sopenharmony_ci# ============================
55637db96d56Sopenharmony_ci# from argparse import * tests
55647db96d56Sopenharmony_ci# ============================
55657db96d56Sopenharmony_ci
55667db96d56Sopenharmony_ciclass TestImportStar(TestCase):
55677db96d56Sopenharmony_ci
55687db96d56Sopenharmony_ci    def test(self):
55697db96d56Sopenharmony_ci        for name in argparse.__all__:
55707db96d56Sopenharmony_ci            self.assertTrue(hasattr(argparse, name))
55717db96d56Sopenharmony_ci
55727db96d56Sopenharmony_ci    def test_all_exports_everything_but_modules(self):
55737db96d56Sopenharmony_ci        items = [
55747db96d56Sopenharmony_ci            name
55757db96d56Sopenharmony_ci            for name, value in vars(argparse).items()
55767db96d56Sopenharmony_ci            if not (name.startswith("_") or name == 'ngettext')
55777db96d56Sopenharmony_ci            if not inspect.ismodule(value)
55787db96d56Sopenharmony_ci        ]
55797db96d56Sopenharmony_ci        self.assertEqual(sorted(items), sorted(argparse.__all__))
55807db96d56Sopenharmony_ci
55817db96d56Sopenharmony_ci
55827db96d56Sopenharmony_ciclass TestWrappingMetavar(TestCase):
55837db96d56Sopenharmony_ci
55847db96d56Sopenharmony_ci    def setUp(self):
55857db96d56Sopenharmony_ci        super().setUp()
55867db96d56Sopenharmony_ci        self.parser = ErrorRaisingArgumentParser(
55877db96d56Sopenharmony_ci            'this_is_spammy_prog_with_a_long_name_sorry_about_the_name'
55887db96d56Sopenharmony_ci        )
55897db96d56Sopenharmony_ci        # this metavar was triggering library assertion errors due to usage
55907db96d56Sopenharmony_ci        # message formatting incorrectly splitting on the ] chars within
55917db96d56Sopenharmony_ci        metavar = '<http[s]://example:1234>'
55927db96d56Sopenharmony_ci        self.parser.add_argument('--proxy', metavar=metavar)
55937db96d56Sopenharmony_ci
55947db96d56Sopenharmony_ci    def test_help_with_metavar(self):
55957db96d56Sopenharmony_ci        help_text = self.parser.format_help()
55967db96d56Sopenharmony_ci        self.assertEqual(help_text, textwrap.dedent('''\
55977db96d56Sopenharmony_ci            usage: this_is_spammy_prog_with_a_long_name_sorry_about_the_name
55987db96d56Sopenharmony_ci                   [-h] [--proxy <http[s]://example:1234>]
55997db96d56Sopenharmony_ci
56007db96d56Sopenharmony_ci            options:
56017db96d56Sopenharmony_ci              -h, --help            show this help message and exit
56027db96d56Sopenharmony_ci              --proxy <http[s]://example:1234>
56037db96d56Sopenharmony_ci            '''))
56047db96d56Sopenharmony_ci
56057db96d56Sopenharmony_ci
56067db96d56Sopenharmony_ciclass TestExitOnError(TestCase):
56077db96d56Sopenharmony_ci
56087db96d56Sopenharmony_ci    def setUp(self):
56097db96d56Sopenharmony_ci        self.parser = argparse.ArgumentParser(exit_on_error=False)
56107db96d56Sopenharmony_ci        self.parser.add_argument('--integers', metavar='N', type=int)
56117db96d56Sopenharmony_ci
56127db96d56Sopenharmony_ci    def test_exit_on_error_with_good_args(self):
56137db96d56Sopenharmony_ci        ns = self.parser.parse_args('--integers 4'.split())
56147db96d56Sopenharmony_ci        self.assertEqual(ns, argparse.Namespace(integers=4))
56157db96d56Sopenharmony_ci
56167db96d56Sopenharmony_ci    def test_exit_on_error_with_bad_args(self):
56177db96d56Sopenharmony_ci        with self.assertRaises(argparse.ArgumentError):
56187db96d56Sopenharmony_ci            self.parser.parse_args('--integers a'.split())
56197db96d56Sopenharmony_ci
56207db96d56Sopenharmony_ci
56217db96d56Sopenharmony_cidef tearDownModule():
56227db96d56Sopenharmony_ci    # Remove global references to avoid looking like we have refleaks.
56237db96d56Sopenharmony_ci    RFile.seen = {}
56247db96d56Sopenharmony_ci    WFile.seen = set()
56257db96d56Sopenharmony_ci
56267db96d56Sopenharmony_ci
56277db96d56Sopenharmony_ciif __name__ == '__main__':
56287db96d56Sopenharmony_ci    unittest.main()
5629