import random from rotated_binary_search import find_pivot, search, count_rotations def test_empty(): assert find_pivot([]) == -1 assert search([], 5) == -1 assert count_rotations([]) == 0 def test_single(): assert find_pivot([7]) == 0 assert search([7], 7) == 0 assert search([7], 3) == -1 def test_sorted_no_rotation(): a = [1,2,3,4,5] assert find_pivot(a) == 0 for t in a + [0,6]: idx = search(a, t) assert (idx == -1) == (t not in a) if idx != -1: assert a[idx] == t def test_rotated(): base = [1,2,3,4,5,6,7] for r in range(len(base)): arr = base[r:] + base[:r] expected_pivot = (len(base) - r) % len(base) assert find_pivot(arr) == expected_pivot, (r, find_pivot(arr), expected_pivot) assert count_rotations(arr) == expected_pivot for t in base: i = search(arr, t) assert i != -1 and arr[i] == t def test_duplicates(): arr = [2,2,2,3,3,1,1,2] # pivot should point at a minimum (value 1) p = find_pivot(arr) assert arr[p] == 1 assert search(arr, 3) != -1 assert search(arr, 9) == -1 def test_randomized(): random.seed(7) for _ in range(2000): n = random.randint(0, 30) base = sorted(random.randint(-5,5) for _ in range(n)) r = random.randrange(n) if n else 0 arr = base[r:] + base[:r] if n else [] p = find_pivot(arr) if n: assert arr[p] == min(arr) # search every element for t in set(base): i = search(arr, t) assert i == -1 or arr[i] == t # search absent assert search(arr, 10**9) == -1