#include "pch.h"

#include <Base64.h>
#include <Text.h>

#include "CppUnitTest.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

// test class for base64 encoding and decoding
namespace FrameworkTests
{
    TEST_CLASS (Base64Tests)
    {
    public:
        TEST_METHOD (TestEncoding)
        {
            const char* data = "Hello World!";
            const char* encoded = "SGVsbG8gV29ybGQh";
            Framework::Text encodedData
                = Framework::base64Encode(data, Framework::textLength(data));
            Assert::AreEqual(encoded, encodedData.getText());
        }

        TEST_METHOD (TestDecoding)
        {
            const char* data = "SGVsbG8gV29ybGQh";
            const char* decoded = "Hello World!";
            char* decodedData = 0;
            int decodecLength;
            Framework::base64Decode(data, &decodedData, &decodecLength);
            Assert::AreEqual(decoded, decodedData);
            delete[] decodedData;
        }

        TEST_METHOD (TestDecodingInvalid)
        {
            const char* data = "SGVsbG8.gVd29ybGQh";
            char* decodedData = 0;
            int decodecLength;
            Framework::base64Decode(data, &decodedData, &decodecLength);
            Assert::AreEqual(0, decodecLength);
            delete[] decodedData;
        }

        TEST_METHOD (TestDecodeAndEncode)
        {
            const char* data
                = "g0OLN0EJepEiT8eiNdvb9PfJkIqSpiLqb3uvRwyg2Y7iZsQkbkC1kI99M8Na"
                  "ELhT2Erca/"
                  "D+VmB6B6aFpoAViuXZrlQaZeSo4RhtPScmjwFwbGtha8DA5Mdna2/"
                  "ngPjOWqgkdA4JHe8hiS1Ir7tIICmygZR0Qnk8qeSrkWWlYL5OhDRcjFBMrNl"
                  "584o1Pape7izxZG1soBdRTKi28Ap2QI2pmxr55sbTYbtelfcK8+"
                  "c15UyiUuy4ozliWitr0Gr3egYAE3Ts2UlOlafjjbDXdeS+"
                  "wYcRrkGz56IPEw/"
                  "efQgAAAAAWYMbzXDzF76JvaIYb3uNVDpQ20v9Hf3mvw75zet31Ub57xRr4ys"
                  "qbujMhVhIFKuCY4jMYqTLSWXYRDTFuwoMtfggIt1KS0w0GdGLYOQ44ki/"
                  "r6lle/LJVDf9GvEIAAAAACaoAgBFyt6PFyzCL/"
                  "xPj+GGcipGItOqncd18f1zDfB7Mpp9d2VcCAAAAAB7h8qphRo5Z5+"
                  "rkeXNZZFrLQdeLHpqHvWct3MUHc8cmFjlQ9z+"
                  "fESeKNSF9TsXYWgev5OYKrCOxmgDAAAAANmF0fUfK9thCADVAQDa3Ex6BgAi"
                  "/vpcF13DNB1Yy0cJWw5xXef2MN0XWrl3YpVVrRFbzhFWLCez71rQSCcZUYIm"
                  "wd4PuRDrz2mmSMo8nHlM90lcT3SDAwAAADG1AWXd06wFAAAAAOv8hxK/"
                  "ZiB6dg1K3rKSqu4wJTwobZh24Rx5R/"
                  "hN8v058IVLsetqLGJ3dkIqCuwaORJVYH7s1WAJT6cDAAAAAJuaAdSMhiA/"
                  "c4pq1QIA4Bgs6gYARSQXmYOVhlr1j6mdkkU5kxvEGjoEAAAAAI3DbmPEUHvv"
                  "O4A1XpbO4S1WPCPk5MB3K/gMRb4lf8KxQzEWCAAAAADFAgCBkPe8ES4cp/"
                  "v81FI69jgguK9LsbqPcN8PM5JSZKda5TlSokl/"
                  "vvB8u8XO9b0IAAAAABd2t2Eoc/"
                  "CYVAHL5VIxjqsXxv25EX54AgD6NcfJLIXRQvuJoiT7k7xQlIg35bnEktCMkI"
                  "qdDwQAAAAANQMAnwAACjln02TspaXoMEkOLdzJfHFTs1cNeencBgBVAwB6AA"
                  "Boo4lsQ5OkqWgKlg6vfz73jGrVV+ZHqZqethSIlBoEAAAAAPy8jWn+"
                  "IQ6piBdBlsW/"
                  "075NP5SkJtpOv3oGANMEAAAAAJntB5erkwGrtA5VPiWV0+"
                  "pWqKmj5j5IDRqWzJScoZc3kJ3NPDLN5uXbPSQB0vfrKqCVzYjTF5XtrWOCSg"
                  "UAAAAAGoGUt0/Q6B64z/"
                  "j18vnI6uXyjHzAFVHXqj+"
                  "FDsHPEttRppOgeH29MU23J0Gy7yyZ47gWpc1mfXilAwAAAACFZ9KXQyQ/"
                  "1sO2VYLnojoQ4uv+EIXjx5uJlQMAAAAAMAQAAAAABw+oCpMR2yxU/"
                  "morwyKARgojgBkGAGwZFvH73Y6FdJGMgjqVF0pyQp1yrMg2zUp812z78HJpC"
                  "4dcB2bpjNl8Gly1r3IBIrSek2FnyDCwRgkeQviPqwQAAAAAkAQAAAAAGAgAA"
                  "AAAC33xl1dusLMkYA==";
            char* decodedData = 0;
            int decodecLength;
            Framework::base64Decode(data, &decodedData, &decodecLength);
            Framework::Text encoded
                = Framework::base64Encode(decodedData, decodecLength);
            Assert::IsTrue(encoded.isEqual(data));
            delete[] decodedData;
        }
    };
} // namespace FrameworkTests