##// END OF EJS Templates
test canning classes
MinRK -
Show More
@@ -1,168 +1,210 b''
1 1 """test serialization tools"""
2 2
3 3 #-------------------------------------------------------------------------------
4 4 # Copyright (C) 2011 The IPython Development Team
5 5 #
6 6 # Distributed under the terms of the BSD License. The full license is in
7 7 # the file COPYING, distributed as part of this software.
8 8 #-------------------------------------------------------------------------------
9 9
10 10 #-------------------------------------------------------------------------------
11 11 # Imports
12 12 #-------------------------------------------------------------------------------
13 13
14 14 import pickle
15 15
16 16 import nose.tools as nt
17 17
18 18 # from unittest import TestCaes
19 19 from IPython.zmq.serialize import serialize_object, unserialize_object
20 20 from IPython.testing import decorators as dec
21 from IPython.utils.pickleutil import CannedArray
21 from IPython.utils.pickleutil import CannedArray, CannedClass
22 from IPython.parallel import interactive
22 23
23 24 #-------------------------------------------------------------------------------
24 25 # Globals and Utilities
25 26 #-------------------------------------------------------------------------------
26 27
27 28 def roundtrip(obj):
28 29 """roundtrip an object through serialization"""
29 30 bufs = serialize_object(obj)
30 31 obj2, remainder = unserialize_object(bufs)
31 32 nt.assert_equals(remainder, [])
32 33 return obj2
33 34
34 35 class C(object):
35 36 """dummy class for """
36 37
37 38 def __init__(self, **kwargs):
38 39 for key,value in kwargs.iteritems():
39 40 setattr(self, key, value)
40 41
41 42 SHAPES = ((100,), (1024,10), (10,8,6,5), (), (0,))
42 43 DTYPES = ('uint8', 'float64', 'int32', [('g', 'float32')], '|S10')
43 44 #-------------------------------------------------------------------------------
44 45 # Tests
45 46 #-------------------------------------------------------------------------------
46 47
47 48 @dec.parametric
48 49 def test_roundtrip_simple():
49 50 for obj in [
50 51 'hello',
51 52 dict(a='b', b=10),
52 53 [1,2,'hi'],
53 54 (b'123', 'hello'),
54 55 ]:
55 56 obj2 = roundtrip(obj)
56 57 yield nt.assert_equals(obj, obj2)
57 58
58 59 @dec.parametric
59 60 def test_roundtrip_nested():
60 61 for obj in [
61 62 dict(a=range(5), b={1:b'hello'}),
62 63 [range(5),[range(3),(1,[b'whoda'])]],
63 64 ]:
64 65 obj2 = roundtrip(obj)
65 66 yield nt.assert_equals(obj, obj2)
66 67
67 68 @dec.parametric
68 69 def test_roundtrip_buffered():
69 70 for obj in [
70 71 dict(a=b"x"*1025),
71 72 b"hello"*500,
72 73 [b"hello"*501, 1,2,3]
73 74 ]:
74 75 bufs = serialize_object(obj)
75 76 yield nt.assert_equals(len(bufs), 2)
76 77 obj2, remainder = unserialize_object(bufs)
77 78 yield nt.assert_equals(remainder, [])
78 79 yield nt.assert_equals(obj, obj2)
79 80
80 81 def _scrub_nan(A):
81 82 """scrub nans out of empty arrays
82 83
83 84 since nan != nan
84 85 """
85 86 import numpy
86 87 if A.dtype.fields and A.shape:
87 88 for field in A.dtype.fields.keys():
88 89 try:
89 90 A[field][numpy.isnan(A[field])] = 0
90 91 except (TypeError, NotImplementedError):
91 92 # e.g. str dtype
92 93 pass
93 94
94 95 @dec.parametric
95 96 @dec.skip_without('numpy')
96 97 def test_numpy():
97 98 import numpy
98 99 from numpy.testing.utils import assert_array_equal
99 100 for shape in SHAPES:
100 101 for dtype in DTYPES:
101 102 A = numpy.empty(shape, dtype=dtype)
102 103 _scrub_nan(A)
103 104 bufs = serialize_object(A)
104 105 B, r = unserialize_object(bufs)
105 106 yield nt.assert_equals(r, [])
106 107 yield nt.assert_equals(A.shape, B.shape)
107 108 yield nt.assert_equals(A.dtype, B.dtype)
108 109 yield assert_array_equal(A,B)
109 110
110 111 @dec.parametric
111 112 @dec.skip_without('numpy')
112 113 def test_recarray():
113 114 import numpy
114 115 from numpy.testing.utils import assert_array_equal
115 116 for shape in SHAPES:
116 117 for dtype in [
117 118 [('f', float), ('s', '|S10')],
118 119 [('n', int), ('s', '|S1'), ('u', 'uint32')],
119 120 ]:
120 121 A = numpy.empty(shape, dtype=dtype)
121 122 _scrub_nan(A)
122 123
123 124 bufs = serialize_object(A)
124 125 B, r = unserialize_object(bufs)
125 126 yield nt.assert_equals(r, [])
126 127 yield nt.assert_equals(A.shape, B.shape)
127 128 yield nt.assert_equals(A.dtype, B.dtype)
128 129 yield assert_array_equal(A,B)
129 130
130 131 @dec.parametric
131 132 @dec.skip_without('numpy')
132 133 def test_numpy_in_seq():
133 134 import numpy
134 135 from numpy.testing.utils import assert_array_equal
135 136 for shape in SHAPES:
136 137 for dtype in DTYPES:
137 138 A = numpy.empty(shape, dtype=dtype)
138 139 _scrub_nan(A)
139 140 bufs = serialize_object((A,1,2,b'hello'))
140 141 canned = pickle.loads(bufs[0])
141 142 yield nt.assert_true(canned[0], CannedArray)
142 143 tup, r = unserialize_object(bufs)
143 144 B = tup[0]
144 145 yield nt.assert_equals(r, [])
145 146 yield nt.assert_equals(A.shape, B.shape)
146 147 yield nt.assert_equals(A.dtype, B.dtype)
147 148 yield assert_array_equal(A,B)
148 149
149 150 @dec.parametric
150 151 @dec.skip_without('numpy')
151 152 def test_numpy_in_dict():
152 153 import numpy
153 154 from numpy.testing.utils import assert_array_equal
154 155 for shape in SHAPES:
155 156 for dtype in DTYPES:
156 157 A = numpy.empty(shape, dtype=dtype)
157 158 _scrub_nan(A)
158 159 bufs = serialize_object(dict(a=A,b=1,c=range(20)))
159 160 canned = pickle.loads(bufs[0])
160 161 yield nt.assert_true(canned['a'], CannedArray)
161 162 d, r = unserialize_object(bufs)
162 163 B = d['a']
163 164 yield nt.assert_equals(r, [])
164 165 yield nt.assert_equals(A.shape, B.shape)
165 166 yield nt.assert_equals(A.dtype, B.dtype)
166 167 yield assert_array_equal(A,B)
168
169 @dec.parametric
170 def test_class():
171 @interactive
172 class C(object):
173 a=5
174 bufs = serialize_object(dict(C=C))
175 canned = pickle.loads(bufs[0])
176 yield nt.assert_true(canned['C'], CannedClass)
177 d, r = unserialize_object(bufs)
178 C2 = d['C']
179 yield nt.assert_equal(C2.a, C.a)
180
181 @dec.parametric
182 def test_class_oldstyle():
183 @interactive
184 class C:
185 a=5
167 186
187 bufs = serialize_object(dict(C=C))
188 canned = pickle.loads(bufs[0])
189 yield nt.assert_true(canned['C'], CannedClass)
190 d, r = unserialize_object(bufs)
191 C2 = d['C']
192 yield nt.assert_equal(C2.a, C.a)
168 193
194 @dec.parametric
195 def test_class_inheritance():
196 @interactive
197 class C(object):
198 a=5
199
200 @interactive
201 class D(C):
202 b=10
203
204 bufs = serialize_object(dict(D=D))
205 canned = pickle.loads(bufs[0])
206 yield nt.assert_true(canned['D'], CannedClass)
207 d, r = unserialize_object(bufs)
208 D2 = d['D']
209 yield nt.assert_equal(D2.a, D.a)
210 yield nt.assert_equal(D2.b, D.b)
General Comments 0
You need to be logged in to leave comments. Login now