Skip to content

Commit 50e6e7a

Browse files
[2.7] Add new tests for bytes and bytearray constructors. (GH-9843)
Covered all special cases: bytes, tuple, list, differend kinds of iterables and iterators.. (cherry picked from commit 1a997eb) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 68ddb59 commit 50e6e7a

File tree

1 file changed

+56
-3
lines changed

1 file changed

+56
-3
lines changed

Lib/test/test_bytes.py

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
the latter should be modernized).
55
"""
66

7+
import array
78
import os
89
import re
910
import sys
@@ -58,11 +59,49 @@ def test_empty_sequence(self):
5859
self.assertRaises(IndexError, lambda: b[-sys.maxint-2])
5960
self.assertRaises(IndexError, lambda: b[-10**100])
6061

62+
def test_from_iterable(self):
63+
b = self.type2test(range(256))
64+
self.assertEqual(len(b), 256)
65+
self.assertEqual(list(b), list(range(256)))
66+
67+
# Non-sequence iterable.
68+
b = self.type2test({42})
69+
self.assertEqual(b, b"*")
70+
b = self.type2test({43, 45})
71+
self.assertIn(tuple(b), {(43, 45), (45, 43)})
72+
73+
# Iterator that has a __length_hint__.
74+
b = self.type2test(iter(range(256)))
75+
self.assertEqual(len(b), 256)
76+
self.assertEqual(list(b), list(range(256)))
77+
78+
# Iterator that doesn't have a __length_hint__.
79+
b = self.type2test(i for i in range(256) if i % 2)
80+
self.assertEqual(len(b), 128)
81+
self.assertEqual(list(b), list(range(256))[1::2])
82+
83+
# Sequence without __iter__.
84+
class S:
85+
def __getitem__(self, i):
86+
return (1, 2, 3)[i]
87+
b = self.type2test(S())
88+
self.assertEqual(b, b"\x01\x02\x03")
89+
90+
def test_from_tuple(self):
91+
# There is a special case for tuples.
92+
b = self.type2test(tuple(range(256)))
93+
self.assertEqual(len(b), 256)
94+
self.assertEqual(list(b), list(range(256)))
95+
b = self.type2test((1, 2, 3))
96+
self.assertEqual(b, b"\x01\x02\x03")
97+
6198
def test_from_list(self):
62-
ints = list(range(256))
63-
b = self.type2test(i for i in ints)
99+
# There is a special case for lists.
100+
b = self.type2test(list(range(256)))
64101
self.assertEqual(len(b), 256)
65-
self.assertEqual(list(b), ints)
102+
self.assertEqual(list(b), list(range(256)))
103+
b = self.type2test([1, 2, 3])
104+
self.assertEqual(b, b"\x01\x02\x03")
66105

67106
def test_from_index(self):
68107
b = self.type2test([Indexable(), Indexable(1), Indexable(254),
@@ -71,6 +110,20 @@ def test_from_index(self):
71110
self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
72111
self.assertRaises(ValueError, self.type2test, [Indexable(256)])
73112

113+
def test_from_buffer(self):
114+
a = self.type2test(array.array('B', [1, 2, 3]))
115+
self.assertEqual(a, b"\x01\x02\x03")
116+
a = self.type2test(b"\x01\x02\x03")
117+
self.assertEqual(a, b"\x01\x02\x03")
118+
119+
# http://bugs.python.org/issue29159
120+
# Fallback when __index__ raises exception other than OverflowError
121+
class B(bytes):
122+
def __index__(self):
123+
raise TypeError
124+
125+
self.assertEqual(self.type2test(B(b"foobar")), b"foobar")
126+
74127
def test_from_ssize(self):
75128
self.assertEqual(self.type2test(0), b'')
76129
self.assertEqual(self.type2test(1), b'\x00')

0 commit comments

Comments
 (0)