test_bits.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. #!/usr/bin/env python
  2. import unittest
  3. import sys
  4. sys.path.insert(0, '..')
  5. import bitstring
  6. from bitstring import MmapByteArray
  7. from bitstring import Bits, BitArray, ConstByteStore, ByteStore
  8. class Creation(unittest.TestCase):
  9. def testCreationFromBytes(self):
  10. s = Bits(bytes=b'\xa0\xff')
  11. self.assertEqual((s.len, s.hex), (16, 'a0ff'))
  12. s = Bits(bytes=b'abc', length=0)
  13. self.assertEqual(s, '')
  14. def testCreationFromBytesErrors(self):
  15. self.assertRaises(bitstring.CreationError, Bits, bytes=b'abc', length=25)
  16. def testCreationFromDataWithOffset(self):
  17. s1 = Bits(bytes=b'\x0b\x1c\x2f', offset=0, length=20)
  18. s2 = Bits(bytes=b'\xa0\xb1\xC2', offset=4)
  19. self.assertEqual((s2.len, s2.hex), (20, '0b1c2'))
  20. self.assertEqual((s1.len, s1.hex), (20, '0b1c2'))
  21. self.assertTrue(s1 == s2)
  22. def testCreationFromHex(self):
  23. s = Bits(hex='0xA0ff')
  24. self.assertEqual((s.len, s.hex), (16, 'a0ff'))
  25. s = Bits(hex='0x0x0X')
  26. self.assertEqual((s.length, s.hex), (0, ''))
  27. def testCreationFromHexWithWhitespace(self):
  28. s = Bits(hex=' \n0 X a 4e \r3 \n')
  29. self.assertEqual(s.hex, 'a4e3')
  30. def testCreationFromHexErrors(self):
  31. self.assertRaises(bitstring.CreationError, Bits, hex='0xx0')
  32. self.assertRaises(bitstring.CreationError, Bits, hex='0xX0')
  33. self.assertRaises(bitstring.CreationError, Bits, hex='0Xx0')
  34. self.assertRaises(bitstring.CreationError, Bits, hex='-2e')
  35. # These really should fail, but it's awkward and not a big deal...
  36. # self.assertRaises(bitstring.CreationError, Bits, '0x2', length=2)
  37. # self.assertRaises(bitstring.CreationError, Bits, '0x3', offset=1)
  38. def testCreationFromBin(self):
  39. s = Bits(bin='1010000011111111')
  40. self.assertEqual((s.length, s.hex), (16, 'a0ff'))
  41. s = Bits(bin='00')[:1]
  42. self.assertEqual(s.bin, '0')
  43. s = Bits(bin=' 0000 \n 0001\r ')
  44. self.assertEqual(s.bin, '00000001')
  45. def testCreationFromBinWithWhitespace(self):
  46. s = Bits(bin=' \r\r\n0 B 00 1 1 \t0 ')
  47. self.assertEqual(s.bin, '00110')
  48. def testCreationFromOctErrors(self):
  49. s = Bits('0b00011')
  50. self.assertRaises(bitstring.InterpretError, s._getoct)
  51. self.assertRaises(bitstring.CreationError, s._setoct, '8')
  52. def testCreationFromUintWithOffset(self):
  53. self.assertRaises(bitstring.Error, Bits, uint=12, length=8, offset=1)
  54. def testCreationFromUintErrors(self):
  55. self.assertRaises(bitstring.CreationError, Bits, uint=-1, length=10)
  56. self.assertRaises(bitstring.CreationError, Bits, uint=12)
  57. self.assertRaises(bitstring.CreationError, Bits, uint=4, length=2)
  58. self.assertRaises(bitstring.CreationError, Bits, uint=0, length=0)
  59. self.assertRaises(bitstring.CreationError, Bits, uint=12, length=-12)
  60. def testCreationFromInt(self):
  61. s = Bits(int=0, length=4)
  62. self.assertEqual(s.bin, '0000')
  63. s = Bits(int=1, length=2)
  64. self.assertEqual(s.bin, '01')
  65. s = Bits(int=-1, length=11)
  66. self.assertEqual(s.bin, '11111111111')
  67. s = Bits(int=12, length=7)
  68. self.assertEqual(s.int, 12)
  69. s = Bits(int=-243, length=108)
  70. self.assertEqual((s.int, s.length), (-243, 108))
  71. for length in range(6, 10):
  72. for value in range(-17, 17):
  73. s = Bits(int=value, length=length)
  74. self.assertEqual((s.int, s.length), (value, length))
  75. s = Bits(int=10, length=8)
  76. def testCreationFromIntErrors(self):
  77. self.assertRaises(bitstring.CreationError, Bits, int=-1, length=0)
  78. self.assertRaises(bitstring.CreationError, Bits, int=12)
  79. self.assertRaises(bitstring.CreationError, Bits, int=4, length=3)
  80. self.assertRaises(bitstring.CreationError, Bits, int=-5, length=3)
  81. def testCreationFromSe(self):
  82. for i in range(-100, 10):
  83. s = Bits(se=i)
  84. self.assertEqual(s.se, i)
  85. def testCreationFromSeWithOffset(self):
  86. self.assertRaises(bitstring.CreationError, Bits, se=-13, offset=1)
  87. def testCreationFromSeErrors(self):
  88. self.assertRaises(bitstring.CreationError, Bits, se=-5, length=33)
  89. s = Bits(bin='001000')
  90. self.assertRaises(bitstring.InterpretError, s._getse)
  91. def testCreationFromUe(self):
  92. [self.assertEqual(Bits(ue=i).ue, i) for i in range(0, 20)]
  93. def testCreationFromUeWithOffset(self):
  94. self.assertRaises(bitstring.CreationError, Bits, ue=104, offset=2)
  95. def testCreationFromUeErrors(self):
  96. self.assertRaises(bitstring.CreationError, Bits, ue=-1)
  97. self.assertRaises(bitstring.CreationError, Bits, ue=1, length=12)
  98. s = Bits(bin='10')
  99. self.assertRaises(bitstring.InterpretError, s._getue)
  100. def testCreationFromBool(self):
  101. a = Bits('bool=1')
  102. self.assertEqual(a, 'bool=1')
  103. b = Bits('bool=0')
  104. self.assertEqual(b, [0])
  105. c = bitstring.pack('2*bool', 0, 1)
  106. self.assertEqual(c, '0b01')
  107. def testCreationKeywordError(self):
  108. self.assertRaises(bitstring.CreationError, Bits, squirrel=5)
  109. def testDataStoreType(self):
  110. a = Bits('0xf')
  111. self.assertEqual(type(a._datastore), bitstring.ConstByteStore)
  112. class Initialisation(unittest.TestCase):
  113. def testEmptyInit(self):
  114. a = Bits()
  115. self.assertEqual(a, '')
  116. def testNoPos(self):
  117. a = Bits('0xabcdef')
  118. try:
  119. a.pos
  120. except AttributeError:
  121. pass
  122. else:
  123. assert False
  124. def testFind(self):
  125. a = Bits('0xabcd')
  126. r = a.find('0xbc')
  127. self.assertEqual(r[0], 4)
  128. r = a.find('0x23462346246', bytealigned=True)
  129. self.assertFalse(r)
  130. def testRfind(self):
  131. a = Bits('0b11101010010010')
  132. b = a.rfind('0b010')
  133. self.assertEqual(b[0], 11)
  134. def testFindAll(self):
  135. a = Bits('0b0010011')
  136. b = list(a.findall([1]))
  137. self.assertEqual(b, [2, 5, 6])
  138. class Cut(unittest.TestCase):
  139. def testCut(self):
  140. s = Bits(30)
  141. for t in s.cut(3):
  142. self.assertEqual(t, [0] * 3)
  143. class InterleavedExpGolomb(unittest.TestCase):
  144. def testCreation(self):
  145. s1 = Bits(uie=0)
  146. s2 = Bits(uie=1)
  147. self.assertEqual(s1, [1])
  148. self.assertEqual(s2, [0, 0, 1])
  149. s1 = Bits(sie=0)
  150. s2 = Bits(sie=-1)
  151. s3 = Bits(sie=1)
  152. self.assertEqual(s1, [1])
  153. self.assertEqual(s2, [0, 0, 1, 1])
  154. self.assertEqual(s3, [0, 0, 1, 0])
  155. def testCreationFromProperty(self):
  156. s = BitArray()
  157. s.uie = 45
  158. self.assertEqual(s.uie, 45)
  159. s.sie = -45
  160. self.assertEqual(s.sie, -45)
  161. def testInterpretation(self):
  162. for x in range(101):
  163. self.assertEqual(Bits(uie=x).uie, x)
  164. for x in range(-100, 100):
  165. self.assertEqual(Bits(sie=x).sie, x)
  166. def testErrors(self):
  167. for f in ['sie=100, 0b1001', '0b00', 'uie=100, 0b1001']:
  168. s = Bits(f)
  169. self.assertRaises(bitstring.InterpretError, s._getsie)
  170. self.assertRaises(bitstring.InterpretError, s._getuie)
  171. self.assertRaises(ValueError, Bits, 'uie=-10')
  172. class FileBased(unittest.TestCase):
  173. def setUp(self):
  174. self.a = Bits(filename='smalltestfile')
  175. self.b = Bits(filename='smalltestfile', offset=16)
  176. self.c = Bits(filename='smalltestfile', offset=20, length=16)
  177. self.d = Bits(filename='smalltestfile', offset=20, length=4)
  178. def testCreationWithOffset(self):
  179. self.assertEqual(self.a, '0x0123456789abcdef')
  180. self.assertEqual(self.b, '0x456789abcdef')
  181. self.assertEqual(self.c, '0x5678')
  182. def testBitOperators(self):
  183. x = self.b[4:20]
  184. self.assertEqual(x, '0x5678')
  185. self.assertEqual((x & self.c).hex, self.c.hex)
  186. self.assertEqual(self.c ^ self.b[4:20], 16)
  187. self.assertEqual(self.a[23:36] | self.c[3:], self.c[3:])
  188. def testAddition(self):
  189. h = self.d + '0x1'
  190. x = self.a[20:24] + self.c[-4:] + self.c[8:12]
  191. self.assertEqual(x, '0x587')
  192. x = self.b + x
  193. self.assertEqual(x.hex, '456789abcdef587')
  194. x = BitArray(x)
  195. del x[12:24]
  196. self.assertEqual(x, '0x456abcdef587')
  197. class Mmap(unittest.TestCase):
  198. def setUp(self):
  199. self.f = open('smalltestfile', 'rb')
  200. def tearDown(self):
  201. self.f.close()
  202. def testByteArrayEquivalence(self):
  203. a = MmapByteArray(self.f)
  204. self.assertEqual(a.bytelength, 8)
  205. self.assertEqual(len(a), 8)
  206. self.assertEqual(a[0], 0x01)
  207. self.assertEqual(a[1], 0x23)
  208. self.assertEqual(a[7], 0xef)
  209. self.assertEqual(a[0:1], bytearray([1]))
  210. self.assertEqual(a[:], bytearray([0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef]))
  211. self.assertEqual(a[2:4], bytearray([0x45, 0x67]))
  212. def testWithLength(self):
  213. a = MmapByteArray(self.f, 3)
  214. self.assertEqual(a[0], 0x01)
  215. self.assertEqual(len(a), 3)
  216. def testWithOffset(self):
  217. a = MmapByteArray(self.f, None, 5)
  218. self.assertEqual(len(a), 3)
  219. self.assertEqual(a[0], 0xab)
  220. def testWithLengthAndOffset(self):
  221. a = MmapByteArray(self.f, 3, 3)
  222. self.assertEqual(len(a), 3)
  223. self.assertEqual(a[0], 0x67)
  224. self.assertEqual(a[:], bytearray([0x67, 0x89, 0xab]))
  225. class Comparisons(unittest.TestCase):
  226. def testUnorderable(self):
  227. a = Bits(5)
  228. b = Bits(5)
  229. self.assertRaises(TypeError, a.__lt__, b)
  230. self.assertRaises(TypeError, a.__gt__, b)
  231. self.assertRaises(TypeError, a.__le__, b)
  232. self.assertRaises(TypeError, a.__ge__, b)
  233. class Subclassing(unittest.TestCase):
  234. def testIsInstance(self):
  235. class SubBits(bitstring.Bits): pass
  236. a = SubBits()
  237. self.assertTrue(isinstance(a, SubBits))
  238. def testClassType(self):
  239. class SubBits(bitstring.Bits): pass
  240. self.assertEqual(SubBits().__class__, SubBits)
  241. class LongBoolConversion(unittest.TestCase):
  242. def testLongBool(self):
  243. a = Bits(1000)
  244. b = bool(a)
  245. self.assertTrue(b is False)
  246. # Some basic tests for the private ByteStore classes
  247. class ConstByteStoreCreation(unittest.TestCase):
  248. def testProperties(self):
  249. a = ConstByteStore(bytearray(b'abc'))
  250. self.assertEqual(a.bytelength, 3)
  251. self.assertEqual(a.offset, 0)
  252. self.assertEqual(a.bitlength, 24)
  253. self.assertEqual(a._rawarray, b'abc')
  254. def testGetBit(self):
  255. a = ConstByteStore(bytearray([0x0f]))
  256. self.assertEqual(a.getbit(0), False)
  257. self.assertEqual(a.getbit(3), False)
  258. self.assertEqual(a.getbit(4), True)
  259. self.assertEqual(a.getbit(7), True)
  260. b = ConstByteStore(bytearray([0x0f]), 7, 1)
  261. self.assertEqual(b.getbit(2), False)
  262. self.assertEqual(b.getbit(3), True)
  263. def testGetByte(self):
  264. a = ConstByteStore(bytearray(b'abcde'), 1, 13)
  265. self.assertEqual(a.getbyte(0), 97)
  266. self.assertEqual(a.getbyte(1), 98)
  267. self.assertEqual(a.getbyte(4), 101)
  268. class PadToken(unittest.TestCase):
  269. def testCreation(self):
  270. a = Bits('pad:10')
  271. self.assertEqual(a, Bits(10))
  272. b = Bits('pad:0')
  273. self.assertEqual(b, Bits())
  274. c = Bits('0b11, pad:1, 0b111')
  275. self.assertEqual(c, Bits('0b110111'))
  276. def testPack(self):
  277. s = bitstring.pack('0b11, pad:3=5, 0b1')
  278. self.assertEqual(s.bin, '110001')
  279. d = bitstring.pack('pad:c', c=12)
  280. self.assertEqual(d, Bits(12))
  281. e = bitstring.pack('0xf, uint:12, pad:1, bin, pad:4, 0b10', 0, '111')
  282. self.assertEqual(e.bin, '11110000000000000111000010')
  283. def testUnpack(self):
  284. s = Bits('0b111000111')
  285. x, y = s.unpack('3, pad:3, 3')
  286. self.assertEqual((x, y), (7, 7))
  287. x, y = s.unpack('2, pad:2, bin')
  288. self.assertEqual((x, y), (3, '00111'))
  289. x = s.unpack('pad:1, pad:2, pad:3')
  290. self.assertEqual(x, [])
  291. class ModifiedByAddingBug(unittest.TestCase):
  292. def testAdding(self):
  293. a = Bits('0b0')
  294. b = Bits('0b11')
  295. c = a + b
  296. self.assertEqual(c, '0b011')
  297. self.assertEqual(a, '0b0')
  298. self.assertEqual(b, '0b11')
  299. def testAdding2(self):
  300. a = Bits(100)
  301. b = Bits(101)
  302. c = a + b
  303. self.assertEqual(a, 100)
  304. self.assertEqual(b, 101)
  305. self.assertEqual(c, 201)