test_sequnpack.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # coding: utf-8
  2. import pytest
  3. from pandas import compat
  4. from pandas.io.msgpack import BufferFull, OutOfData, Unpacker
  5. class TestPack(object):
  6. def test_partial_data(self):
  7. unpacker = Unpacker()
  8. msg = "No more data to unpack"
  9. for data in [b"\xa5", b"h", b"a", b"l", b"l"]:
  10. unpacker.feed(data)
  11. with pytest.raises(StopIteration, match=msg):
  12. next(iter(unpacker))
  13. unpacker.feed(b"o")
  14. assert next(iter(unpacker)) == b"hallo"
  15. def test_foobar(self):
  16. unpacker = Unpacker(read_size=3, use_list=1)
  17. unpacker.feed(b'foobar')
  18. assert unpacker.unpack() == ord(b'f')
  19. assert unpacker.unpack() == ord(b'o')
  20. assert unpacker.unpack() == ord(b'o')
  21. assert unpacker.unpack() == ord(b'b')
  22. assert unpacker.unpack() == ord(b'a')
  23. assert unpacker.unpack() == ord(b'r')
  24. msg = "No more data to unpack"
  25. with pytest.raises(OutOfData, match=msg):
  26. unpacker.unpack()
  27. unpacker.feed(b'foo')
  28. unpacker.feed(b'bar')
  29. k = 0
  30. for o, e in zip(unpacker, 'foobarbaz'):
  31. assert o == ord(e)
  32. k += 1
  33. assert k == len(b'foobar')
  34. def test_foobar_skip(self):
  35. unpacker = Unpacker(read_size=3, use_list=1)
  36. unpacker.feed(b'foobar')
  37. assert unpacker.unpack() == ord(b'f')
  38. unpacker.skip()
  39. assert unpacker.unpack() == ord(b'o')
  40. unpacker.skip()
  41. assert unpacker.unpack() == ord(b'a')
  42. unpacker.skip()
  43. msg = "No more data to unpack"
  44. with pytest.raises(OutOfData, match=msg):
  45. unpacker.unpack()
  46. def test_maxbuffersize_read_size_exceeds_max_buffer_size(self):
  47. msg = "read_size should be less or equal to max_buffer_size"
  48. with pytest.raises(ValueError, match=msg):
  49. Unpacker(read_size=5, max_buffer_size=3)
  50. def test_maxbuffersize_bufferfull(self):
  51. unpacker = Unpacker(read_size=3, max_buffer_size=3, use_list=1)
  52. unpacker.feed(b'foo')
  53. with pytest.raises(BufferFull, match=r'^$'):
  54. unpacker.feed(b'b')
  55. def test_maxbuffersize(self):
  56. unpacker = Unpacker(read_size=3, max_buffer_size=3, use_list=1)
  57. unpacker.feed(b'foo')
  58. assert ord('f') == next(unpacker)
  59. unpacker.feed(b'b')
  60. assert ord('o') == next(unpacker)
  61. assert ord('o') == next(unpacker)
  62. assert ord('b') == next(unpacker)
  63. def test_readbytes(self):
  64. unpacker = Unpacker(read_size=3)
  65. unpacker.feed(b'foobar')
  66. assert unpacker.unpack() == ord(b'f')
  67. assert unpacker.read_bytes(3) == b'oob'
  68. assert unpacker.unpack() == ord(b'a')
  69. assert unpacker.unpack() == ord(b'r')
  70. # Test buffer refill
  71. unpacker = Unpacker(compat.BytesIO(b'foobar'), read_size=3)
  72. assert unpacker.unpack() == ord(b'f')
  73. assert unpacker.read_bytes(3) == b'oob'
  74. assert unpacker.unpack() == ord(b'a')
  75. assert unpacker.unpack() == ord(b'r')
  76. def test_issue124(self):
  77. unpacker = Unpacker()
  78. unpacker.feed(b'\xa1?\xa1!')
  79. assert tuple(unpacker) == (b'?', b'!')
  80. assert tuple(unpacker) == ()
  81. unpacker.feed(b"\xa1?\xa1")
  82. assert tuple(unpacker) == (b'?', )
  83. assert tuple(unpacker) == ()
  84. unpacker.feed(b"!")
  85. assert tuple(unpacker) == (b'!', )
  86. assert tuple(unpacker) == ()