Added doctest for examples in the library reference.

Added random test from bisect to augment the finite precomputed checks.
This commit is contained in:
Raymond Hettinger 2003-01-16 12:31:36 +00:00
parent d230550a6b
commit 4422375c72
1 changed files with 60 additions and 0 deletions

View File

@ -93,6 +93,23 @@ class TestBisect(unittest.TestCase):
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 @@ class TestInsort(unittest.TestCase):
#==============================================================================
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 @@ def makeAllTests():
#------------------------------------------------------------------------------
__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)