annotate Lib/test/test_memoryview.py @ 79691:05c8928362ee

Merge __next__ method link fixes with 3.3.
author Ezio Melotti <ezio.melotti@gmail.com>
date Fri, 12 Oct 2012 13:46:37 +0300
parents ccaf827bbf4c
children 0dc604d58949
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
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
355 # 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
356 # with itemsize > 1.
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
357 # NOTE: support for multi-dimensional objects is unimplemented.
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
358
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
359 class BaseBytesMemoryTests(AbstractMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
360 ro_type = bytes
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
361 rw_type = bytearray
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
362 getitem_type = bytes
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
363 itemsize = 1
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
364 format = 'B'
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
365
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
366 class BaseArrayMemoryTests(AbstractMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
367 ro_type = None
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
368 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
369 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
370 itemsize = array.array('i').itemsize
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
371 format = 'i'
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
372
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
373 def test_getbuffer(self):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
374 # 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
375 pass
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
376
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
377 def test_tolist(self):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
378 # XXX NotImplementedError: tolist() only supports byte views
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
379 pass
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
380
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 # Variations on indirection levels: memoryview, slice of memoryview,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
383 # slice of slice of memoryview.
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
384 # This is important to test allocation subtleties.
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 class BaseMemoryviewTests:
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
387 def _view(self, obj):
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
388 return memoryview(obj)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
389
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
390 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
391 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
392
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
393 class BaseMemorySliceTests:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
394 source_bytes = b"XabcdefY"
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
395
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 m = memoryview(obj)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
398 return m[1:7]
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
399
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
400 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
401 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
402
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
403 def test_refs(self):
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
404 for tp in self._types:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
405 m = memoryview(tp(self._source))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
406 oldrefcount = sys.getrefcount(m)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
407 m[1:2]
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
408 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
409
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
410 class BaseMemorySliceSliceTests:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
411 source_bytes = b"XabcdefY"
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
412
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
413 def _view(self, obj):
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
414 m = memoryview(obj)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
415 return m[:7][1:]
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
416
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
417 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
418 self.assertEqual(obj[1:7], tp(contents))
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
419
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
420
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
421 # Concrete test classes
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
422
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
423 class BytesMemoryviewTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
424 BaseMemoryviewTests, BaseBytesMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
425
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
426 def test_constructor(self):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
427 for tp in self._types:
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
428 ob = tp(self._source)
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54828
diff changeset
429 self.assertTrue(memoryview(ob))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54828
diff changeset
430 self.assertTrue(memoryview(object=ob))
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
431 self.assertRaises(TypeError, memoryview)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
432 self.assertRaises(TypeError, memoryview, ob, ob)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
433 self.assertRaises(TypeError, memoryview, argument=ob)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
434 self.assertRaises(TypeError, memoryview, ob, argument=True)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
435
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
436 class ArrayMemoryviewTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
437 BaseMemoryviewTests, BaseArrayMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
438
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
439 def test_array_assign(self):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
440 # 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
441 a = array.array('i', range(10))
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
442 m = memoryview(a)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
443 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
444 m[:] = new_a
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64362
diff changeset
445 self.assertEqual(a, new_a)
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
446
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 class BytesMemorySliceTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
449 BaseMemorySliceTests, BaseBytesMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
450 pass
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
451
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
452 class ArrayMemorySliceTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
453 BaseMemorySliceTests, BaseArrayMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
454 pass
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 class BytesMemorySliceSliceTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
457 BaseMemorySliceSliceTests, BaseBytesMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
458 pass
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
459
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
460 class ArrayMemorySliceSliceTest(unittest.TestCase,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
461 BaseMemorySliceSliceTests, BaseArrayMemoryTests):
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
462 pass
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
463
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 47201
diff changeset
464
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
465 def test_main():
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
466 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
467
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
468 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
469 test_main()