From f26404f56abd88ca976f2ba6bc03fecd40ba75b4 Mon Sep 17 00:00:00 2001 From: Matthew Ellison Date: Mon, 30 Apr 2018 12:20:28 -0400 Subject: [PATCH] Moved test main to new file for neatness --- testMain.hpp | 327 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 testMain.hpp diff --git a/testMain.hpp b/testMain.hpp new file mode 100644 index 0000000..aa89021 --- /dev/null +++ b/testMain.hpp @@ -0,0 +1,327 @@ +//Ciphers/testMain.hpp +//Matthew Ellison +// Created: 4-30-18 +//Modified: 4-30-18 +//This file contains the driver function and the test functions for the Cipher program +//This program will use some simple ciphers that are no longer widely used but still fun to play with + + +#include "Headers/Caesar.hpp" +#include "Headers/Playfair.hpp" +#include "Headers/Vigenere.hpp" +#include "Headers/Atbash.hpp" +#include +#include + + +//#define TEST_VERSION + +#ifdef TEST_VERSION +#define CAESAR_TEST +#define PLAYFAIR_TEST +#define VIGENERE_TEST +#define ATBASH_TEST +enum codingState { ENCODE, DECODE }; +std::string testingError(codingState type, const std::string& input, const std::string& output, const std::string& cipher); +#endif //TEST_VERSION definition + +#ifdef CAESAR_TEST +bool caesarTest(std::string& errorString); +#endif //CAESAR_TEST + +#ifdef PLAYFAIR_TEST +bool playfairTest(std::string& errorString); +#endif //PLAYFAIR_TEST + +#ifdef VIGENERE_TEST +bool vigenereTest(std::string& errorString); +#endif //VIGENERE_TEST + +#ifdef ATBASH_TEST +bool atbashTest(std::string& errorString); +#endif //ATBASH_TEST + + +#ifdef TEST_VERSION + +int main(int argc, char** argv){ + bool testResult = false; + std::string resultString = ""; + std::string errorString = ""; + + //Testing the Caesar Cipher + #ifdef CAESAR_TEST + testResult = caesarTest(errorString); + //If the test was successful + if(testResult){ + resultString += "Caesar Cipher completed successfully\n"; + } + else{ + resultString += "Caesar Cipher error in " + errorString; + } + std::cout << "Test1: " << resultString << std::endl; + //Reset the variables + errorString = ""; + testResult = false; + #endif //CAESAR_TEST + + //Testing the playfair cipher + #ifdef PLAYFAIR_TEST + testResult = playfairTest(errorString); + if(testResult){ + resultString += "Playfair Cipher completed successfully\n"; + } + else{ + resultString += "Playfair Cipher error in " + errorString; + } + errorString = ""; + testResult = false; + #endif //PLAYFAIR_TEST + + #ifdef VIGENERE_TEST + testResult = vigenereTest(errorString); + if(testResult){ + resultString += "Vigenere Cipher completed successfully\n"; + } + else{ + resultString += "Vigenere Cipher error in " + errorString; + } + errorString = ""; + testResult = false; + #endif //VIGENERE_TEST + + #ifdef ATBASH_TEST + testResult = atbashTest(errorString); + if(testResult){ + resultString+= "Atbash Cipher completed successfully\n"; + } + else{ + resultString += "Atbash Cipher error in " + errorString; + } + errorString = ""; + testResult = false; + #endif //ATBASH_TEST + + std::cout << "Results:\n" << resultString << std::endl; + std::cin.get(); + + return 0; +} + +std::string testingError(codingState type, const std::string& input, const std::string& output, const std::string& cipher){ + std::string errorMessage; + //Decide if it was encoding or decoding + if(type == ENCODE){ + errorMessage = "Encoding:"; + } + else if(type == DECODE){ + errorMessage = "Decoding:"; + } + else{ + errorMessage = "We gots problems"; + } + errorMessage += "\nError in: " + input + "\nExpected: " + output + "\nActual: " + cipher + '\n'; + + return errorMessage; +} + + +#ifdef CAESAR_TEST +bool caesarTest(std::string& errorString){ + ///Add something in error message about shift amount + Caesar cipher; + bool passed = true; + std::string inputString; //Holds the string to be input into the cipher + std::string outputString; //Holds the string that the cipher is expected to output + std::string cipherString; //Holds the string that the cipher actually output + + ///All lowercase + inputString = "abcdefghijklmnopqrstuvwxyz"; //Shift = 3 + outputString = "defghijklmnopqrstuvwxyzabc"; //Shift = 3 + //Try it forwards + cipherString = cipher.encode(3, inputString); + if(cipherString != outputString){ + //errorString += "Encoding:\nError in: " + inputString + "\nExpected: " + outputString + "\nActual: " + cipherString + '\n'; + errorString += testingError(ENCODE, inputString, outputString, cipherString); + passed = false; + } + //Try it backwards + cipherString = cipher.decode(3, outputString); + if(cipherString != inputString){ + //errorString += "Decoding:\nError in: " + outputString + "\nExpected: " + inputString + "\nActual: " + cipherString + '\n'; + errorString += testingError(DECODE, outputString, inputString, cipherString); + passed = false; + } + + ///All upercase + inputString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + outputString = "XYZABCDEFGHIJKLMNOPQRSTUVW"; + //Try it forwards + cipherString = cipher.encode(-3, inputString); + if(cipherString != outputString){ + errorString += testingError(ENCODE, inputString, outputString, cipherString); + passed = false; + } + //Try it backwards + cipherString = cipher.decode(-3, outputString); + if(cipherString != inputString){ + errorString += testingError(DECODE, outputString, inputString, cipherString); + passed = false; + } + + ///Both cases + inputString = "AbCdEfGhIjKlMnOpQrStUvWxYz"; + outputString = "DeFgHiJkLmNoPqRsTuVwXyZaBc"; + //Try it forwards + cipherString = cipher.encode(3, inputString); + if(cipherString != outputString){ + errorString += testingError(ENCODE, inputString, outputString, cipherString); + passed = false; + } + //Try it backwards + cipherString = cipher.decode(3, outputString); + if(cipherString != inputString){ + errorString += testingError(DECODE, outputString, inputString, cipherString); + passed = false; + } + + ///Punctuation + inputString = "abc,def. rst; wxyz"; + outputString = "def,ghi. uvw; zabc"; + //Try it forwards + cipherString = cipher.encode(3, inputString); + if(cipherString != outputString){ + errorString += testingError(ENCODE, inputString, outputString, cipherString); + passed = false; + } + //Try it backwards + cipherString = cipher.decode(3, outputString); + if(cipherString != inputString){ + errorString += testingError(DECODE, outputString, inputString, cipherString); + passed = false; + } + + return passed; +} +#endif //CAESAR_TEST + +#ifdef PLAYFAIR_TEST +bool playfairTest(std::string& errorString){ + bool passed = true; + std::string keyword, inputString, outputString, cipherString; + Playfair cipher; + + //Test from wikipedia + keyword = "Playfair Example"; + inputString = "Hide the gold in the tree stump"; + outputString = "BMODZBXDNABEKUDMUIXMMOUVIF"; + //Setup the cipher + cipherString = cipher.encode(keyword, inputString); + //If the cipher didn't spit out the correct string throw an error + if(cipherString != outputString){ + errorString += testingError(ENCODE, inputString, outputString, cipherString); + passed = false; + } + //This removes the spaces and turns everything capital so the reverse will work correctly + inputString = cipher.getInputString(); + + //Do the same thing in reverse + cipher.reset(); + cipherString = cipher.decode(keyword, outputString); + //If the cipher didn't spit out the correct string throw an error + if(cipherString != inputString){ + errorString += testingError(DECODE, outputString, inputString, cipherString); + passed = false; + } + + //Return if the cipher passed the tests + return passed; +} +#endif //PLAYFAIR_TEST + +#ifdef VIGENERE_TEST +bool vigenereTest(std::string& errorString){ + bool passed = true; + std::string keyword, inputString, outputString, cipherString; + Vigenere cipher; + + //Test from wikipedia + keyword = "lemon"; + inputString = "Attack at dawn"; + outputString = "LXFOPVEFRNHR"; + //Setup the cipher + cipherString = cipher.encode(keyword, inputString); + //If the cipher didn't spit out the correct string throw an error + if(cipherString != outputString){ + errorString += testingError(ENCODE, inputString, outputString, cipherString); + passed = false; + } + //This removes the spaces and turns everything capital so the reverse will work correctly + inputString = cipher.getInputString(); + + //Do the same thing in reverse + cipher.reset(); + cipherString = cipher.decode(keyword, outputString); + //If the cipher didn't spit out the correct string throw an error + if(cipherString != inputString){ + errorString += testingError(DECODE, outputString, inputString, cipherString); + passed = false; + } + + + //Second test from wikipedia + keyword = "ABCD"; + inputString = "CRYPTOISSHORTFORCRYPTOGRAPHY"; + outputString = "CSASTPKVSIQUTGQUCSASTPIUAQJB"; + //Setup the cipher + cipherString = cipher.encode(keyword, inputString); + //If the cipher didn't spit out the correct string throw an error + if(cipherString != outputString){ + errorString += testingError(ENCODE, inputString, outputString, cipherString); + passed = false; + } + //This removes the spaces and turns everything capital so the reverse will work correctly + inputString = cipher.getInputString(); + + //Do the same thing in reverse + cipher.reset(); + cipherString = cipher.decode(keyword, outputString); + //If the cipher didn't spit out the correct string throw an error + if(cipherString != inputString){ + errorString += testingError(DECODE, outputString, inputString, cipherString); + passed = false; + } + + + //Return if the cipher passed the tests + return passed; +} +#endif //VIGENERE_TEST + +#ifdef ATBASH_TEST +bool atbashTest(std::string& errorString){ + bool passed = true; + std::string inputString, outputString, cipherString; + Atbash cipher; + + inputString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + outputString = "ZYXWVUTSRQPONMLKJIHGFEDCBA"; + cipherString = cipher.encode(inputString); + if(cipherString != outputString){ + errorString += testingError(ENCODE, inputString, outputString, cipherString); + passed = false; + } + + //Try it backwards + cipher.reset(); + cipherString = cipher.decode(outputString); + if(cipherString != inputString){ + errorString += testingError(DECODE, outputString, inputString, cipherString); + passed = false; + } + + return passed; +} +#endif //ATBASH_TEST + +#endif //TEST_VERSION