From f68690f296d60f9917dc48c594aecbc590696f3d Mon Sep 17 00:00:00 2001 From: Harshil Darji Date: Tue, 2 Aug 2016 23:16:55 +0530 Subject: [PATCH] Added test cases --- ciphers/brute-force_caesar_cipher.py | 67 +++++++++++++---- ciphers/caesar_cipher.py | 73 +++++++++++-------- ciphers/simple_substitution_cipher.py | 8 ++ ciphers/transposition_cipher.py | 10 +++ .../detecting_english_programmatically.py | 16 +++- 5 files changed, 127 insertions(+), 47 deletions(-) diff --git a/ciphers/brute-force_caesar_cipher.py b/ciphers/brute-force_caesar_cipher.py index 46c4246e6..3e6e975c8 100644 --- a/ciphers/brute-force_caesar_cipher.py +++ b/ciphers/brute-force_caesar_cipher.py @@ -1,18 +1,53 @@ -message = input("Encrypted message: ") -LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +def decrypt(message): + """ + >>> decrypt('TMDETUX PMDVU') + Decryption using Key #0: TMDETUX PMDVU + Decryption using Key #1: SLCDSTW OLCUT + Decryption using Key #2: RKBCRSV NKBTS + Decryption using Key #3: QJABQRU MJASR + Decryption using Key #4: PIZAPQT LIZRQ + Decryption using Key #5: OHYZOPS KHYQP + Decryption using Key #6: NGXYNOR JGXPO + Decryption using Key #7: MFWXMNQ IFWON + Decryption using Key #8: LEVWLMP HEVNM + Decryption using Key #9: KDUVKLO GDUML + Decryption using Key #10: JCTUJKN FCTLK + Decryption using Key #11: IBSTIJM EBSKJ + Decryption using Key #12: HARSHIL DARJI + Decryption using Key #13: GZQRGHK CZQIH + Decryption using Key #14: FYPQFGJ BYPHG + Decryption using Key #15: EXOPEFI AXOGF + Decryption using Key #16: DWNODEH ZWNFE + Decryption using Key #17: CVMNCDG YVMED + Decryption using Key #18: BULMBCF XULDC + Decryption using Key #19: ATKLABE WTKCB + Decryption using Key #20: ZSJKZAD VSJBA + Decryption using Key #21: YRIJYZC URIAZ + Decryption using Key #22: XQHIXYB TQHZY + Decryption using Key #23: WPGHWXA SPGYX + Decryption using Key #24: VOFGVWZ ROFXW + Decryption using Key #25: UNEFUVY QNEWV + """ + LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + for key in range(len(LETTERS)): + translated = "" + for symbol in message: + if symbol in LETTERS: + num = LETTERS.find(symbol) + num = num - key + if num < 0: + num = num + len(LETTERS) + translated = translated + LETTERS[num] + else: + translated = translated + symbol + print("Decryption using Key #%s: %s" % (key, translated)) -message = message.upper() +def main(): + message = input("Encrypted message: ") + message = message.upper() + decrypt(message) -for key in range(len(LETTERS)): - translated = "" - for symbol in message: - if symbol in LETTERS: - num = LETTERS.find(symbol) - num = num - key - if num < 0: - num = num + len(LETTERS) - translated = translated + LETTERS[num] - else: - translated = translated + symbol - - print("Decryption using Key #%s: %s" % (key, translated)) +if __name__ == '__main__': + import doctest + doctest.testmod() + main() diff --git a/ciphers/caesar_cipher.py b/ciphers/caesar_cipher.py index b1342dc5e..43315a97d 100644 --- a/ciphers/caesar_cipher.py +++ b/ciphers/caesar_cipher.py @@ -1,38 +1,51 @@ # The Caesar Cipher Algorithm -message = input("Enter message: ") -key = int(input("Key [1-26]: ")) -mode = input("Encrypt or Decrypt [e/d]: ") +def main(): + message = input("Enter message: ") + key = int(input("Key [1-26]: ")) + mode = input("Encrypt or Decrypt [e/d]: ") -if mode.lower().startswith('e'): - mode = "encrypt" -elif mode.lower().startswith('d'): - mode = "decrypt" + if mode.lower().startswith('e'): + mode = "encrypt" + elif mode.lower().startswith('d'): + mode = "decrypt" -LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + translated = encdec(message, key, mode) + if mode == "encrypt": + print("Encryption:", translated) + elif mode == "decrypt": + print("Decryption:", translated) + +def encdec(message, key, mode): + """ + >>> encdec('Harshil Darji', 12, 'encrypt') + 'TMDETUX PMDVU' -translated = "" + >>> encdec('TMDETUX PMDVU', 12, 'decrypt') + 'HARSHIL DARJI' + """ + message = message.upper() + translated = "" + LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + for symbol in message: + if symbol in LETTERS: + num = LETTERS.find(symbol) + if mode == "encrypt": + num = num + key + elif mode == "decrypt": + num = num - key -message = message.upper() + if num >= len(LETTERS): + num = num - len(LETTERS) + elif num < 0: + num = num + len(LETTERS) -for symbol in message: - if symbol in LETTERS: - num = LETTERS.find(symbol) - if mode == "encrypt": - num = num + key - elif mode == "decrypt": - num = num - key + translated = translated + LETTERS[num] + else: + translated = translated + symbol + return translated - if num >= len(LETTERS): - num = num - len(LETTERS) - elif num < 0: - num = num + len(LETTERS) - - translated = translated + LETTERS[num] - else: - translated = translated + symbol - -if mode == "encrypt": - print("Encryption:", translated) -elif mode == "decrypt": - print("Decryption:", translated) +if __name__ == '__main__': + import doctest + doctest.testmod() + main() \ No newline at end of file diff --git a/ciphers/simple_substitution_cipher.py b/ciphers/simple_substitution_cipher.py index 4244434f2..41ac4a6a7 100644 --- a/ciphers/simple_substitution_cipher.py +++ b/ciphers/simple_substitution_cipher.py @@ -28,9 +28,17 @@ def checkValidKey(key): sys.exit('Error in the key or symbol set.') def encryptMessage(key, message): + """ + >>> encryptMessage('LFWOAYUISVKMNXPBDCRJTQEGHZ', 'Harshil Darji') + 'Ilcrism Olcvs' + """ return translateMessage(key, message, 'encrypt') def decryptMessage(key, message): + """ + >>> decryptMessage('LFWOAYUISVKMNXPBDCRJTQEGHZ', 'Ilcrism Olcvs') + 'Harshil Darji' + """ return translateMessage(key, message, 'decrypt') def translateMessage(key, message, mode): diff --git a/ciphers/transposition_cipher.py b/ciphers/transposition_cipher.py index 8c995d819..1c2ed0aa0 100644 --- a/ciphers/transposition_cipher.py +++ b/ciphers/transposition_cipher.py @@ -14,6 +14,10 @@ def main(): print('Output:\n%s' %(text + '|')) def encryptMessage(key, message): + """ + >>> encryptMessage(6, 'Harshil Darji') + 'Hlia rDsahrij' + """ cipherText = [''] * key for col in range(key): pointer = col @@ -23,6 +27,10 @@ def encryptMessage(key, message): return ''.join(cipherText) def decryptMessage(key, message): + """ + >>> decryptMessage(6, 'Hlia rDsahrij') + 'Harshil Darji' + """ numCols = math.ceil(len(message) / key) numRows = key numShadedBoxes = (numCols * numRows) - len(message) @@ -40,4 +48,6 @@ def decryptMessage(key, message): return "".join(plainText) if __name__ == '__main__': + import doctest + doctest.testmod() main() diff --git a/detect english/detecting_english_programmatically.py b/detect english/detecting_english_programmatically.py index 4e196296e..dad320b43 100644 --- a/detect english/detecting_english_programmatically.py +++ b/detect english/detecting_english_programmatically.py @@ -1,8 +1,11 @@ +import os + UPPERLETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' LETTERS_AND_SPACE = UPPERLETTERS + UPPERLETTERS.lower() + ' \t\n' def loadDictionary(): - dictionaryFile = open('Dictionary.txt') + path = os.path.split(os.path.realpath(__file__)) + dictionaryFile = open(path[0] + '\Dictionary.txt') englishWords = {} for word in dictionaryFile.read().split('\n'): englishWords[word] = None @@ -34,8 +37,19 @@ def removeNonLetters(message): return ''.join(lettersOnly) def isEnglish(message, wordPercentage = 20, letterPercentage = 85): + """ + >>> isEnglish('Hello World') + True + + >>> isEnglish('llold HorWd') + False + """ wordsMatch = getEnglishCount(message) * 100 >= wordPercentage numLetters = len(removeNonLetters(message)) messageLettersPercentage = (float(numLetters) / len(message)) * 100 lettersMatch = messageLettersPercentage >= letterPercentage return wordsMatch and lettersMatch + + +import doctest +doctest.testmod()