changeset 242:a9883eeb9757

Add tests for Base64
author David Demelier <markand@malikania.fr>
date Thu, 11 Sep 2014 21:09:58 +0200
parents d9409b338f2f
children 73e5381d7baf
files C++/Base64.h C++/Tests/Base64/CMakeLists.txt C++/Tests/Base64/main.cpp CMakeLists.txt
diffstat 4 files changed, 222 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/C++/Base64.h	Thu Sep 11 17:22:11 2014 +0200
+++ b/C++/Base64.h	Thu Sep 11 21:09:58 2014 +0200
@@ -67,8 +67,8 @@
 				inputbuf[count] = *input++;
 
 			*output++ = lookup(inputbuf[0] >> 2 & 0x3f);
-			*output++ = lookup(inputbuf[0] << 4 & 0x3f | inputbuf[1] >> 4 & 0x0f);
-			*output++ = (count < 2) ? '=' : lookup(inputbuf[1] << 2 & 0x3c | inputbuf[2] >> 6 & 0x03);
+			*output++ = lookup((inputbuf[0] << 4 & 0x3f) | (inputbuf[1] >> 4 & 0x0f));
+			*output++ = (count < 2) ? '=' : lookup((inputbuf[1] << 2 & 0x3c) | (inputbuf[2] >> 6 & 0x03));
 			*output++ = (count < 3) ? '=' : lookup(inputbuf[2] & 0x3f);
 		}
 	}
@@ -98,12 +98,12 @@
 			if (count != 4)
 				throw std::invalid_argument("truncated string");
 
-			*output++ = inputbuf[0] << 2 & 0xfc | inputbuf[1] >> 4 & 0x03;
+			*output++ = (inputbuf[0] << 2 & 0xfc) | (inputbuf[1] >> 4 & 0x03);
 
 			if (inputbuf[2] != '=')
-				*output++ = inputbuf[1] << 4 & 0xf0 | inputbuf[2] >> 2 & 0x0f;
+				*output++ = (inputbuf[1] << 4 & 0xf0) | (inputbuf[2] >> 2 & 0x0f);
 			if (inputbuf[3] != '=')
-				*output++ = inputbuf[2] << 6 & 0xc0 | inputbuf[3] & 0x3f;
+				*output++ = (inputbuf[2] << 6 & 0xc0) | (inputbuf[3] & 0x3f);
 		}
 	}
 
@@ -125,4 +125,4 @@
 	static std::string decode(const std::string &input);
 };
 
-#endif // !_BASE_64_H_
\ No newline at end of file
+#endif // !_BASE_64_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/C++/Tests/Base64/CMakeLists.txt	Thu Sep 11 21:09:58 2014 +0200
@@ -0,0 +1,27 @@
+#
+# CMakeLists.txt -- tests for Base64
+#
+# Copyright (c) 2013, 2014 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.
+#
+
+set(
+	SOURCES
+	${code_SOURCE_DIR}/C++/Base64.cpp
+	${code_SOURCE_DIR}/C++/Base64.h
+	main.cpp
+)
+
+define_test(base64 "${SOURCES}")
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/C++/Tests/Base64/main.cpp	Thu Sep 11 21:09:58 2014 +0200
@@ -0,0 +1,184 @@
+/*
+ * main.cpp -- main test file for Base64
+ *
+ * Copyright (c) 2013, 2014 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="));
+}
+
+int main(int argc, char **argv)
+{
+	testing::InitGoogleTest(&argc, argv);
+
+	return RUN_ALL_TESTS();
+}
--- a/CMakeLists.txt	Thu Sep 11 17:22:11 2014 +0200
+++ b/CMakeLists.txt	Thu Sep 11 21:09:58 2014 +0200
@@ -56,6 +56,7 @@
 	add_test(${name}-test ${name})
 endfunction()
 
+option(WITH_BASE64 "Enable base64 tests" On)
 option(WITH_CONVERTER "Enable converter tests" On)
 option(WITH_DIRECTORY "Enable directory tests" On)
 option(WITH_DRIVER "Enable SQL drivers tests" On)
@@ -70,6 +71,10 @@
 option(WITH_XMLPARSER "Enable XML tests" On)
 option(WITH_XDG "Enable XDG standard directories tests" On)
 
+if (WITH_BASE64)
+	add_subdirectory(C++/Tests/Base64)
+endif ()
+
 if (WITH_DIRECTORY)
 	add_subdirectory(C++/Tests/Directory)
 endif ()