示例#1
0
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)
示例#2
0
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)
示例#3
0
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
示例#4
0
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)
示例#5
0
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
示例#6
0
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
示例#7
0
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
示例#8
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)
示例#9
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
示例#10
0
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
示例#11
0
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
示例#12
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
示例#13
0
	def __init__(self):
		super(YFastStateMachine, self).__init__()
		self.t = YFastTrie(max_trie_entry_size)