| from test.test_support import TestFailed, verbose | 
 |  | 
 | 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 |