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