test_constbitstream.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #!/usr/bin/env python
  2. import unittest
  3. import sys
  4. sys.path.insert(0, '..')
  5. import bitstring
  6. from bitstring import ConstBitStream as CBS
  7. class All(unittest.TestCase):
  8. def testFromFile(self):
  9. s = CBS(filename='test.m1v')
  10. self.assertEqual(s[0:32].hex, '000001b3')
  11. self.assertEqual(s.read(8 * 4).hex, '000001b3')
  12. width = s.read(12).uint
  13. height = s.read(12).uint
  14. self.assertEqual((width, height), (352, 288))
  15. class InterleavedExpGolomb(unittest.TestCase):
  16. def testReading(self):
  17. s = CBS(uie=333)
  18. a = s.read('uie')
  19. self.assertEqual(a, 333)
  20. s = CBS('uie=12, sie=-9, sie=9, uie=1000000')
  21. u = s.unpack('uie, 2*sie, uie')
  22. self.assertEqual(u, [12, -9, 9, 1000000])
  23. def testReadingErrors(self):
  24. s = CBS(10)
  25. self.assertRaises(bitstring.ReadError, s.read, 'uie')
  26. self.assertEqual(s.pos, 0)
  27. self.assertRaises(bitstring.ReadError, s.read, 'sie')
  28. self.assertEqual(s.pos, 0)
  29. class ReadTo(unittest.TestCase):
  30. def testByteAligned(self):
  31. a = CBS('0xaabb00aa00bb')
  32. b = a.readto('0x00', bytealigned=True)
  33. self.assertEqual(b, '0xaabb00')
  34. self.assertEqual(a.bytepos, 3)
  35. b = a.readto('0xaa', bytealigned=True)
  36. self.assertEqual(b, '0xaa')
  37. self.assertRaises(bitstring.ReadError, a.readto, '0xcc', bytealigned=True)
  38. def testNotAligned(self):
  39. a = CBS('0b00111001001010011011')
  40. a.pos = 1
  41. self.assertEqual(a.readto('0b00'), '0b011100')
  42. self.assertEqual(a.readto('0b110'), '0b10010100110')
  43. self.assertRaises(ValueError, a.readto, '')
  44. def testDisallowIntegers(self):
  45. a = CBS('0x0f')
  46. self.assertRaises(ValueError, a.readto, 4)
  47. def testReadingLines(self):
  48. s = b"This is a test\nof reading lines\nof text\n"
  49. b = CBS(bytes=s)
  50. n = bitstring.Bits(bytes=b'\n')
  51. self.assertEqual(b.readto(n).bytes, b'This is a test\n')
  52. self.assertEqual(b.readto(n).bytes, b'of reading lines\n')
  53. self.assertEqual(b.readto(n).bytes, b'of text\n')
  54. class Subclassing(unittest.TestCase):
  55. def testIsInstance(self):
  56. class SubBits(CBS): pass
  57. a = SubBits()
  58. self.assertTrue(isinstance(a, SubBits))
  59. def testClassType(self):
  60. class SubBits(CBS): pass
  61. self.assertEqual(SubBits().__class__, SubBits)
  62. class PadToken(unittest.TestCase):
  63. def testRead(self):
  64. s = CBS('0b100011110001')
  65. a = s.read('pad:1')
  66. self.assertEqual(a, None)
  67. self.assertEqual(s.pos, 1)
  68. a = s.read(3)
  69. self.assertEqual(a, CBS('0b000'))
  70. a = s.read('pad:0')
  71. self.assertEqual(a, None)
  72. self.assertEqual(s.pos, 4)
  73. def testReadList(self):
  74. s = CBS('0b10001111001')
  75. t = s.readlist('pad:1, uint:3, pad:4, uint:3')
  76. self.assertEqual(t, [0, 1])
  77. s.pos = 0
  78. t = s.readlist('pad:1, pad:5')
  79. self.assertEqual(t, [])
  80. self.assertEqual(s.pos, 6)
  81. s.pos = 0
  82. t = s.readlist('pad:1, bin, pad:4, uint:3')
  83. self.assertEqual(t, ['000', 1])
  84. s.pos = 0
  85. t = s.readlist('pad, bin:3, pad:4, uint:3')
  86. self.assertEqual(t, ['000', 1])
  87. class ReadingBytes(unittest.TestCase):
  88. def testUnpackingBytes(self):
  89. s = CBS(80)
  90. t = s.unpack('bytes:1')
  91. self.assertEqual(t[0], b'\x00')
  92. a, b, c = s.unpack('bytes:1, bytes, bytes:2')
  93. self.assertEqual(a, b'\x00')
  94. self.assertEqual(b, b'\x00'*7)
  95. self.assertEqual(c, b'\x00'*2)
  96. def testUnpackingBytesWithKeywords(self):
  97. s = CBS('0x55'*10)
  98. t = s.unpack('pad:a, bytes:b, bytes, pad:a', a=4, b=6)
  99. self.assertEqual(t, [b'\x55'*6, b'\x55'*3])