From 9a61a4eba622018a6cee0e820f8f4b5d58fd8cd4 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 9 Jan 2018 18:21:51 +0000 Subject: [PATCH] Factor out convert_argv(). --- tests/__main__.py | 52 +++++++++++++++++++++++++---------------- tests/test_test_main.py | 46 ++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 tests/test_test_main.py diff --git a/tests/__main__.py b/tests/__main__.py index 214121d19..c61e50ca6 100644 --- a/tests/__main__.py +++ b/tests/__main__.py @@ -1,30 +1,42 @@ - import os import os.path -from unittest.main import main import sys +import unittest TEST_ROOT = os.path.dirname(__file__) PROJECT_ROOT = os.path.dirname(TEST_ROOT) -executable = sys.executable + ' -m unittest' -if all(arg.startswith('-') for arg in sys.argv[1:]): - argv = [executable, - 'discover', - '--start-directory', PROJECT_ROOT, - '--top-level-directory', PROJECT_ROOT, - ] + sys.argv[1:] -else: - argv = [executable] + sys.argv[1:] - for i, arg in enumerate(argv[1:], 1): - if arg.startswith('-'): - continue - mod, _, test = arg.partition(':') - mod = mod.rstrip(os.sep) - mod = mod.rstrip('.py') - mod = mod.replace(os.sep, '.') - argv[i] = mod if not test else mod + '.' + test +def convert_argv(argv): + args = [] + modules = set() + for arg in argv: + # Unittest's main has only flags and positional args. + # So we don't worry about options with values. + if not arg.startswith('-'): + # It must be the name of a test, case, module, or file. + # We convert filenames to module names. For filenames + # we support specifying a test name by appending it to + # the filename with a ":" in between. + mod, _, test = arg.partition(':') + if mod.endswith(os.sep): + mod = mod.rsplit(os.sep, 1)[0] + mod = mod.rsplit('.py', 1)[0] + mod = mod.replace(os.sep, '.') + arg = mod if not test else mod + '.' + test + modules.add(mod) + args.append(arg) + + if not modules: + # Do discovery. + args = ['discover', + '--start-directory', PROJECT_ROOT, + ] + args + return [sys.executable + ' -m unittest'] + args + #return [sys.executable, '-m', 'unittest'] + args + -main(module=None, argv=argv) +if __name__ == '__main__': + argv = convert_argv(sys.argv[1:]) + unittest.main(module=None, argv=argv) diff --git a/tests/test_test_main.py b/tests/test_test_main.py new file mode 100644 index 000000000..dc25c4e44 --- /dev/null +++ b/tests/test_test_main.py @@ -0,0 +1,46 @@ +import os +import os.path +import unittest +import sys + +from .__main__ import convert_argv + + +PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__)) + + +class ConvertArgsTests(unittest.TestCase): + + def test_discovery(self): + argv = convert_argv(['-v', '--failfast']) + + self.assertEqual(argv, [ + sys.executable + ' -m unittest', + 'discover', + '--start-directory', PROJECT_ROOT, + '-v', '--failfast', + ]) + + def test_modules(self): + argv = convert_argv(['-v', '--failfast', + 'w', + 'x/y.py:Spam.test_spam'.replace('/', os.sep), + 'z:Eggs', + ]) + + self.assertEqual(argv, [ + sys.executable + ' -m unittest', + '-v', '--failfast', + 'w', + 'x.y.Spam.test_spam', + 'z.Eggs', + ]) + + def test_no_args(self): + argv = convert_argv([]) + + self.assertEqual(argv, [ + sys.executable + ' -m unittest', + 'discover', + '--start-directory', PROJECT_ROOT, + ])