Brett Cannon | 2a922ed | 2009-03-09 03:35:50 +0000 | [diff] [blame] | 1 | from importlib import abc |
| 2 | from importlib import machinery |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 3 | import inspect |
Brett Cannon | 2a922ed | 2009-03-09 03:35:50 +0000 | [diff] [blame] | 4 | import unittest |
| 5 | |
| 6 | |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 7 | class InheritanceTests: |
Brett Cannon | 2a922ed | 2009-03-09 03:35:50 +0000 | [diff] [blame] | 8 | |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 9 | """Test that the specified class is a subclass/superclass of the expected |
| 10 | classes.""" |
Brett Cannon | 2a922ed | 2009-03-09 03:35:50 +0000 | [diff] [blame] | 11 | |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 12 | subclasses = [] |
| 13 | superclasses = [] |
Brett Cannon | 2a922ed | 2009-03-09 03:35:50 +0000 | [diff] [blame] | 14 | |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 15 | def __init__(self, *args, **kwargs): |
| 16 | super().__init__(*args, **kwargs) |
| 17 | assert self.subclasses or self.superclasses, self.__class__ |
| 18 | self.__test = getattr(abc, self.__class__.__name__) |
Brett Cannon | 2a922ed | 2009-03-09 03:35:50 +0000 | [diff] [blame] | 19 | |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 20 | def test_subclasses(self): |
| 21 | # Test that the expected subclasses inherit. |
| 22 | for subclass in self.subclasses: |
| 23 | self.assertTrue(issubclass(subclass, self.__test), |
| 24 | "{0} is not a subclass of {1}".format(subclass, self.__test)) |
| 25 | |
| 26 | def test_superclasses(self): |
| 27 | # Test that the class inherits from the expected superclasses. |
| 28 | for superclass in self.superclasses: |
| 29 | self.assertTrue(issubclass(self.__test, superclass), |
| 30 | "{0} is not a superclass of {1}".format(superclass, self.__test)) |
| 31 | |
| 32 | |
Nick Coghlan | 8a9080f | 2012-08-02 21:26:03 +1000 | [diff] [blame] | 33 | class MetaPathFinder(InheritanceTests, unittest.TestCase): |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 34 | |
Nick Coghlan | 8a9080f | 2012-08-02 21:26:03 +1000 | [diff] [blame] | 35 | superclasses = [abc.Finder] |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 36 | subclasses = [machinery.BuiltinImporter, machinery.FrozenImporter, |
Nick Coghlan | ff79486 | 2012-08-02 21:45:24 +1000 | [diff] [blame] | 37 | machinery.PathFinder, machinery.WindowsRegistryFinder] |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 38 | |
Brett Cannon | f4dc920 | 2012-08-10 12:21:12 -0400 | [diff] [blame] | 39 | |
Nick Coghlan | 8a9080f | 2012-08-02 21:26:03 +1000 | [diff] [blame] | 40 | class PathEntryFinder(InheritanceTests, unittest.TestCase): |
| 41 | |
| 42 | superclasses = [abc.Finder] |
| 43 | subclasses = [machinery.FileFinder] |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 44 | |
Brett Cannon | f4dc920 | 2012-08-10 12:21:12 -0400 | [diff] [blame] | 45 | |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 46 | class Loader(InheritanceTests, unittest.TestCase): |
| 47 | |
| 48 | subclasses = [abc.PyLoader] |
| 49 | |
| 50 | |
| 51 | class ResourceLoader(InheritanceTests, unittest.TestCase): |
| 52 | |
| 53 | superclasses = [abc.Loader] |
| 54 | |
| 55 | |
| 56 | class InspectLoader(InheritanceTests, unittest.TestCase): |
| 57 | |
| 58 | superclasses = [abc.Loader] |
| 59 | subclasses = [abc.PyLoader, machinery.BuiltinImporter, |
Brett Cannon | 938d44d | 2012-04-22 19:58:33 -0400 | [diff] [blame] | 60 | machinery.FrozenImporter, machinery.ExtensionFileLoader] |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 61 | |
| 62 | |
Brett Cannon | 6919427 | 2009-07-20 04:23:48 +0000 | [diff] [blame] | 63 | class ExecutionLoader(InheritanceTests, unittest.TestCase): |
| 64 | |
| 65 | superclasses = [abc.InspectLoader] |
| 66 | subclasses = [abc.PyLoader] |
| 67 | |
| 68 | |
Brett Cannon | 938d44d | 2012-04-22 19:58:33 -0400 | [diff] [blame] | 69 | class FileLoader(InheritanceTests, unittest.TestCase): |
| 70 | |
| 71 | superclasses = [abc.ResourceLoader, abc.ExecutionLoader] |
Marc-Andre Lemburg | 4fe29c9 | 2012-04-25 02:31:37 +0200 | [diff] [blame] | 72 | subclasses = [machinery.SourceFileLoader, machinery.SourcelessFileLoader] |
Brett Cannon | 938d44d | 2012-04-22 19:58:33 -0400 | [diff] [blame] | 73 | |
| 74 | |
Brett Cannon | b7183d8 | 2010-06-28 05:46:25 +0000 | [diff] [blame] | 75 | class SourceLoader(InheritanceTests, unittest.TestCase): |
| 76 | |
| 77 | superclasses = [abc.ResourceLoader, abc.ExecutionLoader] |
Brett Cannon | 938d44d | 2012-04-22 19:58:33 -0400 | [diff] [blame] | 78 | subclasses = [machinery.SourceFileLoader] |
Brett Cannon | b7183d8 | 2010-06-28 05:46:25 +0000 | [diff] [blame] | 79 | |
| 80 | |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 81 | class PyLoader(InheritanceTests, unittest.TestCase): |
| 82 | |
Brett Cannon | 6919427 | 2009-07-20 04:23:48 +0000 | [diff] [blame] | 83 | superclasses = [abc.Loader, abc.ResourceLoader, abc.ExecutionLoader] |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 84 | |
| 85 | |
| 86 | class PyPycLoader(InheritanceTests, unittest.TestCase): |
| 87 | |
| 88 | superclasses = [abc.PyLoader] |
Brett Cannon | 2a922ed | 2009-03-09 03:35:50 +0000 | [diff] [blame] | 89 | |
| 90 | |
| 91 | def test_main(): |
| 92 | from test.support import run_unittest |
Brett Cannon | 64ef00f | 2009-07-20 03:19:18 +0000 | [diff] [blame] | 93 | classes = [] |
| 94 | for class_ in globals().values(): |
| 95 | if (inspect.isclass(class_) and |
| 96 | issubclass(class_, unittest.TestCase) and |
| 97 | issubclass(class_, InheritanceTests)): |
| 98 | classes.append(class_) |
| 99 | run_unittest(*classes) |
Brett Cannon | 2a922ed | 2009-03-09 03:35:50 +0000 | [diff] [blame] | 100 | |
| 101 | |
| 102 | if __name__ == '__main__': |
| 103 | test_main() |