Implement autotag()
[ton] / test_tags.py
1 import collections
2 import unittest
3
4 from don import tags
5
6 class AutoTagTests(unittest.TestCase):
7     def test_autotags_void(self):
8         self.assertEqual(
9             tags.autotag(None),
10             tags.TaggedObject(tag = tags.VOID, value = None),
11         )
12
13     def test_autotags_true(self):
14         self.assertEqual(
15             tags.autotag(True),
16             tags.TaggedObject(tag = tags.TRUE, value = True),
17         )
18
19     def test_autotags_false(self):
20         self.assertEqual(
21             tags.autotag(False),
22             tags.TaggedObject(tag = tags.FALSE, value = False),
23         )
24
25     def test_autotags_int_defaults_to_INT32(self):
26         self.assertEqual(
27             tags.autotag(127),
28             tags.TaggedObject(tag = tags.DEFAULT_INTEGER_ENCODING, value = 127),
29         )
30         self.assertEqual(
31             tags.autotag(-128),
32             tags.TaggedObject(tag = tags.DEFAULT_INTEGER_ENCODING, value = -128),
33         )
34         self.assertEqual(
35             tags.autotag(128),
36             tags.TaggedObject(tag = tags.DEFAULT_INTEGER_ENCODING, value = 128),
37         )
38         self.assertEqual(
39             tags.autotag(-129),
40             tags.TaggedObject(tag = tags.DEFAULT_INTEGER_ENCODING, value = -129),
41         )
42         self.assertEqual(
43             tags.autotag(-32768),
44             tags.TaggedObject(tag = tags.DEFAULT_INTEGER_ENCODING, value = -32768),
45         )
46         self.assertEqual(
47             tags.autotag(32767),
48             tags.TaggedObject(tag = tags.DEFAULT_INTEGER_ENCODING, value = 32767),
49         )
50         self.assertEqual(
51             tags.autotag(-32769),
52             tags.TaggedObject(tag = tags.DEFAULT_INTEGER_ENCODING, value = -32769),
53         )
54         self.assertEqual(
55             tags.autotag(32768),
56             tags.TaggedObject(tag = tags.DEFAULT_INTEGER_ENCODING, value = 32768),
57         )
58         self.assertEqual(
59             tags.autotag(-2147483648),
60             tags.TaggedObject(tag = tags.DEFAULT_INTEGER_ENCODING, value = -2147483648),
61         )
62         self.assertEqual(
63             tags.autotag(2147483647),
64             tags.TaggedObject(tag = tags.DEFAULT_INTEGER_ENCODING, value = 2147483647),
65         )
66         self.assertEqual(
67             tags.autotag(-2147483649),
68             tags.TaggedObject(tag = tags.INT64, value = -2147483649),
69         )
70         self.assertEqual(
71             tags.autotag(2147483648),
72             tags.TaggedObject(tag = tags.INT64, value = 2147483648),
73         )
74         self.assertEqual(
75             tags.autotag(-9223372036854775808),
76             tags.TaggedObject(tag = tags.INT64, value = -9223372036854775808),
77         )
78         self.assertEqual(
79             tags.autotag(9223372036854775807),
80             tags.TaggedObject(tag = tags.INT64, value = 9223372036854775807),
81         )
82         
83         with self.assertRaises(tags.TooWideError):
84             tags.autotag(9223372036854775808)
85
86         with self.assertRaises(tags.TooWideError):
87             tags.autotag(-9223372036854775809)
88
89     def test_autotags_int_to_smallest_possible_type_when_preferred_type_is_smallest(self):
90         self.assertEqual(
91             tags.autotag(127, preferred_integer_tag=tags.SMALLEST),
92             tags.TaggedObject(tag = tags.INT8, value = 127),
93         )
94         self.assertEqual(
95             tags.autotag(-128, preferred_integer_tag=tags.SMALLEST),
96             tags.TaggedObject(tag = tags.INT8, value = -128),
97         )
98         self.assertEqual(
99             tags.autotag(128, preferred_integer_tag=tags.SMALLEST),
100             tags.TaggedObject(tag = tags.INT16, value = 128),
101         )
102         self.assertEqual(
103             tags.autotag(-129, preferred_integer_tag=tags.SMALLEST),
104             tags.TaggedObject(tag = tags.INT16, value = -129),
105         )
106         self.assertEqual(
107             tags.autotag(-32768, preferred_integer_tag=tags.SMALLEST),
108             tags.TaggedObject(tag = tags.INT16, value = -32768),
109         )
110         self.assertEqual(
111             tags.autotag(32767, preferred_integer_tag=tags.SMALLEST),
112             tags.TaggedObject(tag = tags.INT16, value = 32767),
113         )
114         self.assertEqual(
115             tags.autotag(-32769, preferred_integer_tag=tags.SMALLEST),
116             tags.TaggedObject(tag = tags.INT32, value = -32769),
117         )
118         self.assertEqual(
119             tags.autotag(32768, preferred_integer_tag=tags.SMALLEST),
120             tags.TaggedObject(tag = tags.INT32, value = 32768),
121         )
122         self.assertEqual(
123             tags.autotag(-2147483648, preferred_integer_tag=tags.SMALLEST),
124             tags.TaggedObject(tag = tags.INT32, value = -2147483648),
125         )
126         self.assertEqual(
127             tags.autotag(2147483647, preferred_integer_tag=tags.SMALLEST),
128             tags.TaggedObject(tag = tags.INT32, value = 2147483647),
129         )
130         self.assertEqual(
131             tags.autotag(-2147483649, preferred_integer_tag=tags.SMALLEST),
132             tags.TaggedObject(tag = tags.INT64, value = -2147483649),
133         )
134         self.assertEqual(
135             tags.autotag(2147483648, preferred_integer_tag=tags.SMALLEST),
136             tags.TaggedObject(tag = tags.INT64, value = 2147483648),
137         )
138         self.assertEqual(
139             tags.autotag(-9223372036854775808, preferred_integer_tag=tags.SMALLEST),
140             tags.TaggedObject(tag = tags.INT64, value = -9223372036854775808),
141         )
142         self.assertEqual(
143             tags.autotag(9223372036854775807, preferred_integer_tag=tags.SMALLEST),
144             tags.TaggedObject(tag = tags.INT64, value = 9223372036854775807),
145         )
146         
147         with self.assertRaises(tags.TooWideError):
148             tags.autotag(9223372036854775808, preferred_integer_tag=tags.SMALLEST)
149
150         with self.assertRaises(tags.TooWideError):
151             tags.autotag(-9223372036854775809, preferred_integer_tag=tags.SMALLEST)
152
153     def test_tags_integer_to_preferred_integer_tag(self):
154         self.assertEqual(
155             tags.autotag(42, preferred_integer_tag = tags.INT8),
156             tags.TaggedObject(tag = tags.INT8, value = 42),
157         )
158
159         self.assertEqual(
160             tags.autotag(42, preferred_integer_tag = tags.INT16),
161             tags.TaggedObject(tag = tags.INT16, value = 42),
162         )
163
164         self.assertEqual(
165             tags.autotag(42, preferred_integer_tag = tags.INT32),
166             tags.TaggedObject(tag = tags.INT32, value = 42),
167         )
168
169         self.assertEqual(
170             tags.autotag(42, preferred_integer_tag = tags.INT64),
171             tags.TaggedObject(tag = tags.INT64, value = 42),
172         )
173
174     def test_tags_string_to_utf8_by_default(self):
175         self.assertEqual(
176             tags.autotag('Hello, world'),
177             tags.TaggedObject(tag = tags.DEFAULT_STRING_ENCODING, value = 'Hello, world'),
178         )
179
180     def test_tags_string_to_preferred_string_encoding(self):
181         self.assertEqual(
182             tags.autotag('Hello, world', preferred_string_tag=tags.UTF8),
183             tags.TaggedObject(tag = tags.UTF8, value = 'Hello, world'),
184         )
185
186         self.assertEqual(
187             tags.autotag('Hello, world', preferred_string_tag=tags.UTF16),
188             tags.TaggedObject(tag = tags.UTF16, value = 'Hello, world'),
189         )
190
191         self.assertEqual(
192             tags.autotag('Hello, world', preferred_string_tag=tags.UTF32),
193             tags.TaggedObject(tag = tags.UTF32, value = 'Hello, world'),
194         )
195
196     def test_tags_list(self):
197         self.assertEqual(
198             tags.autotag([1,2,3]),
199             tags.TaggedObject(
200                 tag = tags.LIST,
201                 value = [
202                     tags.TaggedObject(tag = tags.INT32, value = 1),
203                     tags.TaggedObject(tag = tags.INT32, value = 2),
204                     tags.TaggedObject(tag = tags.INT32, value = 3),
205                 ],
206             ),
207         )
208
209     def test_tags_dictionary(self):
210         self.assertEqual(
211             tags.autotag(collections.OrderedDict([
212                 ('foo', 1),
213                 ('bar', True),
214             ])),
215             tags.TaggedObject(
216                 tag = tags.DICTIONARY,
217                 value = collections.OrderedDict([
218                     (
219                         tags.TaggedObject(tag = tags.UTF8, value = 'foo'),
220                         tags.TaggedObject(tag = tags.INT32, value = 1),
221                     ),
222                     (
223                         tags.TaggedObject(tag = tags.UTF8, value = 'bar'),
224                         tags.TaggedObject(tag = tags.TRUE, value = True),
225                     ),
226                 ]),
227             ),
228         )
229
230 unittest.main()