blob: dca48b1b5b2b2d66416e1a51928fed37331db769 [file] [log] [blame]
Christian Heimes7b6fc8e2007-11-08 02:28:11 +00001"""Unit tests for the memoryview
2
3XXX We need more tests! Some tests are in test_bytes
4"""
5
6import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007import test.support
Antoine Pitrou616d2852008-08-19 22:09:34 +00008import sys
Christian Heimes7b6fc8e2007-11-08 02:28:11 +00009
Antoine Pitrou616d2852008-08-19 22:09:34 +000010
11class CommonMemoryTests:
12 #
13 # Tests common to direct memoryviews and sliced memoryviews
14 #
15
16 base_object = b"abcdef"
17
18 def check_getitem_with_type(self, tp):
19 b = tp(self.base_object)
20 oldrefcount = sys.getrefcount(b)
21 m = self._view(b)
22 self.assertEquals(m[0], b"a")
23 self.assert_(isinstance(m[0], bytes), type(m[0]))
24 self.assertEquals(m[5], b"f")
25 self.assertEquals(m[-1], b"f")
26 self.assertEquals(m[-6], b"a")
27 # Bounds checking
28 self.assertRaises(IndexError, lambda: m[6])
29 self.assertRaises(IndexError, lambda: m[-7])
30 self.assertRaises(IndexError, lambda: m[sys.maxsize])
31 self.assertRaises(IndexError, lambda: m[-sys.maxsize])
32 # Type checking
33 self.assertRaises(TypeError, lambda: m[None])
34 self.assertRaises(TypeError, lambda: m[0.0])
35 self.assertRaises(TypeError, lambda: m["a"])
36 m = None
37 self.assertEquals(sys.getrefcount(b), oldrefcount)
38
39 def test_getitem_readonly(self):
40 self.check_getitem_with_type(bytes)
41
42 def test_getitem_writable(self):
43 self.check_getitem_with_type(bytearray)
44
45 def test_setitem_readonly(self):
46 b = self.base_object
47 oldrefcount = sys.getrefcount(b)
48 m = self._view(b)
49 def setitem(value):
50 m[0] = value
51 self.assertRaises(TypeError, setitem, b"a")
52 self.assertRaises(TypeError, setitem, 65)
53 self.assertRaises(TypeError, setitem, memoryview(b"a"))
54 m = None
55 self.assertEquals(sys.getrefcount(b), oldrefcount)
56
57 def test_setitem_writable(self):
58 b = bytearray(self.base_object)
59 oldrefcount = sys.getrefcount(b)
60 m = self._view(b)
61 m[0] = b"0"
62 self._check_contents(b, b"0bcdef")
63 m[1:3] = b"12"
64 self._check_contents(b, b"012def")
65 m[1:1] = b""
66 self._check_contents(b, b"012def")
67 m[:] = b"abcdef"
68 self._check_contents(b, b"abcdef")
69
70 # Overlapping copies of a view into itself
71 m[0:3] = m[2:5]
72 self._check_contents(b, b"cdedef")
73 m[:] = b"abcdef"
74 m[2:5] = m[0:3]
75 self._check_contents(b, b"ababcf")
76
77 def setitem(key, value):
78 m[key] = value
79 # Bounds checking
80 self.assertRaises(IndexError, setitem, 6, b"a")
81 self.assertRaises(IndexError, setitem, -7, b"a")
82 self.assertRaises(IndexError, setitem, sys.maxsize, b"a")
83 self.assertRaises(IndexError, setitem, -sys.maxsize, b"a")
84 # Wrong index/slice types
85 self.assertRaises(TypeError, setitem, 0.0, b"a")
86 self.assertRaises(TypeError, setitem, (0,), b"a")
87 self.assertRaises(TypeError, setitem, "a", b"a")
88 # Trying to resize the memory object
89 self.assertRaises(ValueError, setitem, 0, b"")
90 self.assertRaises(ValueError, setitem, 0, b"ab")
91 self.assertRaises(ValueError, setitem, slice(1,1), b"a")
92 self.assertRaises(ValueError, setitem, slice(0,2), b"a")
93
94 m = None
95 self.assertEquals(sys.getrefcount(b), oldrefcount)
96
97 def test_len(self):
98 self.assertEquals(len(self._view(self.base_object)), 6)
99
100 def test_tobytes(self):
101 m = self._view(self.base_object)
102 b = m.tobytes()
103 self.assertEquals(b, b"abcdef")
104 self.assert_(isinstance(b, bytes), type(b))
105
106 def test_tolist(self):
107 m = self._view(self.base_object)
108 l = m.tolist()
109 self.assertEquals(l, list(b"abcdef"))
110
111 def test_compare(self):
112 # memoryviews can compare for equality with other objects
113 # having the buffer interface.
114 m = self._view(self.base_object)
115 for tp in (bytes, bytearray):
116 self.assertTrue(m == tp(b"abcdef"))
117 self.assertFalse(m != tp(b"abcdef"))
118 self.assertFalse(m == tp(b"abcde"))
119 self.assertTrue(m != tp(b"abcde"))
120 self.assertFalse(m == tp(b"abcde1"))
121 self.assertTrue(m != tp(b"abcde1"))
122 self.assertTrue(m == m)
123 self.assertTrue(m == m[:])
124 self.assertTrue(m[0:6] == m[:])
125 self.assertFalse(m[0:5] == m)
126
127 # Comparison with objects which don't support the buffer API
128 self.assertFalse(m == "abc")
129 self.assertTrue(m != "abc")
130 self.assertFalse("abc" == m)
131 self.assertTrue("abc" != m)
132
133 # Unordered comparisons
134 for c in (m, b"abcdef"):
135 self.assertRaises(TypeError, lambda: m < c)
136 self.assertRaises(TypeError, lambda: c <= m)
137 self.assertRaises(TypeError, lambda: m >= c)
138 self.assertRaises(TypeError, lambda: c > m)
139
140 def check_attributes_with_type(self, tp):
141 b = tp(self.base_object)
142 m = self._view(b)
143 self.assertEquals(m.format, 'B')
144 self.assertEquals(m.itemsize, 1)
145 self.assertEquals(m.ndim, 1)
146 self.assertEquals(m.shape, (6,))
147 self.assertEquals(m.size, 6)
148 self.assertEquals(m.strides, (1,))
149 self.assertEquals(m.suboffsets, None)
150 return m
151
152 def test_attributes_readonly(self):
153 m = self.check_attributes_with_type(bytes)
154 self.assertEquals(m.readonly, True)
155
156 def test_attributes_writable(self):
157 m = self.check_attributes_with_type(bytearray)
158 self.assertEquals(m.readonly, False)
159
160
161class MemoryviewTest(unittest.TestCase, CommonMemoryTests):
162
163 def _view(self, obj):
164 return memoryview(obj)
165
166 def _check_contents(self, obj, contents):
167 self.assertEquals(obj, contents)
Christian Heimes7b6fc8e2007-11-08 02:28:11 +0000168
169 def test_constructor(self):
170 ob = b'test'
171 self.assert_(memoryview(ob))
172 self.assert_(memoryview(object=ob))
173 self.assertRaises(TypeError, memoryview)
174 self.assertRaises(TypeError, memoryview, ob, ob)
175 self.assertRaises(TypeError, memoryview, argument=ob)
176 self.assertRaises(TypeError, memoryview, ob, argument=True)
177
Antoine Pitrou616d2852008-08-19 22:09:34 +0000178
179class MemorySliceTest(unittest.TestCase, CommonMemoryTests):
180 base_object = b"XabcdefY"
181
182 def _view(self, obj):
183 m = memoryview(obj)
184 return m[1:7]
185
186 def _check_contents(self, obj, contents):
187 self.assertEquals(obj[1:7], contents)
188
189 def test_refs(self):
190 m = memoryview(b"ab")
191 oldrefcount = sys.getrefcount(m)
192 m[1:2]
193 self.assertEquals(sys.getrefcount(m), oldrefcount)
194
195
196class MemorySliceSliceTest(unittest.TestCase, CommonMemoryTests):
197 base_object = b"XabcdefY"
198
199 def _view(self, obj):
200 m = memoryview(obj)
201 return m[:7][1:]
202
203 def _check_contents(self, obj, contents):
204 self.assertEquals(obj[1:7], contents)
205
206
Christian Heimes7b6fc8e2007-11-08 02:28:11 +0000207def test_main():
Antoine Pitrou616d2852008-08-19 22:09:34 +0000208 test.support.run_unittest(
209 MemoryviewTest, MemorySliceTest, MemorySliceSliceTest)
Christian Heimes7b6fc8e2007-11-08 02:28:11 +0000210
211
212if __name__ == "__main__":
213 test_main()