44the latter should be modernized).
55"""
66
7+ import array
78import os
89import re
910import 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