diff --git a/src/irclib.py b/src/irclib.py index fc78dd6c2..bedba788a 100644 --- a/src/irclib.py +++ b/src/irclib.py @@ -30,6 +30,7 @@ ### from fix import * +from structures import queue, MaxLengthQueue import copy import time diff --git a/test/test_fix.py b/test/test_fix.py index d247811c7..4c38faca4 100644 --- a/test/test_fix.py +++ b/test/test_fix.py @@ -35,175 +35,6 @@ from test import * import pickle -class QueueTest(unittest.TestCase): - def testGetitem(self): - q = queue() - n = 10 - for i in xrange(n): - q.enqueue(i) - for i in xrange(n): - self.assertEqual(q[i], i) - for i in xrange(n, 0, -1): - self.assertEqual(q[-i], n-i) - self.assertRaises(IndexError, q.__getitem__, -(n+1)) - self.assertRaises(IndexError, q.__getitem__, n) - #self.assertEqual(q[3:7], queue([3, 4, 5, 6])) - - def testSetitem(self): - q1 = queue() - for i in xrange(10): - q1.enqueue(i) - q2 = eval(repr(q1)) - for (i, elt) in enumerate(q2): - q2[i] = elt*2 - self.assertEqual([x*2 for x in q1], list(q2)) - - def testNonzero(self): - q = queue() - self.failIf(q, 'queue not zero after initialization') - q.enqueue(1) - self.failUnless(q, 'queue zero after adding element') - q.dequeue() - self.failIf(q, 'queue not zero after dequeue of only element') - - def testLen(self): - q = queue() - self.assertEqual(0, len(q), 'queue len not 0 after initialization') - q.enqueue(1) - self.assertEqual(1, len(q), 'queue len not 1 after enqueue') - q.enqueue(2) - self.assertEqual(2, len(q), 'queue len not 2 after enqueue') - q.dequeue() - self.assertEqual(1, len(q), 'queue len not 1 after dequeue') - q.dequeue() - self.assertEqual(0, len(q), 'queue len not 0 after dequeue') - for i in range(10): - L = range(i) - q = queue(L) - self.assertEqual(len(q), i) - - def testEq(self): - q1 = queue() - q2 = queue() - self.failUnless(q1 == q1, 'queue not equal to itself') - self.failUnless(q2 == q2, 'queue not equal to itself') - self.failUnless(q1 == q2, 'initialized queues not equal') - q1.enqueue(1) - self.failUnless(q1 == q1, 'queue not equal to itself') - self.failUnless(q2 == q2, 'queue not equal to itself') - q2.enqueue(1) - self.failUnless(q1 == q1, 'queue not equal to itself') - self.failUnless(q2 == q2, 'queue not equal to itself') - self.failUnless(q1 == q2, 'queues not equal after identical enqueue') - q1.dequeue() - self.failUnless(q1 == q1, 'queue not equal to itself') - self.failUnless(q2 == q2, 'queue not equal to itself') - self.failIf(q1 == q2, 'queues equal after one dequeue') - q2.dequeue() - self.failUnless(q1 == q2, 'queues not equal after both are dequeued') - self.failUnless(q1 == q1, 'queue not equal to itself') - self.failUnless(q2 == q2, 'queue not equal to itself') - - def testInit(self): - self.assertEqual(len(queue()), 0, 'queue len not 0 after init') - q = queue() - q.enqueue(1) - q.enqueue(2) - q.enqueue(3) - self.assertEqual(queue((1, 2, 3)),q, 'init not equivalent to enqueues') - q = queue((1, 2, 3)) - self.assertEqual(q.dequeue(), 1, 'values not returned in proper order') - self.assertEqual(q.dequeue(), 2, 'values not returned in proper order') - self.assertEqual(q.dequeue(), 3, 'values not returned in proper order') - - def testRepr(self): - q = queue() - q.enqueue(1) - self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') - q.enqueue('foo') - self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') - q.enqueue(None) - self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') - q.enqueue(1.0) - self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') - q.enqueue([]) - self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') - q.enqueue(()) - self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') - q.enqueue([1]) - self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') - q.enqueue((1,)) - self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') - - def testEnqueueDequeue(self): - q = queue() - self.assertRaises(IndexError, q.dequeue) - q.enqueue(1) - self.assertEqual(q.dequeue(), 1, - 'first dequeue didn\'t return same as first enqueue') - q.enqueue(1) - q.enqueue(2) - q.enqueue(3) - self.assertEqual(q.dequeue(), 1) - self.assertEqual(q.dequeue(), 2) - self.assertEqual(q.dequeue(), 3) - - def testPeek(self): - q = queue() - self.assertRaises(IndexError, q.peek) - q.enqueue(1) - self.assertEqual(q.peek(), 1, 'peek didn\'t return first enqueue') - q.enqueue(2) - self.assertEqual(q.peek(), 1, 'peek didn\'t return first enqueue') - q.dequeue() - self.assertEqual(q.peek(), 2, 'peek didn\'t return second enqueue') - q.dequeue() - self.assertRaises(IndexError, q.peek) - - def testContains(self): - q = queue() - self.failIf(1 in q, 'empty queue cannot have elements') - q.enqueue(1) - self.failUnless(1 in q, 'recent enqueued element not in q') - q.enqueue(2) - self.failUnless(1 in q, 'original enqueued element not in q') - self.failUnless(2 in q, 'second enqueued element not in q') - q.dequeue() - self.failIf(1 in q, 'dequeued element in q') - self.failUnless(2 in q, 'not dequeued element not in q') - q.dequeue() - self.failIf(2 in q, 'dequeued element in q') - - def testIter(self): - q1 = queue((1, 2, 3)) - q2 = queue() - for i in q1: - q2.enqueue(i) - self.assertEqual(q1, q2, 'iterate didn\'t return all elements') - for _ in queue(): - self.fail('no elements should be in empty queue') - - def testPickleCopy(self): - q = queue(range(10)) - self.assertEqual(q, pickle.loads(pickle.dumps(q))) - - -class MaxLengthQueueTestCase(unittest.TestCase): - def testMaxLength(self): - q = MaxLengthQueue(3) - q.enqueue(1) - self.assertEqual(len(q), 1) - q.enqueue(2) - self.assertEqual(len(q), 2) - q.enqueue(3) - self.assertEqual(len(q), 3) - q.enqueue(4) - self.assertEqual(len(q), 3) - self.assertEqual(q.peek(), 2) - q.enqueue(5) - self.assertEqual(len(q), 3) - self.assertEqual(q[0], 3) - class FunctionsTest(unittest.TestCase): def testCatch(self): def f(): diff --git a/test/test_structures.py b/test/test_structures.py index c0edd9e39..f167f37f3 100644 --- a/test/test_structures.py +++ b/test/test_structures.py @@ -31,6 +31,8 @@ from test import * +import pickle + from structures import * class RingBufferTestCase(unittest.TestCase): @@ -87,11 +89,33 @@ class RingBufferTestCase(unittest.TestCase): b = RingBuffer(len(L), L) for i in range(len(b)): self.assertEqual(L[i], b[i]) + for i in range(len(b)): + self.assertEqual(L[-i], b[-i]) for i in range(len(b)): b.append(i) for i in range(len(b)): self.assertEqual(L[i], b[i]) + def testSliceGetitem(self): + L = range(10) + b = RingBuffer(len(L), L) + for i in range(len(b)): + self.assertEqual(L[:i], b[:i]) + self.assertEqual(L[i:], b[i:]) + self.assertEqual(L[i:len(b)-i], b[i:len(b)-i]) + self.assertEqual(L[:-i], b[:-i]) + self.assertEqual(L[-i:], b[-i:]) + self.assertEqual(L[i:-i], b[i:-i]) + for i in range(len(b)): + b.append(i) + for i in range(len(b)): + self.assertEqual(L[:i], b[:i]) + self.assertEqual(L[i:], b[i:]) + self.assertEqual(L[i:len(b)-i], b[i:len(b)-i]) + self.assertEqual(L[:-i], b[:-i]) + self.assertEqual(L[-i:], b[-i:]) + self.assertEqual(L[i:-i], b[i:-i]) + def testSetitem(self): L = range(10) b = RingBuffer(len(L), [0]*len(L)) @@ -106,6 +130,17 @@ class RingBufferTestCase(unittest.TestCase): for i in range(len(b)): self.assertEqual(b[i], i) + def testSliceSetitem(self): + L = range(10) + b = RingBuffer(len(L), [0]*len(L)) + self.assertRaises(ValueError, b.__setitem__, slice(0, 10), []) + b[2:4] = L[2:4] + self.assertEquals(b[2:4], L[2:4]) + for i in range(len(b)): + b.append(0) + b[2:4] = L[2:4] + self.assertEquals(b[2:4], L[2:4]) + def testExtend(self): b = RingBuffer(3, range(3)) self.assertEqual(list(b), range(3)) @@ -127,3 +162,213 @@ class RingBufferTestCase(unittest.TestCase): self.assertEqual(repr(b), 'RingBuffer(3, [3, 4, 5])') b.append(6) self.assertEqual(repr(b), 'RingBuffer(3, [4, 5, 6])') + + def testPickleCopy(self): + b = RingBuffer(10, range(10)) + self.assertEqual(pickle.loads(pickle.dumps(b)), b) + + def testEq(self): + b = RingBuffer(3, range(3)) + self.failIf(b == range(3)) + b1 = RingBuffer(3) + self.failIf(b == b1) + b1.append(0) + self.failIf(b == b1) + b1.append(1) + self.failIf(b == b1) + b1.append(2) + self.failUnless(b == b1) + b = RingBuffer(100, range(10)) + b1 = RingBuffer(10, range(10)) + self.failIf(b == b1) + + + + def testIter(self): + b = RingBuffer(3, range(3)) + L = [] + for elt in b: + L.append(elt) + self.assertEqual(L, range(3)) + for elt in range(3): + b.append(elt) + del L[:] + for elt in b: + L.append(elt) + self.assertEqual(L, range(3)) + + +class QueueTest(unittest.TestCase): + def testGetitem(self): + q = queue() + n = 10 + for i in xrange(n): + q.enqueue(i) + for i in xrange(n): + self.assertEqual(q[i], i) + for i in xrange(n, 0, -1): + self.assertEqual(q[-i], n-i) + self.assertRaises(IndexError, q.__getitem__, -(n+1)) + self.assertRaises(IndexError, q.__getitem__, n) + #self.assertEqual(q[3:7], queue([3, 4, 5, 6])) + + def testSetitem(self): + q1 = queue() + for i in xrange(10): + q1.enqueue(i) + q2 = eval(repr(q1)) + for (i, elt) in enumerate(q2): + q2[i] = elt*2 + self.assertEqual([x*2 for x in q1], list(q2)) + + def testNonzero(self): + q = queue() + self.failIf(q, 'queue not zero after initialization') + q.enqueue(1) + self.failUnless(q, 'queue zero after adding element') + q.dequeue() + self.failIf(q, 'queue not zero after dequeue of only element') + + def testLen(self): + q = queue() + self.assertEqual(0, len(q), 'queue len not 0 after initialization') + q.enqueue(1) + self.assertEqual(1, len(q), 'queue len not 1 after enqueue') + q.enqueue(2) + self.assertEqual(2, len(q), 'queue len not 2 after enqueue') + q.dequeue() + self.assertEqual(1, len(q), 'queue len not 1 after dequeue') + q.dequeue() + self.assertEqual(0, len(q), 'queue len not 0 after dequeue') + for i in range(10): + L = range(i) + q = queue(L) + self.assertEqual(len(q), i) + + def testEq(self): + q1 = queue() + q2 = queue() + self.failUnless(q1 == q1, 'queue not equal to itself') + self.failUnless(q2 == q2, 'queue not equal to itself') + self.failUnless(q1 == q2, 'initialized queues not equal') + q1.enqueue(1) + self.failUnless(q1 == q1, 'queue not equal to itself') + self.failUnless(q2 == q2, 'queue not equal to itself') + q2.enqueue(1) + self.failUnless(q1 == q1, 'queue not equal to itself') + self.failUnless(q2 == q2, 'queue not equal to itself') + self.failUnless(q1 == q2, 'queues not equal after identical enqueue') + q1.dequeue() + self.failUnless(q1 == q1, 'queue not equal to itself') + self.failUnless(q2 == q2, 'queue not equal to itself') + self.failIf(q1 == q2, 'queues equal after one dequeue') + q2.dequeue() + self.failUnless(q1 == q2, 'queues not equal after both are dequeued') + self.failUnless(q1 == q1, 'queue not equal to itself') + self.failUnless(q2 == q2, 'queue not equal to itself') + + def testInit(self): + self.assertEqual(len(queue()), 0, 'queue len not 0 after init') + q = queue() + q.enqueue(1) + q.enqueue(2) + q.enqueue(3) + self.assertEqual(queue((1, 2, 3)),q, 'init not equivalent to enqueues') + q = queue((1, 2, 3)) + self.assertEqual(q.dequeue(), 1, 'values not returned in proper order') + self.assertEqual(q.dequeue(), 2, 'values not returned in proper order') + self.assertEqual(q.dequeue(), 3, 'values not returned in proper order') + + def testRepr(self): + q = queue() + q.enqueue(1) + self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') + q.enqueue('foo') + self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') + q.enqueue(None) + self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') + q.enqueue(1.0) + self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') + q.enqueue([]) + self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') + q.enqueue(()) + self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') + q.enqueue([1]) + self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') + q.enqueue((1,)) + self.assertEqual(q, eval(repr(q)), 'repr doesn\'t eval to same queue') + + def testEnqueueDequeue(self): + q = queue() + self.assertRaises(IndexError, q.dequeue) + q.enqueue(1) + self.assertEqual(q.dequeue(), 1, + 'first dequeue didn\'t return same as first enqueue') + q.enqueue(1) + q.enqueue(2) + q.enqueue(3) + self.assertEqual(q.dequeue(), 1) + self.assertEqual(q.dequeue(), 2) + self.assertEqual(q.dequeue(), 3) + + def testPeek(self): + q = queue() + self.assertRaises(IndexError, q.peek) + q.enqueue(1) + self.assertEqual(q.peek(), 1, 'peek didn\'t return first enqueue') + q.enqueue(2) + self.assertEqual(q.peek(), 1, 'peek didn\'t return first enqueue') + q.dequeue() + self.assertEqual(q.peek(), 2, 'peek didn\'t return second enqueue') + q.dequeue() + self.assertRaises(IndexError, q.peek) + + def testContains(self): + q = queue() + self.failIf(1 in q, 'empty queue cannot have elements') + q.enqueue(1) + self.failUnless(1 in q, 'recent enqueued element not in q') + q.enqueue(2) + self.failUnless(1 in q, 'original enqueued element not in q') + self.failUnless(2 in q, 'second enqueued element not in q') + q.dequeue() + self.failIf(1 in q, 'dequeued element in q') + self.failUnless(2 in q, 'not dequeued element not in q') + q.dequeue() + self.failIf(2 in q, 'dequeued element in q') + + def testIter(self): + q1 = queue((1, 2, 3)) + q2 = queue() + for i in q1: + q2.enqueue(i) + self.assertEqual(q1, q2, 'iterate didn\'t return all elements') + for _ in queue(): + self.fail('no elements should be in empty queue') + + def testPickleCopy(self): + q = queue(range(10)) + self.assertEqual(q, pickle.loads(pickle.dumps(q))) + + +class MaxLengthQueueTestCase(unittest.TestCase): + def testInit(self): + q = MaxLengthQueue(3, (1, 2, 3)) + self.assertEqual(list(q), [1, 2, 3]) + self.assertRaises(TypeError, MaxLengthQueue, 3, 1, 2, 3) + + def testMaxLength(self): + q = MaxLengthQueue(3) + q.enqueue(1) + self.assertEqual(len(q), 1) + q.enqueue(2) + self.assertEqual(len(q), 2) + q.enqueue(3) + self.assertEqual(len(q), 3) + q.enqueue(4) + self.assertEqual(len(q), 3) + self.assertEqual(q.peek(), 2) + q.enqueue(5) + self.assertEqual(len(q), 3) + self.assertEqual(q[0], 3) +