@@ -69,11 +69,49 @@ def test_empty_sequence(self):
6969 self .assertRaises (IndexError , lambda : b [- sys .maxsize - 2 ])
7070 self .assertRaises (IndexError , lambda : b [- 10 ** 100 ])
7171
72+ def test_from_iterable (self ):
73+ b = self .type2test (range (256 ))
74+ self .assertEqual (len (b ), 256 )
75+ self .assertEqual (list (b ), list (range (256 )))
76+
77+ # Non-sequence iterable.
78+ b = self .type2test ({42 })
79+ self .assertEqual (b , b"*" )
80+ b = self .type2test ({43 , 45 })
81+ self .assertIn (tuple (b ), {(43 , 45 ), (45 , 43 )})
82+
83+ # Iterator that has a __length_hint__.
84+ b = self .type2test (iter (range (256 )))
85+ self .assertEqual (len (b ), 256 )
86+ self .assertEqual (list (b ), list (range (256 )))
87+
88+ # Iterator that doesn't have a __length_hint__.
89+ b = self .type2test (i for i in range (256 ) if i % 2 )
90+ self .assertEqual (len (b ), 128 )
91+ self .assertEqual (list (b ), list (range (256 ))[1 ::2 ])
92+
93+ # Sequence without __iter__.
94+ class S :
95+ def __getitem__ (self , i ):
96+ return (1 , 2 , 3 )[i ]
97+ b = self .type2test (S ())
98+ self .assertEqual (b , b"\x01 \x02 \x03 " )
99+
100+ def test_from_tuple (self ):
101+ # There is a special case for tuples.
102+ b = self .type2test (tuple (range (256 )))
103+ self .assertEqual (len (b ), 256 )
104+ self .assertEqual (list (b ), list (range (256 )))
105+ b = self .type2test ((1 , 2 , 3 ))
106+ self .assertEqual (b , b"\x01 \x02 \x03 " )
107+
72108 def test_from_list (self ):
73- ints = list ( range ( 256 ))
74- b = self .type2test (i for i in ints )
109+ # There is a special case for lists.
110+ b = self .type2test (list ( range ( 256 )) )
75111 self .assertEqual (len (b ), 256 )
76- self .assertEqual (list (b ), ints )
112+ self .assertEqual (list (b ), list (range (256 )))
113+ b = self .type2test ([1 , 2 , 3 ])
114+ self .assertEqual (b , b"\x01 \x02 \x03 " )
77115
78116 def test_from_index (self ):
79117 b = self .type2test ([Indexable (), Indexable (1 ), Indexable (254 ),
@@ -85,6 +123,8 @@ def test_from_index(self):
85123 def test_from_buffer (self ):
86124 a = self .type2test (array .array ('B' , [1 , 2 , 3 ]))
87125 self .assertEqual (a , b"\x01 \x02 \x03 " )
126+ a = self .type2test (b"\x01 \x02 \x03 " )
127+ self .assertEqual (a , b"\x01 \x02 \x03 " )
88128
89129 # http://bugs.python.org/issue29159
90130 # Fallback when __index__ raises exception other than OverflowError
0 commit comments