4
4
the latter should be modernized).
5
5
"""
6
6
7
+ import array
7
8
import os
8
9
import re
9
10
import sys
@@ -58,11 +59,49 @@ def test_empty_sequence(self):
58
59
self .assertRaises (IndexError , lambda : b [- sys .maxint - 2 ])
59
60
self .assertRaises (IndexError , lambda : b [- 10 ** 100 ])
60
61
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
+
61
98
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 )) )
64
101
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 " )
66
105
67
106
def test_from_index (self ):
68
107
b = self .type2test ([Indexable (), Indexable (1 ), Indexable (254 ),
@@ -71,6 +110,20 @@ def test_from_index(self):
71
110
self .assertRaises (ValueError , self .type2test , [Indexable (- 1 )])
72
111
self .assertRaises (ValueError , self .type2test , [Indexable (256 )])
73
112
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
+
74
127
def test_from_ssize (self ):
75
128
self .assertEqual (self .type2test (0 ), b'' )
76
129
self .assertEqual (self .type2test (1 ), b'\x00 ' )
0 commit comments