257 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
| from cStringIO import StringIO
 | |
| 
 | |
| import os
 | |
| import sys
 | |
| import unittest
 | |
| import unittest.test
 | |
| 
 | |
| 
 | |
| class Test_TestProgram(unittest.TestCase):
 | |
| 
 | |
|     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)
 | |
| 
 | |
|     # 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())
 | |
| 
 | |
| 
 | |
| 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()
 | |
| 
 | |
|         # If initializing raises a type error it should be retried
 | |
|         # 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)
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     unittest.main()
 |