"Dual Object Notation" -> "Twofold Object Notation"
[ton] / test_binary.py
1 # -*- coding: utf-8 -*-
2 import collections
3 import unittest
4
5 from ton import binary, tags
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_binary(self):
25         self.assertEqual(binary.serialize(b'\xde\xad\xbe\xef'), b'\x30\x00\x00\x00\x04\xde\xad\xbe\xef')
26
27     def test_serializes_utf8(self):
28         self.assertEqual(
29             binary.serialize('Hello, world'),
30             b'\x31\x00\x00\x00\x0cHello, world',
31         )
32         self.assertEqual(
33             binary.serialize('世界'),
34             b'\x31\x00\x00\x00\x06\xe4\xb8\x96\xe7\x95\x8c',
35         )
36
37     def test_serializes_list(self):
38         self.assertEqual(binary.serialize([]),                                  b'\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00')
39         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')
40         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')
41
42     def test_serializes_dictionary(self):
43         self.assertEqual(binary.serialize({}), b'\x41\x00\x00\x00\x00\x00\x00\x00\x00')
44         self.assertEqual(binary.serialize(collections.OrderedDict([
45             ('foo',42),
46             ('bar','baz'),
47         ])), b'A\x00\x00\x00\x1d\x00\x00\x00\x021\x00\x00\x00\x03foo\x12\x00\x00\x00*1\x00\x00\x00\x03bar1\x00\x00\x00\x03baz')
48
49 class TestBinaryDeserialize(unittest.TestCase):
50     def test_deserializes_null(self):
51         self.assertEqual(binary.deserialize(b'\x00'), None)
52
53     def test_deserializes_true(self):
54         self.assertEqual(binary.deserialize(b'\x01'), True)
55
56     def test_deserializes_false(self):
57         self.assertEqual(binary.deserialize(b'\x02'), False)
58
59     def test_deserializes_8_bit_twos_complement_with_network_byte_order(self):
60         self.assertEqual(binary.deserialize(b'\x10\x80'), -128)
61         self.assertEqual(binary.deserialize(b'\x10\xff'), -1)
62         self.assertEqual(binary.deserialize(b'\x10\x00'), 0)
63         self.assertEqual(binary.deserialize(b'\x10\x01'), 1)
64         self.assertEqual(binary.deserialize(b'\x10\x7f'), 127)
65
66     def test_deserializes_16_bit_twos_complement_with_network_byte_order(self):
67         self.assertEqual(binary.deserialize(b'\x11\x80\x00'), -32768)
68         self.assertEqual(binary.deserialize(b'\x11\xff\xff'), -1)
69         self.assertEqual(binary.deserialize(b'\x11\x00\x00'), 0)
70         self.assertEqual(binary.deserialize(b'\x11\x00\x01'), 1)
71         self.assertEqual(binary.deserialize(b'\x11\x7f\xff'), 32767)
72
73     def test_deserializes_32_bit_twos_complement_with_network_byte_order(self):
74         self.assertEqual(binary.deserialize(b'\x12\x80\x00\x00\x00'), -2147483648)
75         self.assertEqual(binary.deserialize(b'\x12\xff\xff\xff\xff'), -1)
76         self.assertEqual(binary.deserialize(b'\x12\x00\x00\x00\x00'), 0)
77         self.assertEqual(binary.deserialize(b'\x12\x00\x00\x00\x01'), 1)
78         self.assertEqual(binary.deserialize(b'\x12\x7f\xff\xff\xff'), 2147483647)
79
80     def test_deserializes_64_bit_twos_complement_with_network_byte_order(self):
81         self.assertEqual(binary.deserialize(b'\x13\x80\x00\x00\x00\x00\x00\x00\x00'), -9223372036854775808)
82         self.assertEqual(binary.deserialize(b'\x13\xff\xff\xff\xff\xff\xff\xff\xff'), -1)
83         self.assertEqual(binary.deserialize(b'\x13\x00\x00\x00\x00\x00\x00\x00\x00'), 0)
84         self.assertEqual(binary.deserialize(b'\x13\x00\x00\x00\x00\x00\x00\x00\x01'), 1)
85         self.assertEqual(binary.deserialize(b'\x13\x7f\xff\xff\xff\xff\xff\xff\xff'), 9223372036854775807)
86
87     def test_deserializes_binary(self):
88         self.assertEqual(binary.deserialize(b'\x30\x00\x00\x00\x04\xde\xad\xbe\xef'), b'\xde\xad\xbe\xef')
89
90     def test_deserializes_utf8(self):
91         self.assertEqual(binary.deserialize(b'\x31\x00\x00\x00\x0cHello, world'),             'Hello, world')
92         self.assertEqual(binary.deserialize(b'\x31\x00\x00\x00\x06\xe4\xb8\x96\xe7\x95\x8c'), '世界')
93
94     def test_deserializes_lists(self):
95         self.assertEqual(list(binary.deserialize(b'\x40\x12\x00\x00\x00\x00\x00\x00\x00\x00')), [])
96         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])
97
98     def test_deserializes_dictionaries(self):
99         self.assertEqual(binary.deserialize(b'\x41\x00\x00\x00\x00\x00\x00\x00\x00'), collections.OrderedDict([]))
100         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')]))
101
102 unittest.main()