1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
from test.test_support import *
t = (1, 2, 3)
l = [4, 5, 6]
class Seq:
def __getitem__(self, i):
if i >= 0 and i < 3: return i
raise IndexError
a = -1
b = -1
c = -1
# unpack tuple
if verbose:
print 'unpack tuple'
a, b, c = t
if a != 1 or b != 2 or c != 3:
raise TestFailed
# unpack list
if verbose:
print 'unpack list'
a, b, c = l
if a != 4 or b != 5 or c != 6:
raise TestFailed
# unpack implied tuple
if verbose:
print 'unpack implied tuple'
a, b, c = 7, 8, 9
if a != 7 or b != 8 or c != 9:
raise TestFailed
# unpack string... fun!
if verbose:
print 'unpack string'
a, b, c = 'one'
if a != 'o' or b != 'n' or c != 'e':
raise TestFailed
# unpack generic sequence
if verbose:
print 'unpack sequence'
a, b, c = Seq()
if a != 0 or b != 1 or c != 2:
raise TestFailed
# single element unpacking, with extra syntax
if verbose:
print 'unpack single tuple/list'
st = (99,)
sl = [100]
a, = st
if a != 99:
raise TestFailed
b, = sl
if b != 100:
raise TestFailed
# now for some failures
# unpacking non-sequence
if verbose:
print 'unpack non-sequence'
try:
a, b, c = 7
raise TestFailed
except TypeError:
pass
# unpacking tuple of wrong size
if verbose:
print 'unpack tuple wrong size'
try:
a, b = t
raise TestFailed
except ValueError:
pass
# unpacking list of wrong size
if verbose:
print 'unpack list wrong size'
try:
a, b = l
raise TestFailed
except ValueError:
pass
# unpacking sequence too short
if verbose:
print 'unpack sequence too short'
try:
a, b, c, d = Seq()
raise TestFailed
except ValueError:
pass
# unpacking sequence too long
if verbose:
print 'unpack sequence too long'
try:
a, b = Seq()
raise TestFailed
except ValueError:
pass
# unpacking a sequence where the test for too long raises a different
# kind of error
class BozoError(Exception):
pass
class BadSeq:
def __getitem__(self, i):
if i >= 0 and i < 3:
return i
elif i == 3:
raise BozoError
else:
raise IndexError
# trigger code while not expecting an IndexError
if verbose:
print 'unpack sequence too long, wrong error'
try:
a, b, c, d, e = BadSeq()
raise TestFailed
except BozoError:
pass
# trigger code while expecting an IndexError
if verbose:
print 'unpack sequence too short, wrong error'
try:
a, b, c = BadSeq()
raise TestFailed
except BozoError:
pass
|