import caesar4 import unittest class KnownEncryptions(unittest.TestCase): known_encryptions = ( ('hello', 2, 'jgnnq'), ('plain', 5, 'uqfns'), ('abcde', 1, 'bcdef'), ('zoo', 4, 'dss'), ('xylophone', 14, 'lmzcdvcbs'), ('HELLO', 2, 'JGNNQ'), ('XyLoPhOnE', 14, 'LmZcDvCbS'), ('hello', -2, 'fcjjm'), ('AnAcOnDa', -20, 'GtGiUtJg')) def test_caesar_known_encryptions(self): '''encrypt should give known result with known input''' for plaintext, shift, ciphertext in self.known_encryptions: result = caesar4.encrypt(plaintext, shift) self.assertEqual(result, ciphertext) def test_caesar_known_decryptions(self): '''decrypt should give known result with known input''' for plaintext, shift, ciphertext in self.known_encryptions: result = caesar4.decrypt(ciphertext, shift) self.assertEqual(result, plaintext) class EncryptAndDecrypt(unittest.TestCase): plaintext = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' def test_encrypt_and_decrypt(self): '''decrypt(encrypt(string, n)) == string for all strings and all n''' for i in range(-25, 26): self.assertEqual(self.plaintext, caesar4.decrypt(caesar4.encrypt(self.plaintext, i), i)) class BadInput(unittest.TestCase): plaintext = ' 1234567890`~!@#$%^&*()-_=+[]{}\|:;"\'<>?/' def test_non_alpha(self): '''encrypt and decrypt should not touch non-alphabetical characters''' for i in range(-25, 26): self.assertEqual(self.plaintext, caesar4.encrypt(self.plaintext, i)) self.assertEqual(self.plaintext, caesar4.decrypt(self.plaintext, i)) if __name__ == '__main__': unittest.main()