test_bitarray.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #!/usr/bin/env python
  2. """
  3. Unit tests for the bitarray module.
  4. """
  5. import unittest
  6. import sys
  7. sys.path.insert(0, '..')
  8. import bitstring
  9. from bitstring import BitArray
  10. class All(unittest.TestCase):
  11. def testCreationFromUint(self):
  12. s = BitArray(uint=15, length=6)
  13. self.assertEqual(s.bin, '001111')
  14. s = BitArray(uint=0, length=1)
  15. self.assertEqual(s.bin, '0')
  16. s.uint = 1
  17. self.assertEqual(s.uint, 1)
  18. s = BitArray(length=8)
  19. s.uint = 0
  20. self.assertEqual(s.uint, 0)
  21. s.uint = 255
  22. self.assertEqual(s.uint, 255)
  23. self.assertEqual(s.len, 8)
  24. self.assertRaises(bitstring.CreationError, s._setuint, 256)
  25. def testCreationFromOct(self):
  26. s = BitArray(oct='7')
  27. self.assertEqual(s.oct, '7')
  28. self.assertEqual(s.bin, '111')
  29. s.append('0o1')
  30. self.assertEqual(s.bin, '111001')
  31. s.oct = '12345670'
  32. self.assertEqual(s.length, 24)
  33. self.assertEqual(s.bin, '001010011100101110111000')
  34. s = BitArray('0o123')
  35. self.assertEqual(s.oct, '123')
  36. class NoPosAttribute(unittest.TestCase):
  37. def testReplace(self):
  38. s = BitArray('0b01')
  39. s.replace('0b1', '0b11')
  40. self.assertEqual(s, '0b011')
  41. def testDelete(self):
  42. s = BitArray('0b000000001')
  43. del s[-1:]
  44. self.assertEqual(s, '0b00000000')
  45. def testInsert(self):
  46. s = BitArray('0b00')
  47. s.insert('0xf', 1)
  48. self.assertEqual(s, '0b011110')
  49. def testInsertParameters(self):
  50. s = BitArray('0b111')
  51. self.assertRaises(TypeError, s.insert, '0x4')
  52. def testOverwrite(self):
  53. s = BitArray('0b01110')
  54. s.overwrite('0b000', 1)
  55. self.assertEqual(s, '0b00000')
  56. def testOverwriteParameters(self):
  57. s = BitArray('0b0000')
  58. self.assertRaises(TypeError, s.overwrite, '0b111')
  59. def testPrepend(self):
  60. s = BitArray('0b0')
  61. s.prepend([1])
  62. self.assertEqual(s, [1, 0])
  63. def testRol(self):
  64. s = BitArray('0b0001')
  65. s.rol(1)
  66. self.assertEqual(s, '0b0010')
  67. def testRor(self):
  68. s = BitArray('0b1000')
  69. s.ror(1)
  70. self.assertEqual(s, '0b0100')
  71. def testSetItem(self):
  72. s = BitArray('0b000100')
  73. s[4:5] = '0xf'
  74. self.assertEqual(s, '0b000111110')
  75. s[0:1] = [1]
  76. self.assertEqual(s, '0b100111110')
  77. class Bugs(unittest.TestCase):
  78. def testAddingNonsense(self):
  79. a = BitArray([0])
  80. a += '0' # a uint of length 0 - so nothing gets added.
  81. self.assertEqual(a, [0])
  82. self.assertRaises(ValueError, a.__iadd__, '3')
  83. self.assertRaises(ValueError, a.__iadd__, 'se')
  84. self.assertRaises(ValueError, a.__iadd__, 'float:32')
  85. def testPrependAfterCreationFromDataWithOffset(self):
  86. s1 = BitArray(bytes=b'\x00\x00\x07\xff\xf0\x00', offset=21, length=15)
  87. self.assertFalse(s1.any(0))
  88. s1.prepend('0b0')
  89. self.assertEqual(s1.bin, '0111111111111111')
  90. s1.prepend('0b0')
  91. self.assertEqual(s1.bin, '00111111111111111')
  92. class ByteAligned(unittest.TestCase):
  93. def testDefault(self, defaultbytealigned=bitstring.bytealigned):
  94. self.assertFalse(defaultbytealigned)
  95. def testChangingIt(self):
  96. bitstring.bytealigned = True
  97. self.assertTrue(bitstring.bytealigned)
  98. bitstring.bytealigned = False
  99. def testNotByteAligned(self):
  100. bitstring.bytealigned = False
  101. a = BitArray('0x00 ff 0f f')
  102. l = list(a.findall('0xff'))
  103. self.assertEqual(l, [8, 20])
  104. p = a.find('0x0f')[0]
  105. self.assertEqual(p, 4)
  106. p = a.rfind('0xff')[0]
  107. self.assertEqual(p, 20)
  108. s = list(a.split('0xff'))
  109. self.assertEqual(s, ['0x00', '0xff0', '0xff'])
  110. a.replace('0xff', '')
  111. self.assertEqual(a, '0x000')
  112. def testByteAligned(self):
  113. bitstring.bytealigned = True
  114. a = BitArray('0x00 ff 0f f')
  115. l = list(a.findall('0xff'))
  116. self.assertEqual(l, [8])
  117. p = a.find('0x0f')[0]
  118. self.assertEqual(p, 16)
  119. p = a.rfind('0xff')[0]
  120. self.assertEqual(p, 8)
  121. s = list(a.split('0xff'))
  122. self.assertEqual(s, ['0x00', '0xff0ff'])
  123. a.replace('0xff', '')
  124. self.assertEqual(a, '0x000ff')
  125. class SliceAssignment(unittest.TestCase):
  126. def testSliceAssignmentSingleBit(self):
  127. a = BitArray('0b000')
  128. a[2] = '0b1'
  129. self.assertEqual(a.bin, '001')
  130. a[0] = BitArray(bin='1')
  131. self.assertEqual(a.bin, '101')
  132. a[-1] = '0b0'
  133. self.assertEqual(a.bin, '100')
  134. a[-3] = '0b0'
  135. self.assertEqual(a.bin, '000')
  136. def testSliceAssignmentSingleBitErrors(self):
  137. a = BitArray('0b000')
  138. self.assertRaises(IndexError, a.__setitem__, -4, '0b1')
  139. self.assertRaises(IndexError, a.__setitem__, 3, '0b1')
  140. self.assertRaises(TypeError, a.__setitem__, 1, 1.3)
  141. def testSliceAssignmentMulipleBits(self):
  142. a = BitArray('0b0')
  143. a[0] = '0b110'
  144. self.assertEqual(a.bin, '110')
  145. a[0] = '0b000'
  146. self.assertEqual(a.bin, '00010')
  147. a[0:3] = '0b111'
  148. self.assertEqual(a.bin, '11110')
  149. a[-2:] = '0b011'
  150. self.assertEqual(a.bin, '111011')
  151. a[:] = '0x12345'
  152. self.assertEqual(a.hex, '12345')
  153. a[:] = ''
  154. self.assertFalse(a)
  155. def testSliceAssignmentMultipleBitsErrors(self):
  156. a = BitArray()
  157. self.assertRaises(IndexError, a.__setitem__, 0, '0b00')
  158. a += '0b1'
  159. a[0:2] = '0b11'
  160. self.assertEqual(a, '0b11')
  161. def testDelSliceStep(self):
  162. a = BitArray(bin='100111101001001110110100101')
  163. del a[::2]
  164. self.assertEqual(a.bin, '0110010101100')
  165. del a[3:9:3]
  166. self.assertEqual(a.bin, '01101101100')
  167. del a[2:7:1]
  168. self.assertEqual(a.bin, '011100')
  169. del a[::99]
  170. self.assertEqual(a.bin, '11100')
  171. del a[::1]
  172. self.assertEqual(a.bin, '')
  173. def testDelSliceNegativeStep(self):
  174. a = BitArray('0b0001011101101100100110000001')
  175. del a[5:23:-3]
  176. self.assertEqual(a.bin, '0001011101101100100110000001')
  177. del a[25:3:-3]
  178. self.assertEqual(a.bin, '00011101010000100001')
  179. del a[:6:-7]
  180. self.assertEqual(a.bin, '000111010100010000')
  181. del a[15::-2]
  182. self.assertEqual(a.bin, '0010000000')
  183. del a[::-1]
  184. self.assertEqual(a.bin, '')
  185. def testDelSliceErrors(self):
  186. a = BitArray(10)
  187. del a[5:3]
  188. self.assertEqual(a, 10)
  189. del a[3:5:-1]
  190. self.assertEqual(a, 10)
  191. def testDelSingleElement(self):
  192. a = BitArray('0b0010011')
  193. del a[-1]
  194. self.assertEqual(a.bin, '001001')
  195. del a[2]
  196. self.assertEqual(a.bin, '00001')
  197. try:
  198. del a[5]
  199. self.assertTrue(False)
  200. except IndexError:
  201. pass
  202. def testSetSliceStep(self):
  203. a = BitArray(bin='0000000000')
  204. a[::2] = '0b11111'
  205. self.assertEqual(a.bin, '1010101010')
  206. a[4:9:3] = [0, 0]
  207. self.assertEqual(a.bin, '1010001010')
  208. a[7:3:-1] = [1, 1, 1, 0]
  209. self.assertEqual(a.bin, '1010011110')
  210. a[7:1:-2] = [0, 0, 1]
  211. self.assertEqual(a.bin, '1011001010')
  212. a[::-5] = [1, 1]
  213. self.assertEqual(a.bin, '1011101011')
  214. a[::-1] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
  215. self.assertEqual(a.bin, '1000000000')
  216. def testSetSliceErrors(self):
  217. a = BitArray(8)
  218. try:
  219. a[::3] = [1]
  220. self.assertTrue(False)
  221. except ValueError:
  222. pass
  223. class A(object): pass
  224. try:
  225. a[1:2] = A()
  226. self.assertTrue(False)
  227. except TypeError:
  228. pass
  229. try:
  230. a[1:4:-1] = [1, 2]
  231. self.assertTrue(False)
  232. except ValueError:
  233. pass
  234. class Subclassing(unittest.TestCase):
  235. def testIsInstance(self):
  236. class SubBits(BitArray): pass
  237. a = SubBits()
  238. self.assertTrue(isinstance(a, SubBits))
  239. def testClassType(self):
  240. class SubBits(BitArray): pass
  241. self.assertEqual(SubBits().__class__, SubBits)
  242. class Clear(unittest.TestCase):
  243. def testClear(self):
  244. s = BitArray('0xfff')
  245. s.clear()
  246. self.assertEqual(s.len, 0)
  247. class Copy(unittest.TestCase):
  248. def testCopyMethod(self):
  249. s = BitArray(9)
  250. t = s.copy()
  251. self.assertEqual(s, t)
  252. t[0] = True
  253. self.assertEqual(t.bin, '100000000')
  254. self.assertEqual(s.bin, '000000000')
  255. class ModifiedByAddingBug(unittest.TestCase):
  256. def testAdding(self):
  257. a = BitArray('0b0')
  258. b = BitArray('0b11')
  259. c = a + b
  260. self.assertEqual(c, '0b011')
  261. self.assertEqual(a, '0b0')
  262. self.assertEqual(b, '0b11')