#!/usr/bin/python from PIPRes.splits import * from PIPRes.testing import silentAssertRaises import unittest, re tenMask = makeSimpleMask(10) twentyMask = makeSimpleMask(20) noFourBit = tenMask - (0x8L) secTwenty = twentyMask ^ tenMask class FirstOnBitTest(unittest.TestCase): def testSimplePositive(self): a = 8L self.assertEqual(getFirstBitAsIndex(a), 3) a <<=50 self.assertEqual(getFirstBitAsIndex(a), 53) self.assertEqual(getFirstBitAsIndex(3), 0) self.assertEqual(getFirstBitAsIndex(long('1')), 0) def testBadArg(self): silentAssertRaises(self, ValueError, getFirstBitAsIndex, -1) silentAssertRaises(self, ValueError, getFirstBitAsIndex, '1') silentAssertRaises(self, ValueError, getFirstBitAsIndex, 1.2) silentAssertRaises(self, ValueError, getFirstBitAsIndex, 0) def testGetFirstBitOnly(self): a = 8L self.assertEqual(getFirstBitOnly(a), 8L) a <<=50 self.assertEqual(getFirstBitOnly(a), a) self.assertEqual(getFirstBitOnly(0), 0) self.assertEqual(getFirstBitOnly(3), 1) self.assertEqual(getFirstBitOnly(4), 4L) self.assertEqual(getFirstBitOnly(12), 4L) self.assertEqual(getFirstBitOnly(20), 4L) self.assertEqual(getFirstBitOnly(24), 8L) self.assertEqual(getFirstBitOnly(long('1')), 1) def testCountBits(self): self.assertEqual([countBits(i) for i in range(32)], [len([j for j in iterBits(i)]) for i in range(32)]) self.assertEqual([countBits(i) for i in range(100,132)], [len([j for j in iterBits(i)]) for i in range(100,132)]) class SplitTest(unittest.TestCase): def testCompareOrientedSplits(self): self.assertEqual(compareOrientedSplits(15, 15, 15, False), (SplitCompatEnum.identical, None)) self.assertEqual(compareOrientedSplits(11, 14, 31, False), (SplitCompatEnum.incompat, None)) self.assertEqual(compareOrientedSplits(15, 10, 15, False), (SplitCompatEnum.compat, 5)) self.assertEqual(compareOrientedSplits(10, 15, 15, False), (SplitCompatEnum.compat, -5)) def testFirstBitAsNumber(self): self.assertEqual(getFirstBitAsIndex(1), 0) self.assertEqual(getFirstBitAsIndex(2), 1) self.assertEqual(getFirstBitAsIndex(3), 0) self.assertEqual(getFirstBitAsIndex(4), 2) def testGetFirstBitOnly(self): self.assertEqual([getFirstBitOnly(i) for i in range(17)], [0, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 16]) silentAssertRaises(self, ValueError, getFirstBitOnly, '0') silentAssertRaises(self, ValueError, getFirstBitOnly, -1) def testMakeSimpleMaskBadArgs(self): silentAssertRaises(self, ValueError, makeSimpleMask, 0) silentAssertRaises(self, ValueError, makeSimpleMask, 0.2) # < 1 raises value error silentAssertRaises(self, ValueError, makeSimpleMask, None) silentAssertRaises(self, TypeError, makeSimpleMask, '1') silentAssertRaises(self, TypeError, makeSimpleMask, 1.2) silentAssertRaises(self, TypeError, makeSimpleMask, 1.0) def testMakeSimpleMask(self): self.assertEqual(makeSimpleMask(1), 1L) self.assertEqual(makeSimpleMask(2), 3L) self.assertEqual(makeSimpleMask(10), 1023L) def testInvertSplit(self): self.assertEqual(invertSplit(8L, tenMask), noFourBit) for b in iterBits(tenMask): self.assertEqual(invertSplit(invertSplit(b, tenMask), tenMask), b) c = 0L for b in iterBits(tenMask): c |= b self.assertEqual(invertSplit(invertSplit(c, tenMask), tenMask), c) def testOrientSplit(self): self.assertEqual(orientSplit(8L, tenMask), noFourBit) self.assertEqual(orientSplit(noFourBit, tenMask), noFourBit) self.assertEqual(orientSplit(8L, twentyMask), twentyMask - 8L) self.assertEqual(orientSplit(noFourBit, twentyMask), noFourBit) self.assertEqual(orientSplit(noFourBit, tenMask, 8L), 8L) self.assertEqual(orientSplit(noFourBit, secTwenty), secTwenty) silentAssertRaises(self, ValueError, orientSplit, noFourBit, secTwenty, 0x04L) def testCompareSplit(self): self.assertEqual(compareSplits(noFourBit, 8L, tenMask)[0], SplitCompatEnum.identical) cmp = compareSplits(noFourBit, 9L, tenMask) self.assertEqual(cmp[0], SplitCompatEnum.compat) self.assertEqual(compareSplits(noFourBit^2L, 9L, tenMask)[0], SplitCompatEnum.incompat) self.assertEqual(compareSplits(1024 | (noFourBit^2L), 1033L, tenMask)[0], SplitCompatEnum.incompat) self.assertEqual(compareSplits(1024 | (noFourBit^2L), 1033L, twentyMask)[0], SplitCompatEnum.incompat) self.assertEqual(compareSplits(1024 | (noFourBit^2L), 1033L, secTwenty)[0], SplitCompatEnum.identical) cmp = compareSplits(noFourBit, tenMask, tenMask) self.assertEqual(cmp[0], SplitCompatEnum.compat) cmp = compareSplits(noFourBit, tenMask, twentyMask) self.assertEqual(cmp[0], SplitCompatEnum.compat) self.assertEqual(compareSplits(noFourBit, tenMask, secTwenty)[0], SplitCompatEnum.identical) def testIterBits(self): self.assertEqual([i for i in iterBits(twentyMask)], [1L, 2L, 4L, 8L, 16L, 32L, 64L, 128L, 256L, 512L, 1024L, 2048L, 4096L, 8192L, 16384L, 32768L, 65536L, 131072L, 262144L, 524288L]) self.assertEqual([i for i in iterBits(twentyMask,tenMask)], [1L, 2L, 4L, 8L, 16L, 32L, 64L, 128L, 256L, 512L]) self.assertEqual([i for i in iterBits(341L, tenMask)], [1L, 4L, 16L, 64L, 256L]) def testIterSplitIndices(self): self.assertEqual([i for i in iterSplitIndices(twentyMask)], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) self.assertEqual([i for i in iterSplitIndices(twentyMask, oneBased = True)], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]) self.assertEqual([i for i in iterSplitIndices(twentyMask,tenMask)], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) self.assertEqual([i for i in iterSplitIndices(341L, tenMask)], [0, 2, 4, 6, 8]) def testIsTrivial(self): self.assertEqual(isTrivialSplit(tenMask, tenMask), True) self.assertEqual(isTrivialSplit(0L, tenMask), True) for b in iterBits(tenMask): self.assertEqual(isTrivialSplit(b, tenMask), True) self.assertEqual(isTrivialSplit(invertSplit(b, tenMask), tenMask), True) self.assertEqual([isTrivialSplit(1L | i, tenMask) for i in iterBits(tenMask)], [True, False, False, False, False, False, False, False, False, False]) if __name__ == '__main__': unittest.main()