| 
									
										
										
										
											2010-03-25 23:56:33 +00:00
										 |  |  | from cStringIO import StringIO | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-07 15:34:08 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2010-05-07 15:52:05 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2010-03-25 23:56:33 +00:00
										 |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Test_TestProgram(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-07 15:34:08 +00: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 23:56:33 +00: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 15:52:05 +00: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() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # If initialising 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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-25 23:56:33 +00:00
										 |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main() |