| from importlib import abc |
| from importlib import machinery |
| import inspect |
| import unittest |
| |
| |
| class InheritanceTests: |
| |
| """Test that the specified class is a subclass/superclass of the expected |
| classes.""" |
| |
| subclasses = [] |
| superclasses = [] |
| |
| def __init__(self, *args, **kwargs): |
| super().__init__(*args, **kwargs) |
| assert self.subclasses or self.superclasses, self.__class__ |
| self.__test = getattr(abc, self.__class__.__name__) |
| |
| def test_subclasses(self): |
| # Test that the expected subclasses inherit. |
| for subclass in self.subclasses: |
| self.assertTrue(issubclass(subclass, self.__test), |
| "{0} is not a subclass of {1}".format(subclass, self.__test)) |
| |
| def test_superclasses(self): |
| # Test that the class inherits from the expected superclasses. |
| for superclass in self.superclasses: |
| self.assertTrue(issubclass(self.__test, superclass), |
| "{0} is not a superclass of {1}".format(superclass, self.__test)) |
| |
| |
| class MetaPathFinder(InheritanceTests, unittest.TestCase): |
| |
| superclasses = [abc.Finder] |
| subclasses = [machinery.BuiltinImporter, machinery.FrozenImporter, |
| machinery.PathFinder, machinery.WindowsRegistryFinder] |
| |
| |
| class PathEntryFinder(InheritanceTests, unittest.TestCase): |
| |
| superclasses = [abc.Finder] |
| subclasses = [machinery.FileFinder] |
| |
| |
| class Loader(InheritanceTests, unittest.TestCase): |
| |
| subclasses = [abc.PyLoader] |
| |
| |
| class ResourceLoader(InheritanceTests, unittest.TestCase): |
| |
| superclasses = [abc.Loader] |
| |
| |
| class InspectLoader(InheritanceTests, unittest.TestCase): |
| |
| superclasses = [abc.Loader] |
| subclasses = [abc.PyLoader, machinery.BuiltinImporter, |
| machinery.FrozenImporter, machinery.ExtensionFileLoader] |
| |
| |
| class ExecutionLoader(InheritanceTests, unittest.TestCase): |
| |
| superclasses = [abc.InspectLoader] |
| subclasses = [abc.PyLoader] |
| |
| |
| class FileLoader(InheritanceTests, unittest.TestCase): |
| |
| superclasses = [abc.ResourceLoader, abc.ExecutionLoader] |
| subclasses = [machinery.SourceFileLoader, machinery.SourcelessFileLoader] |
| |
| |
| class SourceLoader(InheritanceTests, unittest.TestCase): |
| |
| superclasses = [abc.ResourceLoader, abc.ExecutionLoader] |
| subclasses = [machinery.SourceFileLoader] |
| |
| |
| class PyLoader(InheritanceTests, unittest.TestCase): |
| |
| superclasses = [abc.Loader, abc.ResourceLoader, abc.ExecutionLoader] |
| |
| |
| class PyPycLoader(InheritanceTests, unittest.TestCase): |
| |
| superclasses = [abc.PyLoader] |
| |
| |
| def test_main(): |
| from test.support import run_unittest |
| classes = [] |
| for class_ in globals().values(): |
| if (inspect.isclass(class_) and |
| issubclass(class_, unittest.TestCase) and |
| issubclass(class_, InheritanceTests)): |
| classes.append(class_) |
| run_unittest(*classes) |
| |
| |
| if __name__ == '__main__': |
| test_main() |