TestInstanceOf.test_instance_of_callable()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 28
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 22
nop 1
dl 0
loc 28
rs 9.352
c 0
b 0
f 0
1
from sys import version_info
2
from typing import List, Dict, Union, Optional, Callable, Any, Tuple, Type, Iterable
3
from unittest import TestCase, skipUnless
4
5
import nptyping as nptyping
6
import numpy
7
8
from typish import Literal, instance_of, State, register_get_type
9
10
11
class A: pass
12
13
14
class B(A): pass
15
16
17
class C(B): pass
18
19
20
class D(C): pass
21
22
23
class E(D): pass
24
25
26
class F(E, str): pass
27
28
29
class TestInstanceOf(TestCase):
30
    def test_instance_of(self):
31
        self.assertTrue(instance_of([[[1], [2]]], List[List[List[int]]]))
32
        self.assertTrue(instance_of([[[1], ['2']]], List[List[List[object]]]))
33
        self.assertTrue(instance_of([], List[int]))
34
        self.assertTrue(instance_of({}, Dict[int, int]))
35
36
    def test_instance_of_multiple(self):
37
        self.assertTrue(instance_of(F(), A))
38
        self.assertTrue(instance_of(F(), str))
39
        self.assertTrue(instance_of(F(), A, str))
40
        self.assertTrue(not instance_of(F(), A, str, int))
41
42
    def test_instance_of_union(self):
43
        self.assertTrue(instance_of(F(), Union[int, A]))
44
        self.assertTrue(instance_of(F(), Union[A, int]))
45
        self.assertTrue(instance_of(F(), Union[A, str]))
46
        self.assertTrue(instance_of(F(), Optional[str]))
47
        self.assertTrue(instance_of(None, Optional[str]))
48
        self.assertTrue(instance_of(Any, Union[int, Literal[Any]]))
49
50
    def test_instance_of_callable(self):
51
        def func1(x: int, y: str) -> object:
52
            pass
53
54
        def func2() -> int:
55
            pass
56
57
        def func3(x: int):
58
            pass
59
60
        def func4():
61
            pass
62
63
        def func5(x):
64
            pass
65
66
        def func6(l: List[List[List[int]]]):
67
            pass
68
69
        self.assertTrue(instance_of(func1, Callable[[int, str], object]))
70
        self.assertTrue(instance_of(func1, Callable[[object, str], object]))
71
        self.assertTrue(not instance_of(func1, Callable[[str, str], object]))
72
        self.assertTrue(not instance_of(func1, Callable[[str, str], int]))
73
        self.assertTrue(instance_of(func2, Callable[[], int]))
74
        self.assertTrue(instance_of(func3, Callable[[int], Any]))
75
        self.assertTrue(instance_of(func4, Callable))
76
        self.assertTrue(instance_of(func5, Callable[[Any], Any]))
77
        self.assertTrue(instance_of(func6, Callable[[List[List[List[int]]]], Any]))
78
79
    def test_lambda_instance_of_callable(self):
80
        self.assertTrue(instance_of(lambda x, y: 42, Callable[[int, str], str]))
81
        self.assertTrue(instance_of(lambda: 42, Callable[[], str]))
82
83
    def test_instance_of_type(self):
84
        self.assertTrue(instance_of(int, Type))
85
        self.assertTrue(instance_of(int, Type[int]))
86
        self.assertTrue(not instance_of(str, Type[int]))
87
88
    def test_instance_of_tuple(self):
89
        self.assertTrue(instance_of((1,), Tuple[int]))
90
        self.assertTrue(instance_of((1, 2, 3), Tuple[int, ...]))
91
92
    def test_instance_of_list_with_union(self):
93
        self.assertTrue(instance_of([1, '2', 3], List[Union[int, str]]))
94
        self.assertTrue(not instance_of([1, '2', 3], List[Union[int, float]]))
95
96
    def test_instance_of_tuple_with_union(self):
97
        self.assertTrue(instance_of((1, '2', 3), Tuple[Union[int, str], ...]))
98
        self.assertTrue(not instance_of((1, '2', 3), Tuple[Union[int, float], ...]))
99
100
    def test_instance_of_iterable(self):
101
        self.assertTrue(instance_of([1, 2, 3], Iterable[int]))
102
        self.assertTrue(instance_of((1, 2, 3), Iterable[int]))
103
104
    def test_instance_of_literal(self):
105
        self.assertTrue(instance_of(42, Literal[42]))
106
        self.assertTrue(instance_of(42, Literal[42], int))
107
        self.assertTrue(not instance_of(43, Literal[42]))
108
        self.assertTrue(not instance_of(42, Literal[42], str))
109
        self.assertTrue(not instance_of(42, Literal))
110
        self.assertTrue(instance_of(Any, Literal[Any]))
111
        self.assertTrue(not instance_of(42, Literal[Any]))
112
        self.assertTrue(not instance_of(42, Literal))
113
        self.assertTrue(instance_of(2, Literal[1, 2]))
114
115
    def test_instance_of_typing_literal(self):
116
        # This is to mock Python 3.8 Literal.
117
        class LiteralMockMeta(type):
118
            __name__ = 'Literal'
119
120
            def __instancecheck__(self, instance):
121
                raise Exception('typing.Literal does not allow instance checks.')
122
123
        class LiteralMock(metaclass=LiteralMockMeta):
124
            __args__ = (42,)
125
126
        self.assertTrue(instance_of(42, LiteralMock))
127
128
    def test_instance_of_numpy(self):
129
        self.assertTrue(instance_of(numpy.array([1, 2, 3]), numpy.ndarray))
130
131
    def test_instance_of_nptyping_ndarray(self):
132
        local_state = State()
133
        register_get_type(numpy.ndarray, nptyping.NDArray.type_of, local_state)
134
135
        arr = numpy.array([1, 2, 3])
136
        arr_type = nptyping.NDArray[(3,), int]
137
138
        self.assertTrue(instance_of(arr, arr_type, state=local_state))
139
        self.assertTrue(instance_of([arr], List[arr_type], state=local_state))
140
        self.assertTrue(instance_of([arr], List[nptyping.NDArray], state=local_state))
141
        self.assertTrue(not instance_of([arr], List[nptyping.NDArray[(4,), float]], state=local_state))
142
143
    @skipUnless(10 * version_info.major + version_info.minor >= 39, 'PEP-585')
144
    def test_instance_of_py39_types(self):
145
        self.assertTrue(instance_of({'42': 42}, Dict[str, int]))
146
        self.assertTrue(not instance_of({'42': 42}, Dict[str, str]))
147
        self.assertTrue(not instance_of({42: 42}, Dict[str, int]))
148
        self.assertTrue(instance_of([1, 2, 3], list[int]))
149
        self.assertTrue(not instance_of([1, 2, 3], list[str]))
150