Added doctest for examples in the library reference.
Added random test from bisect to augment the finite precomputed checks.
diff --git a/Lib/test/test_bisect.py b/Lib/test/test_bisect.py
index 0104abf..1a8b0ee 100644
--- a/Lib/test/test_bisect.py
+++ b/Lib/test/test_bisect.py
@@ -93,6 +93,23 @@
for func, list, elt, expected in self.precomputedCases:
self.assertEqual(func(list, elt), expected)
+ def test_random(self, n=20):
+ from random import randrange
+ for i in xrange(n):
+ data = [randrange(0, n, 2) for j in xrange(i)]
+ data.sort()
+ elem = randrange(n)
+ ip = bisect_left(data, elem)
+ if ip < len(data):
+ self.failUnless(elem <= data[ip])
+ if ip > 0:
+ self.failUnless(data[ip-1] < elem)
+ ip = bisect_right(data, elem)
+ if ip < len(data):
+ self.failUnless(elem < data[ip])
+ if ip > 0:
+ self.failUnless(data[ip-1] <= elem)
+
#==============================================================================
class TestInsort(unittest.TestCase):
@@ -116,6 +133,46 @@
#==============================================================================
+libreftest = """
+Example from the Library Reference: Doc/lib/libbisect.tex
+
+The bisect() function is generally useful for categorizing numeric data.
+This example uses bisect() to look up a letter grade for an exam total
+(say) based on a set of ordered numeric breakpoints: 85 and up is an `A',
+75..84 is a `B', etc.
+
+ >>> grades = "FEDCBA"
+ >>> breakpoints = [30, 44, 66, 75, 85]
+ >>> from bisect import bisect
+ >>> def grade(total):
+ ... return grades[bisect(breakpoints, total)]
+ ...
+ >>> grade(66)
+ 'C'
+ >>> map(grade, [33, 99, 77, 44, 12, 88])
+ ['E', 'A', 'B', 'D', 'F', 'A']
+
+The bisect module can be used with the Queue module to implement
+a priority queue (example courtesy of Fredrik Lundh):
+
+>>> import Queue, bisect
+>>> class PriorityQueue(Queue.Queue):
+... def _put(self, item):
+... bisect.insort(self.queue, item)
+...
+>>> queue = PriorityQueue(0)
+>>> queue.put((2, "second"))
+>>> queue.put((1, "first"))
+>>> queue.put((3, "third"))
+>>> queue.get()
+(1, 'first')
+>>> queue.get()
+(2, 'second')
+
+"""
+
+#==============================================================================
+
def makeAllTests():
suite = unittest.TestSuite()
for klass in (TestBisect,
@@ -126,10 +183,13 @@
#------------------------------------------------------------------------------
+__test__ = {'libreftest' : libreftest}
+
def test_main(verbose=None):
from test import test_bisect
suite = makeAllTests()
test_support.run_suite(suite)
+ test_support.run_doctest(test_bisect, verbose)
if __name__ == "__main__":
test_main(verbose=True)