blob: 0c96842c77a7304f4e45f9fe36570f1bf100e1a2 [file] [log] [blame]
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001import unittest
2from test import test_support
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +00003import zlib
Gregory P. Smithc856fa82008-03-18 22:27:41 +00004import binascii
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00005import random
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00006
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00007
Guido van Rossum7d9ea502003-02-03 20:45:52 +00008class ChecksumTestCase(unittest.TestCase):
9 # checksum test cases
10 def test_crc32start(self):
11 self.assertEqual(zlib.crc32(""), zlib.crc32("", 0))
Andrew M. Kuchlingbb7e8002005-11-22 15:32:28 +000012 self.assert_(zlib.crc32("abc", 0xffffffff))
Andrew M. Kuchlingfcfc8d52001-08-10 15:50:11 +000013
Guido van Rossum7d9ea502003-02-03 20:45:52 +000014 def test_crc32empty(self):
15 self.assertEqual(zlib.crc32("", 0), 0)
16 self.assertEqual(zlib.crc32("", 1), 1)
17 self.assertEqual(zlib.crc32("", 432), 432)
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +000018
Guido van Rossum7d9ea502003-02-03 20:45:52 +000019 def test_adler32start(self):
20 self.assertEqual(zlib.adler32(""), zlib.adler32("", 1))
Andrew M. Kuchlingbb7e8002005-11-22 15:32:28 +000021 self.assert_(zlib.adler32("abc", 0xffffffff))
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000022
Guido van Rossum7d9ea502003-02-03 20:45:52 +000023 def test_adler32empty(self):
24 self.assertEqual(zlib.adler32("", 0), 0)
25 self.assertEqual(zlib.adler32("", 1), 1)
26 self.assertEqual(zlib.adler32("", 432), 432)
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000027
Guido van Rossum7d9ea502003-02-03 20:45:52 +000028 def assertEqual32(self, seen, expected):
29 # 32-bit values masked -- checksums on 32- vs 64- bit machines
30 # This is important if bit 31 (0x08000000L) is set.
31 self.assertEqual(seen & 0x0FFFFFFFFL, expected & 0x0FFFFFFFFL)
32
33 def test_penguins(self):
34 self.assertEqual32(zlib.crc32("penguin", 0), 0x0e5c1a120L)
35 self.assertEqual32(zlib.crc32("penguin", 1), 0x43b6aa94)
36 self.assertEqual32(zlib.adler32("penguin", 0), 0x0bcf02f6)
37 self.assertEqual32(zlib.adler32("penguin", 1), 0x0bd602f7)
38
39 self.assertEqual(zlib.crc32("penguin"), zlib.crc32("penguin", 0))
40 self.assertEqual(zlib.adler32("penguin"),zlib.adler32("penguin",1))
41
Gregory P. Smithf48f9d32008-03-17 18:48:05 +000042 def test_abcdefghijklmnop(self):
43 """test issue1202 compliance: signed crc32, adler32 in 2.x"""
44 foo = 'abcdefghijklmnop'
45 # explicitly test signed behavior
46 self.assertEqual(zlib.crc32(foo), -1808088941)
47 self.assertEqual(zlib.crc32('spam'), 1138425661)
48 self.assertEqual(zlib.adler32(foo+foo), -721416943)
49 self.assertEqual(zlib.adler32('spam'), 72286642)
50
Gregory P. Smithc856fa82008-03-18 22:27:41 +000051 def test_same_as_binascii_crc32(self):
52 foo = 'abcdefghijklmnop'
53 self.assertEqual(binascii.crc32(foo), zlib.crc32(foo))
54 self.assertEqual(binascii.crc32('spam'), zlib.crc32('spam'))
55
Gregory P. Smith88440962008-03-25 06:12:45 +000056 def test_negative_crc_iv_input(self):
57 # The range of valid input values for the crc state should be
58 # -2**31 through 2**32-1 to allow inputs artifically constrained
59 # to a signed 32-bit integer.
60 self.assertEqual(zlib.crc32('ham', -1), zlib.crc32('ham', 0xffffffffL))
61 self.assertEqual(zlib.crc32('spam', -3141593),
62 zlib.crc32('spam', 0xffd01027L))
63 self.assertEqual(zlib.crc32('spam', -(2**31)),
64 zlib.crc32('spam', (2**31)))
Guido van Rossum7d9ea502003-02-03 20:45:52 +000065
66
67class ExceptionTestCase(unittest.TestCase):
68 # make sure we generate some expected errors
Armin Rigoec560192007-10-15 07:48:35 +000069 def test_badlevel(self):
70 # specifying compression level out of range causes an error
71 # (but -1 is Z_DEFAULT_COMPRESSION and apparently the zlib
72 # accepts 0 too)
73 self.assertRaises(zlib.error, zlib.compress, 'ERROR', 10)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000074
75 def test_badcompressobj(self):
76 # verify failure on building compress object with bad params
Neil Schemenauer94afd3e2004-06-05 19:02:52 +000077 self.assertRaises(ValueError, zlib.compressobj, 1, zlib.DEFLATED, 0)
Armin Rigoec560192007-10-15 07:48:35 +000078 # specifying total bits too large causes an error
79 self.assertRaises(ValueError,
80 zlib.compressobj, 1, zlib.DEFLATED, zlib.MAX_WBITS + 1)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000081
82 def test_baddecompressobj(self):
83 # verify failure on building decompress object with bad params
84 self.assertRaises(ValueError, zlib.decompressobj, 0)
85
86
87
88class CompressTestCase(unittest.TestCase):
89 # Test compression in one go (whole message compression)
90 def test_speech(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000091 x = zlib.compress(HAMLET_SCENE)
92 self.assertEqual(zlib.decompress(x), HAMLET_SCENE)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000093
94 def test_speech128(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000095 # compress more data
96 data = HAMLET_SCENE * 128
Guido van Rossum7d9ea502003-02-03 20:45:52 +000097 x = zlib.compress(data)
98 self.assertEqual(zlib.decompress(x), data)
99
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000100
101
102
103class CompressObjectTestCase(unittest.TestCase):
104 # Test compression object
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000105 def test_pair(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +0000106 # straightforward compress/decompress objects
107 data = HAMLET_SCENE * 128
108 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000109 x1 = co.compress(data)
110 x2 = co.flush()
111 self.assertRaises(zlib.error, co.flush) # second flush should not work
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000112 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000113 y1 = dco.decompress(x1 + x2)
114 y2 = dco.flush()
115 self.assertEqual(data, y1 + y2)
116
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000117 def test_compressoptions(self):
118 # specify lots of options to compressobj()
119 level = 2
120 method = zlib.DEFLATED
121 wbits = -12
122 memlevel = 9
123 strategy = zlib.Z_FILTERED
124 co = zlib.compressobj(level, method, wbits, memlevel, strategy)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000125 x1 = co.compress(HAMLET_SCENE)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000126 x2 = co.flush()
127 dco = zlib.decompressobj(wbits)
128 y1 = dco.decompress(x1 + x2)
129 y2 = dco.flush()
Neil Schemenauer6412b122004-06-05 19:34:28 +0000130 self.assertEqual(HAMLET_SCENE, y1 + y2)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000131
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000132 def test_compressincremental(self):
133 # compress object in steps, decompress object as one-shot
Neil Schemenauer6412b122004-06-05 19:34:28 +0000134 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000135 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000136 bufs = []
137 for i in range(0, len(data), 256):
138 bufs.append(co.compress(data[i:i+256]))
139 bufs.append(co.flush())
140 combuf = ''.join(bufs)
141
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000142 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000143 y1 = dco.decompress(''.join(bufs))
144 y2 = dco.flush()
145 self.assertEqual(data, y1 + y2)
146
Neil Schemenauer6412b122004-06-05 19:34:28 +0000147 def test_decompinc(self, flush=False, source=None, cx=256, dcx=64):
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000148 # compress object in steps, decompress object in steps
Neil Schemenauer6412b122004-06-05 19:34:28 +0000149 source = source or HAMLET_SCENE
150 data = source * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000151 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000152 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000153 for i in range(0, len(data), cx):
154 bufs.append(co.compress(data[i:i+cx]))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000155 bufs.append(co.flush())
156 combuf = ''.join(bufs)
157
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000158 self.assertEqual(data, zlib.decompress(combuf))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000159
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000160 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000161 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000162 for i in range(0, len(combuf), dcx):
163 bufs.append(dco.decompress(combuf[i:i+dcx]))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000164 self.assertEqual('', dco.unconsumed_tail, ########
165 "(A) uct should be '': not %d long" %
Neil Schemenauer6412b122004-06-05 19:34:28 +0000166 len(dco.unconsumed_tail))
167 if flush:
168 bufs.append(dco.flush())
169 else:
170 while True:
171 chunk = dco.decompress('')
172 if chunk:
173 bufs.append(chunk)
174 else:
175 break
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000176 self.assertEqual('', dco.unconsumed_tail, ########
Neil Schemenauer6412b122004-06-05 19:34:28 +0000177 "(B) uct should be '': not %d long" %
178 len(dco.unconsumed_tail))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000179 self.assertEqual(data, ''.join(bufs))
180 # Failure means: "decompressobj with init options failed"
181
Neil Schemenauer6412b122004-06-05 19:34:28 +0000182 def test_decompincflush(self):
183 self.test_decompinc(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000184
Neil Schemenauer6412b122004-06-05 19:34:28 +0000185 def test_decompimax(self, source=None, cx=256, dcx=64):
186 # compress in steps, decompress in length-restricted steps
187 source = source or HAMLET_SCENE
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000188 # Check a decompression object with max_length specified
Neil Schemenauer6412b122004-06-05 19:34:28 +0000189 data = source * 128
190 co = zlib.compressobj()
191 bufs = []
192 for i in range(0, len(data), cx):
193 bufs.append(co.compress(data[i:i+cx]))
194 bufs.append(co.flush())
195 combuf = ''.join(bufs)
196 self.assertEqual(data, zlib.decompress(combuf),
197 'compressed data failure')
198
199 dco = zlib.decompressobj()
200 bufs = []
201 cb = combuf
202 while cb:
203 #max_length = 1 + len(cb)//10
204 chunk = dco.decompress(cb, dcx)
205 self.failIf(len(chunk) > dcx,
206 'chunk too big (%d>%d)' % (len(chunk), dcx))
207 bufs.append(chunk)
208 cb = dco.unconsumed_tail
209 bufs.append(dco.flush())
210 self.assertEqual(data, ''.join(bufs), 'Wrong data retrieved')
211
212 def test_decompressmaxlen(self, flush=False):
213 # Check a decompression object with max_length specified
214 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000215 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000216 bufs = []
217 for i in range(0, len(data), 256):
218 bufs.append(co.compress(data[i:i+256]))
219 bufs.append(co.flush())
220 combuf = ''.join(bufs)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000221 self.assertEqual(data, zlib.decompress(combuf),
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000222 'compressed data failure')
223
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000224 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000225 bufs = []
226 cb = combuf
227 while cb:
Guido van Rossumf3594102003-02-27 18:39:18 +0000228 max_length = 1 + len(cb)//10
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000229 chunk = dco.decompress(cb, max_length)
230 self.failIf(len(chunk) > max_length,
231 'chunk too big (%d>%d)' % (len(chunk),max_length))
232 bufs.append(chunk)
233 cb = dco.unconsumed_tail
Neil Schemenauer6412b122004-06-05 19:34:28 +0000234 if flush:
235 bufs.append(dco.flush())
236 else:
237 while chunk:
238 chunk = dco.decompress('', max_length)
239 self.failIf(len(chunk) > max_length,
240 'chunk too big (%d>%d)' % (len(chunk),max_length))
241 bufs.append(chunk)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000242 self.assertEqual(data, ''.join(bufs), 'Wrong data retrieved')
243
Neil Schemenauer6412b122004-06-05 19:34:28 +0000244 def test_decompressmaxlenflush(self):
245 self.test_decompressmaxlen(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000246
247 def test_maxlenmisc(self):
248 # Misc tests of max_length
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000249 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000250 self.assertRaises(ValueError, dco.decompress, "", -1)
251 self.assertEqual('', dco.unconsumed_tail)
252
253 def test_flushes(self):
254 # Test flush() with the various options, using all the
255 # different levels in order to provide more variations.
256 sync_opt = ['Z_NO_FLUSH', 'Z_SYNC_FLUSH', 'Z_FULL_FLUSH']
257 sync_opt = [getattr(zlib, opt) for opt in sync_opt
258 if hasattr(zlib, opt)]
Neil Schemenauer6412b122004-06-05 19:34:28 +0000259 data = HAMLET_SCENE * 8
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000260
261 for sync in sync_opt:
262 for level in range(10):
263 obj = zlib.compressobj( level )
264 a = obj.compress( data[:3000] )
265 b = obj.flush( sync )
266 c = obj.compress( data[3000:] )
267 d = obj.flush()
268 self.assertEqual(zlib.decompress(''.join([a,b,c,d])),
269 data, ("Decompress failed: flush "
270 "mode=%i, level=%i") % (sync, level))
271 del obj
272
273 def test_odd_flush(self):
274 # Test for odd flushing bugs noted in 2.0, and hopefully fixed in 2.1
275 import random
276
277 if hasattr(zlib, 'Z_SYNC_FLUSH'):
278 # Testing on 17K of "random" data
279
280 # Create compressor and decompressor objects
Neil Schemenauer6412b122004-06-05 19:34:28 +0000281 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000282 dco = zlib.decompressobj()
283
284 # Try 17K of data
285 # generate random data stream
286 try:
287 # In 2.3 and later, WichmannHill is the RNG of the bug report
288 gen = random.WichmannHill()
289 except AttributeError:
290 try:
291 # 2.2 called it Random
292 gen = random.Random()
293 except AttributeError:
294 # others might simply have a single RNG
295 gen = random
296 gen.seed(1)
297 data = genblock(1, 17 * 1024, generator=gen)
298
299 # compress, sync-flush, and decompress
300 first = co.compress(data)
301 second = co.flush(zlib.Z_SYNC_FLUSH)
302 expanded = dco.decompress(first + second)
303
304 # if decompressed data is different from the input data, choke.
305 self.assertEqual(expanded, data, "17K random source doesn't match")
306
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000307 def test_empty_flush(self):
308 # Test that calling .flush() on unused objects works.
309 # (Bug #1083110 -- calling .flush() on decompress objects
310 # caused a core dump.)
311
312 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
313 self.failUnless(co.flush()) # Returns a zlib header
314 dco = zlib.decompressobj()
315 self.assertEqual(dco.flush(), "") # Returns nothing
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000316
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000317 if hasattr(zlib.compressobj(), "copy"):
318 def test_compresscopy(self):
319 # Test copying a compression object
320 data0 = HAMLET_SCENE
321 data1 = HAMLET_SCENE.swapcase()
322 c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
323 bufs0 = []
324 bufs0.append(c0.compress(data0))
Georg Brandl8d3342b2006-05-16 07:38:27 +0000325
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000326 c1 = c0.copy()
327 bufs1 = bufs0[:]
Georg Brandl8d3342b2006-05-16 07:38:27 +0000328
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000329 bufs0.append(c0.compress(data0))
330 bufs0.append(c0.flush())
331 s0 = ''.join(bufs0)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000332
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000333 bufs1.append(c1.compress(data1))
334 bufs1.append(c1.flush())
335 s1 = ''.join(bufs1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000336
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000337 self.assertEqual(zlib.decompress(s0),data0+data0)
338 self.assertEqual(zlib.decompress(s1),data0+data1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000339
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000340 def test_badcompresscopy(self):
341 # Test copying a compression object in an inconsistent state
342 c = zlib.compressobj()
343 c.compress(HAMLET_SCENE)
344 c.flush()
345 self.assertRaises(ValueError, c.copy)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000346
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000347 if hasattr(zlib.decompressobj(), "copy"):
348 def test_decompresscopy(self):
349 # Test copying a decompression object
350 data = HAMLET_SCENE
351 comp = zlib.compress(data)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000352
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000353 d0 = zlib.decompressobj()
354 bufs0 = []
355 bufs0.append(d0.decompress(comp[:32]))
Georg Brandl8d3342b2006-05-16 07:38:27 +0000356
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000357 d1 = d0.copy()
358 bufs1 = bufs0[:]
Georg Brandl8d3342b2006-05-16 07:38:27 +0000359
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000360 bufs0.append(d0.decompress(comp[32:]))
361 s0 = ''.join(bufs0)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000362
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000363 bufs1.append(d1.decompress(comp[32:]))
364 s1 = ''.join(bufs1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000365
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000366 self.assertEqual(s0,s1)
367 self.assertEqual(s0,data)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000368
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000369 def test_baddecompresscopy(self):
370 # Test copying a compression object in an inconsistent state
371 data = zlib.compress(HAMLET_SCENE)
372 d = zlib.decompressobj()
373 d.decompress(data)
374 d.flush()
375 self.assertRaises(ValueError, d.copy)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000376
377def genblock(seed, length, step=1024, generator=random):
378 """length-byte stream of random data from a seed (in step-byte blocks)."""
379 if seed is not None:
380 generator.seed(seed)
381 randint = generator.randint
382 if length < step or step < 2:
383 step = length
384 blocks = []
385 for i in range(0, length, step):
386 blocks.append(''.join([chr(randint(0,255))
387 for x in range(step)]))
388 return ''.join(blocks)[:length]
389
390
391
392def choose_lines(source, number, seed=None, generator=random):
393 """Return a list of number lines randomly chosen from the source"""
394 if seed is not None:
395 generator.seed(seed)
396 sources = source.split('\n')
397 return [generator.choice(sources) for n in range(number)]
398
399
400
Neil Schemenauer6412b122004-06-05 19:34:28 +0000401HAMLET_SCENE = """
Fred Drake004d5e62000-10-23 17:22:08 +0000402LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000403
404 O, fear me not.
405 I stay too long: but here my father comes.
406
407 Enter POLONIUS
408
409 A double blessing is a double grace,
410 Occasion smiles upon a second leave.
411
Fred Drake004d5e62000-10-23 17:22:08 +0000412LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000413
414 Yet here, Laertes! aboard, aboard, for shame!
415 The wind sits in the shoulder of your sail,
416 And you are stay'd for. There; my blessing with thee!
417 And these few precepts in thy memory
418 See thou character. Give thy thoughts no tongue,
419 Nor any unproportioned thought his act.
420 Be thou familiar, but by no means vulgar.
421 Those friends thou hast, and their adoption tried,
422 Grapple them to thy soul with hoops of steel;
423 But do not dull thy palm with entertainment
424 Of each new-hatch'd, unfledged comrade. Beware
425 Of entrance to a quarrel, but being in,
426 Bear't that the opposed may beware of thee.
427 Give every man thy ear, but few thy voice;
428 Take each man's censure, but reserve thy judgment.
429 Costly thy habit as thy purse can buy,
430 But not express'd in fancy; rich, not gaudy;
431 For the apparel oft proclaims the man,
432 And they in France of the best rank and station
433 Are of a most select and generous chief in that.
434 Neither a borrower nor a lender be;
435 For loan oft loses both itself and friend,
436 And borrowing dulls the edge of husbandry.
437 This above all: to thine ownself be true,
438 And it must follow, as the night the day,
439 Thou canst not then be false to any man.
440 Farewell: my blessing season this in thee!
441
Fred Drake004d5e62000-10-23 17:22:08 +0000442LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000443
444 Most humbly do I take my leave, my lord.
445
Fred Drake004d5e62000-10-23 17:22:08 +0000446LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000447
448 The time invites you; go; your servants tend.
449
Fred Drake004d5e62000-10-23 17:22:08 +0000450LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000451
452 Farewell, Ophelia; and remember well
453 What I have said to you.
454
Fred Drake004d5e62000-10-23 17:22:08 +0000455OPHELIA
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000456
457 'Tis in my memory lock'd,
458 And you yourself shall keep the key of it.
459
Fred Drake004d5e62000-10-23 17:22:08 +0000460LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000461
462 Farewell.
463"""
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000464
465
466def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000467 test_support.run_unittest(
468 ChecksumTestCase,
469 ExceptionTestCase,
470 CompressTestCase,
471 CompressObjectTestCase
472 )
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000473
474if __name__ == "__main__":
475 test_main()