1 import unittest
2 import sys
3
4 from test.support.import_helper import import_fresh_module
5
6
7 TESTS = 'test.datetimetester'
8
9 def load_tests(loader, tests, pattern):
10 try:
11 pure_tests = import_fresh_module(TESTS,
12 fresh=['datetime', '_pydatetime', '_strptime'],
13 blocked=['_datetime'])
14 fast_tests = import_fresh_module(TESTS,
15 fresh=['datetime', '_strptime'],
16 blocked=['_pydatetime'])
17 finally:
18 # XXX: import_fresh_module() is supposed to leave sys.module cache untouched,
19 # XXX: but it does not, so we have to cleanup ourselves.
20 for modname in ['datetime', '_datetime', '_strptime']:
21 sys.modules.pop(modname, None)
22
23 test_modules = [pure_tests, fast_tests]
24 test_suffixes = ["_Pure", "_Fast"]
25 # XXX(gb) First run all the _Pure tests, then all the _Fast tests. You might
26 # not believe this, but in spite of all the sys.modules trickery running a _Pure
27 # test last will leave a mix of pure and native datetime stuff lying around.
28 for module, suffix in zip(test_modules, test_suffixes):
29 test_classes = []
30 for name, cls in module.__dict__.items():
31 if not isinstance(cls, type):
32 continue
33 if issubclass(cls, unittest.TestCase):
34 test_classes.append(cls)
35 elif issubclass(cls, unittest.TestSuite):
36 suit = cls()
37 test_classes.extend(type(test) for test in suit)
38 test_classes = sorted(set(test_classes), key=lambda cls: cls.__qualname__)
39 for cls in test_classes:
40 cls.__name__ += suffix
41 cls.__qualname__ += suffix
42 @classmethod
43 def setUpClass(cls_, module=module):
44 cls_._save_sys_modules = sys.modules.copy()
45 sys.modules[TESTS] = module
46 sys.modules['datetime'] = module.datetime_module
47 if hasattr(module, '_pydatetime'):
48 sys.modules['_pydatetime'] = module._pydatetime
49 sys.modules['_strptime'] = module._strptime
50 @classmethod
51 def tearDownClass(cls_):
52 sys.modules.clear()
53 sys.modules.update(cls_._save_sys_modules)
54 cls.setUpClass = setUpClass
55 cls.tearDownClass = tearDownClass
56 tests.addTests(loader.loadTestsFromTestCase(cls))
57 return tests
58
59
60 if __name__ == "__main__":
61 unittest.main()