view C++/tests/Base64/main.cpp @ 477:65b567c8de54

Base64: - Add some asserts, - Add new isValid function, - Throw more errors on invalid strings.
author David Demelier <markand@malikania.fr>
date Tue, 10 Nov 2015 13:32:51 +0100
parents d5ec1174b707
children 3f29e6c05983
line wrap: on
line source

/*
 * main.cpp -- main test file for Base64
 *
 * Copyright (c) 2013-2015 David Demelier <markand@malikania.fr>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <gtest/gtest.h>

#include <Base64.h>

TEST(Lookup, lookup)
{
	ASSERT_EQ('A', base64::lookup(0b000000));
	ASSERT_EQ('B', base64::lookup(0b000001));
	ASSERT_EQ('C', base64::lookup(0b000010));
	ASSERT_EQ('D', base64::lookup(0b000011));
	ASSERT_EQ('E', base64::lookup(0b000100));
	ASSERT_EQ('F', base64::lookup(0b000101));
	ASSERT_EQ('G', base64::lookup(0b000110));
	ASSERT_EQ('H', base64::lookup(0b000111));
	ASSERT_EQ('I', base64::lookup(0b001000));
	ASSERT_EQ('J', base64::lookup(0b001001));
	ASSERT_EQ('K', base64::lookup(0b001010));
	ASSERT_EQ('L', base64::lookup(0b001011));
	ASSERT_EQ('M', base64::lookup(0b001100));
	ASSERT_EQ('N', base64::lookup(0b001101));
	ASSERT_EQ('O', base64::lookup(0b001110));
	ASSERT_EQ('P', base64::lookup(0b001111));
	ASSERT_EQ('Q', base64::lookup(0b010000));
	ASSERT_EQ('R', base64::lookup(0b010001));
	ASSERT_EQ('S', base64::lookup(0b010010));
	ASSERT_EQ('T', base64::lookup(0b010011));
	ASSERT_EQ('U', base64::lookup(0b010100));
	ASSERT_EQ('V', base64::lookup(0b010101));
	ASSERT_EQ('W', base64::lookup(0b010110));
	ASSERT_EQ('X', base64::lookup(0b010111));
	ASSERT_EQ('Y', base64::lookup(0b011000));
	ASSERT_EQ('Z', base64::lookup(0b011001));
	ASSERT_EQ('a', base64::lookup(0b011010));
	ASSERT_EQ('b', base64::lookup(0b011011));
	ASSERT_EQ('c', base64::lookup(0b011100));
	ASSERT_EQ('d', base64::lookup(0b011101));
	ASSERT_EQ('e', base64::lookup(0b011110));
	ASSERT_EQ('f', base64::lookup(0b011111));
	ASSERT_EQ('g', base64::lookup(0b100000));
	ASSERT_EQ('h', base64::lookup(0b100001));
	ASSERT_EQ('i', base64::lookup(0b100010));
	ASSERT_EQ('j', base64::lookup(0b100011));
	ASSERT_EQ('k', base64::lookup(0b100100));
	ASSERT_EQ('l', base64::lookup(0b100101));
	ASSERT_EQ('m', base64::lookup(0b100110));
	ASSERT_EQ('n', base64::lookup(0b100111));
	ASSERT_EQ('o', base64::lookup(0b101000));
	ASSERT_EQ('p', base64::lookup(0b101001));
	ASSERT_EQ('q', base64::lookup(0b101010));
	ASSERT_EQ('r', base64::lookup(0b101011));
	ASSERT_EQ('s', base64::lookup(0b101100));
	ASSERT_EQ('t', base64::lookup(0b101101));
	ASSERT_EQ('u', base64::lookup(0b101110));
	ASSERT_EQ('v', base64::lookup(0b101111));
	ASSERT_EQ('w', base64::lookup(0b110000));
	ASSERT_EQ('x', base64::lookup(0b110001));
	ASSERT_EQ('y', base64::lookup(0b110010));
	ASSERT_EQ('z', base64::lookup(0b110011));
	ASSERT_EQ('0', base64::lookup(0b110100));
	ASSERT_EQ('1', base64::lookup(0b110101));
	ASSERT_EQ('2', base64::lookup(0b110110));
	ASSERT_EQ('3', base64::lookup(0b110111));
	ASSERT_EQ('4', base64::lookup(0b111000));
	ASSERT_EQ('5', base64::lookup(0b111001));
	ASSERT_EQ('6', base64::lookup(0b111010));
	ASSERT_EQ('7', base64::lookup(0b111011));
	ASSERT_EQ('8', base64::lookup(0b111100));
	ASSERT_EQ('9', base64::lookup(0b111101));
	ASSERT_EQ('+', base64::lookup(0b111110));
	ASSERT_EQ('/', base64::lookup(0b111111));
}

TEST(Lookup, rlookup)
{
	ASSERT_EQ(0b000000, base64::rlookup('A'));
	ASSERT_EQ(0b000001, base64::rlookup('B'));
	ASSERT_EQ(0b000010, base64::rlookup('C'));
	ASSERT_EQ(0b000011, base64::rlookup('D'));
	ASSERT_EQ(0b000100, base64::rlookup('E'));
	ASSERT_EQ(0b000101, base64::rlookup('F'));
	ASSERT_EQ(0b000110, base64::rlookup('G'));
	ASSERT_EQ(0b000111, base64::rlookup('H'));
	ASSERT_EQ(0b001000, base64::rlookup('I'));
	ASSERT_EQ(0b001001, base64::rlookup('J'));
	ASSERT_EQ(0b001010, base64::rlookup('K'));
	ASSERT_EQ(0b001011, base64::rlookup('L'));
	ASSERT_EQ(0b001100, base64::rlookup('M'));
	ASSERT_EQ(0b001101, base64::rlookup('N'));
	ASSERT_EQ(0b001110, base64::rlookup('O'));
	ASSERT_EQ(0b001111, base64::rlookup('P'));
	ASSERT_EQ(0b010000, base64::rlookup('Q'));
	ASSERT_EQ(0b010001, base64::rlookup('R'));
	ASSERT_EQ(0b010010, base64::rlookup('S'));
	ASSERT_EQ(0b010011, base64::rlookup('T'));
	ASSERT_EQ(0b010100, base64::rlookup('U'));
	ASSERT_EQ(0b010101, base64::rlookup('V'));
	ASSERT_EQ(0b010110, base64::rlookup('W'));
	ASSERT_EQ(0b010111, base64::rlookup('X'));
	ASSERT_EQ(0b011000, base64::rlookup('Y'));
	ASSERT_EQ(0b011001, base64::rlookup('Z'));
	ASSERT_EQ(0b011010, base64::rlookup('a'));
	ASSERT_EQ(0b011011, base64::rlookup('b'));
	ASSERT_EQ(0b011100, base64::rlookup('c'));
	ASSERT_EQ(0b011101, base64::rlookup('d'));
	ASSERT_EQ(0b011110, base64::rlookup('e'));
	ASSERT_EQ(0b011111, base64::rlookup('f'));
	ASSERT_EQ(0b100000, base64::rlookup('g'));
	ASSERT_EQ(0b100001, base64::rlookup('h'));
	ASSERT_EQ(0b100010, base64::rlookup('i'));
	ASSERT_EQ(0b100011, base64::rlookup('j'));
	ASSERT_EQ(0b100100, base64::rlookup('k'));
	ASSERT_EQ(0b100101, base64::rlookup('l'));
	ASSERT_EQ(0b100110, base64::rlookup('m'));
	ASSERT_EQ(0b100111, base64::rlookup('n'));
	ASSERT_EQ(0b101000, base64::rlookup('o'));
	ASSERT_EQ(0b101001, base64::rlookup('p'));
	ASSERT_EQ(0b101010, base64::rlookup('q'));
	ASSERT_EQ(0b101011, base64::rlookup('r'));
	ASSERT_EQ(0b101100, base64::rlookup('s'));
	ASSERT_EQ(0b101101, base64::rlookup('t'));
	ASSERT_EQ(0b101110, base64::rlookup('u'));
	ASSERT_EQ(0b101111, base64::rlookup('v'));
	ASSERT_EQ(0b110000, base64::rlookup('w'));
	ASSERT_EQ(0b110001, base64::rlookup('x'));
	ASSERT_EQ(0b110010, base64::rlookup('y'));
	ASSERT_EQ(0b110011, base64::rlookup('z'));
	ASSERT_EQ(0b110100, base64::rlookup('0'));
	ASSERT_EQ(0b110101, base64::rlookup('1'));
	ASSERT_EQ(0b110110, base64::rlookup('2'));
	ASSERT_EQ(0b110111, base64::rlookup('3'));
	ASSERT_EQ(0b111000, base64::rlookup('4'));
	ASSERT_EQ(0b111001, base64::rlookup('5'));
	ASSERT_EQ(0b111010, base64::rlookup('6'));
	ASSERT_EQ(0b111011, base64::rlookup('7'));
	ASSERT_EQ(0b111100, base64::rlookup('8'));
	ASSERT_EQ(0b111101, base64::rlookup('9'));
	ASSERT_EQ(0b111110, base64::rlookup('+'));
	ASSERT_EQ(0b111111, base64::rlookup('/'));
}

TEST(Encode, basic)
{
	ASSERT_EQ("YQ==", base64::encode("a"));
	ASSERT_EQ("YWI=", base64::encode("ab"));
	ASSERT_EQ("YWJj", base64::encode("abc"));

	ASSERT_EQ("aGVsbG8=", base64::encode("hello"));
	ASSERT_EQ("dGhpcyBpcyBhIGxvbmcgc2VudGVuY2U=", base64::encode("this is a long sentence"));
}

TEST(Decode, basic)
{
	ASSERT_EQ("a", base64::decode("YQ=="));
	ASSERT_EQ("ab", base64::decode("YWI="));
	ASSERT_EQ("abc", base64::decode("YWJj"));

	ASSERT_EQ("hello", base64::decode("aGVsbG8="));
	ASSERT_EQ("this is a long sentence", base64::decode("dGhpcyBpcyBhIGxvbmcgc2VudGVuY2U="));
	ASSERT_EQ("Welcome to our server dude", base64::decode("V2VsY29tZSB0byBvdXIgc2VydmVyIGR1ZGU="));
}

TEST(Failure, truncated)
{
	try {
		base64::decode("YW=");

		FAIL() << "exception expected";
	} catch (...) {}
}

TEST(Failure, invalid)
{
	try {
		base64::decode("?!");

		FAIL() << "exception expected";
	} catch (...) {}
}

TEST(Failure, wrong1)
{
	try {
		base64::decode("=ABC");

		FAIL() << "exception expected";
	} catch (...) {}
}

TEST(Failure, wrong2)
{
	try {
		base64::decode("A=BC");

		FAIL() << "exception expected";
	} catch (...) {}
}

TEST(Failure, wrong3)
{
	try {
		base64::decode("==BC");

		FAIL() << "exception expected";
	} catch (...) {}
}

int main(int argc, char **argv)
{
	testing::InitGoogleTest(&argc, argv);

	return RUN_ALL_TESTS();
}