Major reorganization
[ton] / test_don.py
1 import collections
2 import unittest
3
4 import don
5 from don import binary, string
6
7 class TestBinarySerialize(unittest.TestCase):
8     def test_serializes_null(self):
9         self.assertEqual(binary.serialize(None), b'\x00')
10
11     def test_serializes_true(self):
12         self.assertEqual(binary.serialize(True), b'\x01')
13
14     def test_serializes_false(self):
15         self.assertEqual(binary.serialize(False), b'\x02')
16
17     def test_serializes_integers_in_32_bit_twos_complement_with_network_byte_order(self):
18         self.assertEqual(binary.serialize(-2147483648), b'\x12\x80\x00\x00\x00')
19         self.assertEqual(binary.serialize(-1),          b'\x12\xff\xff\xff\xff')
20         self.assertEqual(binary.serialize(0),           b'\x12\x00\x00\x00\x00')
21         self.assertEqual(binary.serialize(1),           b'\x12\x00\x00\x00\x01')
22         self.assertEqual(binary.serialize(2147483647),  b'\x12\x7f\xff\xff\xff')
23
24     def test_serializes_floats_into_binary64_with_network_byte_order(self):
25         self.assertEqual(binary.serialize(1.0),          b'\x21\x3f\xf0\x00\x00\x00\x00\x00\x00')
26         self.assertEqual(binary.serialize(2.0),          b'\x21\x40\x00\x00\x00\x00\x00\x00\x00')
27         self.assertEqual(binary.serialize(-2.0),         b'\x21\xc0\x00\x00\x00\x00\x00\x00\x00')
28         self.assertEqual(binary.serialize(0.5),          b'\x21\x3f\xe0\x00\x00\x00\x00\x00\x00')
29         self.assertEqual(binary.serialize(2.0 ** -1074), b'\x21\x00\x00\x00\x00\x00\x00\x00\x01')
30         self.assertEqual(binary.serialize(2.0 ** -1022), b'\x21\x00\x10\x00\x00\x00\x00\x00\x00')
31         self.assertEqual(binary.serialize(0.0),          b'\x21\x00\x00\x00\x00\x00\x00\x00\x00')
32
33     def test_serializes_binary(self):
34         self.assertEqual(binary.serialize(b'\xde\xad\xbe\xef'), b'\x30\x00\x00\x00\x04\xde\xad\xbe\xef')
35
36     def test_serializes_utf8(self):
37         self.assertEqual(binary.serialize('Hello, world'), b'\x31\x00\x00\x00\x0cHello, world')
38         self.assertEqual(binary.serialize('世界'),         b'\x31\x00\x00\x00\x06\xe4\xb8\x96\xe7\x95\x8c')
39
40     def test_serializes_list(self):
41         self.assertEqual(binary.serialize([]),                                  b'\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00')
42         self.assertEqual(binary.serialize([1,2,3]),                             b'\x40\x12\x00\x00\x00\x0c\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03')
43         self.assertEqual(binary.serialize(['Hello, world', 'Goodnight, moon']), b'\x40\x31\x00\x00\x00#\x00\x00\x00\x02\x00\x00\x00\x0cHello, world\x00\x00\x00\x0fGoodnight, moon')
44         self.assertEqual(binary.serialize([1.618, 2.718, 3.142]),               b'\x40\x21\x00\x00\x00\x18\x00\x00\x00\x03?\xf9\xe3S\xf7\xce\xd9\x17@\x05\xbev\xc8\xb49X@\t"\xd0\xe5`A\x89')
45
46     def test_serializes_dictionary(self):
47         self.assertEqual(binary.serialize({}), b'\x41\x00\x00\x00\x00\x00\x00\x00\x00')
48         self.assertEqual(binary.serialize(collections.OrderedDict([
49             ('foo',42),
50             ('bar',3.14),
51             ('baz','qux'),
52         ])), b'A\x00\x00\x00+\x00\x00\x00\x03\x00\x00\x00\x03foo\x12\x00\x00\x00*\x00\x00\x00\x03bar!@\t\x1e\xb8Q\xeb\x85\x1f\x00\x00\x00\x03baz1\x00\x00\x00\x03qux')
53
54 class TestBinaryDeserialize(unittest.TestCase):
55     def test_deserializes_null(self):
56         self.assertEqual(binary.deserialize(b'\x00'), None)
57
58     def test_deserializes_true(self):
59         self.assertEqual(binary.deserialize(b'\x01'), True)
60
61     def test_deserializes_false(self):
62         self.assertEqual(binary.deserialize(b'\x02'), False)
63
64     def test_deserializes_8_bit_twos_complement_with_network_byte_order(self):
65         self.assertEqual(binary.deserialize(b'\x10\x80'), -128)
66         self.assertEqual(binary.deserialize(b'\x10\xff'), -1)
67         self.assertEqual(binary.deserialize(b'\x10\x00'), 0)
68         self.assertEqual(binary.deserialize(b'\x10\x01'), 1)
69         self.assertEqual(binary.deserialize(b'\x10\x7f'), 127)
70
71     def test_deserializes_16_bit_twos_complement_with_network_byte_order(self):
72         self.assertEqual(binary.deserialize(b'\x11\x80\x00'), -32768)
73         self.assertEqual(binary.deserialize(b'\x11\xff\xff'), -1)
74         self.assertEqual(binary.deserialize(b'\x11\x00\x00'), 0)
75         self.assertEqual(binary.deserialize(b'\x11\x00\x01'), 1)
76         self.assertEqual(binary.deserialize(b'\x11\x7f\xff'), 32767)
77
78     def test_deserializes_32_bit_twos_complement_with_network_byte_order(self):
79         self.assertEqual(binary.deserialize(b'\x12\x80\x00\x00\x00'), -2147483648)
80         self.assertEqual(binary.deserialize(b'\x12\xff\xff\xff\xff'), -1)
81         self.assertEqual(binary.deserialize(b'\x12\x00\x00\x00\x00'), 0)
82         self.assertEqual(binary.deserialize(b'\x12\x00\x00\x00\x01'), 1)
83         self.assertEqual(binary.deserialize(b'\x12\x7f\xff\xff\xff'), 2147483647)
84
85     def test_deserializes_64_bit_twos_complement_with_network_byte_order(self):
86         self.assertEqual(binary.deserialize(b'\x13\x80\x00\x00\x00\x00\x00\x00\x00'), -9223372036854775808)
87         self.assertEqual(binary.deserialize(b'\x13\xff\xff\xff\xff\xff\xff\xff\xff'), -1)
88         self.assertEqual(binary.deserialize(b'\x13\x00\x00\x00\x00\x00\x00\x00\x00'), 0)
89         self.assertEqual(binary.deserialize(b'\x13\x00\x00\x00\x00\x00\x00\x00\x01'), 1)
90         self.assertEqual(binary.deserialize(b'\x13\x7f\xff\xff\xff\xff\xff\xff\xff'), 9223372036854775807)
91
92     def test_deserializes_binary64_as_float(self):
93         self.assertEqual(binary.deserialize(b'\x21\x3f\xf0\x00\x00\x00\x00\x00\x00'), 1.0)
94         self.assertEqual(binary.deserialize(b'\x21\x40\x00\x00\x00\x00\x00\x00\x00'), 2.0)
95         self.assertEqual(binary.deserialize(b'\x21\xc0\x00\x00\x00\x00\x00\x00\x00'), -2.0)
96         self.assertEqual(binary.deserialize(b'\x21\x3f\xe0\x00\x00\x00\x00\x00\x00'), 0.5)
97         self.assertEqual(binary.deserialize(b'\x21\x00\x00\x00\x00\x00\x00\x00\x01'), 2.0 ** -1074)
98         self.assertEqual(binary.deserialize(b'\x21\x00\x10\x00\x00\x00\x00\x00\x00'), 2.0 ** -1022)
99         self.assertEqual(binary.deserialize(b'\x21\x00\x00\x00\x00\x00\x00\x00\x00'), 0.0)
100
101     def test_deserializes_binary(self):
102         self.assertEqual(binary.deserialize(b'\x30\x00\x00\x00\x04\xde\xad\xbe\xef'), b'\xde\xad\xbe\xef')
103
104     def test_deserializes_utf8(self):
105         self.assertEqual(binary.deserialize(b'\x31\x00\x00\x00\x0cHello, world'),             'Hello, world')
106         self.assertEqual(binary.deserialize(b'\x31\x00\x00\x00\x06\xe4\xb8\x96\xe7\x95\x8c'), '世界')
107
108     def test_deserializes_lists(self):
109         self.assertEqual(list(binary.deserialize(b'\x40\x12\x00\x00\x00\x00\x00\x00\x00\x00')), [])
110         self.assertEqual(list(binary.deserialize(b'\x40\x12\x00\x00\x00\x0c\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03')), [1,2,3])
111
112     def test_deserializes_dictionaries(self):
113         self.assertEqual(binary.deserialize(b'\x41\x00\x00\x00\x00\x00\x00\x00\x00'), collections.OrderedDict([]))
114         self.assertEqual(binary.deserialize(b'\x41\x00\x00\x00\x1b\x00\x00\x00\x02\x00\x00\x00\x03foo\x12\x00\x00\x00\x2a\x00\x00\x00\x03bar\x31\x00\x00\x00\x03baz'), collections.OrderedDict([('foo',42), ('bar','baz')]))
115
116
117 class TestStringSerialize(unittest.TestCase):
118     def test_serializes_null(self):
119         self.assertEqual(string.serialize(None), 'null')
120
121     def test_serializes_true(self):
122         self.assertEqual(string.serialize(True), 'true')
123
124     def test_serializes_false(self):
125         self.assertEqual(string.serialize(False), 'false')
126
127     def test_serializes_int8(self):
128         self.assertEqual(string.serialize(don.TaggedObject(don.INT8, 1)), '1i8')
129         self.assertEqual(string.serialize(don.TaggedObject(don.INT8, -1)), '-1i8')
130         self.assertEqual(string.serialize(don.TaggedObject(don.INT8, 42)), '42i8')
131
132     def test_serializes_int16(self):
133         self.assertEqual(string.serialize(don.TaggedObject(don.INT16, 1)), '1i16')
134         self.assertEqual(string.serialize(don.TaggedObject(don.INT16, -1)), '-1i16')
135         self.assertEqual(string.serialize(don.TaggedObject(don.INT16, 42)), '42i16')
136
137     def test_serializes_int32(self):
138         self.assertEqual(string.serialize(don.TaggedObject(don.INT32, 1)), '1i32')
139         self.assertEqual(string.serialize(don.TaggedObject(don.INT32, -1)), '-1i32')
140         self.assertEqual(string.serialize(don.TaggedObject(don.INT32, 42)), '42i32')
141
142     def test_serializes_int64(self):
143         self.assertEqual(string.serialize(don.TaggedObject(don.INT64, 1)), '1i64')
144         self.assertEqual(string.serialize(don.TaggedObject(don.INT64, -1)), '-1i64')
145         self.assertEqual(string.serialize(don.TaggedObject(don.INT64, 42)), '42i64')
146
147     def test_serializes_float(self):
148         self.assertEqual(string.serialize(don.TaggedObject(don.FLOAT, 1.0)), '1.0f')
149
150     def test_serializes_double(self):
151         self.assertEqual(string.serialize(don.TaggedObject(don.DOUBLE, 1.0)), '1.0d')
152
153     def test_serializes_binary(self):
154         self.assertEqual(string.serialize(don.TaggedObject(don.BINARY, b'\xde\xad\xbe\xef')), '"deadbeef"b')
155
156     def test_serializes_utf8(self):
157         self.assertEqual(string.serialize(don.TaggedObject(don.UTF8, 'Hello, world')), '"Hello, world"utf8')
158
159     def test_serializes_utf16(self):
160         self.assertEqual(string.serialize(don.TaggedObject(don.UTF16, 'Hello, world')), '"Hello, world"utf16')
161
162     def test_serializes_utf32(self):
163         self.assertEqual(string.serialize(don.TaggedObject(don.UTF32, 'Hello, world')), '"Hello, world"utf32')
164
165     def test_serializes_list(self):
166         self.assertEqual(string.serialize(don.TaggedObject(don.LIST, [1,2,3])), '[1i32, 2i32, 3i32]')
167
168     def test_serializes_dictionary(self):
169         self.assertEqual(
170             string.serialize(don.TaggedObject(don.DICTIONARY, collections.OrderedDict([
171                 ('foo', 1),
172                 ('bar', 'baz'),
173             ]))),
174             '{ "foo"utf8: 1i32, "bar"utf8: "baz"utf8 }'
175         )
176
177 #   class TestStringDeserialize(unittest.TestCase):
178 #       def test_deserializes_null(self):
179 #           self.assertEqual(
180 #               None,
181 #               string.deserialize('null'),
182 #           )
183 #       
184 #       def test_deserializes_null(self):
185 #           self.assertEqual(
186 #               True,
187 #               string.deserialize('true'),
188 #           )
189 #       
190 #       def test_deserializes_null(self):
191 #           self.assertEqual(
192 #               False,
193 #               string.deserialize('false'),
194 #           )
195
196 unittest.main()