def test_split_patterns(self): pattern_list = ['ab', 'b'] root = link_pattern_trie(construct_pattern_trie(pattern_list)) a_node = root.edges['a'] b_node = root.edges['b'] self.assertEqual(b_node, a_node.edges['b'].failure_link) self.assertEqual(b_node, a_node.edges['b'].output_link)
def test_repeated_char(self): pattern = 'aaaaaa' root = link_pattern_trie(construct_pattern_trie([pattern])) current = root for c in pattern: nxt = current.edges[c] self.assertEqual(None, current.output_link) self.assertEqual(current, nxt.failure_link)
def test_base_case(self): pattern_list = ['a', 'b', 'c'] root = link_pattern_trie(construct_pattern_trie(pattern_list)) self.assertEqual(root, root.failure_link) self.assertEqual(None, root.output_link) for c in pattern_list: self.assertEqual(root, root.edges[c].failure_link) self.assertEqual(None, root.edges[c].output_link)
def test_long_output_path(self): pattern_list = ['b', 'abb', 'aab'] root = link_pattern_trie(construct_pattern_trie(pattern_list)) end_node = self.follow_path(root, 'aab') mid_node = self.follow_path(root, 'ab') start_node = self.follow_path(root, 'b') self.assertEqual(mid_node, end_node.failure_link) self.assertEqual(start_node, mid_node.failure_link) self.assertEqual(start_node, mid_node.output_link) self.assertEqual(start_node, end_node.output_link)
def test_eclipsing_patterns(self): pattern_list = ['aaaaa', 'aaaa', 'aaa', 'aa', 'a'] root = link_pattern_trie(construct_pattern_trie(pattern_list)) current = root.edges['a'] self.assertEqual(root, current.failure_link) self.assertEqual(None, current.output_link) for c in 'aaaa': nxt = current.edges[c] self.assertEqual(current, nxt.failure_link) self.assertEqual(current, nxt.output_link)