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