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')