test_abc.py 2.37 KB
Newer Older
1 2
from importlib import abc
from importlib import machinery
3
import inspect
4 5 6
import unittest


7
class InheritanceTests:
8

9 10
    """Test that the specified class is a subclass/superclass of the expected
    classes."""
11

12 13
    subclasses = []
    superclasses = []
14

15 16 17 18
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        assert self.subclasses or self.superclasses, self.__class__
        self.__test = getattr(abc, self.__class__.__name__)
19

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
    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 Finder(InheritanceTests, unittest.TestCase):

    subclasses = [machinery.BuiltinImporter, machinery.FrozenImporter,
                    machinery.PathFinder]


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]


56 57 58 59 60 61
class ExecutionLoader(InheritanceTests, unittest.TestCase):

    superclasses = [abc.InspectLoader]
    subclasses = [abc.PyLoader]


62 63 64 65 66
class SourceLoader(InheritanceTests, unittest.TestCase):

    superclasses = [abc.ResourceLoader, abc.ExecutionLoader]


67 68
class PyLoader(InheritanceTests, unittest.TestCase):

69
    superclasses = [abc.Loader, abc.ResourceLoader, abc.ExecutionLoader]
70 71 72 73 74


class PyPycLoader(InheritanceTests, unittest.TestCase):

    superclasses = [abc.PyLoader]
75 76 77 78


def test_main():
    from test.support import run_unittest
79 80 81 82 83 84 85
    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)
86 87 88 89


if __name__ == '__main__':
    test_main()