def test_split_subtree(values): left_tree, right_tree = YFastTrie._split_subtree(SortedList(values), max_trie_entry_size) assert isinstance(left_tree, SortedList) assert isinstance(right_tree, SortedList) assert len(left_tree) + len(right_tree) == len(values) assert max(left_tree) < min(right_tree) assert YFastTrie._calculate_representative(max(left_tree), max_trie_entry_size) < min(right_tree)
def test_merge_subtrees(values): values = SortedList(values) split = randint(1, len(values) - 1) left_tree = SortedList(values.islice(stop=split)) right_tree = SortedList(values.islice(start=split)) new_left, new_right = YFastTrie._merge_subtrees(left_tree, right_tree, 2 * max_trie_entry_size) if len(values) <= 2 * max_trie_entry_size: assert new_right is None assert isinstance(new_left, SortedList) assert len(new_left) == len(values) else: assert isinstance(new_left, SortedList) assert isinstance(new_right, SortedList) assert len(new_left) + len(new_right) == len(values) assert YFastTrie._calculate_representative(max(new_left), max_trie_entry_size) < min(new_right)
def test_clear(entries): t = YFastTrie(max_trie_entry_size) for entry in entries: t += entry assert len(t) > 0 assert t.min is not None assert t.max is not None t.clear() assert len(t) == 0 assert len(t._partitions) == 0 assert len(t._subtrees) == 0 assert t.min is None assert t.max is None
def test_merge_large_subtrees(values): values = SortedList(values) split = len(values) // 2 left_tree = SortedList(values.islice(stop=split)) right_tree = SortedList(values.islice(start=split)) new_left, new_right = YFastTrie._merge_subtrees(left_tree, right_tree, 2 * max_trie_entry_size) assert isinstance(new_left, SortedList) assert isinstance(new_right, SortedList) assert len(new_left) + len(new_right) == len(values) assert YFastTrie._calculate_representative(max(new_left), max_trie_entry_size) < min(new_right) split += 1 left_tree = SortedList(values.islice(stop=split)) right_tree = SortedList(values.islice(start=split)) new_left, new_right = YFastTrie._merge_subtrees(left_tree, right_tree, 2 * max_trie_entry_size) assert isinstance(new_left, SortedList) assert isinstance(new_right, SortedList) assert len(new_left) + len(new_right) == len(values) assert YFastTrie._calculate_representative(max(new_left), max_trie_entry_size) < min(new_right)
def test_successor(entries, test_values): t = YFastTrie(max_trie_entry_size) for entry in entries: t += entry for val in test_values: succ = t > val if succ is not None: assert succ > val tree, _ = t._get_value_subtree(val) if tree is None or max(tree) <= val: tree, _ = t._get_value_subtree(succ) assert min([v for v in tree if v > val]) == succ else: assert val >= t.max
def test_predecessor(entries, test_values): t = YFastTrie(max_trie_entry_size) for entry in entries: t += entry for val in test_values: pred = t < val if pred is not None: assert pred < val tree, _ = t._get_value_subtree(val) if tree is None or min(tree) >= val: tree, _ = t._get_value_subtree(pred) assert max([v for v in tree if v < val]) == pred else: assert val <= t.min
def test_iter(entries): t = YFastTrie(max_trie_entry_size) for entry in entries: t += entry entries = sorted(entries) for entry in t: assert entry == entries.pop(0) assert len(entries) == 0
def test_successor_predecessor_empty_trie(): t = YFastTrie(max_trie_entry_size) with pytest.raises(ValueError): t.successor(0) with pytest.raises(ValueError): t.predecessor(0)
def test_get_value_subtree(entries, test_values): t = YFastTrie(max_trie_entry_size) assert t._get_value_subtree(test_values[0]) == (None, None) for entry in entries: t += entry entries = [XFastTrie._to_int(e, t._maxlen) for e in entries] for val in test_values: tree, rep_node = t._get_value_subtree(val) if val > t._partitions.max: assert tree is None assert rep_node is None else: assert val <= rep_node.value if val in entries: assert val in tree else: assert val not in tree
def test_insert_with_split(): t = YFastTrie(max_trie_entry_size) big_rep = 3 * max_trie_entry_size - 1 small_rep = 2 * max_trie_entry_size - 1 for i in range(3 * max_trie_entry_size - 1, max_trie_entry_size - 1, -1): t += i assert len(t._partitions) == 1 assert big_rep in t._subtrees assert len(t._subtrees[big_rep]) == 2 * max_trie_entry_size t += max_trie_entry_size - 1 assert len(t._partitions) == 2 assert big_rep in t._subtrees assert small_rep in t._subtrees assert len(t._subtrees[big_rep]) == max_trie_entry_size assert len(t._subtrees[small_rep]) == max_trie_entry_size + 1
def test_calculate_representative(val): rep = YFastTrie._calculate_representative(val, max_trie_entry_size) assert rep >= val assert (rep + 1) % max_trie_entry_size == 0
def valid_subtree_values(self): for rep in self.t._subtrees.keys(): assert rep in self.t._partitions assert YFastTrie._calculate_representative(rep, max_trie_entry_size) == rep
def __init__(self): super(YFastStateMachine, self).__init__() self.t = YFastTrie(max_trie_entry_size)