Factor out convert_argv().

This commit is contained in:
Eric Snow 2018-01-09 18:21:51 +00:00
parent dc00f36e3e
commit 9a61a4eba6
2 changed files with 78 additions and 20 deletions

View file

@ -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)
main(module=None, argv=argv)
if not modules:
# Do discovery.
args = ['discover',
'--start-directory', PROJECT_ROOT,
] + args
return [sys.executable + ' -m unittest'] + args
#return [sys.executable, '-m', 'unittest'] + args
if __name__ == '__main__':
argv = convert_argv(sys.argv[1:])
unittest.main(module=None, argv=argv)

46
tests/test_test_main.py Normal file
View file

@ -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,
])