| 4000 | # ===================== |
| 4001 | |
| 4002 | class TestHelpFormattingMetaclass(type): |
| 4003 | |
| 4004 | def __init__(cls, name, bases, bodydict): |
| 4005 | if name == 'HelpTestCase': |
| 4006 | return |
| 4007 | |
| 4008 | class AddTests(object): |
| 4009 | |
| 4010 | def __init__(self, test_class, func_suffix, std_name): |
| 4011 | self.func_suffix = func_suffix |
| 4012 | self.std_name = std_name |
| 4013 | |
| 4014 | for test_func in [self.test_format, |
| 4015 | self.test_print, |
| 4016 | self.test_print_file]: |
| 4017 | test_name = '%s_%s' % (test_func.__name__, func_suffix) |
| 4018 | |
| 4019 | def test_wrapper(self, test_func=test_func): |
| 4020 | test_func(self) |
| 4021 | try: |
| 4022 | test_wrapper.__name__ = test_name |
| 4023 | except TypeError: |
| 4024 | pass |
| 4025 | setattr(test_class, test_name, test_wrapper) |
| 4026 | |
| 4027 | def _get_parser(self, tester): |
| 4028 | parser = argparse.ArgumentParser( |
| 4029 | *tester.parser_signature.args, |
| 4030 | **tester.parser_signature.kwargs) |
| 4031 | for argument_sig in getattr(tester, 'argument_signatures', []): |
| 4032 | parser.add_argument(*argument_sig.args, |
| 4033 | **argument_sig.kwargs) |
| 4034 | group_sigs = getattr(tester, 'argument_group_signatures', []) |
| 4035 | for group_sig, argument_sigs in group_sigs: |
| 4036 | group = parser.add_argument_group(*group_sig.args, |
| 4037 | **group_sig.kwargs) |
| 4038 | for argument_sig in argument_sigs: |
| 4039 | group.add_argument(*argument_sig.args, |
| 4040 | **argument_sig.kwargs) |
| 4041 | subparsers_sigs = getattr(tester, 'subparsers_signatures', []) |
| 4042 | if subparsers_sigs: |
| 4043 | subparsers = parser.add_subparsers() |
| 4044 | for subparser_sig in subparsers_sigs: |
| 4045 | subparsers.add_parser(*subparser_sig.args, |
| 4046 | **subparser_sig.kwargs) |
| 4047 | return parser |
| 4048 | |
| 4049 | def _test(self, tester, parser_text): |
| 4050 | expected_text = getattr(tester, self.func_suffix) |
| 4051 | expected_text = textwrap.dedent(expected_text) |
| 4052 | tester.maxDiff = None |
| 4053 | tester.assertEqual(expected_text, parser_text) |
| 4054 | |
| 4055 | @force_not_colorized |
| 4056 | def test_format(self, tester): |
| 4057 | parser = self._get_parser(tester) |
| 4058 | format = getattr(parser, 'format_%s' % self.func_suffix) |
| 4059 | self._test(tester, format()) |