Coverage for /home/jenkins/workspace/NDS/Zserio/NDS_ZSERIO-linux-build/compiler/extensions/python/runtime/tests/test_bitsizeof.py: 100%
225 statements
« prev ^ index » next coverage.py v6.5.0, created at 2023-12-13 15:12 +0000
« prev ^ index » next coverage.py v6.5.0, created at 2023-12-13 15:12 +0000
1import unittest
3from zserio.bitbuffer import BitBuffer
4from zserio.bitsizeof import (bitsizeof_varint16, bitsizeof_varint32, bitsizeof_varint64, bitsizeof_varint,
5 bitsizeof_varuint16, bitsizeof_varuint32, bitsizeof_varuint64, bitsizeof_varuint,
6 bitsizeof_varsize, bitsizeof_string, bitsizeof_bitbuffer)
7from zserio.exception import PythonRuntimeException
8from zserio.limits import INT64_MIN
10class BitSizeOfTest(unittest.TestCase):
12 def test_bitsizeof_varint16(self):
13 self.assertEqual(1 * 8, bitsizeof_varint16(0))
15 self.assertEqual(1 * 8, bitsizeof_varint16(1 << (0)))
16 self.assertEqual(1 * 8, bitsizeof_varint16(-(1 << (0))))
17 self.assertEqual(1 * 8, bitsizeof_varint16((1 << (6)) - 1))
18 self.assertEqual(1 * 8, bitsizeof_varint16(-((1 << (6)) - 1)))
20 self.assertEqual(2 * 8, bitsizeof_varint16(1 << (6)))
21 self.assertEqual(2 * 8, bitsizeof_varint16(-(1 << (6))))
22 self.assertEqual(2 * 8, bitsizeof_varint16((1 << (6 + 8)) - 1))
23 self.assertEqual(2 * 8, bitsizeof_varint16(-((1 << (6 + 8)) - 1)))
25 with self.assertRaises(PythonRuntimeException):
26 bitsizeof_varint16(-(1 << (6 + 8))) # below the lower bound
28 with self.assertRaises(PythonRuntimeException):
29 bitsizeof_varint16(1 << (6 + 8)) # above the upper bound
31 def test_bitsizeof_varint32(self):
32 self.assertEqual(1 * 8, bitsizeof_varint32(0))
34 self.assertEqual(1 * 8, bitsizeof_varint32(1 << (0)))
35 self.assertEqual(1 * 8, bitsizeof_varint32(-(1 << (0))))
36 self.assertEqual(1 * 8, bitsizeof_varint32((1 << (6)) - 1))
37 self.assertEqual(1 * 8, bitsizeof_varint32(-((1 << (6)) - 1)))
39 self.assertEqual(2 * 8, bitsizeof_varint32(1 << (6)))
40 self.assertEqual(2 * 8, bitsizeof_varint32(-(1 << (6))))
41 self.assertEqual(2 * 8, bitsizeof_varint32((1 << (6 + 7)) - 1))
42 self.assertEqual(2 * 8, bitsizeof_varint32(-((1 << (6 + 7)) - 1)))
44 self.assertEqual(3 * 8, bitsizeof_varint32(1 << (6 + 7)))
45 self.assertEqual(3 * 8, bitsizeof_varint32(-(1 << (6 + 7))))
46 self.assertEqual(3 * 8, bitsizeof_varint32((1 << (6 + 7 + 7)) - 1))
47 self.assertEqual(3 * 8, bitsizeof_varint32(-((1 << (6 + 7 + 7)) - 1)))
49 self.assertEqual(4 * 8, bitsizeof_varint32(1 << (6 + 7 + 7)))
50 self.assertEqual(4 * 8, bitsizeof_varint32(-(1 << (6 + 7 + 7))))
51 self.assertEqual(4 * 8, bitsizeof_varint32((1 << (6 + 7 + 7 + 8)) - 1))
52 self.assertEqual(4 * 8, bitsizeof_varint32(-((1 << (6 + 7 + 7 + 8)) - 1)))
54 with self.assertRaises(PythonRuntimeException):
55 bitsizeof_varint32(-(1 << (6 + 7 + 7 + 8))) # below the lower bound
57 with self.assertRaises(PythonRuntimeException):
58 bitsizeof_varint32(1 << (6 + 7 + 7 + 8)) # above the upper bound
60 def test_bitsizeof_varint64(self):
61 self.assertEqual(1 * 8, bitsizeof_varint64(0))
63 self.assertEqual(1 * 8, bitsizeof_varint64(1 << (0)))
64 self.assertEqual(1 * 8, bitsizeof_varint64(-(1 << (0))))
65 self.assertEqual(1 * 8, bitsizeof_varint64((1 << (6)) - 1))
66 self.assertEqual(1 * 8, bitsizeof_varint64(-((1 << (6)) - 1)))
68 self.assertEqual(2 * 8, bitsizeof_varint64(1 << (6)))
69 self.assertEqual(2 * 8, bitsizeof_varint64(-(1 << (6))))
70 self.assertEqual(2 * 8, bitsizeof_varint64((1 << (6 + 7)) - 1))
71 self.assertEqual(2 * 8, bitsizeof_varint64(-((1 << (6 + 7)) - 1)))
73 self.assertEqual(3 * 8, bitsizeof_varint64(1 << (6 + 7)))
74 self.assertEqual(3 * 8, bitsizeof_varint64(-(1 << (6 + 7))))
75 self.assertEqual(3 * 8, bitsizeof_varint64((1 << (6 + 7 + 7)) - 1))
76 self.assertEqual(3 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7)) - 1)))
78 self.assertEqual(4 * 8, bitsizeof_varint64(1 << (6 + 7 + 7)))
79 self.assertEqual(4 * 8, bitsizeof_varint64(-(1 << (6 + 7 + 7))))
80 self.assertEqual(4 * 8, bitsizeof_varint64((1 << (6 + 7 + 7 + 7)) - 1))
81 self.assertEqual(4 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7 + 7)) - 1)))
83 self.assertEqual(5 * 8, bitsizeof_varint64(1 << (6 + 7 + 7 + 7)))
84 self.assertEqual(5 * 8, bitsizeof_varint64(-(1 << (6 + 7 + 7 + 7))))
85 self.assertEqual(5 * 8, bitsizeof_varint64((1 << (6 + 7 + 7 + 7 + 7)) - 1))
86 self.assertEqual(5 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7 + 7 + 7)) - 1)))
88 self.assertEqual(6 * 8, bitsizeof_varint64(1 << (6 + 7 + 7 + 7 + 7)))
89 self.assertEqual(6 * 8, bitsizeof_varint64(-(1 << (6 + 7 + 7 + 7 + 7))))
90 self.assertEqual(6 * 8, bitsizeof_varint64((1 << (6 + 7 + 7 + 7 + 7 + 7)) - 1))
91 self.assertEqual(6 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7 + 7 + 7 + 7)) - 1)))
93 self.assertEqual(7 * 8, bitsizeof_varint64(1 << (6 + 7 + 7 + 7 + 7 + 7)))
94 self.assertEqual(7 * 8, bitsizeof_varint64(-(1 << (6 + 7 + 7 + 7 + 7 + 7))))
95 self.assertEqual(7 * 8, bitsizeof_varint64((1 << (6 + 7 + 7 + 7 + 7 + 7 + 7)) - 1))
96 self.assertEqual(7 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7 + 7 + 7 + 7 + 7)) - 1)))
98 self.assertEqual(8 * 8, bitsizeof_varint64(1 << (6 + 7 + 7 + 7 + 7 + 7 + 7)))
99 self.assertEqual(8 * 8, bitsizeof_varint64(-(1 << (6 + 7 + 7 + 7 + 7 + 7 + 7))))
100 self.assertEqual(8 * 8, bitsizeof_varint64((1 << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1))
101 self.assertEqual(8 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1)))
103 with self.assertRaises(PythonRuntimeException):
104 bitsizeof_varint64(-(1 << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 8))) # below the lower bound
106 with self.assertRaises(PythonRuntimeException):
107 bitsizeof_varint64(1 << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) # above the upper bound
109 def test_bitsizeof_varint(self):
110 self.assertEqual(8, bitsizeof_varint(0))
111 self.assertEqual(8, bitsizeof_varint(-(1 << 6) + 1))
112 self.assertEqual(8, bitsizeof_varint((1 << 6) - 1))
113 self.assertEqual(16, bitsizeof_varint(-(1 << 6)))
114 self.assertEqual(16, bitsizeof_varint((1 << 6)))
115 self.assertEqual(16, bitsizeof_varint(-(1 << 13) + 1))
116 self.assertEqual(16, bitsizeof_varint((1 << 13) - 1))
117 self.assertEqual(24, bitsizeof_varint(-(1 << 13)))
118 self.assertEqual(24, bitsizeof_varint((1 << 13)))
119 self.assertEqual(24, bitsizeof_varint(-(1 << 20) + 1))
120 self.assertEqual(24, bitsizeof_varint((1 << 20) - 1))
121 self.assertEqual(32, bitsizeof_varint(-(1 << 20)))
122 self.assertEqual(32, bitsizeof_varint((1 << 20)))
123 self.assertEqual(32, bitsizeof_varint(-(1 << 27) + 1))
124 self.assertEqual(32, bitsizeof_varint((1 << 27) - 1))
125 self.assertEqual(40, bitsizeof_varint(-(1 << 27)))
126 self.assertEqual(40, bitsizeof_varint((1 << 27)))
127 self.assertEqual(40, bitsizeof_varint(-(1 << 34) + 1))
128 self.assertEqual(40, bitsizeof_varint((1 << 34) - 1))
129 self.assertEqual(48, bitsizeof_varint(-(1 << 34)))
130 self.assertEqual(48, bitsizeof_varint((1 << 34)))
131 self.assertEqual(48, bitsizeof_varint(-(1 << 41) + 1))
132 self.assertEqual(48, bitsizeof_varint((1 << 41) - 1))
133 self.assertEqual(56, bitsizeof_varint(-(1 << 41)))
134 self.assertEqual(56, bitsizeof_varint((1 << 41)))
135 self.assertEqual(56, bitsizeof_varint(-(1 << 48) + 1))
136 self.assertEqual(56, bitsizeof_varint((1 << 48) - 1))
137 self.assertEqual(64, bitsizeof_varint(-(1 << 48)))
138 self.assertEqual(64, bitsizeof_varint((1 << 48)))
139 self.assertEqual(64, bitsizeof_varint(-(1 << 55) + 1))
140 self.assertEqual(64, bitsizeof_varint((1 << 55) - 1))
141 self.assertEqual(72, bitsizeof_varint(-(1 << 55)))
142 self.assertEqual(72, bitsizeof_varint((1 << 55)))
143 self.assertEqual(72, bitsizeof_varint(-(1 << 63) + 1))
144 self.assertEqual(72, bitsizeof_varint((1 << 63) - 1))
146 # special case, INT64_MIN is stored as -0
147 self.assertEqual(8, bitsizeof_varint(INT64_MIN))
149 with self.assertRaises(PythonRuntimeException):
150 bitsizeof_varint(INT64_MIN - 1) # below the lower bound
152 with self.assertRaises(PythonRuntimeException):
153 bitsizeof_varint(1 << 63) # above the upper bound
155 def test_bitsizeof_varuint16(self):
156 self.assertEqual(1 * 8, bitsizeof_varuint16(0))
158 self.assertEqual(1 * 8, bitsizeof_varuint16(1 << (0)))
159 self.assertEqual(1 * 8, bitsizeof_varuint16((1 << (7)) - 1))
161 self.assertEqual(2 * 8, bitsizeof_varuint16(1 << (7)))
162 self.assertEqual(2 * 8, bitsizeof_varuint16((1 << (7 + 8)) - 1))
164 with self.assertRaises(PythonRuntimeException):
165 bitsizeof_varuint16(-1) # below the lower bound
167 with self.assertRaises(PythonRuntimeException):
168 bitsizeof_varuint16(1 << (7 + 8)) # above the upper bound
170 def test_bitsizeof_varuint32(self):
171 self.assertEqual(1 * 8, bitsizeof_varuint32(0))
173 self.assertEqual(1 * 8, bitsizeof_varuint32(1 << (0)))
174 self.assertEqual(1 * 8, bitsizeof_varuint32((1 << (7)) - 1))
176 self.assertEqual(2 * 8, bitsizeof_varuint32(1 << (7)))
177 self.assertEqual(2 * 8, bitsizeof_varuint32((1 << (7 + 7)) - 1))
179 self.assertEqual(3 * 8, bitsizeof_varuint32(1 << (7 + 7)))
180 self.assertEqual(3 * 8, bitsizeof_varuint32((1 << (7 + 7 + 7)) - 1))
182 self.assertEqual(4 * 8, bitsizeof_varuint32(1 << (7 + 7 + 7)))
183 self.assertEqual(4 * 8, bitsizeof_varuint32((1 << (7 + 7 + 7 + 8)) - 1))
185 with self.assertRaises(PythonRuntimeException):
186 bitsizeof_varuint32(-1) # below the lower bound
188 with self.assertRaises(PythonRuntimeException):
189 bitsizeof_varuint32(1 << (7 + 7 + 7 + 8)) # above the upper bound
191 def test_bitsizeof_varuint64(self):
192 self.assertEqual(1 * 8, bitsizeof_varuint64(0))
194 self.assertEqual(1 * 8, bitsizeof_varuint64(1 << (0)))
195 self.assertEqual(1 * 8, bitsizeof_varuint64((1 << (7)) - 1))
197 self.assertEqual(2 * 8, bitsizeof_varuint64(1 << (7)))
198 self.assertEqual(2 * 8, bitsizeof_varuint64((1 << (7 + 7)) - 1))
200 self.assertEqual(3 * 8, bitsizeof_varuint64(1 << (7 + 7)))
201 self.assertEqual(3 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7)) - 1))
203 self.assertEqual(4 * 8, bitsizeof_varuint64(1 << (7 + 7 + 7)))
204 self.assertEqual(4 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7 + 7)) - 1))
206 self.assertEqual(5 * 8, bitsizeof_varuint64(1 << (7 + 7 + 7 + 7)))
207 self.assertEqual(5 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7 + 7 + 7)) - 1))
209 self.assertEqual(6 * 8, bitsizeof_varuint64(1 << (7 + 7 + 7 + 7 + 7)))
210 self.assertEqual(6 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7 + 7 + 7 + 7)) - 1))
212 self.assertEqual(7 * 8, bitsizeof_varuint64(1 << (7 + 7 + 7 + 7 + 7 + 7)))
213 self.assertEqual(7 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7 + 7 + 7 + 7 + 7)) - 1))
215 self.assertEqual(8 * 8, bitsizeof_varuint64(1 << (7 + 7 + 7 + 7 + 7 + 7 + 7)))
216 self.assertEqual(8 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1))
218 with self.assertRaises(PythonRuntimeException):
219 bitsizeof_varuint64(-1) # below the lower bound
221 with self.assertRaises(PythonRuntimeException):
222 bitsizeof_varuint64(1 << (7 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) # above the upper bound
224 def test_bitsizeof_varuint(self):
225 self.assertEqual(8, bitsizeof_varuint(0))
226 self.assertEqual(8, bitsizeof_varuint((1 << 7) - 1))
227 self.assertEqual(16, bitsizeof_varuint((1 << 7)))
228 self.assertEqual(16, bitsizeof_varuint((1 << 14) - 1))
229 self.assertEqual(24, bitsizeof_varuint((1 << 14)))
230 self.assertEqual(24, bitsizeof_varuint((1 << 21) - 1))
231 self.assertEqual(32, bitsizeof_varuint((1 << 21)))
232 self.assertEqual(32, bitsizeof_varuint((1 << 28) - 1))
233 self.assertEqual(40, bitsizeof_varuint((1 << 28)))
234 self.assertEqual(40, bitsizeof_varuint((1 << 35) - 1))
235 self.assertEqual(48, bitsizeof_varuint((1 << 35)))
236 self.assertEqual(48, bitsizeof_varuint((1 << 42) - 1))
237 self.assertEqual(56, bitsizeof_varuint((1 << 42)))
238 self.assertEqual(56, bitsizeof_varuint((1 << 49) - 1))
239 self.assertEqual(64, bitsizeof_varuint((1 << 49)))
240 self.assertEqual(64, bitsizeof_varuint((1 << 56) - 1))
241 self.assertEqual(72, bitsizeof_varuint((1 << 56)))
242 self.assertEqual(72, bitsizeof_varuint((1 << 64) - 1))
244 with self.assertRaises(PythonRuntimeException):
245 bitsizeof_varuint(-1) # below the lower bound
247 with self.assertRaises(PythonRuntimeException):
248 bitsizeof_varuint(1 << 64) # above the upper bound
250 def test_bitsizeof_varsize(self):
251 self.assertEqual(1 * 8, bitsizeof_varsize(0))
253 self.assertEqual(1 * 8, bitsizeof_varsize(1 << (0)))
254 self.assertEqual(1 * 8, bitsizeof_varsize((1 << (7)) - 1))
256 self.assertEqual(2 * 8, bitsizeof_varsize(1 << (7)))
257 self.assertEqual(2 * 8, bitsizeof_varsize((1 << (7 + 7)) - 1))
259 self.assertEqual(3 * 8, bitsizeof_varsize(1 << (7 + 7)))
260 self.assertEqual(3 * 8, bitsizeof_varsize((1 << (7 + 7 + 7)) - 1))
262 self.assertEqual(4 * 8, bitsizeof_varsize(1 << (7 + 7 + 7)))
263 self.assertEqual(4 * 8, bitsizeof_varsize((1 << (7 + 7 + 7 + 7)) - 1))
265 self.assertEqual(5 * 8, bitsizeof_varsize(1 << (7 + 7 + 7 + 7)))
266 self.assertEqual(5 * 8, bitsizeof_varsize((1 << (2 + 7 + 7 + 7 + 8)) - 1))
268 with self.assertRaises(PythonRuntimeException):
269 bitsizeof_varsize(-1) # below the lower bound
271 with self.assertRaises(PythonRuntimeException):
272 bitsizeof_varsize(1 << (2 + 7 + 7 + 7 + 8)) # above the upper bound
274 def test_bitsizeof_string(self):
275 self.assertEqual((1 + 1) * 8, bitsizeof_string("T"))
276 self.assertEqual((1 + 4) * 8, bitsizeof_string("TEST"))
278 test_string_length = 1 << 7 # 2 bytes per character!
279 test_string = (b'\xc2\xAB' * test_string_length).decode("utf-8")
280 self.assertEqual((2 + 2 * test_string_length) * 8, bitsizeof_string(test_string))
282 def test_bitsizeof_bitbuffer(self):
283 test_bitbuffer1 = BitBuffer(bytes([0xAB, 0x03]), 8)
284 self.assertEqual(8 + 8, bitsizeof_bitbuffer(test_bitbuffer1))
286 test_bitbuffer2 = BitBuffer(bytes([0xAB, 0x03]), 11)
287 self.assertEqual(8 + 11, bitsizeof_bitbuffer(test_bitbuffer2))
289 test_bitbuffer3 = BitBuffer(bytes([0xAB, 0xCD]), 16)
290 self.assertEqual(8 + 16, bitsizeof_bitbuffer(test_bitbuffer3))
292 test_bitbuffer4 = BitBuffer(bytes([0xAB, 0xCD]))
293 self.assertEqual(8 + 16, bitsizeof_bitbuffer(test_bitbuffer4))
295 test_bitbuffer5 = BitBuffer(bytes(16 * [1]), 127)
296 self.assertEqual(8 + 15 * 8 + 7, bitsizeof_bitbuffer(test_bitbuffer5))
298 test_bitbuffer6 = BitBuffer(bytes(16 * [1]), 128)
299 self.assertEqual(16 + 16 * 8, bitsizeof_bitbuffer(test_bitbuffer6))