bits/tests/test_bits.py

151 lines
5.4 KiB
Python

from unittest import TestCase
from .context import Bits, Bytes
class TestBits(TestCase):
def setUp(self):
self.testObjects = [
{"bytes": b'\x7f',
"bits": "01111111",
"int": 127,
"reverse": 254,
"bitsObject": Bits(127)
},
{"bytes": b'\xcf',
"bits": "11001111",
"int": 207,
"reverse": 243,
"bitsObject": Bits(207)
},
{"bytes": b'{',
"bits": "01111011",
"int": 123,
"reverse": 222,
"bitsObject": Bits(123)
},
{"bytes": b'<',
"bits": "00111100",
"int": 60,
"reverse": 60,
"bitsObject": Bits(60)
},
{"bytes": b'>',
"bits": "00111110",
"int": 62,
"reverse": 124,
"bitsObject": Bits(62)
}
]
def test_class(self):
"""
Test various class features
"""
with self.subTest("Reject values > 255"):
self.assertRaises(ValueError, Bits, 256)
with self.subTest("Reject values < 0"):
self.assertRaises(ValueError, Bits, -1)
with self.subTest("Reject binary strings longer than 8 characters"):
self.assertRaises(TypeError, Bits, '1100110011')
with self.subTest("Index errors"):
with self.assertRaises(IndexError):
Bits(127)[9]
with self.subTest("Test length"):
self.assertEqual(len(Bits(0)), 8)
def test_bytes(self):
"""
Test conversion to bytes object
"""
for testcase in self.testObjects:
with self.subTest("testcase[\"int\"]: " + str(testcase["int"])):
self.assertEqual(bytes(testcase["bitsObject"]),
testcase["bytes"])
def test_int(self):
"""
Test integer conversion
"""
for testcase in self.testObjects:
with self.subTest("testcase[\"int\"]: " + str(testcase["int"])):
self.assertEqual(int(testcase["bitsObject"]), testcase["int"])
def test_str(self):
"""
Test string representation
"""
for testcase in self.testObjects:
with self.subTest("testcase[\"int\"]: " + str(testcase["int"])):
s = str(testcase["bitsObject"])
self.assertEqual(s, testcase["bits"])
def test_bits(self):
"""
Test bit representation
"""
for testcase in self.testObjects:
with self.subTest("testcase[\"int\"]: " + str(testcase["int"])):
self.assertEqual(testcase["bitsObject"].bin(),
testcase["bits"])
with self.subTest("testcase[\"int\"]: " + str(testcase["int"]) \
+ " [without leading zeros]"):
self.assertEqual(testcase["bitsObject"].bin(pad=False),
testcase["bits"].strip("0"))
def test_reverse(self):
"""
Test the reverse function changes the object bitorder and value
"""
for testcase in self.testObjects:
with self.subTest("testcase[\"int\"]: " + str(testcase["int"])):
testcase["bitsObject"].reverse()
self.assertEqual(testcase["bitsObject"].bin(),
testcase["bits"][::-1])
def test_comparisons(self):
"""
Test the comparison operators
"""
for testcase in self.testObjects:
with self.subTest("testcase[\"int\"]: " + str(testcase["int"]) \
+ " [==]"):
self.assertEqual(testcase["bitsObject"],
Bits(testcase["int"]))
with self.subTest("testcase[\"int\"]: " + str(testcase["int"]) \
+ " [!=]"):
# Toggle bit 3
testobj = Bits(testcase["int"])
testobj[3] = not testobj[3]
self.assertNotEqual(testobj, testcase["bitsObject"])
with self.subTest("testcase[\"int\"]: " + str(testcase["int"]) \
+ " [<]"):
if testcase["int"] < 255:
self.assertLess(testcase["bitsObject"],
Bits(255))
else:
self.skipTest("value is MAX")
with self.subTest("testcase[\"int\"]: " + str(testcase["int"]) \
+ " [<=]"):
if testcase["int"] < 255:
self.assertLessEqual(testcase["bitsObject"], Bits(255))
self.assertLessEqual(testcase["bitsObject"],
Bits(testcase["int"]))
with self.subTest("testcase[\"int\"]: " + str(testcase["int"]) \
+ " [>]"):
if testcase["int"] > 0:
self.assertGreater(testcase["bitsObject"], Bits(0))
else:
self.skipTest("value is MIN")
with self.subTest("testcase[\"int\"]: " + str(testcase["int"]) \
+ " [>=]"):
if testcase["int"] > 0:
self.assertGreaterEqual(testcase["bitsObject"], Bits(0))
self.assertLessEqual(testcase["bitsObject"],
Bits(testcase["int"]))