def test_bits_to_bucket_num(self):
        # valid
        bn = BaseDiscretizer.bits_to_bucket_num('0b0')
        self.assertEqual(bn, 0)
        bn = BaseDiscretizer.bits_to_bucket_num('0b10')
        self.assertEqual(bn, 2)
        bn = BaseDiscretizer.bits_to_bucket_num('0b0010')
        self.assertEqual(bn, 2)
        bn = BaseDiscretizer.bits_to_bucket_num('0b00000000010')
        self.assertEqual(bn, 2)

        # not a string
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bits_to_bucket_num,
                          1101)

        # empty string
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bits_to_bucket_num,
                          '')

        # not a string of bits (should begin with '0b')
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bits_to_bucket_num,
                          '11111111')

        # no bits
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bits_to_bucket_num,
                          '0b')

        # invalid bits
        self.assertRaises(ValueError,
                          BaseDiscretizer.bits_to_bucket_num,
                          '0b123')
    def tests_bits_to_bytearray(self):
        # 1 byte
        ba = BaseDiscretizer.bits_to_bytearray('0b11111111')
        self.assertIsInstance(ba, bytearray)
        self.assertEqual(len(ba), 1)
        self.assertEqual(ba[0], 255)

        # 1 byte, shortened
        ba = BaseDiscretizer.bits_to_bytearray('0b10')
        self.assertEqual(len(ba), 1)
        self.assertEqual(ba[0], 2)

        # 4 bytes
        ba = BaseDiscretizer.bits_to_bytearray('0b'+'11111111'+'00000000'+'01111111'+'00000011')
        self.assertEqual(len(ba), 4)
        self.assertEqual(ba, bytearray([255, 0, 127, 3]))

        # 4 bytes (zero first)
        ba = BaseDiscretizer.bits_to_bytearray('0b'+'00000000'+'11111111'+'01111111'+'00000011')
        self.assertEqual(len(ba), 4)
        self.assertEqual(ba, bytearray([0, 255, 127, 3]))

        # 4 bytes, shortened
        ba = BaseDiscretizer.bits_to_bytearray('0b'+'00'+'11111111'+'01111111'+'00000011')
        self.assertEqual(len(ba), 4)
        self.assertEqual(ba, bytearray([0, 255, 127, 3]))

        # not a string
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bits_to_bytearray,
                          1101)

        # empty string
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bits_to_bytearray,
                          '')

        # not a string of bits (should begin with '0b')
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bits_to_bytearray,
                          '11111111')

        # no bits
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bits_to_bytearray,
                          '0b')

        # invalid bits
        self.assertRaises(ValueError,
                          BaseDiscretizer.bits_to_bytearray,
                          '0b123')
    def test_bytearray_to_bucket_num(self):
        # valid
        bn = BaseDiscretizer.bytearray_to_bucket_num(bytearray([0]))
        self.assertIsInstance(bn, int)
        self.assertEqual(bn, 0)
        bn = BaseDiscretizer.bytearray_to_bucket_num(bytearray([0, 0, 0]))
        self.assertEqual(bn, 0)
        bn = BaseDiscretizer.bytearray_to_bucket_num(bytearray([3]))
        self.assertEqual(bn, 3)
        bn = BaseDiscretizer.bytearray_to_bucket_num(bytearray([255]))
        self.assertEqual(bn, 255)
        bn = BaseDiscretizer.bytearray_to_bucket_num(bytearray([1, 0]))
        self.assertEqual(bn, 256)
        bn = BaseDiscretizer.bytearray_to_bucket_num(bytearray([1, 1]))
        self.assertEqual(bn, 257)
        bn = BaseDiscretizer.bytearray_to_bucket_num(bytearray([255, 255]))
        self.assertEqual(bn, 65535)
        bn = BaseDiscretizer.bytearray_to_bucket_num(bytearray([1, 0, 0]))
        self.assertEqual(bn, 65536)

        # 0 bytes
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bytearray_to_bucket_num,
                          bytearray())

        # not a bytearray
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bytearray_to_bucket_num,
                          0.0)
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bytearray_to_bucket_num,
                          [0, 1, 2])
    def test_bucket_num_to_bytearray(self):
        # valid
        ba = BaseDiscretizer.bucket_num_to_bytearray(0)
        self.assertIsInstance(ba, bytearray)
        self.assertEqual(len(ba), 1)
        self.assertEqual(ba[0], 0)

        ba = BaseDiscretizer.bucket_num_to_bytearray(3)
        self.assertEqual(ba, bytearray([3]))

        ba = BaseDiscretizer.bucket_num_to_bytearray(255)
        self.assertEqual(ba, bytearray([255]))

        ba = BaseDiscretizer.bucket_num_to_bytearray(256)
        self.assertEqual(ba, bytearray([1, 0]))

        ba = BaseDiscretizer.bucket_num_to_bytearray(257)
        self.assertEqual(ba, bytearray([1, 1]))

        ba = BaseDiscretizer.bucket_num_to_bytearray(65535)
        self.assertEqual(ba, bytearray([255, 255]))

        ba = BaseDiscretizer.bucket_num_to_bytearray(65536)
        self.assertEqual(ba, bytearray([1, 0, 0]))

        # not an integer
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bucket_num_to_bits,
                          'abcd')

        # bad bucket number
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bucket_num_to_bits,
                          -1)
    def test_bucket_num_to_bits(self):
        # valid
        bits = BaseDiscretizer.bucket_num_to_bits(0)
        self.assertEqual(bits, '0b00000000')
        bits = BaseDiscretizer.bucket_num_to_bits(3)
        self.assertEqual(bits, '0b00000011')
        bits = BaseDiscretizer.bucket_num_to_bits(255)
        self.assertEqual(bits, '0b11111111')
        bits = BaseDiscretizer.bucket_num_to_bits(512)
        self.assertEqual(bits, '0b'+'00000010'+'00000000')
        bits = BaseDiscretizer.bucket_num_to_bits(16744195)
        self.assertEqual(bits, '0b'+'11111111'+'01111111'+'00000011')

        # not an integer
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bucket_num_to_bits,
                          'abcd')

        # bad bucket number
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bucket_num_to_bits,
                          -1)
    def test_bytearray_to_bits(self):
        # 1 byte
        ba = bytearray([255])
        bits = BaseDiscretizer.bytearray_to_bits(ba)
        self.assertEqual(bits, '0b11111111')

        # 4 bytes
        ba = bytearray([0, 255, 127, 3])
        bits = BaseDiscretizer.bytearray_to_bits(ba)
        self.assertEqual(bits, '0b'+'00000000'+'11111111'+'01111111'+'00000011')

        # 0 bytes
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bytearray_to_bits,
                          bytearray())

        # not a bytearray
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bytearray_to_bits,
                          0.0)
        self.assertRaises(DiscretizerException,
                          BaseDiscretizer.bytearray_to_bits,
                          [0, 1, 2])