11 from pyuavcan_v0
import transport
17 bits = transport.bits_from_bytes(bytearray(b
""))
18 self.assertEqual(bits,
"")
21 bits = transport.bits_from_bytes(bytearray(b
"\x00"))
22 self.assertEqual(bits,
"00000000")
24 bits = transport.bits_from_bytes(bytearray(b
"\xA5"))
25 self.assertEqual(bits,
"10100101")
27 bits = transport.bits_from_bytes(bytearray(b
"\xFF"))
28 self.assertEqual(bits,
"11111111")
30 bits = transport.bits_from_bytes(bytearray(b
"\x0F"))
31 self.assertEqual(bits,
"00001111")
33 bits = transport.bits_from_bytes(bytearray(b
"\xF0"))
34 self.assertEqual(bits,
"11110000")
37 bits = transport.bits_from_bytes(bytearray(b
"\x00\xFF"))
38 self.assertEqual(bits,
"0000000011111111")
40 bits = transport.bits_from_bytes(bytearray(b
"\xFF\x00"))
41 self.assertEqual(bits,
"1111111100000000")
43 bits = transport.bits_from_bytes(bytearray(b
"\x00\x00\xAA\x55\xFF\xFF"))
45 bits,
"000000000000000010101010010101011111111111111111")
50 result_bytes = transport.bytes_from_bits(
"")
51 self.assertEqual(result_bytes, b
"")
54 result_bytes = transport.bytes_from_bits(
"0")
55 self.assertEqual(result_bytes, b
"\x00")
57 result_bytes = transport.bytes_from_bits(
"1")
58 self.assertEqual(result_bytes, b
"\x01")
60 result_bytes = transport.bytes_from_bits(
"100")
61 self.assertEqual(result_bytes, b
"\x04")
63 result_bytes = transport.bytes_from_bits(
"001")
64 self.assertEqual(result_bytes, b
"\x01")
66 result_bytes = transport.bytes_from_bits(
"1001")
67 self.assertEqual(result_bytes, b
"\x09")
69 result_bytes = transport.bytes_from_bits(
"01001")
70 self.assertEqual(result_bytes, b
"\x09")
72 result_bytes = transport.bytes_from_bits(
"0001001")
73 self.assertEqual(result_bytes, b
"\x09")
75 result_bytes = transport.bytes_from_bits(
"1001001")
76 self.assertEqual(result_bytes, b
"\x49")
79 result_bytes = transport.bytes_from_bits(
"10010110")
80 self.assertEqual(result_bytes, b
"\x96")
82 result_bytes = transport.bytes_from_bits(
"10100101")
83 self.assertEqual(result_bytes, b
"\xA5")
85 result_bytes = transport.bytes_from_bits(
"00000000")
86 self.assertEqual(result_bytes, b
"\x00")
89 result_bytes = transport.bytes_from_bits(
"1010010110010110")
90 self.assertEqual(result_bytes, b
"\xA5\x96")
92 result_bytes = transport.bytes_from_bits(
"11010010110010110")
93 self.assertEqual(result_bytes, b
"\xD2\xCB\x00")
95 result_bytes = transport.bytes_from_bits(
"10100101100101101")
96 self.assertEqual(result_bytes, b
"\xA5\x96\x01")
101 for bits
in (
"0",
"1",
"100",
"001",
"1001",
"01001",
"001001",
103 out_bits = transport.be_from_le_bits(bits, len(bits))
104 self.assertEqual(out_bits, bits)
107 for bits
in (
"10010110",
"10100101",
"00000000"):
108 out_bits = transport.be_from_le_bits(bits, 8)
109 self.assertEqual(out_bits, bits)
113 out_bits = transport.be_from_le_bits(
"110110101110", 12)
115 self.assertEqual(out_bits,
"111011011010")
118 out_bits = transport.be_from_le_bits(
"1010010110010110", 16)
120 self.assertEqual(out_bits,
"1001011010100101")
123 out_bits = transport.be_from_le_bits(
"11010010110010110", 17)
125 self.assertEqual(out_bits,
"01100101111010010")
128 out_bits = transport.be_from_le_bits(
"10100101100101101", 17)
130 self.assertEqual(out_bits,
"11001011010100101")
135 for bits
in (
"0",
"1",
"100",
"001",
"1001",
"01001",
"001001",
137 out_bits = transport.le_from_be_bits(bits, len(bits))
138 self.assertEqual(out_bits, bits)
141 for bits
in (
"10010110",
"10100101",
"00000000"):
142 out_bits = transport.le_from_be_bits(bits, 8)
143 self.assertEqual(out_bits, bits)
147 out_bits = transport.le_from_be_bits(
"111011011010", 12)
149 self.assertEqual(out_bits,
"110110101110")
152 out_bits = transport.le_from_be_bits(
"1001011010100101", 16)
154 self.assertEqual(out_bits,
"1010010110010110")
157 out_bits = transport.le_from_be_bits(
"01100101111010010", 17)
159 self.assertEqual(out_bits,
"11010010110010110")
162 out_bits = transport.le_from_be_bits(
"11001011010100101", 17)
164 self.assertEqual(out_bits,
"10100101100101101")
169 dtype = parser.PrimitiveType(
170 parser.PrimitiveType.KIND_UNSIGNED_INT,
172 parser.PrimitiveType.CAST_MODE_TRUNCATED)
173 value = transport.cast(0, dtype)
174 self.assertEqual(value, 0)
175 value = transport.cast(1, dtype)
176 self.assertEqual(value, 1)
177 value = transport.cast(2, dtype)
178 self.assertEqual(value, 0)
179 value = transport.cast(-1, dtype)
180 self.assertEqual(value, 1)
181 value = transport.cast(5, dtype)
182 self.assertEqual(value, 1)
183 value = transport.cast(-10, dtype)
184 self.assertEqual(value, 0)
187 dtype = parser.PrimitiveType(
188 parser.PrimitiveType.KIND_UNSIGNED_INT,
190 parser.PrimitiveType.CAST_MODE_TRUNCATED)
191 value = transport.cast(0, dtype)
192 self.assertEqual(value, 0)
193 value = transport.cast(15, dtype)
194 self.assertEqual(value, 15)
195 value = transport.cast(16, dtype)
196 self.assertEqual(value, 0)
197 value = transport.cast(-1, dtype)
198 self.assertEqual(value, 15)
199 value = transport.cast(30, dtype)
200 self.assertEqual(value, 14)
203 dtype = parser.PrimitiveType(
204 parser.PrimitiveType.KIND_UNSIGNED_INT,
206 parser.PrimitiveType.CAST_MODE_TRUNCATED)
207 value = transport.cast(0, dtype)
208 self.assertEqual(value, 0)
209 value = transport.cast(8589934591, dtype)
210 self.assertEqual(value, 8589934591)
211 value = transport.cast(8589934592, dtype)
212 self.assertEqual(value, 0)
213 value = transport.cast(-1, dtype)
214 self.assertEqual(value, 8589934591)
217 dtype = parser.PrimitiveType(
218 parser.PrimitiveType.KIND_UNSIGNED_INT,
220 parser.PrimitiveType.CAST_MODE_TRUNCATED)
221 value = transport.cast(0, dtype)
222 self.assertEqual(value, 0)
223 value = transport.cast(18446744073709551615, dtype)
224 self.assertEqual(value, 18446744073709551615)
225 value = transport.cast(-1, dtype)
226 self.assertEqual(value, 18446744073709551615)
227 value = transport.cast(18446744073709551617, dtype)
228 self.assertEqual(value, 1)
229 value = transport.cast(-18446744073709551615, dtype)
230 self.assertEqual(value, 1)
233 dtype = parser.PrimitiveType(
234 parser.PrimitiveType.KIND_UNSIGNED_INT,
236 parser.PrimitiveType.CAST_MODE_SATURATED)
237 value = transport.cast(0, dtype)
238 self.assertEqual(value, 0)
239 value = transport.cast(1, dtype)
240 self.assertEqual(value, 1)
241 value = transport.cast(2, dtype)
242 self.assertEqual(value, 1)
243 value = transport.cast(-1, dtype)
244 self.assertEqual(value, 0)
245 value = transport.cast(5, dtype)
246 self.assertEqual(value, 1)
247 value = transport.cast(-10, dtype)
248 self.assertEqual(value, 0)
251 dtype = parser.PrimitiveType(
252 parser.PrimitiveType.KIND_UNSIGNED_INT,
254 parser.PrimitiveType.CAST_MODE_SATURATED)
255 value = transport.cast(0, dtype)
256 self.assertEqual(value, 0)
257 value = transport.cast(15, dtype)
258 self.assertEqual(value, 15)
259 value = transport.cast(16, dtype)
260 self.assertEqual(value, 15)
261 value = transport.cast(-1, dtype)
262 self.assertEqual(value, 0)
263 value = transport.cast(30, dtype)
264 self.assertEqual(value, 15)
267 dtype = parser.PrimitiveType(
268 parser.PrimitiveType.KIND_UNSIGNED_INT,
270 parser.PrimitiveType.CAST_MODE_SATURATED)
271 value = transport.cast(0, dtype)
272 self.assertEqual(value, 0)
273 value = transport.cast(8589934591, dtype)
274 self.assertEqual(value, 8589934591)
275 value = transport.cast(8589934592, dtype)
276 self.assertEqual(value, 8589934591)
277 value = transport.cast(-1, dtype)
278 self.assertEqual(value, 0)
281 dtype = parser.PrimitiveType(
282 parser.PrimitiveType.KIND_UNSIGNED_INT,
284 parser.PrimitiveType.CAST_MODE_SATURATED)
285 value = transport.cast(0, dtype)
286 self.assertEqual(value, 0)
287 value = transport.cast(18446744073709551615, dtype)
288 self.assertEqual(value, 18446744073709551615)
289 value = transport.cast(-1, dtype)
290 self.assertEqual(value, 0)
291 value = transport.cast(18446744073709551617, dtype)
292 self.assertEqual(value, 18446744073709551615)
293 value = transport.cast(-18446744073709551615, dtype)
294 self.assertEqual(value, 0)
297 dtype = parser.PrimitiveType(
298 parser.PrimitiveType.KIND_SIGNED_INT,
300 parser.PrimitiveType.CAST_MODE_SATURATED)
301 value = transport.cast(0, dtype)
302 self.assertEqual(value, 0)
303 value = transport.cast(15, dtype)
304 self.assertEqual(value, 7)
305 value = transport.cast(16, dtype)
306 self.assertEqual(value, 7)
307 value = transport.cast(-1, dtype)
308 self.assertEqual(value, -1)
309 value = transport.cast(-30, dtype)
310 self.assertEqual(value, -8)
313 dtype = parser.PrimitiveType(
314 parser.PrimitiveType.KIND_SIGNED_INT,
316 parser.PrimitiveType.CAST_MODE_SATURATED)
317 value = transport.cast(0, dtype)
318 self.assertEqual(value, 0)
319 value = transport.cast(8589934591, dtype)
320 self.assertEqual(value, 4294967295)
321 value = transport.cast(-8589934592, dtype)
322 self.assertEqual(value, -4294967296)
323 value = transport.cast(-1, dtype)
324 self.assertEqual(value, -1)
327 dtype = parser.PrimitiveType(
328 parser.PrimitiveType.KIND_SIGNED_INT,
330 parser.PrimitiveType.CAST_MODE_SATURATED)
331 value = transport.cast(0, dtype)
332 self.assertEqual(value, 0)
333 value = transport.cast(18446744073709551615, dtype)
334 self.assertEqual(value, 9223372036854775808)
335 value = transport.cast(-1, dtype)
336 self.assertEqual(value, -1)
337 value = transport.cast(-18446744073709551617, dtype)
338 self.assertEqual(value, -9223372036854775809)
339 value = transport.cast(-9223372036854775808, dtype)
340 self.assertEqual(value, -9223372036854775808)
355 class TestArrayBasic(unittest.TestCase):
357 custom_type = parser.CompoundType(
359 parser.CompoundType.KIND_MESSAGE,
365 custom_type.fields = [
367 parser.PrimitiveType(
368 parser.PrimitiveType.KIND_SIGNED_INT,
370 parser.PrimitiveType.CAST_MODE_TRUNCATED
375 parser.PrimitiveType(
376 parser.PrimitiveType.KIND_FLOAT,
378 parser.PrimitiveType.CAST_MODE_SATURATED
384 parser.PrimitiveType(
385 parser.PrimitiveType.KIND_UNSIGNED_INT,
387 parser.PrimitiveType.CAST_MODE_SATURATED
389 parser.ArrayType.MODE_DYNAMIC,
396 def custom_type_factory(*args, **kwargs):
397 return transport.CompoundValue(custom_type, *args, **kwargs)
398 custom_type._instantiate = custom_type_factory
401 parser.PrimitiveType(
402 parser.PrimitiveType.KIND_SIGNED_INT,
404 parser.PrimitiveType.CAST_MODE_TRUNCATED
406 parser.ArrayType.MODE_STATIC,
410 parser.PrimitiveType(
411 parser.PrimitiveType.KIND_FLOAT,
413 parser.PrimitiveType.CAST_MODE_SATURATED
415 parser.ArrayType.MODE_STATIC,
420 parser.ArrayType.MODE_STATIC,
425 self.assertEqual(self.
a3_type.value_type.fields[2].type.value_type.bitlen, 1)
426 self.assertEqual(self.
a1_type.get_max_bitlen(), 8 * 4)
427 self.assertEqual(self.
a2_type.get_max_bitlen(), 16 * 2)
428 self.assertEqual(self.
a3_type.get_max_bitlen(), (8 + 16 + 5 + 3) * 2)
431 a1 = transport.ArrayValue(self.
a1_type)
432 a2 = transport.ArrayValue(self.
a2_type)
433 a3 = transport.ArrayValue(self.
a3_type)
442 a3[i].c.append(i2 & 1)
443 self.assertEqual(len(a3[i].c), 5)
446 transport.format_bits(a1._pack(
False)),
447 "00000000 00000001 00000010 00000011"
450 transport.format_bits(a2._pack(
False)),
451 "00000000 00000000 00000000 00111100"
454 transport.format_bits(a3._pack(
True)),
455 "00000000 00000000 00000000 10101010 " +
456 "00000001 00000000 00111100 10101010"
464 parser.CompoundType.KIND_MESSAGE,
472 parser.PrimitiveType(
473 parser.PrimitiveType.KIND_FLOAT,
475 parser.PrimitiveType.CAST_MODE_SATURATED
479 parser.Field(parser.VoidType(3),
None),
481 parser.PrimitiveType(
482 parser.PrimitiveType.KIND_UNSIGNED_INT,
484 parser.PrimitiveType.CAST_MODE_SATURATED
490 def custom_type_factory(*args, **kwargs):
491 return transport.CompoundValue(self.
custom_type, *args,
493 self.
custom_type._instantiate = custom_type_factory
496 self.assertEqual(self.
custom_type.fields[1].type.bitlen, 3)
497 self.assertEqual(self.
custom_type.get_max_bitlen(), 20)
502 transport.format_bits(c1._pack(
False)),
503 "00000000 00000000 0000"
509 transport.format_bits(c1._pack(
False)),
510 "00000000 00111100 0001"
518 parser.CompoundType.KIND_MESSAGE,
527 parser.PrimitiveType(
528 parser.PrimitiveType.KIND_FLOAT,
530 parser.PrimitiveType.CAST_MODE_SATURATED
536 parser.PrimitiveType(
537 parser.PrimitiveType.KIND_UNSIGNED_INT,
539 parser.PrimitiveType.CAST_MODE_SATURATED
541 parser.ArrayType.MODE_STATIC,
548 def custom_type_factory(*args, **kwargs):
549 return transport.CompoundValue(self.
custom_type, *args,
551 self.
custom_type._instantiate = custom_type_factory
554 self.assertEqual(self.
custom_type.fields[0].type.bitlen, 16)
555 self.assertEqual(self.
custom_type.fields[1].type.get_max_bitlen(), 16)
556 self.assertEqual(self.
custom_type.get_max_bitlen(), 17)
561 transport.format_bits(c1._pack(
True)),
562 "00000000 00000000 0"
567 self.assertEqual(transport.get_active_union_field(c2),
"a")
569 transport.format_bits(c2._pack(
True)),
570 "00000000 00011110 0"
576 self.assertEqual(transport.get_active_union_field(c3),
"b")
578 transport.format_bits(c3._pack(
False)),
579 "10000000 10000001 1"
586 self.
a = pyuavcan_v0.protocol.GetNodeInfo.Response()
591 orig_status = self.
a.status
593 self.assertEqual(orig_status.mode, 0)
594 self.assertEqual(orig_status.uptime_sec, 0)
596 self.
a.status = pyuavcan_v0.protocol.NodeStatus(mode=3, uptime_sec=12345)
598 new_status = self.
a.status
600 self.assertEqual(new_status.mode, 3)
601 self.assertEqual(new_status.uptime_sec, 12345)
604 print(repr(self.
a.name))
605 print(
str(self.
a.name))
606 self.assertEqual(self.
a.name, [])
607 self.assertEqual(self.
a.name,
'')
609 self.assertEqual(self.
a.name, [49, 50, 51])
610 self.assertEqual(self.
a.name,
'123')
611 self.
a.name = [52, 53, 54]
612 self.assertEqual(self.
a.name, [52, 53, 54])
613 self.assertEqual(self.
a.name,
'456')
614 print(repr(self.
a.name))
615 print(
str(self.
a.name))
620 def make_float(bitlen):
621 return parser.PrimitiveType(parser.PrimitiveType.KIND_FLOAT, bitlen,
622 parser.PrimitiveType.CAST_MODE_TRUNCATED)
625 a = transport.PrimitiveValue(make_float(64))
627 self.assertEqual(a.value, 0)
630 self.assertEqual(a.value, 123.456)
633 a = transport.PrimitiveValue(make_float(16))
635 self.assertEqual(a.value, 0)
637 a.value = float(
'nan')
639 self.assertEqual(
str(a.value),
'nan')
641 a.value = float(
'inf')
643 self.assertEqual(
str(a.value),
'inf')
645 a.value = float(
'-inf')
647 self.assertEqual(
str(a.value),
'-inf')
650 if __name__ ==
'__main__':