def test_stable_sort(): def check_stable(indexed): for k, g in groupby(indexed, key=lambda x: x[1]): # group by key indexes = list(x[0] for x in g) assert sorted(indexes) == indexes # for func, desc in stable_sort_funcs: for entry in sort_funcs: if not entry.get('stable', False): continue func = entry['func'] desc = entry.get('name', get_func_name(func)) def gen_spec_case(size): spec_cases = gen_special_sort_case(size) for case in ('rand', 'dup', 'dup99'): yield spec_cases[case] if entry.get('skip_large', False): print(desc, 'skipping large testcase.') case_size = 500 else: case_size = 5000 with timed_test(desc, 'stable sort'): for arr in chain(gen_sort_case(7), gen_spec_case(case_size)): indexed = list(enumerate(arr)) # index, key func(indexed, key=lambda x: x[1]) # sort by key check_stable(indexed)
def test_nth_small(): for entry in all_select_funcs: func = entry['func'] desc = entry.get('name', get_func_name(func)) if entry.get('skip_large', False): print(desc, 'skipping large testcase.') case_size = 500 else: case_size = 5000 with timed_test(desc): for seq in chain(gen_sort_case(7), gen_special_sort_case(case_size).values()): copy = seq.copy() if len(copy) == 0: continue sorted_input = sorted(copy) if len(copy) > 20: ranger = range(0, len(copy), len(copy) // 10) else: ranger = range(len(copy)) for i in ranger: n = i + 1 selected = func(copy.copy(), n) assert selected == sorted_input[i], \ '{desc}({copy}, {n}) -> {selected}'.format_map(vars()) for large_func in (nth_large, nth_large_mm): with timed_test(get_func_name(large_func)): assert large_func(list(range(100)), 5) == 95
def test_topk(): for topk in (topk_by_bigheap, topk_by_smallheap): with timed_test(get_func_name(topk)): for seq in gen_sort_case(7): sorted_input = sorted(seq) for k in range(len(seq)): copy = seq.copy() kseq = topk(copy, k) assert sorted(kseq) == sorted_input[len(seq) - k:], \ 'topk({copy}, {k}) -> {kseq}'.format_map(vars())
def test_heap_pop(): for seq in gen_sort_case(7): if len(seq) == 0: continue heap = seq.copy() heap_make(heap) heap_pop(heap) heap.pop() assert heap_verify(heap)
def test_heap_push(): for seq in gen_sort_case(7): if len(seq) == 0: continue heap = seq.copy() heap_make(heap) to_push = list(range(heap[0] + 1)) to_push.extend([(n + 0.5) for n in to_push]) to_push.append(-1) for n in to_push: testbed = heap.copy() heap_push(testbed, n) assert heap_verify(testbed) arr = [2, 1, 0] heap_push(arr, 3, end=1) assert arr == [3, 2, 0]
def test_heap_make(): for seq in gen_sort_case(7): copy = seq.copy() heap_make(copy) assert heap_verify(copy)
def perm_test(func, desc, maxlen=7): kwargs = getattr(func, 'keywords', {}) with timed_test(desc, 'permutation'): for seq in gen_sort_case(maxlen): check_sorted(seq, func=func, **kwargs)