import zlib
from test_support import TestFailed
import sys
import imp

try:
    t = imp.find_module('test_zlib')
    file = t[0]
except ImportError:
    file = open(__file__)
buf = file.read() * 8
file.close()

# test the checksums (hex so the test doesn't break on 64-bit machines)
print hex(zlib.crc32('penguin')), hex(zlib.crc32('penguin', 1))
print hex(zlib.adler32('penguin')), hex(zlib.adler32('penguin', 1))

# make sure we generate some expected errors
try:
    zlib.compress('ERROR', zlib.MAX_WBITS + 1)
except zlib.error, msg:
    print "expecting", msg
try:
    zlib.compressobj(1, 8, 0)
except ValueError, msg:
    print "expecting", msg
try:
    zlib.decompressobj(0)
except ValueError, msg:
    print "expecting", msg

x = zlib.compress(buf)
y = zlib.decompress(x)
if buf != y:
    print "normal compression/decompression failed"
else:
    print "normal compression/decompression succeeded"

buf = buf * 16

co = zlib.compressobj(8, 8, -15)
x1 = co.compress(buf)
x2 = co.flush()
x = x1 + x2

dc = zlib.decompressobj(-15)
y1 = dc.decompress(x)
y2 = dc.flush()
y = y1 + y2
if buf != y:
    print "compress/decompression obj failed"
else:
    print "compress/decompression obj succeeded"

co = zlib.compressobj(2, 8, -12, 9, 1)
bufs = []
for i in range(0, len(buf), 256):
    bufs.append(co.compress(buf[i:i+256]))
bufs.append(co.flush())
combuf = ''.join(bufs)

decomp1 = zlib.decompress(combuf, -12, -5)
if decomp1 != buf:
    print "decompress with init options failed"
else:
    print "decompress with init options succeeded"

deco = zlib.decompressobj(-12)
bufs = []
for i in range(0, len(combuf), 128):
    bufs.append(deco.decompress(combuf[i:i+128]))
bufs.append(deco.flush())
decomp2 = ''.join(bufs)
if decomp2 != buf:
    print "decompressobj with init options failed"
else:
    print "decompressobj with init options succeeded"

# Test flush() with the various options, using all the different levels
# in order to provide more variations.
for sync in [zlib.Z_NO_FLUSH, zlib.Z_SYNC_FLUSH, zlib.Z_FULL_FLUSH]:
    for level in range(10):
        obj = zlib.compressobj( level )
        d = obj.compress( buf[:3000] )
        d = d + obj.flush( sync )
        d = d + obj.compress( buf[3000:] )
        d = d + obj.flush()
        if zlib.decompress(d) != buf:
            print "Decompress failed: flush mode=%i, level=%i" % (sync,level)
        del obj

# Test for the odd flushing bugs noted in 2.0, and hopefully fixed in 2.1

import random
random.seed(1)

print 'Testing on 17K of random data'

# Create compressor and decompressor objects
c=zlib.compressobj(9)
d=zlib.decompressobj()

# Try 17K of data
# generate random data stream
a=""
for i in range(17*1024):
    a=a+chr(random.randint(0,255))

# compress, sync-flush, and decompress
t = d.decompress( c.compress(a)+c.flush(zlib.Z_SYNC_FLUSH) )

# if decompressed data is different from the input data, choke.
if len(t) != len(a):
    print len(a),len(t),len(d.unused_data)
    raise TestFailed, "output of 17K doesn't match"

def ignore():
    """An empty function with a big string.

    Make the compression algorithm work a little harder.
    """

    """
LAERTES

       O, fear me not.
       I stay too long: but here my father comes.

       Enter POLONIUS

       A double blessing is a double grace,
       Occasion smiles upon a second leave.

LORD POLONIUS

       Yet here, Laertes! aboard, aboard, for shame!
       The wind sits in the shoulder of your sail,
       And you are stay'd for. There; my blessing with thee!
       And these few precepts in thy memory
       See thou character. Give thy thoughts no tongue,
       Nor any unproportioned thought his act.
       Be thou familiar, but by no means vulgar.
       Those friends thou hast, and their adoption tried,
       Grapple them to thy soul with hoops of steel;
       But do not dull thy palm with entertainment
       Of each new-hatch'd, unfledged comrade. Beware
       Of entrance to a quarrel, but being in,
       Bear't that the opposed may beware of thee.
       Give every man thy ear, but few thy voice;
       Take each man's censure, but reserve thy judgment.
       Costly thy habit as thy purse can buy,
       But not express'd in fancy; rich, not gaudy;
       For the apparel oft proclaims the man,
       And they in France of the best rank and station
       Are of a most select and generous chief in that.
       Neither a borrower nor a lender be;
       For loan oft loses both itself and friend,
       And borrowing dulls the edge of husbandry.
       This above all: to thine ownself be true,
       And it must follow, as the night the day,
       Thou canst not then be false to any man.
       Farewell: my blessing season this in thee!

LAERTES

       Most humbly do I take my leave, my lord.

LORD POLONIUS

       The time invites you; go; your servants tend.

LAERTES

       Farewell, Ophelia; and remember well
       What I have said to you.

OPHELIA

       'Tis in my memory lock'd,
       And you yourself shall keep the key of it.

LAERTES

       Farewell.
"""
