55
66import unittest
77import test .support
8+ import sys
89
9- class MemoryviewTest (unittest .TestCase ):
10+
11+ class 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+
161+ class 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 )
10168
11169 def test_constructor (self ):
12170 ob = b'test'
@@ -17,8 +175,38 @@ def test_constructor(self):
17175 self .assertRaises (TypeError , memoryview , argument = ob )
18176 self .assertRaises (TypeError , memoryview , ob , argument = True )
19177
178+
179+ class 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+
196+ class 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+
20207def test_main ():
21- test .support .run_unittest (MemoryviewTest )
208+ test .support .run_unittest (
209+ MemoryviewTest , MemorySliceTest , MemorySliceSliceTest )
22210
23211
24212if __name__ == "__main__" :
0 commit comments