blob: c620c3771b4aff5b7ba5a20f317da148f7c6485f [file] [log] [blame]
Brett Cannon2a922ed2009-03-09 03:35:50 +00001from importlib import abc
2from importlib import machinery
Brett Cannon64ef00f2009-07-20 03:19:18 +00003import inspect
Brett Cannon2a922ed2009-03-09 03:35:50 +00004import unittest
5
6
Brett Cannon64ef00f2009-07-20 03:19:18 +00007class InheritanceTests:
Brett Cannon2a922ed2009-03-09 03:35:50 +00008
Brett Cannon64ef00f2009-07-20 03:19:18 +00009 """Test that the specified class is a subclass/superclass of the expected
10 classes."""
Brett Cannon2a922ed2009-03-09 03:35:50 +000011
Brett Cannon64ef00f2009-07-20 03:19:18 +000012 subclasses = []
13 superclasses = []
Brett Cannon2a922ed2009-03-09 03:35:50 +000014
Brett Cannon64ef00f2009-07-20 03:19:18 +000015 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 Cannon2a922ed2009-03-09 03:35:50 +000019
Brett Cannon64ef00f2009-07-20 03:19:18 +000020 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 Coghlan8a9080f2012-08-02 21:26:03 +100033class MetaPathFinder(InheritanceTests, unittest.TestCase):
Brett Cannon64ef00f2009-07-20 03:19:18 +000034
Nick Coghlan8a9080f2012-08-02 21:26:03 +100035 superclasses = [abc.Finder]
Brett Cannon64ef00f2009-07-20 03:19:18 +000036 subclasses = [machinery.BuiltinImporter, machinery.FrozenImporter,
Nick Coghlanff794862012-08-02 21:45:24 +100037 machinery.PathFinder, machinery.WindowsRegistryFinder]
Brett Cannon64ef00f2009-07-20 03:19:18 +000038
Brett Cannonf4dc9202012-08-10 12:21:12 -040039
Nick Coghlan8a9080f2012-08-02 21:26:03 +100040class PathEntryFinder(InheritanceTests, unittest.TestCase):
41
42 superclasses = [abc.Finder]
43 subclasses = [machinery.FileFinder]
Brett Cannon64ef00f2009-07-20 03:19:18 +000044
Brett Cannonf4dc9202012-08-10 12:21:12 -040045
Brett Cannon64ef00f2009-07-20 03:19:18 +000046class Loader(InheritanceTests, unittest.TestCase):
47
48 subclasses = [abc.PyLoader]
49
50
51class ResourceLoader(InheritanceTests, unittest.TestCase):
52
53 superclasses = [abc.Loader]
54
55
56class InspectLoader(InheritanceTests, unittest.TestCase):
57
58 superclasses = [abc.Loader]
59 subclasses = [abc.PyLoader, machinery.BuiltinImporter,
Brett Cannon938d44d2012-04-22 19:58:33 -040060 machinery.FrozenImporter, machinery.ExtensionFileLoader]
Brett Cannon64ef00f2009-07-20 03:19:18 +000061
62
Brett Cannon69194272009-07-20 04:23:48 +000063class ExecutionLoader(InheritanceTests, unittest.TestCase):
64
65 superclasses = [abc.InspectLoader]
66 subclasses = [abc.PyLoader]
67
68
Brett Cannon938d44d2012-04-22 19:58:33 -040069class FileLoader(InheritanceTests, unittest.TestCase):
70
71 superclasses = [abc.ResourceLoader, abc.ExecutionLoader]
Marc-Andre Lemburg4fe29c92012-04-25 02:31:37 +020072 subclasses = [machinery.SourceFileLoader, machinery.SourcelessFileLoader]
Brett Cannon938d44d2012-04-22 19:58:33 -040073
74
Brett Cannonb7183d82010-06-28 05:46:25 +000075class SourceLoader(InheritanceTests, unittest.TestCase):
76
77 superclasses = [abc.ResourceLoader, abc.ExecutionLoader]
Brett Cannon938d44d2012-04-22 19:58:33 -040078 subclasses = [machinery.SourceFileLoader]
Brett Cannonb7183d82010-06-28 05:46:25 +000079
80
Brett Cannon64ef00f2009-07-20 03:19:18 +000081class PyLoader(InheritanceTests, unittest.TestCase):
82
Brett Cannon69194272009-07-20 04:23:48 +000083 superclasses = [abc.Loader, abc.ResourceLoader, abc.ExecutionLoader]
Brett Cannon64ef00f2009-07-20 03:19:18 +000084
85
86class PyPycLoader(InheritanceTests, unittest.TestCase):
87
88 superclasses = [abc.PyLoader]
Brett Cannon2a922ed2009-03-09 03:35:50 +000089
90
91def test_main():
92 from test.support import run_unittest
Brett Cannon64ef00f2009-07-20 03:19:18 +000093 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 Cannon2a922ed2009-03-09 03:35:50 +0000100
101
102if __name__ == '__main__':
103 test_main()