Passed
Push — master ( d3f043...9ce0bf )
by Ramon
04:16 queued 03:10
created

tests.test_ndarray.TestNDArray.test_hash_ndarray()   A

Complexity

Conditions 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 7
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
from typing import Any, Optional
2
from unittest import TestCase
3
4
import numpy as np
5
6
from nptyping.ndarray import NDArray
7
8
9
class TestNDArray(TestCase):
10
11
    def test_initialize_with_nothing(self):
12
        self.assertEqual((Any, ...), NDArray.shape)
13
        self.assertEqual(Any, NDArray._type)
14
        self.assertEqual((Any, ...), NDArray[(Any, ...)].shape)
15
        self.assertEqual(Any, NDArray[(Any, ...)]._type)
16
        self.assertEqual((Any, ...), NDArray[(Any, ...), Any].shape)
17
        self.assertEqual(Any, NDArray[(Any, ...), Any]._type)
18
19
    def test_initialize_with_size(self):
20
        self.assertEqual(1, len(NDArray[5].shape))
21
        self.assertEqual(5, NDArray[5].shape[0])
22
        self.assertEqual(Any, NDArray[5]._type)
23
        self.assertEqual(NDArray[5], NDArray[(5,)])
24
        self.assertEqual(NDArray[5], NDArray[(5,), Any])
25
26
    def test_initialize_with_any_size(self):
27
        self.assertEqual(1, len(NDArray[Any].shape))
28
        self.assertEqual(Any, NDArray[Any].shape[0])
29
        self.assertEqual(Any, NDArray[Any]._type)
30
31
    def test_initialize_with_type(self):
32
        self.assertEqual((Any, ...), NDArray[int].shape)
33
        self.assertEqual(int, NDArray[int]._type)
34
35
    def test_initialize_with_size_and_type(self):
36
        self.assertEqual(1, len(NDArray[3, int].shape))
37
        self.assertEqual(3, NDArray[3, int].shape[0])
38
        self.assertEqual(int, NDArray[3, int]._type)
39
40
    def test_initialize_with_only_sizes(self):
41
        self.assertEqual(3, len(NDArray[(2, 4, Any)].shape))
42
        self.assertEqual(2, NDArray[(2, 4, Any)].shape[0])
43
        self.assertEqual(4, NDArray[(2, 4, Any)].shape[1])
44
        self.assertEqual(Any, NDArray[(2, 4, Any)].shape[2])
45
        self.assertEqual(Any, NDArray[(2, 4, Any)]._type)
46
        self.assertEqual(NDArray[(2, 4, Any)], NDArray[2, 4, Any])
47
48
    def test_initialize_with_sizes_and_type(self):
49
        self.assertEqual(3, len(NDArray[(2, 4, Any), int].shape))
50
        self.assertEqual(2, NDArray[(2, 4, Any), int].shape[0])
51
        self.assertEqual(4, NDArray[(2, 4, Any), int].shape[1])
52
        self.assertEqual(Any, NDArray[(2, 4, Any), int].shape[2])
53
        self.assertEqual(int, NDArray[(2, 4, Any), int]._type)
54
55
    def test_initialize_with_sizes_and_dtype(self):
56
        arr = NDArray[(2, 4, Any), np.dtype(int)]
57
58
        self.assertEqual(3, len(arr.shape))
59
        self.assertEqual(2, arr.shape[0])
60
        self.assertEqual(4, arr.shape[1])
61
        self.assertEqual(Any, arr.shape[2])
62
        self.assertEqual(np.dtype(int), arr._type)
63
64
    def test_initialize_with_ndims(self):
65
        self.assertEqual((2, ...), NDArray[(2, ...), int].shape)
66
67
    def test_invalid_initialization(self):
68
        with self.assertRaises(TypeError):
69
            NDArray['test']
70
        with self.assertRaises(TypeError):
71
            NDArray[(2, '2'), int]
72
        with self.assertRaises(TypeError):
73
            NDArray[(2, 2), 'int']
74
        with self.assertRaises(TypeError):
75
            NDArray[(2, 2, ...), int]
76
77
    def test_instance_check_dimension_sizes(self):
78
        arr2x2x2 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
79
        arr1x2x2 = np.array([[[1, 2], [3, 4]]])
80
        arr3x2x2 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]])
81
        arr2x2 = np.array([[1, 2], [3, 4]])
82
83
        self.assertTrue(isinstance(arr2x2x2, NDArray[(2, 2, 2), int]))
84
        self.assertTrue(not isinstance(arr1x2x2, NDArray[(2, 2, 2), int]))
85
        self.assertTrue(not isinstance(arr3x2x2, NDArray[(2, 2, 2), int]))
86
        self.assertTrue(not isinstance(arr2x2, NDArray[(2, 2, 2), int]))
87
88
    def test_instance_check_dimension_any(self):
89
        arr3x2x2 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]])
90
        arr2x2 = np.array([[1, 2], [3, 4]])
91
92
        self.assertTrue(isinstance(arr3x2x2, NDArray))
93
        self.assertTrue(isinstance(arr2x2, NDArray))
94
        self.assertTrue(isinstance(arr3x2x2, NDArray[int]))
95
        self.assertTrue(isinstance(arr2x2, NDArray[int]))
96
97
    def test_instance_check_types(self):
98
        arr2x2x2_float = np.array([[[1.0, 2.0], [3.0, 4.0]],
99
                                  [[5.0, 6.0], [7.0, 8.0]]])
100
        arr2x2x2 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
101
102
        self.assertTrue(isinstance(arr2x2x2_float, NDArray[(2, 2, 2), float]))
103
        self.assertTrue(not isinstance(arr2x2x2, NDArray[(2, 2, 2), str]))
104
105
    def test_instance_check_types_any(self):
106
        arr2x2x2_float = np.array([[[1.0, 2.0], [3.0, 4.0]],
107
                                  [[5.0, 6.0], [7.0, 8.0]]])
108
        arr2x2x2 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
109
        arr2x2 = np.array([[1, 2], [3, 4]])
110
111
        self.assertTrue(isinstance(arr2x2x2, NDArray[(2, 2, 2)]))
112
        self.assertTrue(isinstance(arr2x2x2_float, NDArray[(2, 2, 2)]))
113
        self.assertTrue(not isinstance(arr2x2, NDArray[(2, 2, 2)]))
114
115
    def test_instance_check_ndims(self):
116
        arr2x2x2 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
117
        arr2x2 = np.array([[1, 2], [3, 4]])
118
        arr3x2x2 = np.array([[[1, 2], [3, 4]],
119
                             [[5, 6], [7, 8]],
120
                             [[9, 10], [11, 12]]])
121
122
        self.assertTrue(isinstance(arr2x2, NDArray[(2, ...), int]))
123
        self.assertTrue(isinstance(arr2x2x2, NDArray[(2, ...), int]))
124
        self.assertTrue(not isinstance(arr3x2x2, NDArray[(2, ...), int]))
125
126
    def test_repr_and_str(self):
127
        import typing  # This import is need for the evals to work.
128
129
        arr_1a = NDArray[(2, 2), int]
130
        arr_1b = eval(repr(arr_1a))
131
132
        arr_2a = NDArray[(typing.Any, ...), int]
133
        arr_2b = eval(repr(arr_2a))
134
135
        arr_3a = NDArray
136
        arr_3b = eval(repr(arr_3a))
137
138
        arr_4a = NDArray[5]
139
        arr_4b = eval(repr(arr_4a))
140
141
        self.assertEqual(arr_1a, arr_1b)
142
        self.assertEqual(arr_2a, arr_2b)
143
        self.assertEqual(arr_3a, arr_3b)
144
        self.assertEqual(arr_4a, arr_4b)
145
146
        self.assertEqual(str(arr_1a), repr(arr_1a))
147
        self.assertEqual(str(arr_2a), repr(arr_2a))
148
        self.assertEqual(str(arr_3a), repr(arr_3a))
149
        self.assertEqual(str(arr_4a), repr(arr_4a))
150
151
    def test_type_of(self):
152
        arr1 = np.array([1, 2, 3])
153
        arr2 = np.array([1, 2, '3'])
154
        arr3 = np.array([1, 2, 3.0])
155
        arr4 = np.array([1, 2, {}])
156
157
        t1 = NDArray.type_of(arr1)
158
        t2 = NDArray.type_of(arr2)
159
        t3 = NDArray.type_of(arr3)
160
        t4 = NDArray.type_of(arr4)
161
162
        self.assertIsInstance(arr1, t1)
163
        self.assertIsInstance(arr2, t2)
164
        self.assertIsInstance(arr3, t3)
165
        self.assertIsInstance(arr4, t4)
166
167
    def test_hash_ndarray(self):
168
        # Hashing should not raise.
169
        hash(NDArray[(3,), int])
170
171
        # You now be able to wrap an NDArray in an optional.
172
        Optional[NDArray[(3,), int]]
173
        Optional[NDArray]
174