annotate Lib/test/test_memoryview.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 0dc604d58949
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
43793
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1 """Unit tests for the memoryview
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2
78650
ccaf827bbf4c Fix out-of-date comment in test_memoryview.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
3 Some tests are in test_bytes. Many tests that require _testbuffer.ndarray
ccaf827bbf4c Fix out-of-date comment in test_memoryview.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
4 are in test_buffer.
43793
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
5 """
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
6
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
7 import unittest
47201
9c930a32cebb #2621 rename test.test_support to test.support
Benjamin Peterson <benjamin@python.org>
parents: 43793
diff changeset
8 import test.support
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
9 import sys
48928
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
10 import gc
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
11 import weakref
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
12 import array
67676
2fde5abfb5f1 Merged revisions 88097 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66340
diff changeset
13 import io
43793
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
14
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
15
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
16 class AbstractMemoryTests:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
17 source_bytes = b"abcdef"
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
18
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
19 @property
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
20 def _source(self):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
21 return self.source_bytes
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
22
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
23 @property
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
24 def _types(self):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
25 return filter(None, [self.ro_type, self.rw_type])
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
26
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
27 def check_getitem_with_type(self, tp):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
28 b = tp(self._source)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
29 oldrefcount = sys.getrefcount(b)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
30 m = self._view(b)
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
31 self.assertEqual(m[0], ord(b"a"))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
32 self.assertIsInstance(m[0], int)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
33 self.assertEqual(m[5], ord(b"f"))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
34 self.assertEqual(m[-1], ord(b"f"))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
35 self.assertEqual(m[-6], ord(b"a"))
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
36 # Bounds checking
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
37 self.assertRaises(IndexError, lambda: m[6])
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
38 self.assertRaises(IndexError, lambda: m[-7])
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
39 self.assertRaises(IndexError, lambda: m[sys.maxsize])
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
40 self.assertRaises(IndexError, lambda: m[-sys.maxsize])
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
41 # Type checking
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
42 self.assertRaises(TypeError, lambda: m[None])
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
43 self.assertRaises(TypeError, lambda: m[0.0])
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
44 self.assertRaises(TypeError, lambda: m["a"])
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
45 m = None
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
46 self.assertEqual(sys.getrefcount(b), oldrefcount)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
47
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
48 def test_getitem(self):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
49 for tp in self._types:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
50 self.check_getitem_with_type(tp)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
51
54828
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 50490
diff changeset
52 def test_iter(self):
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 50490
diff changeset
53 for tp in self._types:
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 50490
diff changeset
54 b = tp(self._source)
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 50490
diff changeset
55 m = self._view(b)
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 50490
diff changeset
56 self.assertEqual(list(m), [m[i] for i in range(len(m))])
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 50490
diff changeset
57
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
58 def test_setitem_readonly(self):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
59 if not self.ro_type:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
60 return
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
61 b = self.ro_type(self._source)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
62 oldrefcount = sys.getrefcount(b)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
63 m = self._view(b)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
64 def setitem(value):
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
65 m[0] = value
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
66 self.assertRaises(TypeError, setitem, b"a")
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
67 self.assertRaises(TypeError, setitem, 65)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
68 self.assertRaises(TypeError, setitem, memoryview(b"a"))
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
69 m = None
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
70 self.assertEqual(sys.getrefcount(b), oldrefcount)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
71
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
72 def test_setitem_writable(self):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
73 if not self.rw_type:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
74 return
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
75 tp = self.rw_type
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
76 b = self.rw_type(self._source)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
77 oldrefcount = sys.getrefcount(b)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
78 m = self._view(b)
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
79 m[0] = ord(b'1')
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
80 self._check_contents(tp, b, b"1bcdef")
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
81 m[0:1] = tp(b"0")
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
82 self._check_contents(tp, b, b"0bcdef")
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
83 m[1:3] = tp(b"12")
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
84 self._check_contents(tp, b, b"012def")
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
85 m[1:1] = tp(b"")
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
86 self._check_contents(tp, b, b"012def")
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
87 m[:] = tp(b"abcdef")
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
88 self._check_contents(tp, b, b"abcdef")
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
89
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
90 # Overlapping copies of a view into itself
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
91 m[0:3] = m[2:5]
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
92 self._check_contents(tp, b, b"cdedef")
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
93 m[:] = tp(b"abcdef")
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
94 m[2:5] = m[0:3]
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
95 self._check_contents(tp, b, b"ababcf")
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
96
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
97 def setitem(key, value):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
98 m[key] = tp(value)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
99 # Bounds checking
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
100 self.assertRaises(IndexError, setitem, 6, b"a")
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
101 self.assertRaises(IndexError, setitem, -7, b"a")
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
102 self.assertRaises(IndexError, setitem, sys.maxsize, b"a")
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
103 self.assertRaises(IndexError, setitem, -sys.maxsize, b"a")
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
104 # Wrong index/slice types
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
105 self.assertRaises(TypeError, setitem, 0.0, b"a")
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
106 self.assertRaises(TypeError, setitem, (0,), b"a")
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
107 self.assertRaises(TypeError, setitem, (slice(0,1,1), 0), b"a")
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
108 self.assertRaises(TypeError, setitem, (0, slice(0,1,1)), b"a")
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
109 self.assertRaises(TypeError, setitem, (0,), b"a")
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
110 self.assertRaises(TypeError, setitem, "a", b"a")
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
111 # Not implemented: multidimensional slices
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
112 slices = (slice(0,1,1), slice(0,1,2))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
113 self.assertRaises(NotImplementedError, setitem, slices, b"a")
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
114 # Trying to resize the memory object
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
115 exc = ValueError if m.format == 'c' else TypeError
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
116 self.assertRaises(exc, setitem, 0, b"")
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
117 self.assertRaises(exc, setitem, 0, b"ab")
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
118 self.assertRaises(ValueError, setitem, slice(1,1), b"a")
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
119 self.assertRaises(ValueError, setitem, slice(0,2), b"a")
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
120
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
121 m = None
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
122 self.assertEqual(sys.getrefcount(b), oldrefcount)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
123
64362
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
124 def test_delitem(self):
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
125 for tp in self._types:
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
126 b = tp(self._source)
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
127 m = self._view(b)
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
128 with self.assertRaises(TypeError):
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
129 del m[1]
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
130 with self.assertRaises(TypeError):
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
131 del m[1:4]
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
132
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
133 def test_tobytes(self):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
134 for tp in self._types:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
135 m = self._view(tp(self._source))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
136 b = m.tobytes()
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
137 # This calls self.getitem_type() on each separate byte of b"abcdef"
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
138 expected = b"".join(
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
139 self.getitem_type(bytes([c])) for c in b"abcdef")
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
140 self.assertEqual(b, expected)
58473
71acd4482e65 Merged revisions 77727 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 55593
diff changeset
141 self.assertIsInstance(b, bytes)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
142
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
143 def test_tolist(self):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
144 for tp in self._types:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
145 m = self._view(tp(self._source))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
146 l = m.tolist()
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
147 self.assertEqual(l, list(b"abcdef"))
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
148
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
149 def test_compare(self):
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
150 # memoryviews can compare for equality with other objects
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
151 # having the buffer interface.
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
152 for tp in self._types:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
153 m = self._view(tp(self._source))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
154 for tp_comp in self._types:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
155 self.assertTrue(m == tp_comp(b"abcdef"))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
156 self.assertFalse(m != tp_comp(b"abcdef"))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
157 self.assertFalse(m == tp_comp(b"abcde"))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
158 self.assertTrue(m != tp_comp(b"abcde"))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
159 self.assertFalse(m == tp_comp(b"abcde1"))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
160 self.assertTrue(m != tp_comp(b"abcde1"))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
161 self.assertTrue(m == m)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
162 self.assertTrue(m == m[:])
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
163 self.assertTrue(m[0:6] == m[:])
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
164 self.assertFalse(m[0:5] == m)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
165
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
166 # Comparison with objects which don't support the buffer API
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
167 self.assertFalse(m == "abcdef")
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
168 self.assertTrue(m != "abcdef")
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
169 self.assertFalse("abcdef" == m)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
170 self.assertTrue("abcdef" != m)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
171
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
172 # Unordered comparisons
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
173 for c in (m, b"abcdef"):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
174 self.assertRaises(TypeError, lambda: m < c)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
175 self.assertRaises(TypeError, lambda: c <= m)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
176 self.assertRaises(TypeError, lambda: m >= c)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
177 self.assertRaises(TypeError, lambda: c > m)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
178
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
179 def check_attributes_with_type(self, tp):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
180 m = self._view(tp(self._source))
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
181 self.assertEqual(m.format, self.format)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
182 self.assertEqual(m.itemsize, self.itemsize)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
183 self.assertEqual(m.ndim, 1)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
184 self.assertEqual(m.shape, (6,))
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
185 self.assertEqual(len(m), 6)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
186 self.assertEqual(m.strides, (self.itemsize,))
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
187 self.assertEqual(m.suboffsets, ())
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
188 return m
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
189
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
190 def test_attributes_readonly(self):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
191 if not self.ro_type:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
192 return
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
193 m = self.check_attributes_with_type(self.ro_type)
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
194 self.assertEqual(m.readonly, True)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
195
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
196 def test_attributes_writable(self):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
197 if not self.rw_type:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
198 return
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
199 m = self.check_attributes_with_type(self.rw_type)
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
200 self.assertEqual(m.readonly, False)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
201
48928
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
202 def test_getbuffer(self):
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
203 # Test PyObject_GetBuffer() on a memoryview object.
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
204 for tp in self._types:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
205 b = tp(self._source)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
206 oldrefcount = sys.getrefcount(b)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
207 m = self._view(b)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
208 oldviewrefcount = sys.getrefcount(m)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
209 s = str(m, "utf-8")
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
210 self._check_contents(tp, b, s.encode("utf-8"))
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
211 self.assertEqual(sys.getrefcount(m), oldviewrefcount)
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
212 m = None
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
213 self.assertEqual(sys.getrefcount(b), oldrefcount)
48928
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
214
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
215 def test_gc(self):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
216 for tp in self._types:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
217 if not isinstance(tp, type):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
218 # If tp is a factory rather than a plain type, skip
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
219 continue
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
220
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
221 class MyView():
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
222 def __init__(self, base):
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
223 self.m = memoryview(base)
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
224 class MySource(tp):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
225 pass
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
226 class MyObject:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
227 pass
48928
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
228
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
229 # Create a reference cycle through a memoryview object.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
230 # This exercises mbuf_clear().
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
231 b = MySource(tp(b'abc'))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
232 m = self._view(b)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
233 o = MyObject()
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
234 b.m = m
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
235 b.o = o
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
236 wr = weakref.ref(o)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
237 b = m = o = None
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
238 # The cycle must be broken
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
239 gc.collect()
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54828
diff changeset
240 self.assertTrue(wr() is None, wr())
48928
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
241
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
242 # This exercises memory_clear().
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
243 m = MyView(tp(b'abc'))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
244 o = MyObject()
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
245 m.x = m
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
246 m.o = o
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
247 wr = weakref.ref(o)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
248 m = o = None
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
249 # The cycle must be broken
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
250 gc.collect()
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
251 self.assertTrue(wr() is None, wr())
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
252
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
253 def _check_released(self, m, tp):
66581
38bec90fd8ab #10273: Rename assertRegexpMatches and assertRaisesRegexp to assertRegex and assertRaisesRegex.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 66310
diff changeset
254 check = self.assertRaisesRegex(ValueError, "released")
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
255 with check: bytes(m)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
256 with check: m.tobytes()
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
257 with check: m.tolist()
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
258 with check: m[0]
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
259 with check: m[0] = b'x'
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
260 with check: len(m)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
261 with check: m.format
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
262 with check: m.itemsize
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
263 with check: m.ndim
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
264 with check: m.readonly
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
265 with check: m.shape
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
266 with check: m.strides
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
267 with check:
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
268 with m:
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
269 pass
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
270 # str() and repr() still function
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
271 self.assertIn("released memory", str(m))
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
272 self.assertIn("released memory", repr(m))
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
273 self.assertEqual(m, m)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
274 self.assertNotEqual(m, memoryview(tp(self._source)))
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
275 self.assertNotEqual(m, tp(self._source))
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
276
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
277 def test_contextmanager(self):
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
278 for tp in self._types:
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
279 b = tp(self._source)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
280 m = self._view(b)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
281 with m as cm:
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
282 self.assertIs(cm, m)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
283 self._check_released(m, tp)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
284 m = self._view(b)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
285 # Can release explicitly inside the context manager
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
286 with m:
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
287 m.release()
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
288
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
289 def test_release(self):
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
290 for tp in self._types:
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
291 b = tp(self._source)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
292 m = self._view(b)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
293 m.release()
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
294 self._check_released(m, tp)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
295 # Can be called a second time (it's a no-op)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
296 m.release()
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64360
diff changeset
297 self._check_released(m, tp)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
298
67676
2fde5abfb5f1 Merged revisions 88097 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66340
diff changeset
299 def test_writable_readonly(self):
2fde5abfb5f1 Merged revisions 88097 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66340
diff changeset
300 # Issue #10451: memoryview incorrectly exposes a readonly
2fde5abfb5f1 Merged revisions 88097 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66340
diff changeset
301 # buffer as writable causing a segfault if using mmap
2fde5abfb5f1 Merged revisions 88097 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66340
diff changeset
302 tp = self.ro_type
2fde5abfb5f1 Merged revisions 88097 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66340
diff changeset
303 if tp is None:
2fde5abfb5f1 Merged revisions 88097 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66340
diff changeset
304 return
2fde5abfb5f1 Merged revisions 88097 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66340
diff changeset
305 b = tp(self._source)
2fde5abfb5f1 Merged revisions 88097 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66340
diff changeset
306 m = self._view(b)
2fde5abfb5f1 Merged revisions 88097 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66340
diff changeset
307 i = io.BytesIO(b'ZZZZ')
2fde5abfb5f1 Merged revisions 88097 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66340
diff changeset
308 self.assertRaises(TypeError, i.readinto, m)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
309
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
310 def test_getbuf_fail(self):
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
311 self.assertRaises(TypeError, self._view, {})
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
312
73669
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
313 def test_hash(self):
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
314 # Memoryviews of readonly (hashable) types are hashable, and they
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
315 # hash as hash(obj.tobytes()).
73669
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
316 tp = self.ro_type
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
317 if tp is None:
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
318 self.skipTest("no read-only type to test")
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
319 b = tp(self._source)
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
320 m = self._view(b)
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
321 self.assertEqual(hash(m), hash(b"abcdef"))
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
322 # Releasing the memoryview keeps the stored hash value (as with weakrefs)
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
323 m.release()
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
324 self.assertEqual(hash(m), hash(b"abcdef"))
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
325 # Hashing a memoryview for the first time after it is released
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
326 # results in an error (as with weakrefs).
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
327 m = self._view(b)
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
328 m.release()
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
329 self.assertRaises(ValueError, hash, m)
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
330
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
331 def test_hash_writable(self):
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
332 # Memoryviews of writable types are unhashable
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
333 tp = self.rw_type
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
334 if tp is None:
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
335 self.skipTest("no writable type to test")
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
336 b = tp(self._source)
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
337 m = self._view(b)
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
338 self.assertRaises(ValueError, hash, m)
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
339
77213
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
340 def test_weakref(self):
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
341 # Check memoryviews are weakrefable
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
342 for tp in self._types:
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
343 b = tp(self._source)
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
344 m = self._view(b)
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
345 L = []
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
346 def callback(wr, b=b):
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
347 L.append(b)
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
348 wr = weakref.ref(m, callback)
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
349 self.assertIs(wr(), m)
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
350 del m
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
351 test.support.gc_collect()
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
352 self.assertIs(wr(), None)
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
353 self.assertIs(L[0], b)
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75254
diff changeset
354
85923
0dc604d58949 Close #19078: memoryview now supports reversed
Nick Coghlan <ncoghlan@gmail.com>
parents: 78650
diff changeset
355 def test_reversed(self):
0dc604d58949 Close #19078: memoryview now supports reversed
Nick Coghlan <ncoghlan@gmail.com>
parents: 78650
diff changeset
356 for tp in self._types:
0dc604d58949 Close #19078: memoryview now supports reversed
Nick Coghlan <ncoghlan@gmail.com>
parents: 78650
diff changeset
357 b = tp(self._source)
0dc604d58949 Close #19078: memoryview now supports reversed
Nick Coghlan <ncoghlan@gmail.com>
parents: 78650
diff changeset
358 m = self._view(b)
0dc604d58949 Close #19078: memoryview now supports reversed
Nick Coghlan <ncoghlan@gmail.com>
parents: 78650
diff changeset
359 aslist = list(reversed(m.tolist()))
0dc604d58949 Close #19078: memoryview now supports reversed
Nick Coghlan <ncoghlan@gmail.com>
parents: 78650
diff changeset
360 self.assertEqual(list(reversed(m)), aslist)
0dc604d58949 Close #19078: memoryview now supports reversed
Nick Coghlan <ncoghlan@gmail.com>
parents: 78650
diff changeset
361 self.assertEqual(list(reversed(m)), list(m[::-1]))
0dc604d58949 Close #19078: memoryview now supports reversed
Nick Coghlan <ncoghlan@gmail.com>
parents: 78650
diff changeset
362
0dc604d58949 Close #19078: memoryview now supports reversed
Nick Coghlan <ncoghlan@gmail.com>
parents: 78650
diff changeset
363
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
364 # Variations on source objects for the buffer: bytes-like objects, then arrays
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
365 # with itemsize > 1.
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
366 # NOTE: support for multi-dimensional objects is unimplemented.
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
367
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
368 class BaseBytesMemoryTests(AbstractMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
369 ro_type = bytes
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
370 rw_type = bytearray
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
371 getitem_type = bytes
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
372 itemsize = 1
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
373 format = 'B'
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
374
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
375 class BaseArrayMemoryTests(AbstractMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
376 ro_type = None
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
377 rw_type = lambda self, b: array.array('i', list(b))
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 58473
diff changeset
378 getitem_type = lambda self, b: array.array('i', list(b)).tobytes()
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
379 itemsize = array.array('i').itemsize
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
380 format = 'i'
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
381
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
382 def test_getbuffer(self):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
383 # XXX Test should be adapted for non-byte buffers
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
384 pass
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
385
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
386 def test_tolist(self):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
387 # XXX NotImplementedError: tolist() only supports byte views
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
388 pass
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
389
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
390
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
391 # Variations on indirection levels: memoryview, slice of memoryview,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
392 # slice of slice of memoryview.
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
393 # This is important to test allocation subtleties.
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
394
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
395 class BaseMemoryviewTests:
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
396 def _view(self, obj):
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
397 return memoryview(obj)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
398
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
399 def _check_contents(self, tp, obj, contents):
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
400 self.assertEqual(obj, tp(contents))
43793
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
401
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
402 class BaseMemorySliceTests:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
403 source_bytes = b"XabcdefY"
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
404
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
405 def _view(self, obj):
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
406 m = memoryview(obj)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
407 return m[1:7]
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
408
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
409 def _check_contents(self, tp, obj, contents):
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
410 self.assertEqual(obj[1:7], tp(contents))
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
411
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
412 def test_refs(self):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
413 for tp in self._types:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
414 m = memoryview(tp(self._source))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
415 oldrefcount = sys.getrefcount(m)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
416 m[1:2]
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
417 self.assertEqual(sys.getrefcount(m), oldrefcount)
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
418
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
419 class BaseMemorySliceSliceTests:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
420 source_bytes = b"XabcdefY"
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
421
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
422 def _view(self, obj):
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
423 m = memoryview(obj)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
424 return m[:7][1:]
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
425
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
426 def _check_contents(self, tp, obj, contents):
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
427 self.assertEqual(obj[1:7], tp(contents))
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
428
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
429
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
430 # Concrete test classes
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
431
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
432 class BytesMemoryviewTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
433 BaseMemoryviewTests, BaseBytesMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
434
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
435 def test_constructor(self):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
436 for tp in self._types:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
437 ob = tp(self._source)
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54828
diff changeset
438 self.assertTrue(memoryview(ob))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54828
diff changeset
439 self.assertTrue(memoryview(object=ob))
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
440 self.assertRaises(TypeError, memoryview)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
441 self.assertRaises(TypeError, memoryview, ob, ob)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
442 self.assertRaises(TypeError, memoryview, argument=ob)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
443 self.assertRaises(TypeError, memoryview, ob, argument=True)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
444
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
445 class ArrayMemoryviewTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
446 BaseMemoryviewTests, BaseArrayMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
447
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
448 def test_array_assign(self):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
449 # Issue #4569: segfault when mutating a memoryview with itemsize != 1
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
450 a = array.array('i', range(10))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
451 m = memoryview(a)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
452 new_a = array.array('i', range(9, -1, -1))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
453 m[:] = new_a
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
454 self.assertEqual(a, new_a)
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
455
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
456
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
457 class BytesMemorySliceTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
458 BaseMemorySliceTests, BaseBytesMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
459 pass
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
460
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
461 class ArrayMemorySliceTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
462 BaseMemorySliceTests, BaseArrayMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
463 pass
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
464
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
465 class BytesMemorySliceSliceTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
466 BaseMemorySliceSliceTests, BaseBytesMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
467 pass
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
468
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
469 class ArrayMemorySliceSliceTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
470 BaseMemorySliceSliceTests, BaseArrayMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
471 pass
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
472
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
473
43793
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
474 def test_main():
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
475 test.support.run_unittest(__name__)
43793
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
476
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
477 if __name__ == "__main__":
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
478 test_main()