blob: 6b7d4a6eb067e0a2fa6df95c7ad937dbfd9b9aaa [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
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00004import random
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00005
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00006
Guido van Rossum7d9ea502003-02-03 20:45:52 +00007class ChecksumTestCase(unittest.TestCase):
8 # checksum test cases
9 def test_crc32start(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000010 self.assertEqual(zlib.crc32(b""), zlib.crc32(b"", 0))
11 self.assert_(zlib.crc32(b"abc", 0xffffffff))
Andrew M. Kuchlingfcfc8d52001-08-10 15:50:11 +000012
Guido van Rossum7d9ea502003-02-03 20:45:52 +000013 def test_crc32empty(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000014 self.assertEqual(zlib.crc32(b"", 0), 0)
15 self.assertEqual(zlib.crc32(b"", 1), 1)
16 self.assertEqual(zlib.crc32(b"", 432), 432)
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +000017
Guido van Rossum7d9ea502003-02-03 20:45:52 +000018 def test_adler32start(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000019 self.assertEqual(zlib.adler32(b""), zlib.adler32(b"", 1))
20 self.assert_(zlib.adler32(b"abc", 0xffffffff))
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000021
Guido van Rossum7d9ea502003-02-03 20:45:52 +000022 def test_adler32empty(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000023 self.assertEqual(zlib.adler32(b"", 0), 0)
24 self.assertEqual(zlib.adler32(b"", 1), 1)
25 self.assertEqual(zlib.adler32(b"", 432), 432)
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000026
Guido van Rossum7d9ea502003-02-03 20:45:52 +000027 def assertEqual32(self, seen, expected):
28 # 32-bit values masked -- checksums on 32- vs 64- bit machines
29 # This is important if bit 31 (0x08000000L) is set.
Guido van Rossume2a383d2007-01-15 16:59:06 +000030 self.assertEqual(seen & 0x0FFFFFFFF, expected & 0x0FFFFFFFF)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000031
32 def test_penguins(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000033 self.assertEqual32(zlib.crc32(b"penguin", 0), 0x0e5c1a120)
34 self.assertEqual32(zlib.crc32(b"penguin", 1), 0x43b6aa94)
35 self.assertEqual32(zlib.adler32(b"penguin", 0), 0x0bcf02f6)
36 self.assertEqual32(zlib.adler32(b"penguin", 1), 0x0bd602f7)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000037
Guido van Rossum776152b2007-05-22 22:44:07 +000038 self.assertEqual(zlib.crc32(b"penguin"), zlib.crc32(b"penguin", 0))
39 self.assertEqual(zlib.adler32(b"penguin"),zlib.adler32(b"penguin",1))
Guido van Rossum7d9ea502003-02-03 20:45:52 +000040
Gregory P. Smithab0d8a12008-03-17 20:24:09 +000041 def test_crc32_adler32_unsigned(self):
42 foo = 'abcdefghijklmnop'
43 # explicitly test signed behavior
44 self.assertEqual(zlib.crc32(foo), 2486878355)
45 self.assertEqual(zlib.crc32('spam'), 1138425661)
46 self.assertEqual(zlib.adler32(foo+foo), 3573550353)
47 self.assertEqual(zlib.adler32('spam'), 72286642)
48
Guido van Rossum7d9ea502003-02-03 20:45:52 +000049
50
51class ExceptionTestCase(unittest.TestCase):
52 # make sure we generate some expected errors
Guido van Rossum8ce8a782007-11-01 19:42:39 +000053 def test_badlevel(self):
54 # specifying compression level out of range causes an error
55 # (but -1 is Z_DEFAULT_COMPRESSION and apparently the zlib
56 # accepts 0 too)
57 self.assertRaises(zlib.error, zlib.compress, 'ERROR', 10)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000058
59 def test_badcompressobj(self):
60 # verify failure on building compress object with bad params
Neil Schemenauer94afd3e2004-06-05 19:02:52 +000061 self.assertRaises(ValueError, zlib.compressobj, 1, zlib.DEFLATED, 0)
Guido van Rossum8ce8a782007-11-01 19:42:39 +000062 # specifying total bits too large causes an error
63 self.assertRaises(ValueError,
64 zlib.compressobj, 1, zlib.DEFLATED, zlib.MAX_WBITS + 1)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000065
66 def test_baddecompressobj(self):
67 # verify failure on building decompress object with bad params
68 self.assertRaises(ValueError, zlib.decompressobj, 0)
69
70
71
72class CompressTestCase(unittest.TestCase):
73 # Test compression in one go (whole message compression)
74 def test_speech(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000075 x = zlib.compress(HAMLET_SCENE)
76 self.assertEqual(zlib.decompress(x), HAMLET_SCENE)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000077
78 def test_speech128(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000079 # compress more data
80 data = HAMLET_SCENE * 128
Guido van Rossum7d9ea502003-02-03 20:45:52 +000081 x = zlib.compress(data)
82 self.assertEqual(zlib.decompress(x), data)
83
Guido van Rossum7d9ea502003-02-03 20:45:52 +000084
85
86
87class CompressObjectTestCase(unittest.TestCase):
88 # Test compression object
Guido van Rossum7d9ea502003-02-03 20:45:52 +000089 def test_pair(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000090 # straightforward compress/decompress objects
91 data = HAMLET_SCENE * 128
92 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +000093 x1 = co.compress(data)
94 x2 = co.flush()
95 self.assertRaises(zlib.error, co.flush) # second flush should not work
Neil Schemenauer94afd3e2004-06-05 19:02:52 +000096 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +000097 y1 = dco.decompress(x1 + x2)
98 y2 = dco.flush()
99 self.assertEqual(data, y1 + y2)
100
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000101 def test_compressoptions(self):
102 # specify lots of options to compressobj()
103 level = 2
104 method = zlib.DEFLATED
105 wbits = -12
106 memlevel = 9
107 strategy = zlib.Z_FILTERED
108 co = zlib.compressobj(level, method, wbits, memlevel, strategy)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000109 x1 = co.compress(HAMLET_SCENE)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000110 x2 = co.flush()
111 dco = zlib.decompressobj(wbits)
112 y1 = dco.decompress(x1 + x2)
113 y2 = dco.flush()
Neil Schemenauer6412b122004-06-05 19:34:28 +0000114 self.assertEqual(HAMLET_SCENE, y1 + y2)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000115
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000116 def test_compressincremental(self):
117 # compress object in steps, decompress object as one-shot
Neil Schemenauer6412b122004-06-05 19:34:28 +0000118 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000119 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000120 bufs = []
121 for i in range(0, len(data), 256):
122 bufs.append(co.compress(data[i:i+256]))
123 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000124 combuf = b''.join(bufs)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000125
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000126 dco = zlib.decompressobj()
Guido van Rossum776152b2007-05-22 22:44:07 +0000127 y1 = dco.decompress(b''.join(bufs))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000128 y2 = dco.flush()
129 self.assertEqual(data, y1 + y2)
130
Neil Schemenauer6412b122004-06-05 19:34:28 +0000131 def test_decompinc(self, flush=False, source=None, cx=256, dcx=64):
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000132 # compress object in steps, decompress object in steps
Neil Schemenauer6412b122004-06-05 19:34:28 +0000133 source = source or HAMLET_SCENE
134 data = source * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000135 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000136 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000137 for i in range(0, len(data), cx):
138 bufs.append(co.compress(data[i:i+cx]))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000139 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000140 combuf = b''.join(bufs)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000141
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000142 self.assertEqual(data, zlib.decompress(combuf))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000143
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000144 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000145 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000146 for i in range(0, len(combuf), dcx):
147 bufs.append(dco.decompress(combuf[i:i+dcx]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000148 self.assertEqual(b'', dco.unconsumed_tail, ########
149 "(A) uct should be b'': not %d long" %
Neil Schemenauer6412b122004-06-05 19:34:28 +0000150 len(dco.unconsumed_tail))
151 if flush:
152 bufs.append(dco.flush())
153 else:
154 while True:
155 chunk = dco.decompress('')
156 if chunk:
157 bufs.append(chunk)
158 else:
159 break
Guido van Rossum776152b2007-05-22 22:44:07 +0000160 self.assertEqual(b'', dco.unconsumed_tail, ########
161 "(B) uct should be b'': not %d long" %
Neil Schemenauer6412b122004-06-05 19:34:28 +0000162 len(dco.unconsumed_tail))
Guido van Rossum776152b2007-05-22 22:44:07 +0000163 self.assertEqual(data, b''.join(bufs))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000164 # Failure means: "decompressobj with init options failed"
165
Neil Schemenauer6412b122004-06-05 19:34:28 +0000166 def test_decompincflush(self):
167 self.test_decompinc(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000168
Neil Schemenauer6412b122004-06-05 19:34:28 +0000169 def test_decompimax(self, source=None, cx=256, dcx=64):
170 # compress in steps, decompress in length-restricted steps
171 source = source or HAMLET_SCENE
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000172 # Check a decompression object with max_length specified
Neil Schemenauer6412b122004-06-05 19:34:28 +0000173 data = source * 128
174 co = zlib.compressobj()
175 bufs = []
176 for i in range(0, len(data), cx):
177 bufs.append(co.compress(data[i:i+cx]))
178 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000179 combuf = b''.join(bufs)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000180 self.assertEqual(data, zlib.decompress(combuf),
181 'compressed data failure')
182
183 dco = zlib.decompressobj()
184 bufs = []
185 cb = combuf
186 while cb:
187 #max_length = 1 + len(cb)//10
188 chunk = dco.decompress(cb, dcx)
189 self.failIf(len(chunk) > dcx,
190 'chunk too big (%d>%d)' % (len(chunk), dcx))
191 bufs.append(chunk)
192 cb = dco.unconsumed_tail
193 bufs.append(dco.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000194 self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved')
Neil Schemenauer6412b122004-06-05 19:34:28 +0000195
196 def test_decompressmaxlen(self, flush=False):
197 # Check a decompression object with max_length specified
198 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000199 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000200 bufs = []
201 for i in range(0, len(data), 256):
202 bufs.append(co.compress(data[i:i+256]))
203 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000204 combuf = b''.join(bufs)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000205 self.assertEqual(data, zlib.decompress(combuf),
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000206 'compressed data failure')
207
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000208 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000209 bufs = []
210 cb = combuf
211 while cb:
Guido van Rossumf3594102003-02-27 18:39:18 +0000212 max_length = 1 + len(cb)//10
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000213 chunk = dco.decompress(cb, max_length)
214 self.failIf(len(chunk) > max_length,
215 'chunk too big (%d>%d)' % (len(chunk),max_length))
216 bufs.append(chunk)
217 cb = dco.unconsumed_tail
Neil Schemenauer6412b122004-06-05 19:34:28 +0000218 if flush:
219 bufs.append(dco.flush())
220 else:
221 while chunk:
222 chunk = dco.decompress('', max_length)
223 self.failIf(len(chunk) > max_length,
224 'chunk too big (%d>%d)' % (len(chunk),max_length))
225 bufs.append(chunk)
Guido van Rossum776152b2007-05-22 22:44:07 +0000226 self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved')
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000227
Neil Schemenauer6412b122004-06-05 19:34:28 +0000228 def test_decompressmaxlenflush(self):
229 self.test_decompressmaxlen(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000230
231 def test_maxlenmisc(self):
232 # Misc tests of max_length
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000233 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000234 self.assertRaises(ValueError, dco.decompress, "", -1)
Guido van Rossum776152b2007-05-22 22:44:07 +0000235 self.assertEqual(b'', dco.unconsumed_tail)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000236
237 def test_flushes(self):
238 # Test flush() with the various options, using all the
239 # different levels in order to provide more variations.
240 sync_opt = ['Z_NO_FLUSH', 'Z_SYNC_FLUSH', 'Z_FULL_FLUSH']
241 sync_opt = [getattr(zlib, opt) for opt in sync_opt
242 if hasattr(zlib, opt)]
Neil Schemenauer6412b122004-06-05 19:34:28 +0000243 data = HAMLET_SCENE * 8
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000244
245 for sync in sync_opt:
246 for level in range(10):
247 obj = zlib.compressobj( level )
248 a = obj.compress( data[:3000] )
249 b = obj.flush( sync )
250 c = obj.compress( data[3000:] )
251 d = obj.flush()
Guido van Rossum776152b2007-05-22 22:44:07 +0000252 self.assertEqual(zlib.decompress(b''.join([a,b,c,d])),
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000253 data, ("Decompress failed: flush "
254 "mode=%i, level=%i") % (sync, level))
255 del obj
256
257 def test_odd_flush(self):
258 # Test for odd flushing bugs noted in 2.0, and hopefully fixed in 2.1
259 import random
260
261 if hasattr(zlib, 'Z_SYNC_FLUSH'):
262 # Testing on 17K of "random" data
263
264 # Create compressor and decompressor objects
Neil Schemenauer6412b122004-06-05 19:34:28 +0000265 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000266 dco = zlib.decompressobj()
267
268 # Try 17K of data
269 # generate random data stream
270 try:
271 # In 2.3 and later, WichmannHill is the RNG of the bug report
272 gen = random.WichmannHill()
273 except AttributeError:
274 try:
275 # 2.2 called it Random
276 gen = random.Random()
277 except AttributeError:
278 # others might simply have a single RNG
279 gen = random
280 gen.seed(1)
281 data = genblock(1, 17 * 1024, generator=gen)
282
283 # compress, sync-flush, and decompress
284 first = co.compress(data)
285 second = co.flush(zlib.Z_SYNC_FLUSH)
286 expanded = dco.decompress(first + second)
287
288 # if decompressed data is different from the input data, choke.
289 self.assertEqual(expanded, data, "17K random source doesn't match")
290
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000291 def test_empty_flush(self):
292 # Test that calling .flush() on unused objects works.
293 # (Bug #1083110 -- calling .flush() on decompress objects
294 # caused a core dump.)
295
296 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
297 self.failUnless(co.flush()) # Returns a zlib header
298 dco = zlib.decompressobj()
Guido van Rossum776152b2007-05-22 22:44:07 +0000299 self.assertEqual(dco.flush(), b"") # Returns nothing
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000300
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000301 if hasattr(zlib.compressobj(), "copy"):
302 def test_compresscopy(self):
303 # Test copying a compression object
304 data0 = HAMLET_SCENE
Guido van Rossum776152b2007-05-22 22:44:07 +0000305 data1 = bytes(str(HAMLET_SCENE, "ascii").swapcase(), "ascii")
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000306 c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
307 bufs0 = []
308 bufs0.append(c0.compress(data0))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000309
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000310 c1 = c0.copy()
311 bufs1 = bufs0[:]
Thomas Wouters477c8d52006-05-27 19:21:47 +0000312
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000313 bufs0.append(c0.compress(data0))
314 bufs0.append(c0.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000315 s0 = b''.join(bufs0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000316
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000317 bufs1.append(c1.compress(data1))
318 bufs1.append(c1.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000319 s1 = b''.join(bufs1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000320
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000321 self.assertEqual(zlib.decompress(s0),data0+data0)
322 self.assertEqual(zlib.decompress(s1),data0+data1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000323
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000324 def test_badcompresscopy(self):
325 # Test copying a compression object in an inconsistent state
326 c = zlib.compressobj()
327 c.compress(HAMLET_SCENE)
328 c.flush()
329 self.assertRaises(ValueError, c.copy)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000330
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000331 if hasattr(zlib.decompressobj(), "copy"):
332 def test_decompresscopy(self):
333 # Test copying a decompression object
334 data = HAMLET_SCENE
335 comp = zlib.compress(data)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000336
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000337 d0 = zlib.decompressobj()
338 bufs0 = []
339 bufs0.append(d0.decompress(comp[:32]))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000340
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000341 d1 = d0.copy()
342 bufs1 = bufs0[:]
Thomas Wouters477c8d52006-05-27 19:21:47 +0000343
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000344 bufs0.append(d0.decompress(comp[32:]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000345 s0 = b''.join(bufs0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000346
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000347 bufs1.append(d1.decompress(comp[32:]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000348 s1 = b''.join(bufs1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000349
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000350 self.assertEqual(s0,s1)
351 self.assertEqual(s0,data)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000352
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000353 def test_baddecompresscopy(self):
354 # Test copying a compression object in an inconsistent state
355 data = zlib.compress(HAMLET_SCENE)
356 d = zlib.decompressobj()
357 d.decompress(data)
358 d.flush()
359 self.assertRaises(ValueError, d.copy)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000360
361def genblock(seed, length, step=1024, generator=random):
362 """length-byte stream of random data from a seed (in step-byte blocks)."""
363 if seed is not None:
364 generator.seed(seed)
365 randint = generator.randint
366 if length < step or step < 2:
367 step = length
Guido van Rossum776152b2007-05-22 22:44:07 +0000368 blocks = bytes()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000369 for i in range(0, length, step):
Guido van Rossum776152b2007-05-22 22:44:07 +0000370 blocks += bytes(randint(0, 255) for x in range(step))
371 return blocks
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000372
373
374
375def choose_lines(source, number, seed=None, generator=random):
376 """Return a list of number lines randomly chosen from the source"""
377 if seed is not None:
378 generator.seed(seed)
379 sources = source.split('\n')
380 return [generator.choice(sources) for n in range(number)]
381
382
383
Guido van Rossum776152b2007-05-22 22:44:07 +0000384HAMLET_SCENE = b"""
Fred Drake004d5e62000-10-23 17:22:08 +0000385LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000386
387 O, fear me not.
388 I stay too long: but here my father comes.
389
390 Enter POLONIUS
391
392 A double blessing is a double grace,
393 Occasion smiles upon a second leave.
394
Fred Drake004d5e62000-10-23 17:22:08 +0000395LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000396
397 Yet here, Laertes! aboard, aboard, for shame!
398 The wind sits in the shoulder of your sail,
399 And you are stay'd for. There; my blessing with thee!
400 And these few precepts in thy memory
401 See thou character. Give thy thoughts no tongue,
402 Nor any unproportioned thought his act.
403 Be thou familiar, but by no means vulgar.
404 Those friends thou hast, and their adoption tried,
405 Grapple them to thy soul with hoops of steel;
406 But do not dull thy palm with entertainment
407 Of each new-hatch'd, unfledged comrade. Beware
408 Of entrance to a quarrel, but being in,
409 Bear't that the opposed may beware of thee.
410 Give every man thy ear, but few thy voice;
411 Take each man's censure, but reserve thy judgment.
412 Costly thy habit as thy purse can buy,
413 But not express'd in fancy; rich, not gaudy;
414 For the apparel oft proclaims the man,
415 And they in France of the best rank and station
416 Are of a most select and generous chief in that.
417 Neither a borrower nor a lender be;
418 For loan oft loses both itself and friend,
419 And borrowing dulls the edge of husbandry.
420 This above all: to thine ownself be true,
421 And it must follow, as the night the day,
422 Thou canst not then be false to any man.
423 Farewell: my blessing season this in thee!
424
Fred Drake004d5e62000-10-23 17:22:08 +0000425LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000426
427 Most humbly do I take my leave, my lord.
428
Fred Drake004d5e62000-10-23 17:22:08 +0000429LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000430
431 The time invites you; go; your servants tend.
432
Fred Drake004d5e62000-10-23 17:22:08 +0000433LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000434
435 Farewell, Ophelia; and remember well
436 What I have said to you.
437
Fred Drake004d5e62000-10-23 17:22:08 +0000438OPHELIA
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000439
440 'Tis in my memory lock'd,
441 And you yourself shall keep the key of it.
442
Fred Drake004d5e62000-10-23 17:22:08 +0000443LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000444
445 Farewell.
446"""
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000447
448
449def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000450 test_support.run_unittest(
451 ChecksumTestCase,
452 ExceptionTestCase,
453 CompressTestCase,
454 CompressObjectTestCase
455 )
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000456
457if __name__ == "__main__":
Guido van Rossum776152b2007-05-22 22:44:07 +0000458 unittest.main() # XXX
459 ###test_main()