136d79436c98ced12e1362e87551112a869ee400
[ton] / test_binary.py
1 import collections
2 import unittest
3
4 from don import binary, tags
5
6 class TestBinarySerialize(unittest.TestCase):
7     def test_serializes_null(self):
8         self.assertEqual(binary.serialize(None), b'\x00')
9
10     def test_serializes_true(self):
11         self.assertEqual(binary.serialize(True), b'\x01')
12
13     def test_serializes_false(self):
14         self.assertEqual(binary.serialize(False), b'\x02')
15
16     def test_serializes_integers_in_32_bit_twos_complement_with_network_byte_order(self):
17         self.assertEqual(binary.serialize(-2147483648), b'\x12\x80\x00\x00\x00')
18         self.assertEqual(binary.serialize(-1),          b'\x12\xff\xff\xff\xff')
19         self.assertEqual(binary.serialize(0),           b'\x12\x00\x00\x00\x00')
20         self.assertEqual(binary.serialize(1),           b'\x12\x00\x00\x00\x01')
21         self.assertEqual(binary.serialize(2147483647),  b'\x12\x7f\xff\xff\xff')
22
23     def test_serializes_floats_into_binary64_with_network_byte_order(self):
24         self.assertEqual(binary.serialize(1.0),          b'\x21\x3f\xf0\x00\x00\x00\x00\x00\x00')
25         self.assertEqual(binary.serialize(2.0),          b'\x21\x40\x00\x00\x00\x00\x00\x00\x00')
26         self.assertEqual(binary.serialize(-2.0),         b'\x21\xc0\x00\x00\x00\x00\x00\x00\x00')
27         self.assertEqual(binary.serialize(0.5),          b'\x21\x3f\xe0\x00\x00\x00\x00\x00\x00')
28         self.assertEqual(binary.serialize(2.0 ** -1074), b'\x21\x00\x00\x00\x00\x00\x00\x00\x01')
29         self.assertEqual(binary.serialize(2.0 ** -1022), b'\x21\x00\x10\x00\x00\x00\x00\x00\x00')
30         self.assertEqual(binary.serialize(0.0),          b'\x21\x00\x00\x00\x00\x00\x00\x00\x00')
31
32     def test_serializes_binary(self):
33         self.assertEqual(binary.serialize(b'\xde\xad\xbe\xef'), b'\x30\x00\x00\x00\x04\xde\xad\xbe\xef')
34
35     def test_serializes_utf8(self):
36         self.assertEqual(
37             binary.serialize('Hello, world'),
38             b'\x31\x00\x00\x00\x0cHello, world',
39         )
40         self.assertEqual(
41             binary.serialize('世界'),
42             b'\x31\x00\x00\x00\x06\xe4\xb8\x96\xe7\x95\x8c',
43         )
44
45     def test_serializes_list(self):
46         self.assertEqual(binary.serialize([]),                                  b'\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00')
47         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')
48         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')
49         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')
50
51     def test_serializes_dictionary(self):
52         self.assertEqual(binary.serialize({}), b'\x41\x00\x00\x00\x00\x00\x00\x00\x00')
53         self.assertEqual(binary.serialize(collections.OrderedDict([
54             ('foo',42),
55             ('bar',3.14),
56             ('baz','qux'),
57         ])), 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')
58
59 class TestBinaryDeserialize(unittest.TestCase):
60     def test_deserializes_null(self):
61         self.assertEqual(binary.deserialize(b'\x00'), None)
62
63     def test_deserializes_true(self):
64         self.assertEqual(binary.deserialize(b'\x01'), True)
65
66     def test_deserializes_false(self):
67         self.assertEqual(binary.deserialize(b'\x02'), False)
68
69     def test_deserializes_8_bit_twos_complement_with_network_byte_order(self):
70         self.assertEqual(binary.deserialize(b'\x10\x80'), -128)
71         self.assertEqual(binary.deserialize(b'\x10\xff'), -1)
72         self.assertEqual(binary.deserialize(b'\x10\x00'), 0)
73         self.assertEqual(binary.deserialize(b'\x10\x01'), 1)
74         self.assertEqual(binary.deserialize(b'\x10\x7f'), 127)
75
76     def test_deserializes_16_bit_twos_complement_with_network_byte_order(self):
77         self.assertEqual(binary.deserialize(b'\x11\x80\x00'), -32768)
78         self.assertEqual(binary.deserialize(b'\x11\xff\xff'), -1)
79         self.assertEqual(binary.deserialize(b'\x11\x00\x00'), 0)
80         self.assertEqual(binary.deserialize(b'\x11\x00\x01'), 1)
81         self.assertEqual(binary.deserialize(b'\x11\x7f\xff'), 32767)
82
83     def test_deserializes_32_bit_twos_complement_with_network_byte_order(self):
84         self.assertEqual(binary.deserialize(b'\x12\x80\x00\x00\x00'), -2147483648)
85         self.assertEqual(binary.deserialize(b'\x12\xff\xff\xff\xff'), -1)
86         self.assertEqual(binary.deserialize(b'\x12\x00\x00\x00\x00'), 0)
87         self.assertEqual(binary.deserialize(b'\x12\x00\x00\x00\x01'), 1)
88         self.assertEqual(binary.deserialize(b'\x12\x7f\xff\xff\xff'), 2147483647)
89
90     def test_deserializes_64_bit_twos_complement_with_network_byte_order(self):
91         self.assertEqual(binary.deserialize(b'\x13\x80\x00\x00\x00\x00\x00\x00\x00'), -9223372036854775808)
92         self.assertEqual(binary.deserialize(b'\x13\xff\xff\xff\xff\xff\xff\xff\xff'), -1)
93         self.assertEqual(binary.deserialize(b'\x13\x00\x00\x00\x00\x00\x00\x00\x00'), 0)
94         self.assertEqual(binary.deserialize(b'\x13\x00\x00\x00\x00\x00\x00\x00\x01'), 1)
95         self.assertEqual(binary.deserialize(b'\x13\x7f\xff\xff\xff\xff\xff\xff\xff'), 9223372036854775807)
96
97     def test_deserializes_binary64_as_float(self):
98         self.assertEqual(binary.deserialize(b'\x21\x3f\xf0\x00\x00\x00\x00\x00\x00'), 1.0)
99         self.assertEqual(binary.deserialize(b'\x21\x40\x00\x00\x00\x00\x00\x00\x00'), 2.0)
100         self.assertEqual(binary.deserialize(b'\x21\xc0\x00\x00\x00\x00\x00\x00\x00'), -2.0)
101         self.assertEqual(binary.deserialize(b'\x21\x3f\xe0\x00\x00\x00\x00\x00\x00'), 0.5)
102         self.assertEqual(binary.deserialize(b'\x21\x00\x00\x00\x00\x00\x00\x00\x01'), 2.0 ** -1074)
103         self.assertEqual(binary.deserialize(b'\x21\x00\x10\x00\x00\x00\x00\x00\x00'), 2.0 ** -1022)
104         self.assertEqual(binary.deserialize(b'\x21\x00\x00\x00\x00\x00\x00\x00\x00'), 0.0)
105
106     def test_deserializes_binary(self):
107         self.assertEqual(binary.deserialize(b'\x30\x00\x00\x00\x04\xde\xad\xbe\xef'), b'\xde\xad\xbe\xef')
108
109     def test_deserializes_utf8(self):
110         self.assertEqual(binary.deserialize(b'\x31\x00\x00\x00\x0cHello, world'),             'Hello, world')
111         self.assertEqual(binary.deserialize(b'\x31\x00\x00\x00\x06\xe4\xb8\x96\xe7\x95\x8c'), '世界')
112
113     def test_deserializes_lists(self):
114         self.assertEqual(list(binary.deserialize(b'\x40\x12\x00\x00\x00\x00\x00\x00\x00\x00')), [])
115         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])
116
117     def test_deserializes_dictionaries(self):
118         self.assertEqual(binary.deserialize(b'\x41\x00\x00\x00\x00\x00\x00\x00\x00'), collections.OrderedDict([]))
119         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')]))
120
121 unittest.main()