|
1 | | -from pytest import raises |
| 1 | +from pytest import mark, raises |
2 | 2 |
|
3 | | -from msgpack import Packer, packb, unpackb |
| 3 | +from msgpack import BufferFull, Packer, Unpacker, packb, unpackb |
4 | 4 |
|
5 | 5 |
|
6 | 6 | def test_unpack_buffer(): |
@@ -47,3 +47,44 @@ def test_packer_getbuffer(): |
47 | 47 | buffer.release() |
48 | 48 | packer.pack(42) |
49 | 49 | assert bytes(packer) == b"\x92*\xa5hello*" |
| 50 | + |
| 51 | + |
| 52 | +@mark.parametrize("shape", [(2, 3), (3, 2), (1, 6)]) |
| 53 | +def test_unpack_multidimensional_buffer(shape): |
| 54 | + packed = packb(b"abcd") |
| 55 | + view = memoryview(packed).cast("B", shape) |
| 56 | + assert unpackb(view) == b"abcd" |
| 57 | + |
| 58 | + unpacker = Unpacker(max_buffer_size=len(packed)) |
| 59 | + unpacker.feed(view) |
| 60 | + assert unpacker.unpack() == b"abcd" |
| 61 | + |
| 62 | + |
| 63 | +def test_feed_multidimensional_buffer_limit(): |
| 64 | + view = memoryview(packb(b"abcd")).cast("B", (2, 3)) |
| 65 | + unpacker = Unpacker(max_buffer_size=5) |
| 66 | + unpacker.feed(packb(42)) |
| 67 | + with raises(BufferFull): |
| 68 | + unpacker.feed(view) |
| 69 | + assert unpacker.unpack() == 42 |
| 70 | + unpacker.feed(packb(43)) |
| 71 | + assert unpacker.unpack() == 43 |
| 72 | + |
| 73 | + |
| 74 | +def test_unpack_scalar_buffer(): |
| 75 | + view = memoryview(packb(42)).cast("B", ()) |
| 76 | + assert unpackb(view) == 42 |
| 77 | + unpacker = Unpacker() |
| 78 | + unpacker.feed(view) |
| 79 | + assert unpacker.unpack() == 42 |
| 80 | + |
| 81 | + |
| 82 | +def test_unpack_strided_multidimensional_buffer(): |
| 83 | + packed = packb(b"abcd") |
| 84 | + padded = packed[:3] + b"xxx" + packed[3:] + b"xxx" |
| 85 | + view = memoryview(padded).cast("B", (4, 3))[::2] |
| 86 | + assert not view.contiguous |
| 87 | + assert unpackb(view) == b"abcd" |
| 88 | + unpacker = Unpacker(max_buffer_size=len(packed)) |
| 89 | + unpacker.feed(view) |
| 90 | + assert unpacker.unpack() == b"abcd" |
0 commit comments