2010-03-25 20:56:33 -03:00
|
|
|
from cStringIO import StringIO
|
|
|
|
|
2010-05-07 12:34:08 -03:00
|
|
|
import os
|
2010-05-07 12:52:05 -03:00
|
|
|
import sys
|
2010-03-25 20:56:33 -03:00
|
|
|
import unittest
|
|
|
|
|
|
|
|
|
|
|
|
class Test_TestProgram(unittest.TestCase):
|
|
|
|
|
2010-05-07 12:34:08 -03:00
|
|
|
def test_discovery_from_dotted_path(self):
|
|
|
|
loader = unittest.TestLoader()
|
|
|
|
|
|
|
|
tests = [self]
|
|
|
|
expectedPath = os.path.abspath(os.path.dirname(unittest.test.__file__))
|
|
|
|
|
|
|
|
self.wasRun = False
|
|
|
|
def _find_tests(start_dir, pattern):
|
|
|
|
self.wasRun = True
|
|
|
|
self.assertEqual(start_dir, expectedPath)
|
|
|
|
return tests
|
|
|
|
loader._find_tests = _find_tests
|
|
|
|
suite = loader.discover('unittest.test')
|
|
|
|
self.assertTrue(self.wasRun)
|
|
|
|
self.assertEqual(suite._tests, tests)
|
|
|
|
|
2010-03-25 20:56:33 -03:00
|
|
|
# Horrible white box test
|
|
|
|
def testNoExit(self):
|
|
|
|
result = object()
|
|
|
|
test = object()
|
|
|
|
|
|
|
|
class FakeRunner(object):
|
|
|
|
def run(self, test):
|
|
|
|
self.test = test
|
|
|
|
return result
|
|
|
|
|
|
|
|
runner = FakeRunner()
|
|
|
|
|
|
|
|
oldParseArgs = unittest.TestProgram.parseArgs
|
|
|
|
def restoreParseArgs():
|
|
|
|
unittest.TestProgram.parseArgs = oldParseArgs
|
|
|
|
unittest.TestProgram.parseArgs = lambda *args: None
|
|
|
|
self.addCleanup(restoreParseArgs)
|
|
|
|
|
|
|
|
def removeTest():
|
|
|
|
del unittest.TestProgram.test
|
|
|
|
unittest.TestProgram.test = test
|
|
|
|
self.addCleanup(removeTest)
|
|
|
|
|
|
|
|
program = unittest.TestProgram(testRunner=runner, exit=False, verbosity=2)
|
|
|
|
|
|
|
|
self.assertEqual(program.result, result)
|
|
|
|
self.assertEqual(runner.test, test)
|
|
|
|
self.assertEqual(program.verbosity, 2)
|
|
|
|
|
|
|
|
class FooBar(unittest.TestCase):
|
|
|
|
def testPass(self):
|
|
|
|
assert True
|
|
|
|
def testFail(self):
|
|
|
|
assert False
|
|
|
|
|
|
|
|
class FooBarLoader(unittest.TestLoader):
|
|
|
|
"""Test loader that returns a suite containing FooBar."""
|
|
|
|
def loadTestsFromModule(self, module):
|
|
|
|
return self.suiteClass(
|
|
|
|
[self.loadTestsFromTestCase(Test_TestProgram.FooBar)])
|
|
|
|
|
|
|
|
|
|
|
|
def test_NonExit(self):
|
|
|
|
program = unittest.main(exit=False,
|
|
|
|
argv=["foobar"],
|
|
|
|
testRunner=unittest.TextTestRunner(stream=StringIO()),
|
|
|
|
testLoader=self.FooBarLoader())
|
|
|
|
self.assertTrue(hasattr(program, 'result'))
|
|
|
|
|
|
|
|
|
|
|
|
def test_Exit(self):
|
|
|
|
self.assertRaises(
|
|
|
|
SystemExit,
|
|
|
|
unittest.main,
|
|
|
|
argv=["foobar"],
|
|
|
|
testRunner=unittest.TextTestRunner(stream=StringIO()),
|
|
|
|
exit=True,
|
|
|
|
testLoader=self.FooBarLoader())
|
|
|
|
|
|
|
|
|
|
|
|
def test_ExitAsDefault(self):
|
|
|
|
self.assertRaises(
|
|
|
|
SystemExit,
|
|
|
|
unittest.main,
|
|
|
|
argv=["foobar"],
|
|
|
|
testRunner=unittest.TextTestRunner(stream=StringIO()),
|
|
|
|
testLoader=self.FooBarLoader())
|
|
|
|
|
|
|
|
|
2010-05-07 12:52:05 -03:00
|
|
|
class InitialisableProgram(unittest.TestProgram):
|
|
|
|
exit = False
|
|
|
|
result = None
|
|
|
|
verbosity = 1
|
|
|
|
defaultTest = None
|
|
|
|
testRunner = None
|
|
|
|
testLoader = unittest.defaultTestLoader
|
|
|
|
progName = 'test'
|
|
|
|
test = 'test'
|
|
|
|
def __init__(self, *args):
|
|
|
|
pass
|
|
|
|
|
|
|
|
RESULT = object()
|
|
|
|
|
|
|
|
class FakeRunner(object):
|
|
|
|
initArgs = None
|
|
|
|
test = None
|
|
|
|
raiseError = False
|
|
|
|
|
|
|
|
def __init__(self, **kwargs):
|
|
|
|
FakeRunner.initArgs = kwargs
|
|
|
|
if FakeRunner.raiseError:
|
|
|
|
FakeRunner.raiseError = False
|
|
|
|
raise TypeError
|
|
|
|
|
|
|
|
def run(self, test):
|
|
|
|
FakeRunner.test = test
|
|
|
|
return RESULT
|
|
|
|
|
|
|
|
class TestCommandLineArgs(unittest.TestCase):
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
self.program = InitialisableProgram()
|
|
|
|
self.program.createTests = lambda: None
|
|
|
|
FakeRunner.initArgs = None
|
|
|
|
FakeRunner.test = None
|
|
|
|
FakeRunner.raiseError = False
|
|
|
|
|
|
|
|
def testHelpAndUnknown(self):
|
|
|
|
program = self.program
|
|
|
|
def usageExit(msg=None):
|
|
|
|
program.msg = msg
|
|
|
|
program.exit = True
|
|
|
|
program.usageExit = usageExit
|
|
|
|
|
|
|
|
for opt in '-h', '-H', '--help':
|
|
|
|
program.exit = False
|
|
|
|
program.parseArgs([None, opt])
|
|
|
|
self.assertTrue(program.exit)
|
|
|
|
self.assertIsNone(program.msg)
|
|
|
|
|
|
|
|
program.parseArgs([None, '-$'])
|
|
|
|
self.assertTrue(program.exit)
|
|
|
|
self.assertIsNotNone(program.msg)
|
|
|
|
|
|
|
|
def testVerbosity(self):
|
|
|
|
program = self.program
|
|
|
|
|
|
|
|
for opt in '-q', '--quiet':
|
|
|
|
program.verbosity = 1
|
|
|
|
program.parseArgs([None, opt])
|
|
|
|
self.assertEqual(program.verbosity, 0)
|
|
|
|
|
|
|
|
for opt in '-v', '--verbose':
|
|
|
|
program.verbosity = 1
|
|
|
|
program.parseArgs([None, opt])
|
|
|
|
self.assertEqual(program.verbosity, 2)
|
|
|
|
|
|
|
|
def testBufferCatchFailfast(self):
|
|
|
|
program = self.program
|
|
|
|
for arg, attr in (('buffer', 'buffer'), ('failfast', 'failfast'),
|
|
|
|
('catch', 'catchbreak')):
|
|
|
|
if attr == 'catch' and not hasInstallHandler:
|
|
|
|
continue
|
|
|
|
|
|
|
|
short_opt = '-%s' % arg[0]
|
|
|
|
long_opt = '--%s' % arg
|
|
|
|
for opt in short_opt, long_opt:
|
|
|
|
setattr(program, attr, None)
|
|
|
|
|
|
|
|
program.parseArgs([None, opt])
|
|
|
|
self.assertTrue(getattr(program, attr))
|
|
|
|
|
|
|
|
for opt in short_opt, long_opt:
|
|
|
|
not_none = object()
|
|
|
|
setattr(program, attr, not_none)
|
|
|
|
|
|
|
|
program.parseArgs([None, opt])
|
|
|
|
self.assertEqual(getattr(program, attr), not_none)
|
|
|
|
|
|
|
|
def testRunTestsRunnerClass(self):
|
|
|
|
program = self.program
|
|
|
|
|
|
|
|
program.testRunner = FakeRunner
|
|
|
|
program.verbosity = 'verbosity'
|
|
|
|
program.failfast = 'failfast'
|
|
|
|
program.buffer = 'buffer'
|
|
|
|
|
|
|
|
program.runTests()
|
|
|
|
|
|
|
|
self.assertEqual(FakeRunner.initArgs, {'verbosity': 'verbosity',
|
|
|
|
'failfast': 'failfast',
|
|
|
|
'buffer': 'buffer'})
|
|
|
|
self.assertEqual(FakeRunner.test, 'test')
|
|
|
|
self.assertIs(program.result, RESULT)
|
|
|
|
|
|
|
|
def testRunTestsRunnerInstance(self):
|
|
|
|
program = self.program
|
|
|
|
|
|
|
|
program.testRunner = FakeRunner()
|
|
|
|
FakeRunner.initArgs = None
|
|
|
|
|
|
|
|
program.runTests()
|
|
|
|
|
|
|
|
# A new FakeRunner should not have been instantiated
|
|
|
|
self.assertIsNone(FakeRunner.initArgs)
|
|
|
|
|
|
|
|
self.assertEqual(FakeRunner.test, 'test')
|
|
|
|
self.assertIs(program.result, RESULT)
|
|
|
|
|
|
|
|
def testRunTestsOldRunnerClass(self):
|
|
|
|
program = self.program
|
|
|
|
|
|
|
|
FakeRunner.raiseError = True
|
|
|
|
program.testRunner = FakeRunner
|
|
|
|
program.verbosity = 'verbosity'
|
|
|
|
program.failfast = 'failfast'
|
|
|
|
program.buffer = 'buffer'
|
|
|
|
program.test = 'test'
|
|
|
|
|
|
|
|
program.runTests()
|
|
|
|
|
2011-03-16 07:34:31 -03:00
|
|
|
# If initializing raises a type error it should be retried
|
2010-05-07 12:52:05 -03:00
|
|
|
# without the new keyword arguments
|
|
|
|
self.assertEqual(FakeRunner.initArgs, {})
|
|
|
|
self.assertEqual(FakeRunner.test, 'test')
|
|
|
|
self.assertIs(program.result, RESULT)
|
|
|
|
|
|
|
|
def testCatchBreakInstallsHandler(self):
|
|
|
|
module = sys.modules['unittest.main']
|
|
|
|
original = module.installHandler
|
|
|
|
def restore():
|
|
|
|
module.installHandler = original
|
|
|
|
self.addCleanup(restore)
|
|
|
|
|
|
|
|
self.installed = False
|
|
|
|
def fakeInstallHandler():
|
|
|
|
self.installed = True
|
|
|
|
module.installHandler = fakeInstallHandler
|
|
|
|
|
|
|
|
program = self.program
|
|
|
|
program.catchbreak = True
|
|
|
|
|
|
|
|
program.testRunner = FakeRunner
|
|
|
|
|
|
|
|
program.runTests()
|
|
|
|
self.assertTrue(self.installed)
|
|
|
|
|
|
|
|
|
2010-03-25 20:56:33 -03:00
|
|
|
if __name__ == '__main__':
|
|
|
|
unittest.main()
|