58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
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
|