Package grassyknoll :: Package tests :: Module test_HitsWrapper
[hide private]

Source Code for Module grassyknoll.tests.test_HitsWrapper

  1  """welcome the land of off-by-one.  enjoy your stay!""" 
  2   
  3  import unittest 
  4  from grassyknoll.backend.lucene.HitsWrapper import HitsWrapper 
  5   
6 -def wrapper(hits):
7 return HitsWrapper(hits, lambda x: x*10)
8
9 -def getCache(hits):
10 return hits._HitsWrapper__cache
11
12 -class HitsWrapperTestCase(unittest.TestCase):
13
14 - def testEmpty(self):
15 hits=wrapper([]) 16 self.assertEqual(len(hits), 0) 17 self.assertRaises(IndexError, hits.__getitem__, 0) 18 self.assertRaises(IndexError, hits.__getitem__, 1) 19 self.assertEquals(hits[0:3], []) 20 self.assertEquals(hits[:3], []) 21 self.assertEquals(hits[3:], []) 22 self.assertRaises(StopIteration, iter(hits).next)
23
24 - def testGetItem(self):
25 hits=wrapper(range(0, 10)) 26 27 self.assertRaises(TypeError, lambda: hits['foo']) 28 29 for i in xrange(0, 10): 30 self.assertEquals(hits[i], i*10) 31 self.assertEquals(len(getCache(hits)), i+1) 32 self.assertEquals(getCache(hits), [j*10 for j in xrange(i+1)])
33
34 - def testSkippingGetItem(self):
35 hits=wrapper(range(0, 10)) 36 37 for i in xrange(0, 10, 2): 38 self.assertEquals(hits[i], i*10) 39 self.assertEquals(len(getCache(hits)), i+1) 40 self.assertEquals(getCache(hits), [j*10 for j in xrange(0, i+1)])
41
42 - def testNegativeGetItem(self):
43 hits=wrapper(range(10)) 44 45 self.assertRaises(IndexError, hits.__getitem__, -1) 46 # this probably isn't an exhaustive set of negative slices, but good enuf 47 self.assertRaises(IndexError, hits.__getitem__, slice(-5, -2, -1)) 48 self.assertRaises(IndexError, hits.__getitem__, slice(None, None, -1)) 49 self.assertRaises(IndexError, hits.__getitem__, slice(None, -2, None)) 50 self.assertRaises(IndexError, hits.__getitem__, slice(-4, None, None))
51
52 - def testLeftSlice(self):
53 hits=wrapper(range(0, 10)) 54 55 self.assertEquals(hits[:3], [j*10 for j in xrange(3)]) 56 self.assertEquals(getCache(hits), [j*10 for j in xrange(3)]) 57 58 self.assertEquals(hits[:8], [j*10 for j in xrange(8)]) 59 self.assertEquals(getCache(hits), [j*10 for j in xrange(8)]) 60 61 self.assertEquals(hits[:5], [j*10 for j in xrange(5)]) 62 # cache still has 8 items 63 self.assertEquals(getCache(hits), [j*10 for j in xrange(8)]) 64 65 self.assertEquals(hits[:12], [j*10 for j in xrange(10)]) 66 self.assertEquals(getCache(hits), [j*10 for j in xrange(10)])
67
68 - def testLeftStepSlice(self):
69 hits=wrapper(range(0, 10)) 70 71 # cache should have all items necessary to reach highest requested, 72 # not just those returned by __getitem__ 73 self.assertEquals(hits[:3:2], [j*10 for j in xrange(0, 3, 2)]) 74 self.assertEquals(getCache(hits), [j*10 for j in xrange(3)]) 75 76 self.assertEquals(hits[:8:2], [j*10 for j in xrange(0, 8, 2)]) 77 self.assertEquals(getCache(hits), [j*10 for j in xrange(8)]) 78 79 self.assertEquals(hits[:5:2], [j*10 for j in xrange(0, 5, 2)]) 80 # cache still has 8 items 81 self.assertEquals(getCache(hits), [j*10 for j in xrange(8)]) 82 83 self.assertEquals(hits[:12:2], [j*10 for j in xrange(0, 10, 2)]) 84 self.assertEquals(getCache(hits), [j*10 for j in xrange(10)])
85
86 - def testMiddleSlice(self):
87 hits=wrapper(range(0, 10)) 88 89 self.assertEquals(hits[2:5], [j*10 for j in xrange(2,5)]) 90 self.assertEquals(getCache(hits), [j*10 for j in xrange(5)]) 91 92 self.assertEquals(hits[1:8:3], [j*10 for j in xrange(1,8,3)]) 93 self.assertEquals(getCache(hits), [j*10 for j in xrange(8)]) 94 95 # 10 in the xrange here b/c the original range only has 10 elements 96 self.assertEquals(hits[4:12:2], [j*10 for j in xrange(4, 10, 2)]) 97 self.assertEquals(getCache(hits), [j*10 for j in xrange(10)])
98
99 - def testRightSlice(self):
100 hits=wrapper(range(0, 10)) 101 102 self.assertEquals(hits[42:], []) 103 # this exhausts the underyling iterator 104 self.assertEquals(hits[3:], [j*10 for j in xrange(3, 10)]) 105 self.assertEquals(getCache(hits), [j*10 for j in xrange(10)])
106
107 - def testIterator(self):
108 hits=wrapper(range(0, 10)) 109 110 for i, h in enumerate(hits): 111 self.assertEquals(i*10, h) 112 self.assertEquals(getCache(hits), [j * 10 for j in xrange(i+1)])
113
114 - def testTwoIterators(self):
115 # this is the fun one 116 117 hits=wrapper(range(0, 5)) 118 119 i1=iter(hits) 120 i2=iter(hits) 121 122 self.assertEquals(i1.next(), 0) 123 124 self.assertEquals(i2.next(), 0) 125 self.assertEquals(getCache(hits), [j*10 for j in xrange(1)]) 126 127 self.assertEquals(i1.next(), 10) 128 self.assertEquals(i1.next(), 20) 129 self.assertEquals(getCache(hits), [j*10 for j in xrange(3)]) 130 131 self.assertEquals(i2.next(), 10) 132 133 self.assertEquals(i1.next(), 30) 134 135 self.assertEquals(i2.next(), 20) 136 self.assertEquals(i2.next(), 30) 137 self.assertEquals(i2.next(), 40) 138 self.assertEquals(getCache(hits), [j*10 for j in xrange(5)]) 139 140 self.assertRaises(StopIteration, i2.next) 141 142 self.assertEquals(i1.next(), 40) 143 self.assertRaises(StopIteration, i1.next)
144 145 if __name__ == '__main__': 146 unittest.main() 147