import struct ## import pdb def simple_err(func, *args): try: apply(func, args) except struct.error: pass else: print 'expected struct.error not caught' ## pdb.set_trace() simple_err(struct.calcsize, 'Q') sz = struct.calcsize('i') if sz * 3 <> struct.calcsize('iii'): print 'inconsistent sizes' sz = struct.calcsize('cbhilfd') if sz * 3 <> struct.calcsize('3c3b3h3i3l3f3d'): print 'inconsistent sizes' simple_err(struct.pack, 'iii', 3) simple_err(struct.pack, 'i', 3, 3, 3) simple_err(struct.pack, 'i', 'foo') simple_err(struct.unpack, 'd', 'flap') s = struct.pack('ii', 1, 2) simple_err(struct.unpack, 'iii', s) simple_err(struct.unpack, 'i', s) c = 'a' b = -1 h = 255 i = 65535 l = 65536 f = 3.1415 d = 3.1415 s = struct.pack('xcbhilfd', c, b, h, i, l, f, d) cp, bp, hp, ip, lp, fp, dp = struct.unpack('xcbhilfd', s) if cp <> c or bp <> b or hp <> h or ip <> i or lp <> l or \ int(100 * fp) <> int(100 * f) or int(100 * dp) <> int(100 * d): # ^^^ calculate only to two decimal places print 'unpack/pack not transitive'