<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 29, 2013 at 3:27 AM, serhiy.storchaka <span dir="ltr"><<a href="mailto:python-checkins@python.org" target="_blank">python-checkins@python.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><a href="http://hg.python.org/cpython/rev/997de0edc5bd" target="_blank">http://hg.python.org/cpython/rev/997de0edc5bd</a><br>

changeset:   85444:997de0edc5bd<br>
parent:      85442:676bbd5b0254<br>
user:        Serhiy Storchaka <<a href="mailto:storchaka@gmail.com">storchaka@gmail.com</a>><br>
date:        Thu Aug 29 12:26:23 2013 +0300<br>
summary:<br>
  Issue #16799: Switched from getopt to argparse style in regrtest's argument<br>
parsing.  Added more tests for regrtest's argument parsing.<br>
<br>
files:<br>
  Lib/test/regrtest.py      |  529 +++++++++++--------------<br>
  Lib/test/test_regrtest.py |  328 ++++++++++++---<br>
  Misc/NEWS                 |    3 +<br>
  3 files changed, 500 insertions(+), 360 deletions(-)<br>
<br>
<br>
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py<br>
--- a/Lib/test/regrtest.py<br>
+++ b/Lib/test/regrtest.py<br>... <br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py<br>
--- a/Lib/test/test_regrtest.py<br>
+++ b/Lib/test/test_regrtest.py<br>
@@ -4,97 +4,281 @@<br>
<br>
 import argparse<br>
 import getopt<br></blockquote><div><br></div><div>We aren't using getopt in this module anymore, are we?</div><div><br></div><div>-eric</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

+import os.path<br>
 import unittest<br>
 from test import regrtest, support<br>
<br>
-def old_parse_args(args):<br>
-    """Parse arguments as regrtest did strictly prior to 3.4.<br>
-<br>
-    Raises getopt.GetoptError on bad arguments.<br>
-    """<br>
-    return getopt.getopt(args, 'hvqxsoS:rf:lu:t:TD:NLR:FdwWM:nj:Gm:',<br>
-        ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',<br>
-         'exclude', 'single', 'slow', 'randomize', 'fromfile=', 'findleaks',<br>
-         'use=', 'threshold=', 'coverdir=', 'nocoverdir',<br>
-         'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',<br>
-         'multiprocess=', 'coverage', 'slaveargs=', 'forever', 'debug',<br>
-         'start=', 'nowindows', 'header', 'testdir=', 'timeout=', 'wait',<br>
-         'failfast', 'match='])<br>
-<br>
 class ParseArgsTestCase(unittest.TestCase):<br>
<br>
-    """Test that regrtest's parsing code matches the prior getopt behavior."""<br>
+    """Test regrtest's argument parsing."""<br>
<br>
-    def _parse_args(self, args):<br>
-        # This is the same logic as that used in regrtest.main()<br>
-        parser = regrtest._create_parser()<br>
-        ns = parser.parse_args(args=args)<br>
-        opts = regrtest._convert_namespace_to_getopt(ns)<br>
-        return opts, ns.args<br>
+    def checkError(self, args, msg):<br>
+        with support.captured_stderr() as err, self.assertRaises(SystemExit):<br>
+            regrtest._parse_args(args)<br>
+        self.assertIn(msg, err.getvalue())<br>
<br>
-    def _check_args(self, args, expected=None):<br>
-        """<br>
-        The expected parameter is for cases when the behavior of the new<br>
-        parse_args differs from the old (but deliberately so).<br>
-        """<br>
-        if expected is None:<br>
-            try:<br>
-                expected = old_parse_args(args)<br>
-            except getopt.GetoptError:<br>
-                # Suppress usage string output when an argparse.ArgumentError<br>
-                # error is raised.<br>
-                with support.captured_stderr():<br>
-                    self.assertRaises(SystemExit, self._parse_args, args)<br>
-                return<br>
-        # The new parse_args() sorts by long option string.<br>
-        expected[0].sort()<br>
-        actual = self._parse_args(args)<br>
-        self.assertEqual(actual, expected)<br>
+    def test_help(self):<br>
+        for opt in '-h', '--help':<br>
+            with self.subTest(opt=opt):<br>
+                with support.captured_stdout() as out, \<br>
+                     self.assertRaises(SystemExit):<br>
+                    regrtest._parse_args([opt])<br>
+                self.assertIn('Run Python regression tests.', out.getvalue())<br>
+<br>
+    def test_timeout(self):<br>
+        ns = regrtest._parse_args(['--timeout', '4.2'])<br>
+        self.assertEqual(ns.timeout, 4.2)<br>
+        self.checkError(['--timeout'], 'expected one argument')<br>
+        self.checkError(['--timeout', 'foo'], 'invalid float value')<br>
+<br>
+    def test_wait(self):<br>
+        ns = regrtest._parse_args(['--wait'])<br>
+        self.assertTrue(ns.wait)<br>
+<br>
+    def test_slaveargs(self):<br>
+        ns = regrtest._parse_args(['--slaveargs', '[[], {}]'])<br>
+        self.assertEqual(ns.slaveargs, '[[], {}]')<br>
+        self.checkError(['--slaveargs'], 'expected one argument')<br>
+<br>
+    def test_start(self):<br>
+        for opt in '-S', '--start':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt, 'foo'])<br>
+                self.assertEqual(ns.start, 'foo')<br>
+                self.checkError([opt], 'expected one argument')<br>
+<br>
+    def test_verbose(self):<br>
+        ns = regrtest._parse_args(['-v'])<br>
+        self.assertEqual(ns.verbose, 1)<br>
+        ns = regrtest._parse_args(['-vvv'])<br>
+        self.assertEqual(ns.verbose, 3)<br>
+        ns = regrtest._parse_args(['--verbose'])<br>
+        self.assertEqual(ns.verbose, 1)<br>
+        ns = regrtest._parse_args(['--verbose'] * 3)<br>
+        self.assertEqual(ns.verbose, 3)<br>
+        ns = regrtest._parse_args([])<br>
+        self.assertEqual(ns.verbose, 0)<br>
+<br>
+    def test_verbose2(self):<br>
+        for opt in '-w', '--verbose2':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.verbose2)<br>
+<br>
+    def test_verbose3(self):<br>
+        for opt in '-W', '--verbose3':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.verbose3)<br>
+<br>
+    def test_debug(self):<br>
+        for opt in '-d', '--debug':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.debug)<br>
+<br>
+    def test_quiet(self):<br>
+        for opt in '-q', '--quiet':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.quiet)<br>
+                self.assertEqual(ns.verbose, 0)<br>
+<br>
+    def test_slow(self):<br>
+        for opt in '-o', '--slow':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.print_slow)<br>
+<br>
+    def test_header(self):<br>
+        ns = regrtest._parse_args(['--header'])<br>
+        self.assertTrue(ns.header)<br>
+<br>
+    def test_randomize(self):<br>
+        for opt in '-r', '--randomize':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.randomize)<br>
+<br>
+    def test_randseed(self):<br>
+        ns = regrtest._parse_args(['--randseed', '12345'])<br>
+        self.assertEqual(ns.random_seed, 12345)<br>
+        self.assertTrue(ns.randomize)<br>
+        self.checkError(['--randseed'], 'expected one argument')<br>
+        self.checkError(['--randseed', 'foo'], 'invalid int value')<br>
+<br>
+    def test_fromfile(self):<br>
+        for opt in '-f', '--fromfile':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt, 'foo'])<br>
+                self.assertEqual(ns.fromfile, 'foo')<br>
+                self.checkError([opt], 'expected one argument')<br>
+                self.checkError([opt, 'foo', '-s'], "don't go together")<br>
+<br>
+    def test_exclude(self):<br>
+        for opt in '-x', '--exclude':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.exclude)<br>
+<br>
+    def test_single(self):<br>
+        for opt in '-s', '--single':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.single)<br>
+                self.checkError([opt, '-f', 'foo'], "don't go together")<br>
+<br>
+    def test_match(self):<br>
+        for opt in '-m', '--match':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt, 'pattern'])<br>
+                self.assertEqual(ns.match_tests, 'pattern')<br>
+                self.checkError([opt], 'expected one argument')<br>
+<br>
+    def test_failfast(self):<br>
+        for opt in '-G', '--failfast':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt, '-v'])<br>
+                self.assertTrue(ns.failfast)<br>
+                ns = regrtest._parse_args([opt, '-W'])<br>
+                self.assertTrue(ns.failfast)<br>
+                self.checkError([opt], '-G/--failfast needs either -v or -W')<br>
+<br>
+    def test_use(self):<br>
+        for opt in '-u', '--use':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt, 'gui,network'])<br>
+                self.assertEqual(ns.use_resources, ['gui', 'network'])<br>
+                ns = regrtest._parse_args([opt, 'gui,none,network'])<br>
+                self.assertEqual(ns.use_resources, ['network'])<br>
+                expected = list(regrtest.RESOURCE_NAMES)<br>
+                expected.remove('gui')<br>
+                ns = regrtest._parse_args([opt, 'all,-gui'])<br>
+                self.assertEqual(ns.use_resources, expected)<br>
+                self.checkError([opt], 'expected one argument')<br>
+                self.checkError([opt, 'foo'], 'invalid resource')<br>
+<br>
+    def test_memlimit(self):<br>
+        for opt in '-M', '--memlimit':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt, '4G'])<br>
+                self.assertEqual(ns.memlimit, '4G')<br>
+                self.checkError([opt], 'expected one argument')<br>
+<br>
+    def test_testdir(self):<br>
+        ns = regrtest._parse_args(['--testdir', 'foo'])<br>
+        self.assertEqual(ns.testdir, os.path.join(support.SAVEDCWD, 'foo'))<br>
+        self.checkError(['--testdir'], 'expected one argument')<br>
+<br>
+    def test_findleaks(self):<br>
+        for opt in '-l', '--findleaks':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.findleaks)<br>
+<br>
+    def test_findleaks(self):<br>
+        for opt in '-L', '--runleaks':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.runleaks)<br>
+<br>
+    def test_findleaks(self):<br>
+        for opt in '-R', '--huntrleaks':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt, ':'])<br>
+                self.assertEqual(ns.huntrleaks, (5, 4, 'reflog.txt'))<br>
+                ns = regrtest._parse_args([opt, '6:'])<br>
+                self.assertEqual(ns.huntrleaks, (6, 4, 'reflog.txt'))<br>
+                ns = regrtest._parse_args([opt, ':3'])<br>
+                self.assertEqual(ns.huntrleaks, (5, 3, 'reflog.txt'))<br>
+                ns = regrtest._parse_args([opt, '6:3:leaks.log'])<br>
+                self.assertEqual(ns.huntrleaks, (6, 3, 'leaks.log'))<br>
+                self.checkError([opt], 'expected one argument')<br>
+                self.checkError([opt, '6'],<br>
+                                'needs 2 or 3 colon-separated arguments')<br>
+                self.checkError([opt, 'foo:'], 'invalid huntrleaks value')<br>
+                self.checkError([opt, '6:foo'], 'invalid huntrleaks value')<br>
+<br>
+    def test_multiprocess(self):<br>
+        for opt in '-j', '--multiprocess':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt, '2'])<br>
+                self.assertEqual(ns.use_mp, 2)<br>
+                self.checkError([opt], 'expected one argument')<br>
+                self.checkError([opt, 'foo'], 'invalid int value')<br>
+                self.checkError([opt, '2', '-T'], "don't go together")<br>
+                self.checkError([opt, '2', '-l'], "don't go together")<br>
+                self.checkError([opt, '2', '-M', '4G'], "don't go together")<br>
+<br>
+    def test_findleaks(self):<br>
+        for opt in '-T', '--coverage':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.trace)<br>
+<br>
+    def test_coverdir(self):<br>
+        for opt in '-D', '--coverdir':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt, 'foo'])<br>
+                self.assertEqual(ns.coverdir,<br>
+                                 os.path.join(support.SAVEDCWD, 'foo'))<br>
+                self.checkError([opt], 'expected one argument')<br>
+<br>
+    def test_nocoverdir(self):<br>
+        for opt in '-N', '--nocoverdir':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertIsNone(ns.coverdir)<br>
+<br>
+    def test_threshold(self):<br>
+        for opt in '-t', '--threshold':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt, '1000'])<br>
+                self.assertEqual(ns.threshold, 1000)<br>
+                self.checkError([opt], 'expected one argument')<br>
+                self.checkError([opt, 'foo'], 'invalid int value')<br>
+<br>
+    def test_nowindows(self):<br>
+        for opt in '-n', '--nowindows':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.nowindows)<br>
+<br>
+    def test_forever(self):<br>
+        for opt in '-F', '--forever':<br>
+            with self.subTest(opt=opt):<br>
+                ns = regrtest._parse_args([opt])<br>
+                self.assertTrue(ns.forever)<br>
+<br>
<br>
     def test_unrecognized_argument(self):<br>
-        self._check_args(['--xxx'])<br>
-<br>
-    def test_value_not_provided(self):<br>
-        self._check_args(['--start'])<br>
-<br>
-    def test_short_option(self):<br>
-        # getopt returns the short option whereas argparse returns the long.<br>
-        expected = ([('--quiet', '')], [])<br>
-        self._check_args(['-q'], expected=expected)<br>
-<br>
-    def test_long_option(self):<br>
-        self._check_args(['--quiet'])<br>
+        self.checkError(['--xxx'], 'usage:')<br>
<br>
     def test_long_option__partial(self):<br>
-        self._check_args(['--qui'])<br>
+        ns = regrtest._parse_args(['--qui'])<br>
+        self.assertTrue(ns.quiet)<br>
+        self.assertEqual(ns.verbose, 0)<br>
<br>
     def test_two_options(self):<br>
-        self._check_args(['--quiet', '--exclude'])<br>
-<br>
-    def test_option_with_value(self):<br>
-        self._check_args(['--start', 'foo'])<br>
+        ns = regrtest._parse_args(['--quiet', '--exclude'])<br>
+        self.assertTrue(ns.quiet)<br>
+        self.assertEqual(ns.verbose, 0)<br>
+        self.assertTrue(ns.exclude)<br>
<br>
     def test_option_with_empty_string_value(self):<br>
-        self._check_args(['--start', ''])<br>
+        ns = regrtest._parse_args(['--start', ''])<br>
+        self.assertEqual(ns.start, '')<br>
<br>
     def test_arg(self):<br>
-        self._check_args(['foo'])<br>
+        ns = regrtest._parse_args(['foo'])<br>
+        self.assertEqual(ns.args, ['foo'])<br>
<br>
     def test_option_and_arg(self):<br>
-        self._check_args(['--quiet', 'foo'])<br>
+        ns = regrtest._parse_args(['--quiet', 'foo'])<br>
+        self.assertTrue(ns.quiet)<br>
+        self.assertEqual(ns.verbose, 0)<br>
+        self.assertEqual(ns.args, ['foo'])<br>
<br>
-    def test_fromfile(self):<br>
-        self._check_args(['--fromfile', 'file'])<br>
-<br>
-    def test_match(self):<br>
-        self._check_args(['--match', 'pattern'])<br>
-<br>
-    def test_randomize(self):<br>
-        self._check_args(['--randomize'])<br>
-<br>
-<br>
-def test_main():<br>
-    support.run_unittest(__name__)<br>
<br>
 if __name__ == '__main__':<br>
-    test_main()<br>
+    unittest.main()<br>
diff --git a/Misc/NEWS b/Misc/NEWS<br>
--- a/Misc/NEWS<br>
+++ b/Misc/NEWS<br>
@@ -153,6 +153,9 @@<br>
 Tests<br>
 -----<br>
<br>
+- Issue #16799: Switched from getopt to argparse style in regrtest's argument<br>
+  parsing.  Added more tests for regrtest's argument parsing.<br>
+<br>
 - Issue #18792: Use "127.0.0.1" or "::1" instead of "localhost" as much as<br>
   possible, since "localhost" goes through a DNS lookup under recent Windows<br>
   versions.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Repository URL: <a href="http://hg.python.org/cpython" target="_blank">http://hg.python.org/cpython</a><br>
</font></span><br>_______________________________________________<br>
Python-checkins mailing list<br>
<a href="mailto:Python-checkins@python.org">Python-checkins@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-checkins" target="_blank">http://mail.python.org/mailman/listinfo/python-checkins</a><br>
<br></blockquote></div><br></div></div>