| 
									
										
										
										
											2015-11-12 11:49:19 +01:00
										 |  |  | #!/usr/bin/env python | 
					
						
							|  |  |  | # coding: utf-8 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-05 21:34:10 +09:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | from array import array | 
					
						
							| 
									
										
										
										
											2015-11-12 11:49:19 +01:00
										 |  |  | from msgpack import packb, unpackb | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2015-11-12 11:49:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-05 21:34:10 +09:00
										 |  |  | pytestmark = pytest.mark.skipif( | 
					
						
							|  |  |  |     sys.version_info[0] < 3, reason="Only Python 3 supports buffer protocol" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-05 21:34:10 +09:00
										 |  |  | def make_array(f, data): | 
					
						
							|  |  |  |     a = array(f) | 
					
						
							|  |  |  |     a.frombytes(data) | 
					
						
							|  |  |  |     return a | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-05 00:49:48 +09:00
										 |  |  | def _runtest(format, nbytes, expected_header, expected_prefix, use_bin_type): | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  |     # create a new array | 
					
						
							|  |  |  |     original_array = array(format) | 
					
						
							|  |  |  |     original_array.fromlist([255] * (nbytes // original_array.itemsize)) | 
					
						
							| 
									
										
										
										
											2019-12-05 21:34:10 +09:00
										 |  |  |     original_data = original_array.tobytes() | 
					
						
							|  |  |  |     view = memoryview(original_array) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # pack, unpack, and reconstruct array | 
					
						
							|  |  |  |     packed = packb(view, use_bin_type=use_bin_type) | 
					
						
							| 
									
										
										
										
											2019-12-05 21:34:10 +09:00
										 |  |  |     unpacked = unpackb(packed, raw=(not use_bin_type)) | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  |     reconstructed_array = make_array(format, unpacked) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # check that we got the right amount of data | 
					
						
							|  |  |  |     assert len(original_data) == nbytes | 
					
						
							|  |  |  |     # check packed header | 
					
						
							|  |  |  |     assert packed[:1] == expected_header | 
					
						
							|  |  |  |     # check packed length prefix, if any | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     assert packed[1 : 1 + len(expected_prefix)] == expected_prefix | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  |     # check packed data | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     assert packed[1 + len(expected_prefix) :] == original_data | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  |     # check array unpacked correctly | 
					
						
							|  |  |  |     assert original_array == reconstructed_array | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_fixstr_from_byte(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("B", 1, b"\xa1", b"", False) | 
					
						
							|  |  |  |     _runtest("B", 31, b"\xbf", b"", False) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_fixstr_from_float(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("f", 4, b"\xa4", b"", False) | 
					
						
							|  |  |  |     _runtest("f", 28, b"\xbc", b"", False) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_str16_from_byte(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("B", 2 ** 8, b"\xda", b"\x01\x00", False) | 
					
						
							|  |  |  |     _runtest("B", 2 ** 16 - 1, b"\xda", b"\xff\xff", False) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_str16_from_float(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("f", 2 ** 8, b"\xda", b"\x01\x00", False) | 
					
						
							|  |  |  |     _runtest("f", 2 ** 16 - 4, b"\xda", b"\xff\xfc", False) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_str32_from_byte(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("B", 2 ** 16, b"\xdb", b"\x00\x01\x00\x00", False) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_str32_from_float(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("f", 2 ** 16, b"\xdb", b"\x00\x01\x00\x00", False) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_bin8_from_byte(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("B", 1, b"\xc4", b"\x01", True) | 
					
						
							|  |  |  |     _runtest("B", 2 ** 8 - 1, b"\xc4", b"\xff", True) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_bin8_from_float(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("f", 4, b"\xc4", b"\x04", True) | 
					
						
							|  |  |  |     _runtest("f", 2 ** 8 - 4, b"\xc4", b"\xfc", True) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_bin16_from_byte(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("B", 2 ** 8, b"\xc5", b"\x01\x00", True) | 
					
						
							|  |  |  |     _runtest("B", 2 ** 16 - 1, b"\xc5", b"\xff\xff", True) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_bin16_from_float(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("f", 2 ** 8, b"\xc5", b"\x01\x00", True) | 
					
						
							|  |  |  |     _runtest("f", 2 ** 16 - 4, b"\xc5", b"\xff\xfc", True) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_bin32_from_byte(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("B", 2 ** 16, b"\xc6", b"\x00\x01\x00\x00", True) | 
					
						
							| 
									
										
										
										
											2016-04-28 15:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 10:04:09 +02:00
										 |  |  | def test_bin32_from_float(): | 
					
						
							| 
									
										
										
										
											2019-12-05 18:51:45 +09:00
										 |  |  |     _runtest("f", 2 ** 16, b"\xc6", b"\x00\x01\x00\x00", True) |