#!/usr/bin/env python3
import sys
import random

from cuckoo_hash import CuckooTable

def simple_test(n, table_size_percentage):
    random.seed(42)
    table = CuckooTable(n*table_size_percentage//100)

    # Insert an arithmetic progression
    for i in range(n):
        table.insert(37*i)

    # Verify contents of the table
    for i in range(n):
        assert table.lookup(37*i), "Item not present in table, but it should be."
        assert not table.lookup(37*i+1), "Item present in table, even though it should not be."

def multiple_test(min_n, max_n, step_n, table_size_percentage):
    for n in range(min_n, max_n, step_n):
        print("\tn={}".format(n))
        simple_test(n, table_size_percentage)

# A list of all tests
tests = [
    ("small",       lambda: simple_test(100, 400)),
    ("middle",      lambda: simple_test(31415, 300)),
    ("big",         lambda: simple_test(1000000, 300)),
    ("tight",       lambda: multiple_test(20000, 40000, 500, 205)),
]

if __name__ == "__main__":
    for required_test in sys.argv[1:] or [name for name, _ in tests]:
        for name, test in tests:
            if name == required_test:
                print("Running test {}".format(name), file=sys.stderr)
                test()
                break
        else:
            raise ValueError("Unknown test {}".format(name))