2015-11-12 11:49:19 +01:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# coding: utf-8
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
2016-04-28 15:08:28 +02:00
|
|
|
# For Python < 3:
|
|
|
|
# - array type only supports old buffer interface
|
|
|
|
# - array.frombytes is not available, must use deprecated array.fromstring
|
|
|
|
if sys.version_info[0] < 3:
|
|
|
|
def __memoryview(obj):
|
|
|
|
return memoryview(buffer(obj))
|
|
|
|
|
|
|
|
def __make_array(f, data):
|
|
|
|
a = array(f)
|
|
|
|
a.fromstring(data)
|
|
|
|
return a
|
|
|
|
|
|
|
|
def __get_data(a):
|
|
|
|
return a.tostring()
|
|
|
|
else:
|
|
|
|
__memoryview = memoryview
|
|
|
|
|
|
|
|
def __make_array(f, data):
|
|
|
|
a = array(f)
|
|
|
|
a.frombytes(data)
|
|
|
|
return a
|
|
|
|
|
|
|
|
def __get_data(a):
|
|
|
|
return a.tobytes()
|
|
|
|
|
|
|
|
|
|
|
|
def __run_test(format, nbytes, expected_header, expected_prefix, use_bin_type):
|
|
|
|
# create a new array
|
|
|
|
original_array = array(format)
|
|
|
|
original_array.fromlist([255] * (nbytes // original_array.itemsize))
|
|
|
|
original_data = __get_data(original_array)
|
|
|
|
view = __memoryview(original_array)
|
|
|
|
|
|
|
|
# pack, unpack, and reconstruct array
|
|
|
|
packed = packb(view, use_bin_type=use_bin_type)
|
|
|
|
unpacked = unpackb(packed)
|
|
|
|
reconstructed_array = __make_array(format, unpacked)
|
|
|
|
|
|
|
|
# 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
|
|
|
|
assert packed[1:1+len(expected_prefix)] == expected_prefix
|
|
|
|
# check packed data
|
|
|
|
assert packed[1+len(expected_prefix):] == original_data
|
|
|
|
# check array unpacked correctly
|
|
|
|
assert original_array == reconstructed_array
|
|
|
|
|
|
|
|
|
|
|
|
# -----------
|
|
|
|
# test fixstr
|
|
|
|
# -----------
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_byte_fixstr():
|
|
|
|
__run_test('B', 31, b'\xbf', b'', False)
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_float_fixstr():
|
|
|
|
__run_test('f', 28, b'\xbc', b'', False)
|
|
|
|
|
|
|
|
|
|
|
|
# ----------
|
|
|
|
# test str16
|
|
|
|
# ----------
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_byte_str16():
|
|
|
|
__run_test('B', 2**8, b'\xda', b'\x01\x00', False)
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_float_str16():
|
|
|
|
__run_test('f', 2**8, b'\xda', b'\x01\x00', False)
|
|
|
|
|
|
|
|
|
|
|
|
# ----------
|
|
|
|
# test str32
|
|
|
|
# ----------
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_byte_str32():
|
|
|
|
__run_test('B', 2**16, b'\xdb', b'\x00\x01\x00\x00', False)
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_float_str32():
|
|
|
|
__run_test('f', 2**16, b'\xdb', b'\x00\x01\x00\x00', False)
|
|
|
|
|
|
|
|
|
|
|
|
# ---------
|
|
|
|
# test bin8
|
|
|
|
# ---------
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_byte_bin8():
|
|
|
|
__run_test('B', 1, b'\xc4', b'\x01', True)
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_float_bin8():
|
|
|
|
__run_test('f', 4, b'\xc4', b'\x04', True)
|
|
|
|
|
|
|
|
|
|
|
|
# ----------
|
|
|
|
# test bin16
|
|
|
|
# ----------
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_byte_bin16():
|
|
|
|
__run_test('B', 2**8, b'\xc5', b'\x01\x00', True)
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_float_bin16():
|
|
|
|
__run_test('f', 2**8, b'\xc5', b'\x01\x00', True)
|
|
|
|
|
|
|
|
|
|
|
|
# ----------
|
|
|
|
# test bin32
|
|
|
|
# ----------
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_byte_bin32():
|
|
|
|
__run_test('B', 2**16, b'\xc6', b'\x00\x01\x00\x00', True)
|
|
|
|
|
|
|
|
|
|
|
|
def test_memoryview_float_bin32():
|
|
|
|
__run_test('f', 2**16, b'\xc6', b'\x00\x01\x00\x00', True)
|