| import unittest |
| import sys |
| |
| from test.support import import_fresh_module, run_unittest |
| |
| TESTS = 'test.datetimetester' |
| |
| try: |
| pure_tests = import_fresh_module(TESTS, fresh=['datetime', '_strptime'], |
| blocked=['_datetime']) |
| fast_tests = import_fresh_module(TESTS, fresh=['datetime', |
| '_datetime', '_strptime']) |
| finally: |
| # XXX: import_fresh_module() is supposed to leave sys.module cache untouched, |
| # XXX: but it does not, so we have to cleanup ourselves. |
| for modname in ['datetime', '_datetime', '_strptime']: |
| sys.modules.pop(modname, None) |
| test_modules = [pure_tests, fast_tests] |
| test_suffixes = ["_Pure", "_Fast"] |
| # XXX(gb) First run all the _Pure tests, then all the _Fast tests. You might |
| # not believe this, but in spite of all the sys.modules trickery running a _Pure |
| # test last will leave a mix of pure and native datetime stuff lying around. |
| all_test_classes = [] |
| |
| for module, suffix in zip(test_modules, test_suffixes): |
| test_classes = [] |
| for name, cls in module.__dict__.items(): |
| if not isinstance(cls, type): |
| continue |
| if issubclass(cls, unittest.TestCase): |
| test_classes.append(cls) |
| elif issubclass(cls, unittest.TestSuite): |
| suit = cls() |
| test_classes.extend(type(test) for test in suit) |
| test_classes = sorted(set(test_classes), key=lambda cls: cls.__qualname__) |
| for cls in test_classes: |
| cls.__name__ += suffix |
| cls.__qualname__ += suffix |
| @classmethod |
| def setUpClass(cls_, module=module): |
| cls_._save_sys_modules = sys.modules.copy() |
| sys.modules[TESTS] = module |
| sys.modules['datetime'] = module.datetime_module |
| sys.modules['_strptime'] = module._strptime |
| @classmethod |
| def tearDownClass(cls_): |
| sys.modules.clear() |
| sys.modules.update(cls_._save_sys_modules) |
| cls.setUpClass = setUpClass |
| cls.tearDownClass = tearDownClass |
| all_test_classes.extend(test_classes) |
| |
| def test_main(): |
| run_unittest(*all_test_classes) |
| |
| if __name__ == "__main__": |
| test_main() |