from test_support import TestFailed, verbose
import struct
## import pdb

def simple_err(func, *args):
    try:
	apply(func, args)
    except struct.error:
	pass
    else:
	raise TestFailed, "%s%s did not raise struct.error" % (
	    func.__name__, args)
## 	pdb.set_trace()

simple_err(struct.calcsize, 'Q')

sz = struct.calcsize('i')
if sz * 3 <> struct.calcsize('iii'):
    raise TestFailed, 'inconsistent sizes'

sz = struct.calcsize('cbhilfd')
if sz * 3 <> struct.calcsize('3c3b3h3i3l3f3d'):
    raise TestFailed, '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

for format in ('xcbhilfd', 'xcBHILfd', '@xsbhilfd'):
    s = struct.pack(format, c, b, h, i, l, f, d)
    cp, bp, hp, ip, lp, fp, dp = struct.unpack(format, 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
	raise TestFailed, "unpack/pack not transitive (%s, %s)" % (
	    str(format), str((cp, bp, hp, ip, lp, fp, dp)))

# Test some of the new features

# (format, argument, big-endian result, little-endian result, asymmetric)
tests = [
    ('c', 'a', 'a', 'a', 0),
    ('xc', 'a', '\0a', '\0a', 0),
    ('cx', 'a', 'a\0', 'a\0', 0),
    ('s', 'a', 'a', 'a', 0),
    ('0s', 'helloworld', '', '', 1),
    ('1s', 'helloworld', 'h', 'h', 1),
    ('9s', 'helloworld', 'helloworl', 'helloworl', 1),
    ('10s', 'helloworld', 'helloworld', 'helloworld', 0),
    ('11s', 'helloworld', 'helloworld\0', 'helloworld\0', 1),
    ('20s', 'helloworld', 'helloworld'+10*'\0', 'helloworld'+10*'\0', 1),
    ('b', 7, '\7', '\7', 0),
    ('b', -7, '\371', '\371', 0),
    ('B', 7, '\7', '\7', 0),
    ('B', 249, '\371', '\371', 0),
    ('h', 700, '\002\274', '\274\002', 0),
    ('h', -700, '\375D', 'D\375', 0),
    ('H', 700, '\002\274', '\274\002', 0),
    ('H', 0x10000-700, '\375D', 'D\375', 0),
    ('i', 70000000, '\004,\035\200', '\200\035,\004', 0),
    ('i', -70000000, '\373\323\342\200', '\200\342\323\373', 0),
    ('I', 70000000L, '\004,\035\200', '\200\035,\004', 0),
    ('I', 0x100000000L-70000000, '\373\323\342\200', '\200\342\323\373', 0),
    ('l', 70000000, '\004,\035\200', '\200\035,\004', 0),
    ('l', -70000000, '\373\323\342\200', '\200\342\323\373', 0),
    ('L', 70000000L, '\004,\035\200', '\200\035,\004', 0),
    ('L', 0x100000000L-70000000, '\373\323\342\200', '\200\342\323\373', 0),
]

def badpack(fmt, arg, got, exp):
    return 

def badunpack(fmt, arg, got, exp):
    return "unpack(%s, %s) -> (%s,) # expected (%s,)" % (
	`fmt`, `arg`, `got`, `exp`)

isbigendian = struct.pack('=h', 1) == '\0\1'

for fmt, arg, big, lil, asy in tests:
    if verbose:
	print `fmt`, `arg`, `big`, `lil`
    for (xfmt, exp) in [('>'+fmt, big), ('!'+fmt, big), ('<'+fmt, lil),
			('='+fmt, isbigendian and big or lil)]:
	res = struct.pack(xfmt, arg)
	if res != exp:
	    raise TestFailed, "pack(%s, %s) -> %s # expected %s" % (
		`fmt`, `arg`, `res`, `exp`)
	n = struct.calcsize(xfmt)
	if n != len(res):
	    raise TestFailed, "calcsize(%s) -> %d # expected %d" % (
		`xfmt`, n, len(res))
	rev = struct.unpack(xfmt, res)[0]
	if rev != arg and not asy:
	    raise TestFailed, "unpack(%s, %s) -> (%s,) # expected (%s,)" % (
		`fmt`, `res`, `rev`, `arg`)
