Passed
Push — master ( 16e282...dc8133 )
by Ramon
56s queued 11s
created

tests.functions.test_instance_of   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 130
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 99
dl 0
loc 130
rs 10
c 0
b 0
f 0
wmc 16

14 Methods

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