Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c1b4154

Browse files
author
Skip Montanaro
committed
more extension marshal tests and conversion to unittest - was surprised to
see how much of the file was not covered by the build process
1 parent eaef615 commit c1b4154

1 file changed

Lines changed: 183 additions & 39 deletions

File tree

Lib/test/test_marshal.py

Lines changed: 183 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,188 @@
1-
from test.test_support import TestFailed
1+
#!/usr/bin/env python
2+
# -*- coding: iso-8859-1 -*-
3+
4+
from test import test_support
25
import marshal
36
import sys
7+
import unittest
8+
import os
49

5-
# XXX Much more needed here.
10+
class IntTestCase(unittest.TestCase):
11+
def test_ints(self):
12+
# Test the full range of Python ints.
13+
n = sys.maxint
14+
while n:
15+
for expected in (-n, n):
16+
s = marshal.dumps(expected)
17+
got = marshal.loads(s)
18+
self.assertEqual(expected, got)
19+
marshal.dump(expected, file(test_support.TESTFN, "wb"))
20+
got = marshal.load(file(test_support.TESTFN, "rb"))
21+
self.assertEqual(expected, got)
22+
n = n >> 1
23+
os.unlink(test_support.TESTFN)
624

7-
# Test the full range of Python ints.
8-
n = sys.maxint
9-
while n:
10-
for expected in (-n, n):
11-
s = marshal.dumps(expected)
12-
got = marshal.loads(s)
13-
if expected != got:
14-
raise TestFailed("for int %d, marshal string is %r, loaded "
15-
"back as %d" % (expected, s, got))
16-
n = n >> 1
17-
18-
# Simulate int marshaling on a 64-bit box. This is most interesting if
19-
# we're running the test on a 32-bit box, of course.
20-
21-
def to_little_endian_string(value, nbytes):
22-
bytes = []
23-
for i in range(nbytes):
24-
bytes.append(chr(value & 0xff))
25-
value >>= 8
26-
return ''.join(bytes)
27-
28-
maxint64 = (1L << 63) - 1
29-
minint64 = -maxint64-1
30-
31-
for base in maxint64, minint64, -maxint64, -(minint64 >> 1):
32-
while base:
33-
s = 'I' + to_little_endian_string(base, 8)
25+
def test_int64(self):
26+
# Simulate int marshaling on a 64-bit box. This is most interesting if
27+
# we're running the test on a 32-bit box, of course.
28+
29+
def to_little_endian_string(value, nbytes):
30+
bytes = []
31+
for i in range(nbytes):
32+
bytes.append(chr(value & 0xff))
33+
value >>= 8
34+
return ''.join(bytes)
35+
36+
maxint64 = (1L << 63) - 1
37+
minint64 = -maxint64-1
38+
39+
for base in maxint64, minint64, -maxint64, -(minint64 >> 1):
40+
while base:
41+
s = 'I' + to_little_endian_string(base, 8)
42+
got = marshal.loads(s)
43+
self.assertEqual(base, got)
44+
if base == -1: # a fixed-point for shifting right 1
45+
base = 0
46+
else:
47+
base >>= 1
48+
49+
def test_bool(self):
50+
for b in (True, False):
51+
new = marshal.loads(marshal.dumps(b))
52+
self.assertEqual(b, new)
53+
self.assertEqual(type(b), type(new))
54+
marshal.dump(b, file(test_support.TESTFN, "wb"))
55+
new = marshal.load(file(test_support.TESTFN, "rb"))
56+
self.assertEqual(b, new)
57+
self.assertEqual(type(b), type(new))
58+
59+
class FloatTestCase(unittest.TestCase):
60+
def test_floats(self):
61+
# Test a few floats
62+
small = 1e-25
63+
n = sys.maxint * 3.7e250
64+
while n > small:
65+
for expected in (-n, n):
66+
f = float(expected)
67+
s = marshal.dumps(f)
68+
got = marshal.loads(s)
69+
self.assertEqual(f, got)
70+
marshal.dump(f, file(test_support.TESTFN, "wb"))
71+
got = marshal.load(file(test_support.TESTFN, "rb"))
72+
self.assertEqual(f, got)
73+
n /= 123.4567
74+
75+
f = 0.0
76+
s = marshal.dumps(f)
3477
got = marshal.loads(s)
35-
if base != got:
36-
raise TestFailed("for int %d, simulated marshal string is %r, "
37-
"loaded back as %d" % (base, s, got))
38-
if base == -1: # a fixed-point for shifting right 1
39-
base = 0
40-
else:
41-
base >>= 1
42-
43-
# Simple-minded check for SF 588452: Debug build crashes
44-
marshal.dumps([128] * 1000)
78+
self.assertEqual(f, got)
79+
80+
n = sys.maxint * 3.7e-250
81+
while n < small:
82+
for expected in (-n, n):
83+
f = float(expected)
84+
s = marshal.dumps(f)
85+
got = marshal.loads(s)
86+
self.assertEqual(f, got)
87+
marshal.dump(f, file(test_support.TESTFN, "wb"))
88+
got = marshal.load(file(test_support.TESTFN, "rb"))
89+
self.assertEqual(f, got)
90+
n *= 123.4567
91+
os.unlink(test_support.TESTFN)
92+
93+
class StringTestCase(unittest.TestCase):
94+
def test_unicode(self):
95+
for s in [u"", u"Andrè Previn", u"abc", u" "*10000]:
96+
new = marshal.loads(marshal.dumps(s))
97+
self.assertEqual(s, new)
98+
self.assertEqual(type(s), type(new))
99+
marshal.dump(s, file(test_support.TESTFN, "wb"))
100+
marshal.load(file(test_support.TESTFN, "rb"))
101+
self.assertEqual(s, new)
102+
self.assertEqual(type(s), type(new))
103+
os.unlink(test_support.TESTFN)
104+
105+
def test_string(self):
106+
for s in ["", "Andrè Previn", "abc", " "*10000]:
107+
new = marshal.loads(marshal.dumps(s))
108+
self.assertEqual(s, new)
109+
self.assertEqual(type(s), type(new))
110+
marshal.dump(s, file(test_support.TESTFN, "wb"))
111+
marshal.load(file(test_support.TESTFN, "rb"))
112+
self.assertEqual(s, new)
113+
self.assertEqual(type(s), type(new))
114+
os.unlink(test_support.TESTFN)
115+
116+
def test_buffer(self):
117+
for s in ["", "Andrè Previn", "abc", " "*10000]:
118+
b = buffer(s)
119+
new = marshal.loads(marshal.dumps(b))
120+
self.assertEqual(s, new)
121+
marshal.dump(b, file(test_support.TESTFN, "wb"))
122+
marshal.load(file(test_support.TESTFN, "rb"))
123+
self.assertEqual(s, new)
124+
os.unlink(test_support.TESTFN)
125+
126+
class ExceptionTestCase(unittest.TestCase):
127+
def test_exceptions(self):
128+
new = marshal.loads(marshal.dumps(StopIteration))
129+
self.assertEqual(StopIteration, new)
130+
131+
class CodeTestCase(unittest.TestCase):
132+
def test_code(self):
133+
co = ExceptionTestCase.test_exceptions.func_code
134+
new = marshal.loads(marshal.dumps(co))
135+
self.assertEqual(co, new)
136+
137+
class ContainerTestCase(unittest.TestCase):
138+
d = {'astring': '[email protected]',
139+
'afloat': 7283.43,
140+
'anint': 2**20,
141+
'ashortlong': 2L,
142+
'alist': ['.zyx.41'],
143+
'atuple': ('.zyx.41',)*10,
144+
'aboolean': False,
145+
'aunicode': u"Andrè Previn"
146+
}
147+
def test_dict(self):
148+
new = marshal.loads(marshal.dumps(self.d))
149+
self.assertEqual(self.d, new)
150+
marshal.dump(self.d, file(test_support.TESTFN, "wb"))
151+
marshal.load(file(test_support.TESTFN, "rb"))
152+
self.assertEqual(self.d, new)
153+
os.unlink(test_support.TESTFN)
154+
155+
def test_list(self):
156+
lst = self.d.items()
157+
new = marshal.loads(marshal.dumps(lst))
158+
self.assertEqual(lst, new)
159+
marshal.dump(lst, file(test_support.TESTFN, "wb"))
160+
marshal.load(file(test_support.TESTFN, "rb"))
161+
self.assertEqual(lst, new)
162+
os.unlink(test_support.TESTFN)
163+
164+
def test_tuple(self):
165+
t = tuple(self.d.keys())
166+
new = marshal.loads(marshal.dumps(t))
167+
self.assertEqual(t, new)
168+
marshal.dump(t, file(test_support.TESTFN, "wb"))
169+
marshal.load(file(test_support.TESTFN, "rb"))
170+
self.assertEqual(t, new)
171+
os.unlink(test_support.TESTFN)
172+
173+
class BugsTestCase(unittest.TestCase):
174+
def test_bug_5888452(self):
175+
# Simple-minded check for SF 588452: Debug build crashes
176+
marshal.dumps([128] * 1000)
177+
178+
def test_main():
179+
test_support.run_unittest(IntTestCase,
180+
FloatTestCase,
181+
StringTestCase,
182+
CodeTestCase,
183+
ContainerTestCase,
184+
ExceptionTestCase,
185+
BugsTestCase)
186+
187+
if __name__ == "__main__":
188+
test_main()

0 commit comments

Comments
 (0)