#include "Base64.h"
#include <string.h>


void base64_test(const char* test, const char* test_str)
{
    // Encode
    std::vector<uint8_t> input_data(test_str, test_str + strlen(test_str));
    std::string encoded_str;
    Base64::Encode(input_data, encoded_str);

    // Decode
    std::vector<uint8_t> decoded_data;
    Base64::Decode(encoded_str, decoded_data);
	std::string decoded(decoded_data.begin(),decoded_data.end());

	if ( decoded == test_str )
    {
		printf("%s: PASS\n", test);
	}
    else
    {
		printf("%s: FAIL\n", test);
		printf("String:   -%s-\n", test_str);
		printf("Encoded:  -%s-\n", encoded_str.c_str());
		printf("Decoded:  -%s-\n", decoded.c_str());
		printf("Length:   -%li-\n", decoded.size());
		printf("Length:   -%li-\n", strlen(test_str));
        for (int i = 0; i < decoded.size(); i++)
        {
          if (decoded[i] != test_str[i])
          {
            printf("mismatch at character %i, %02X != %02X\n", i, decoded[i], test_str[i]);
            break;
          }
        }
		exit(-1);
	}
}


int main()
{
  const char* test_str1 = "";
  const char* test_str2 = "The quick brown fox jumps over the lazy dog.";
  const char* test_str3 = "The quick brown fox jumps over the lazy dog";
  base64_test("Test1", test_str1);
  base64_test("Test2", test_str2);
  base64_test("Test3", test_str3);

  // base64 tests
  std::vector<uint8_t> decoded;
  Base64::Decode("dGVzdAo=", decoded);
  printf("base64 test1: -%s-\n", decoded.data());
  Base64::Decode("dGVzdDEK", decoded);
  printf("base64 test2: -%s-\n", decoded.data());
  Base64::Decode("dGVzdDEyCg==", decoded);
  printf("base64 test3: -%s-\n", decoded.data());
}


