summaryrefslogtreecommitdiff
path: root/test/test_memoryview.py
blob: f555c5b0548e1042b920ad0df23e5c90668c5c29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env python
# coding: utf-8


from array import array
from msgpack import packb, unpackb
import sys


# 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)