File: test_subclass_of.py

package info (click to toggle)
python-typish 1.9.3-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 332 kB
  • sloc: python: 1,636; makefile: 2
file content (93 lines) | stat: -rw-r--r-- 4,252 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import sys
from typing import List, Tuple, Union, Optional, Iterable, Any
from unittest import TestCase

from typish import Literal, subclass_of, Unknown, NoneType


class A: pass
class B(A): pass
class C(B): pass
class D(C): pass
class E(D): pass
class F(E, str): pass


class TestSubclassOf(TestCase):
    def test_subclass_of(self):
        self.assertTrue(not subclass_of(int, str))
        self.assertTrue(subclass_of(E, A))
        self.assertTrue(subclass_of(str, object))
        self.assertTrue(subclass_of(list, List))
        self.assertTrue(subclass_of(List[int], List[int]))
        self.assertTrue(not subclass_of(List[int], List[str]))
        self.assertTrue(subclass_of(List[List[List[int]]], List[List[List[int]]]))
        self.assertTrue(subclass_of(List[int], List[object]))
        self.assertTrue(not subclass_of(List[object], List[int]))
        self.assertTrue(subclass_of(List[Unknown], List[int]))
        self.assertTrue(not subclass_of('test', str))

    def test_subclass_of_tuple(self):
        self.assertTrue(subclass_of(Tuple[int, int], Tuple[int, ...]))
        self.assertTrue(subclass_of(Tuple[int, ...], Tuple[int, ...]))
        self.assertTrue(subclass_of(Tuple[int, int], Tuple[object, ...]))
        self.assertTrue(subclass_of(Tuple[int, ...], Tuple[object, ...]))
        self.assertTrue(subclass_of(Tuple[A, B], Tuple[A, ...]))
        self.assertTrue(subclass_of(Tuple[int, int], Tuple[int, int]))
        self.assertTrue(subclass_of(Tuple[int, int], Tuple[object, int]))
        self.assertTrue(not subclass_of(Tuple[int, int], Tuple[str, int]))
        self.assertTrue(not subclass_of(Tuple[int, int], Tuple[int, int, int]))
        self.assertTrue(not subclass_of(Tuple[int, int, int], Tuple[int, int]))
        self.assertTrue(not subclass_of(Tuple[int, str], Tuple[int, ...]))

    def test_list_subclass_of_tuple(self):
        self.assertTrue(not subclass_of(List[int], Tuple[int, ...]))
        self.assertTrue(not subclass_of(List[int], Tuple[int, int]))

    def test_tuple_subclass_of_list(self):
        self.assertTrue(not subclass_of(Tuple[int, ...], List[int]))

    def test_subclass_of_iterable(self):
        self.assertTrue(subclass_of(List[int], Iterable[int]))
        self.assertTrue(subclass_of(Tuple[int, int, int], Iterable[int]))
        self.assertTrue(subclass_of(Tuple[int, ...], Iterable[int]))
        self.assertTrue(subclass_of(Tuple[B, C, D], Iterable[B]))
        self.assertTrue(subclass_of(Tuple[B, C, D], Iterable[A]))
        self.assertTrue(subclass_of(List[Tuple[int, str]], Iterable[Tuple[int, str]]))
        self.assertTrue(subclass_of(Tuple[Tuple[int, str]], Iterable[Tuple[int, str]]))

    def test_subclass_of_multiple(self):
        self.assertTrue(subclass_of(F, A))
        self.assertTrue(subclass_of(F, str))
        self.assertTrue(subclass_of(F, A, str))
        self.assertTrue(not subclass_of(F, A, str, int))

    def test_subclass_of_union(self):
        self.assertTrue(subclass_of(F, Union[int, str]))
        self.assertTrue(subclass_of(F, Union[A, int]))
        self.assertTrue(subclass_of(F, Union[A, B]))
        self.assertTrue(not subclass_of(int, Union[A, B]))
        self.assertTrue(subclass_of(F, Optional[A]))
        self.assertTrue(subclass_of(NoneType, Optional[A]))

    def test_union_subclass_of_union(self):
        # Subclass holds if all elements of the first enum subclass any of
        # the right enum.
        self.assertTrue(subclass_of(Union[C, D], Union[A, B]))

        # int is no subclass of any of Union[A, B].
        self.assertTrue(not subclass_of(Union[C, D, int], Union[A, B]))

    def test_union_subclass_of(self):
        if sys.version_info[1] in (5,):
            self.assertTrue(not subclass_of(Union[int, A, B, F], Union[C, D]))
        else:
            self.assertTrue(subclass_of(Union[B, F], A))
            self.assertTrue(not subclass_of(Union[A, B], C))
            self.assertTrue(not subclass_of(Union[A, B], Union[C, D]))

    def test_subclass_of_literal(self):
        self.assertTrue(subclass_of(int, Literal[int]))
        self.assertTrue(subclass_of(Any, Literal[Any]))
        self.assertTrue(not subclass_of(int, Literal[Any]))
        self.assertTrue(not subclass_of(int, Literal))