import unittest
def binary_search(a, target):
"""Return an index of target in sorted list a, or -1."""
low, high = 0, len(a) - 1
while low <= high:
mid = (low + high) // 2
if a[mid] == target:
return mid
elif a[mid] < target:
low = mid + 1
else:
high = mid - 1
return -1
class TestBinarySearch(unittest.TestCase):
def setUp(self):
self.a = [3, 8, 12, 19, 23, 31, 38]
def test_middle(self):
self.assertEqual(binary_search(self.a, 19), 3)
def test_first_and_last(self):
self.assertEqual(binary_search(self.a, 3), 0)
self.assertEqual(binary_search(self.a, 38), 6)
def test_missing_inside(self):
self.assertEqual(binary_search(self.a, 20), -1)
def test_missing_outside(self):
self.assertEqual(binary_search(self.a, 1), -1)
self.assertEqual(binary_search(self.a, 99), -1)
def test_empty_and_single(self):
self.assertEqual(binary_search([], 5), -1)
self.assertEqual(binary_search([5], 5), 0)
self.assertEqual(binary_search([5], 4), -1)
def test_duplicates(self):
i = binary_search([4, 4, 4, 4], 4)
self.assertIn(i, [0, 1, 2, 3])
unittest.main(argv=["tests"], exit=False, verbosity=2)