diff options
Diffstat (limited to 'Lib/test/test_argparse.py')
| -rw-r--r-- | Lib/test/test_argparse.py | 138 | 
1 files changed, 64 insertions, 74 deletions
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 1164f3f..d7f90cd 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -20,15 +20,6 @@ class StdIOBuffer(StringIO):  class TestCase(unittest.TestCase): -    def assertEqual(self, obj1, obj2): -        if obj1 != obj2: -            print('') -            print(repr(obj1)) -            print(repr(obj2)) -            print(obj1) -            print(obj2) -        super(TestCase, self).assertEqual(obj1, obj2) -      def setUp(self):          # The tests assume that line wrapping occurs at 80 columns, but this          # behaviour can be overridden by setting the COLUMNS environment @@ -78,9 +69,6 @@ class NS(object):      def __eq__(self, other):          return vars(self) == vars(other) -    def __ne__(self, other): -        return not (self == other) -  class ArgumentParserError(Exception): @@ -765,6 +753,39 @@ class TestOptionalsActionCount(ParserTestCase):      ] +class TestOptionalsAllowLongAbbreviation(ParserTestCase): +    """Allow long options to be abbreviated unambiguously""" + +    argument_signatures = [ +        Sig('--foo'), +        Sig('--foobaz'), +        Sig('--fooble', action='store_true'), +    ] +    failures = ['--foob 5', '--foob'] +    successes = [ +        ('', NS(foo=None, foobaz=None, fooble=False)), +        ('--foo 7', NS(foo='7', foobaz=None, fooble=False)), +        ('--fooba a', NS(foo=None, foobaz='a', fooble=False)), +        ('--foobl --foo g', NS(foo='g', foobaz=None, fooble=True)), +    ] + + +class TestOptionalsDisallowLongAbbreviation(ParserTestCase): +    """Do not allow abbreviations of long options at all""" + +    parser_signature = Sig(allow_abbrev=False) +    argument_signatures = [ +        Sig('--foo'), +        Sig('--foodle', action='store_true'), +        Sig('--foonly'), +    ] +    failures = ['-foon 3', '--foon 3', '--food', '--food --foo 2'] +    successes = [ +        ('', NS(foo=None, foodle=False, foonly=None)), +        ('--foo 3', NS(foo='3', foodle=False, foonly=None)), +        ('--foonly 7 --foodle --foo 2', NS(foo='2', foodle=True, foonly='7')), +    ] +  # ================  # Positional tests  # ================ @@ -1993,14 +2014,9 @@ class TestAddSubparsers(TestCase):              '''))      def _test_subparser_help(self, args_str, expected_help): -        try: +        with self.assertRaises(ArgumentParserError) as cm:              self.parser.parse_args(args_str.split()) -        except ArgumentParserError: -            err = sys.exc_info()[1] -            if err.stdout != expected_help: -                print(repr(expected_help)) -                print(repr(err.stdout)) -            self.assertEqual(err.stdout, expected_help) +        self.assertEqual(expected_help, cm.exception.stdout)      def test_subparser1_help(self):          self._test_subparser_help('5.0 1 -h', textwrap.dedent('''\ @@ -2846,15 +2862,15 @@ class TestGetDefault(TestCase):      def test_get_default(self):          parser = ErrorRaisingArgumentParser() -        self.assertEqual(None, parser.get_default("foo")) -        self.assertEqual(None, parser.get_default("bar")) +        self.assertIsNone(parser.get_default("foo")) +        self.assertIsNone(parser.get_default("bar"))          parser.add_argument("--foo") -        self.assertEqual(None, parser.get_default("foo")) -        self.assertEqual(None, parser.get_default("bar")) +        self.assertIsNone(parser.get_default("foo")) +        self.assertIsNone(parser.get_default("bar"))          parser.add_argument("--bar", type=int, default=42) -        self.assertEqual(None, parser.get_default("foo")) +        self.assertIsNone(parser.get_default("foo"))          self.assertEqual(42, parser.get_default("bar"))          parser.set_defaults(foo="badger") @@ -2869,18 +2885,16 @@ class TestNamespaceContainsSimple(TestCase):      def test_empty(self):          ns = argparse.Namespace() -        self.assertEqual('' in ns, False) -        self.assertEqual('' not in ns, True) -        self.assertEqual('x' in ns, False) +        self.assertNotIn('', ns) +        self.assertNotIn('x', ns)      def test_non_empty(self):          ns = argparse.Namespace(x=1, y=2) -        self.assertEqual('x' in ns, True) -        self.assertEqual('x' not in ns, False) -        self.assertEqual('y' in ns, True) -        self.assertEqual('' in ns, False) -        self.assertEqual('xx' in ns, False) -        self.assertEqual('z' in ns, False) +        self.assertNotIn('', ns) +        self.assertIn('x', ns) +        self.assertIn('y', ns) +        self.assertNotIn('xx', ns) +        self.assertNotIn('z', ns)  # =====================  # Help formatting tests @@ -2936,13 +2950,6 @@ class TestHelpFormattingMetaclass(type):              def _test(self, tester, parser_text):                  expected_text = getattr(tester, self.func_suffix)                  expected_text = textwrap.dedent(expected_text) -                if expected_text != parser_text: -                    print(repr(expected_text)) -                    print(repr(parser_text)) -                    for char1, char2 in zip(expected_text, parser_text): -                        if char1 != char2: -                            print('first diff: %r %r' % (char1, char2)) -                            break                  tester.assertEqual(expected_text, parser_text)              def test_format(self, tester): @@ -4223,24 +4230,17 @@ class TestInvalidArgumentConstructors(TestCase):          self.assertValueError('foo', action='baz')          self.assertValueError('--foo', action=('store', 'append'))          parser = argparse.ArgumentParser() -        try: +        with self.assertRaises(ValueError) as cm:              parser.add_argument("--foo", action="store-true") -        except ValueError: -            e = sys.exc_info()[1] -            expected = 'unknown action' -            msg = 'expected %r, found %r' % (expected, e) -            self.assertTrue(expected in str(e), msg) +        self.assertIn('unknown action', str(cm.exception))      def test_multiple_dest(self):          parser = argparse.ArgumentParser()          parser.add_argument(dest='foo') -        try: +        with self.assertRaises(ValueError) as cm:              parser.add_argument('bar', dest='baz') -        except ValueError: -            e = sys.exc_info()[1] -            expected = 'dest supplied twice for positional argument' -            msg = 'expected %r, found %r' % (expected, e) -            self.assertTrue(expected in str(e), msg) +        self.assertIn('dest supplied twice for positional argument', +                      str(cm.exception))      def test_no_argument_actions(self):          for action in ['store_const', 'store_true', 'store_false', @@ -4397,18 +4397,10 @@ class TestConflictHandling(TestCase):  class TestOptionalsHelpVersionActions(TestCase):      """Test the help and version actions""" -    def _get_error(self, func, *args, **kwargs): -        try: -            func(*args, **kwargs) -        except ArgumentParserError: -            return sys.exc_info()[1] -        else: -            self.assertRaises(ArgumentParserError, func, *args, **kwargs) -      def assertPrintHelpExit(self, parser, args_str): -        self.assertEqual( -            parser.format_help(), -            self._get_error(parser.parse_args, args_str.split()).stdout) +        with self.assertRaises(ArgumentParserError) as cm: +            parser.parse_args(args_str.split()) +        self.assertEqual(parser.format_help(), cm.exception.stdout)      def assertArgumentParserError(self, parser, *args):          self.assertRaises(ArgumentParserError, parser.parse_args, args) @@ -4423,8 +4415,9 @@ class TestOptionalsHelpVersionActions(TestCase):      def test_version_format(self):          parser = ErrorRaisingArgumentParser(prog='PPP')          parser.add_argument('-v', '--version', action='version', version='%(prog)s 3.5') -        msg = self._get_error(parser.parse_args, ['-v']).stdout -        self.assertEqual('PPP 3.5\n', msg) +        with self.assertRaises(ArgumentParserError) as cm: +            parser.parse_args(['-v']) +        self.assertEqual('PPP 3.5\n', cm.exception.stdout)      def test_version_no_help(self):          parser = ErrorRaisingArgumentParser(add_help=False) @@ -4436,8 +4429,9 @@ class TestOptionalsHelpVersionActions(TestCase):      def test_version_action(self):          parser = ErrorRaisingArgumentParser(prog='XXX')          parser.add_argument('-V', action='version', version='%(prog)s 3.7') -        msg = self._get_error(parser.parse_args, ['-V']).stdout -        self.assertEqual('XXX 3.7\n', msg) +        with self.assertRaises(ArgumentParserError) as cm: +            parser.parse_args(['-V']) +        self.assertEqual('XXX 3.7\n', cm.exception.stdout)      def test_no_help(self):          parser = ErrorRaisingArgumentParser(add_help=False) @@ -4607,14 +4601,10 @@ class TestArgumentTypeError(TestCase):          parser = ErrorRaisingArgumentParser(prog='PROG', add_help=False)          parser.add_argument('x', type=spam) -        try: +        with self.assertRaises(ArgumentParserError) as cm:              parser.parse_args(['XXX']) -        except ArgumentParserError: -            expected = 'usage: PROG x\nPROG: error: argument x: spam!\n' -            msg = sys.exc_info()[1].stderr -            self.assertEqual(expected, msg) -        else: -            self.fail() +        self.assertEqual('usage: PROG x\nPROG: error: argument x: spam!\n', +                         cm.exception.stderr)  # =========================  # MessageContentError tests  | 
