def setUp(self): self.trie = Trie()
class TestTrie(unittest.TestCase): def setUp(self): self.trie = Trie() def tearDown(self): self.trie.reset() def test_add_contains(self): self.trie.add('bayern') self.trie.add('chelsea') self.assertTrue(self.trie.contains('bayern')) self.assertTrue(self.trie.contains('chelsea')) def test_contains_partial_word(self): self.trie.add('ban') self.trie.add('banana') self.assertTrue(self.trie.contains('ban')) self.assertTrue(self.trie.contains('banana')) def test_not_contains(self): self.trie.add('ban') self.assertFalse(self.trie.contains('banana')) self.assertFalse(self.trie.contains('aardvark')) def test_lowercase(self): self.trie.add('BAN') self.assertTrue(self.trie.contains('BAN')) self.assertTrue(self.trie.contains('ban'))
class TestSpellcheckTrie(unittest.TestCase): def setUp(self): self.trie = Trie() self.checker = SpellChecker(self.trie) def tearDown(self): self.trie.reset() self.checker.reset() def test_exact_match(self): self.trie.add('bayern') self.assertEqual(self.checker.spellcheck('bayern'), 'bayern') def test_miss(self): self.trie.add('bayern') self.assertFalse(self.checker.spellcheck('byern')) def test_vowel(self): self.trie.add('bayern') self.assertEqual(self.checker.spellcheck('bayarn'), 'bayern') def test_vowel_miss(self): self.trie.add('bayern') self.assertFalse(self.checker.spellcheck('barn')) def test_vowel_last_letter(self): self.trie.add('ygapo') self.assertEqual(self.checker.spellcheck('ygapu'), 'ygapo') def test_repeating_chars(self): self.trie.add('job') self.assertEqual(self.checker.spellcheck('jjoobbb'), 'job') def test_repeating_chars_smaller_word(self): self.trie.add('cuppy') self.trie.add('cuphead') self.assertEqual(self.checker.spellcheck('ccoppphead'), 'cuphead') def test_spellcheck_backtrack(self): self.trie.add('pea') self.trie.add('peep') self.trie.add('peeper') self.trie.add('peephole') self.trie.add('peon') self.trie.add('peonage') self.trie.add('people') self.assertEqual(self.checker.spellcheck('peepple'), 'people') def test_challenge_words(self): self.trie.add('conspiracy') self.trie.add('sheep') self.trie.add('people') self.trie.add('wake') self.assertEqual(self.checker.spellcheck('CUNsperrICY'), 'conspiracy') self.assertEqual(self.checker.spellcheck('sheeeeep'), 'sheep') self.assertEqual(self.checker.spellcheck('peepple'), 'people') self.assertEqual(self.checker.spellcheck('weke'), 'wake') self.assertEqual(self.checker.spellcheck('sheeple'), 'sheep') def test_vowels_and_repeating_letters(self): self.trie.add('sdrucciola') self.assertEqual(self.checker.spellcheck('sdrucciila'), 'sdrucciola')
def setUp(self): self.trie = Trie() self.checker = SpellChecker(self.trie)
# because we don't want to end up with crazy # words, keep the letter the same most of the time if 1 <= rand <= 30 and letter in VOWELS: return random.choice([vowel for vowel in VOWELS if vowel != letter]) elif 31 <= rand <= 40: return letter * random.randint(2, 3) elif 41 <= rand <= 100: return letter return letter if __name__ == '__main__': DICTIONARY = '/usr/share/dict/words' trie = Trie() with open(DICTIONARY, 'r') as f: for line in f: trie.add(line) leafs = trie.root.leafs for i in range(20): misspelling = generate_misspelling(leafs) if DEBUG: sys.stderr.write('+' + misspelling + "\n") print misspelling