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