def test_identical_chars(self):
     pattern_list = ['a', 'a', 'a', 'a']
     root = construct_pattern_trie(pattern_list)
     self.assertEqual(1, len(root.edges))
     self.assertTrue('a' in root.edges)
     self.assertEqual([0,1,2,3], root.edges['a'].patterns)
     self.assertEqual(0, len(root.edges['a'].edges))
 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_matching_patterns(self):
     pattern_list = ['aaba', 'aaba']
     root = construct_pattern_trie(pattern_list)
     current = root
     for c in 'aaba':
         self.assertEqual(1, len(current.edges))
         self.assertTrue(c in current.edges)
         current = current.edges[c]
     self.assertEqual([0,1], current.patterns)
 def test_distinct_chars(self):
     pattern_list = ['a', 'b', 'c', 'd']
     root = construct_pattern_trie(pattern_list)
     self.assertEqual(len(pattern_list), len(root.edges))
     for i, c in enumerate(pattern_list):
         self.assertTrue(c in root.edges)
         self.assertEqual(1, len(root.edges[c].patterns))
         self.assertEqual(i, root.edges[c].patterns[0])
         self.assertEqual(0, len(root.edges[c].edges))
 def test_single_pattern(self):
     pattern = 'aabaaba'
     root = construct_pattern_trie([pattern])
     current = root
     for c in pattern:
         self.assertTrue(c in current.edges)
         self.assertEqual(1, len(current.edges))
         current = current.edges[c]
     self.assertEqual(1, len(current.patterns))
     self.assertEqual(0, current.patterns[0]) 
 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)
 def test_eclipsing_patterns(self):
     pattern_list = ['ab', 'a']
     root = construct_pattern_trie(pattern_list)
     self.assertEqual(1, len(root.edges)) 
     self.assertTrue('a' in root.edges)
     nxt = root.edges['a']
     self.assertEqual([1], nxt.patterns)
     self.assertEqual(1, len(nxt.edges)) 
     self.assertTrue('b' in nxt.edges)
     nxt = nxt.edges['b']
     self.assertEqual([0], nxt.patterns)
     self.assertEqual(0, len(nxt.edges)) 
 def test_prefix_match(self):
     pattern_list = ['ab', 'ac']
     root = construct_pattern_trie(pattern_list)
     self.assertEqual(1, len(root.edges)) 
     self.assertTrue('a' in root.edges)
     branch = root.edges['a']
     self.assertEqual(2, len(branch.edges))
     self.assertTrue('b' in branch.edges)
     self.assertTrue('c' in branch.edges)
     self.assertEqual(0, len(branch.edges['b'].edges))
     self.assertEqual(0, len(branch.edges['c'].edges))
     self.assertEqual(1, len(branch.edges['b'].patterns))
     self.assertEqual(1, len(branch.edges['c'].patterns))
     self.assertEqual(0, branch.edges['b'].patterns[0])
     self.assertEqual(1, branch.edges['c'].patterns[0])
 def test_distinct_patterns(self):
     pattern_list = ['aaba', 'foo', 'bar']
     root = construct_pattern_trie(pattern_list)
     self.assertEqual(sorted(pattern_list), sorted(self.deconstruct_pattern_trie(root)))
 def test_empty_strings(self):
     pattern_list = ['','','','']
     root = construct_pattern_trie(pattern_list)
     self.assertEqual(0, len(root.edges))
     self.assertEqual(0, len(root.patterns))
 def test_empty_set(self):
     root = construct_pattern_trie([])
     self.assertEqual(0, len(root.edges))
     self.assertEqual(0, len(root.patterns))
 def test_intersecting_patterns(self):
     pattern_list = ['aaba', 'aabaaa', 'abba', 'aba', 'baa', 'bab']
     root = construct_pattern_trie(pattern_list)
     self.assertEqual(sorted(pattern_list), sorted(self.deconstruct_pattern_trie(root)))
 def test_distinct_patterns(self):
     pattern_list = ['aaba', 'foo', 'bar']
     pattern_list.sort()
     root = construct_pattern_trie(pattern_list)
     self.assertEqual(pattern_list, self.deconstruct_pattern_trie(root))