diff -r 7ed3b4f830c0 Lib/test/regrlib.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/test/regrlib.py Tue Jul 10 23:14:32 2012 -0700 @@ -0,0 +1,31 @@ +""" +Argument parsing code for regrest. + +""" + +import getopt +import sys + + +def usage(msg, sys_exit=None): + if sys_exit is None: + sys_exit = sys.exit + print(msg, file=sys.stderr) + print("Use --help for usage", file=sys.stderr) + sys_exit(2) + + +def parse_args(sys_exit=None): + """Parse arguments, and return (opts, args).""" + try: + return getopt.getopt(sys.argv[1:], 'hvqxsoS:rf:lu:t:TD:NLR:FdwWM:nj:Gm:', + ['help', 'verbose', 'verbose2', 'verbose3', 'quiet', + 'exclude', 'single', 'slow', 'random', 'fromfile', 'findleaks', + 'use=', 'threshold=', 'coverdir=', 'nocoverdir', + 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=', + 'multiprocess=', 'coverage', 'slaveargs=', 'forever', 'debug', + 'start=', 'nowindows', 'header', 'testdir=', 'timeout=', 'wait', + 'failfast', 'match']) + except getopt.error as msg: + usage(msg, sys_exit) + diff -r 7ed3b4f830c0 Lib/test/regrtest.py --- a/Lib/test/regrtest.py Mon Jul 09 13:43:53 2012 -0700 +++ b/Lib/test/regrtest.py Tue Jul 10 23:14:32 2012 -0700 @@ -167,7 +167,6 @@ import builtins import faulthandler -import getopt import io import json import logging @@ -185,6 +184,7 @@ import unittest import warnings from inspect import isabstract +from test import regrlib try: import threading @@ -245,10 +245,7 @@ TEMPDIR = os.path.abspath(tempfile.gettempdir()) -def usage(msg): - print(msg, file=sys.stderr) - print("Use --help for usage", file=sys.stderr) - sys.exit(2) +usage = regrlib.usage def main(tests=None, testdir=None, verbose=0, quiet=False, @@ -295,17 +292,8 @@ replace_stdout() support.record_original_stdout(sys.stdout) - try: - opts, args = getopt.getopt(sys.argv[1:], 'hvqxsoS:rf:lu:t:TD:NLR:FdwWM:nj:Gm:', - ['help', 'verbose', 'verbose2', 'verbose3', 'quiet', - 'exclude', 'single', 'slow', 'random', 'fromfile', 'findleaks', - 'use=', 'threshold=', 'coverdir=', 'nocoverdir', - 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=', - 'multiprocess=', 'coverage', 'slaveargs=', 'forever', 'debug', - 'start=', 'nowindows', 'header', 'testdir=', 'timeout=', 'wait', - 'failfast', 'match']) - except getopt.error as msg: - usage(msg) + + opts, args = regrlib.parse_args() # Defaults if random_seed is None: diff -r 7ed3b4f830c0 Lib/test/test_regrlib.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/test/test_regrlib.py Tue Jul 10 23:14:32 2012 -0700 @@ -0,0 +1,96 @@ +""" +Tests for regrlib.py. + +""" + +from contextlib import contextmanager +import sys +import unittest +from test import regrlib +from test import support + + +@contextmanager +def temp_sys_argv(argv): + """Context manager that temporarily changes sys.argv.""" + saved_argv = sys.argv + sys.argv = argv + try: + yield + finally: + sys.argv = saved_argv + + +class TestException(Exception): + pass + + +class ParseArgsTestCase(unittest.TestCase): + + def _parse_args(self, args): + argv = ['prog'] + args + def sys_exit(data): + raise TestException(data) + with temp_sys_argv(argv): + opts, args = regrlib.parse_args(sys_exit=sys_exit) + return opts, args + + def _assert_parse(self, args, expected): + with support.captured_stderr() as stream: + parsed = self._parse_args(args) + + self.assertEqual(parsed, expected) + self.assertEqual(stream.getvalue(), '') + + def test_unrecognized_argument(self): + args = ['--xxx'] + with self.assertRaises(TestException) as cm: + with support.captured_stderr() as stream: + self._parse_args(args) + + err = cm.exception + self.assertEqual(err.args, (2,)) + self.assertEqual(stream.getvalue(), 'option --xxx not recognized\nUse --help for usage\n') + + def test_short_option(self): + args = ['-q'] + expected = ([('-q', '')], []) + self._assert_parse(args, expected) + + def test_long_option(self): + args = ['--quiet'] + expected = ([('--quiet', '')], []) + self._assert_parse(args, expected) + + def test_long_option__partial(self): + args = ['--qui'] + expected = ([('--quiet', '')], []) + self._assert_parse(args, expected) + + def test_option_with_arg(self): + args = ['--coverdir', 'foo'] + expected = ([('--coverdir', 'foo')], []) + self._assert_parse(args, expected) + + def test_two_options(self): + args = ['--quiet', '--exclude'] + expected = ([('--quiet', ''), ('--exclude', '')], []) + self._assert_parse(args, expected) + + def test_arg(self): + args = ['foo'] + expected = ([], ['foo']) + self._assert_parse(args, expected) + + def test_option_and_arg(self): + args = ['-q', 'foo'] + expected = ([('-q', '')], ['foo']) + self._assert_parse(args, expected) + + +def test_main(): + tests = [ParseArgsTestCase] + support.run_unittest(*tests) + +if __name__ == '__main__': + test_main()