diff C++/tests/Flags/main.cpp @ 334:0b576ee64d45

* Create brand new hierarchy * Rename DynLib to Dynlib * Remove some warnings
author David Demelier <markand@malikania.fr>
date Sun, 08 Mar 2015 14:26:33 +0100
parents C++/Tests/Flags/main.cpp@0c7bc55e0d36
children d5ec1174b707
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/C++/tests/Flags/main.cpp	Sun Mar 08 14:26:33 2015 +0100
@@ -0,0 +1,298 @@
+/*
+ * main.cpp -- main test file for Flags
+ *
+ * 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 <cstdint>
+
+#include <gtest/gtest.h>
+
+#include <Flags.h>
+
+enum Standard : uint8_t {
+	Fullscreen	= (1 << 0),
+	Audio		= (1 << 1)
+};
+
+enum class Strong : uint8_t {
+	NoLog		= (1 << 0),
+	NoCheck		= (1 << 1)
+};
+
+/* --------------------------------------------------------
+ * Global operators on standard enum
+ * -------------------------------------------------------- */
+
+TEST(OperatorsStandard, opand)
+{
+	Standard s(Fullscreen | Audio);
+
+	ASSERT_EQ(Fullscreen, (s & Fullscreen));
+	ASSERT_EQ(Audio, (s & Audio));
+}
+
+TEST(OperatorsStandard, opor)
+{
+	Standard s(Fullscreen);
+
+	ASSERT_EQ(3, (s | Audio));
+}
+
+TEST(OperatorsStandard, opxor)
+{
+	Standard s(Fullscreen);
+
+	ASSERT_EQ(3, (s ^ Audio));
+}
+
+TEST(OperatorsStandard, opnot)
+{
+	Standard s(Fullscreen);
+
+	ASSERT_EQ(254, ~s);
+}
+
+/* --------------------------------------------------------
+ * Global operators on strong enum
+ * -------------------------------------------------------- */
+
+TEST(OperatorsStrong, opand)
+{
+	Strong s(Strong::NoLog | Strong::NoCheck);
+
+	ASSERT_EQ(Strong::NoLog, (s & Strong::NoLog));
+	ASSERT_EQ(Strong::NoCheck, (s & Strong::NoCheck));
+}
+
+TEST(OperatorsStrong, opor)
+{
+	Strong s(Strong::NoLog);
+
+	ASSERT_EQ(3, static_cast<int>((s | Strong::NoCheck)));
+}
+
+TEST(OperatorsStrong, opxor)
+{
+	Strong s(Strong::NoLog);
+
+	ASSERT_EQ(3, static_cast<int>((s ^ Strong::NoCheck)));
+}
+
+TEST(OperatorsStrong, opnot)
+{
+	Strong s(Strong::NoLog);
+
+	ASSERT_EQ(254, static_cast<int>(~s));
+}
+
+/* --------------------------------------------------------
+ * Flags with standard enums
+ * -------------------------------------------------------- */
+
+TEST(Standard, construct)
+{
+	Flags<Standard> s;
+
+	ASSERT_FALSE(s);
+	ASSERT_TRUE(!s);
+
+	Flags <Standard> s2(Fullscreen | Audio);
+
+	ASSERT_TRUE(s2);
+	ASSERT_FALSE(!s2);
+	ASSERT_TRUE(s2 & Fullscreen);
+	ASSERT_TRUE(s2 & Audio);
+	ASSERT_TRUE((s2 & Fullscreen) == Fullscreen);
+	ASSERT_TRUE((s2 & Audio) == Audio);
+	ASSERT_TRUE(s2 == (Audio | Fullscreen));
+}
+
+TEST(Standard, addByOne)
+{
+	Flags<Standard> s;
+
+	ASSERT_FALSE(s);
+	ASSERT_TRUE(!s);
+	ASSERT_TRUE(!(s & Fullscreen));
+	ASSERT_TRUE(!(s & Audio));
+
+	s |= Fullscreen;
+	ASSERT_TRUE(s);
+	ASSERT_FALSE(!s);
+	ASSERT_TRUE(s & Fullscreen);
+	ASSERT_TRUE((s & Fullscreen) == Fullscreen);
+	ASSERT_FALSE(s & Audio);
+	ASSERT_FALSE((s & Audio) == Audio);
+	ASSERT_TRUE(s == Fullscreen);
+
+	s |= Audio;
+	ASSERT_TRUE(s);
+	ASSERT_FALSE(!s);
+	ASSERT_TRUE(s & Fullscreen);
+	ASSERT_TRUE((s & Fullscreen) == Fullscreen);
+	ASSERT_TRUE(s & Audio);
+	ASSERT_TRUE((s & Audio) == Audio);
+	ASSERT_TRUE(s == (Fullscreen | Audio));
+}
+
+TEST(Standard, add)
+{
+	Flags<Standard> s;
+
+	s |= Fullscreen | Audio;
+	ASSERT_TRUE(s & (Fullscreen | Audio));
+	ASSERT_TRUE((s & (Fullscreen | Audio)) == (Fullscreen | Audio));
+}
+
+TEST(Standard, removeByOne)
+{
+	Flags<Standard> s(Fullscreen | Audio);
+
+	s &= ~(Fullscreen);
+	ASSERT_TRUE(s);
+	ASSERT_FALSE(!s);
+	ASSERT_FALSE(s & Fullscreen);
+	ASSERT_FALSE((s & Fullscreen) == Fullscreen);
+	ASSERT_TRUE(s & Audio);
+	ASSERT_TRUE((s & Audio) == Audio);
+
+	s &= ~(Audio);
+	ASSERT_FALSE(s);
+	ASSERT_TRUE(!s);
+}
+
+TEST(Standard, remove)
+{
+	Flags<Standard> s(Fullscreen | Audio);
+
+	s &= ~(Fullscreen | Audio);
+	ASSERT_FALSE(s);
+	ASSERT_TRUE(!s);
+}
+
+TEST(Standard, xorAdd)
+{
+	Flags<Standard> s(Fullscreen | Audio);
+
+	s ^= Audio;
+	ASSERT_TRUE(s & Fullscreen);
+	ASSERT_TRUE((s & Fullscreen) == Fullscreen);
+	ASSERT_FALSE(s & Audio);
+	ASSERT_FALSE((s & Audio) == Audio);
+}
+
+/* --------------------------------------------------------
+ * Flags with strong enums
+ * -------------------------------------------------------- */
+
+TEST(Strong, construct)
+{
+	Flags<Strong> s;
+
+	ASSERT_FALSE(s);
+	ASSERT_TRUE(!s);
+
+	Flags <Strong> s2(Strong::NoLog | Strong::NoCheck);
+
+	ASSERT_TRUE(s2);
+	ASSERT_FALSE(!s2);
+	ASSERT_TRUE(s2 & Strong::NoLog);
+	ASSERT_TRUE(s2 & Strong::NoCheck);
+	ASSERT_TRUE((s2 & Strong::NoLog) == Strong::NoLog);
+	ASSERT_TRUE((s2 & Strong::NoCheck) == Strong::NoCheck);
+	ASSERT_TRUE(s2 == (Strong::NoLog | Strong::NoCheck));
+}
+
+TEST(Strong, addByOne)
+{
+	Flags<Strong> s;
+
+	ASSERT_FALSE(s);
+	ASSERT_TRUE(!s);
+	ASSERT_TRUE(!(s & Strong::NoLog));
+	ASSERT_TRUE(!(s & Strong::NoCheck));
+
+	s |= Strong::NoLog;
+	ASSERT_TRUE(s);
+	ASSERT_FALSE(!s);
+	ASSERT_TRUE(s & Strong::NoLog);
+	ASSERT_TRUE((s & Strong::NoLog) == Strong::NoLog);
+	ASSERT_FALSE(s & Strong::NoCheck);
+	ASSERT_FALSE((s & Strong::NoCheck) == Strong::NoCheck);
+	ASSERT_TRUE(s == Strong::NoLog);
+
+	s |= Strong::NoCheck;
+	ASSERT_TRUE(s);
+	ASSERT_FALSE(!s);
+	ASSERT_TRUE(s & Strong::NoLog);
+	ASSERT_TRUE((s & Strong::NoLog) == Strong::NoLog);
+	ASSERT_TRUE(s & Strong::NoCheck);
+	ASSERT_TRUE((s & Strong::NoCheck) == Strong::NoCheck);
+	ASSERT_TRUE(s == (Strong::NoLog | Strong::NoCheck));
+}
+
+TEST(Strong, add)
+{
+	Flags<Strong> s;
+
+	s |= Strong::NoLog | Strong::NoCheck;
+	ASSERT_TRUE(s & (Strong::NoLog | Strong::NoCheck));
+	ASSERT_TRUE((s & (Strong::NoLog | Strong::NoCheck)) == (Strong::NoLog | Strong::NoCheck));
+}
+
+TEST(Strong, removeByOne)
+{
+	Flags<Strong> s(Strong::NoLog | Strong::NoCheck);
+
+	s &= ~(Strong::NoLog);
+	ASSERT_TRUE(s);
+	ASSERT_FALSE(!s);
+	ASSERT_FALSE(s & Strong::NoLog);
+	ASSERT_FALSE((s & Strong::NoLog) == Strong::NoLog);
+	ASSERT_TRUE(s & Strong::NoCheck);
+	ASSERT_TRUE((s & Strong::NoCheck) == Strong::NoCheck);
+
+	s &= ~(Strong::NoCheck);
+	ASSERT_FALSE(s);
+	ASSERT_TRUE(!s);
+}
+
+TEST(Strong, remove)
+{
+	Flags<Strong> s(Strong::NoLog | Strong::NoCheck);
+
+	s &= ~(Strong::NoLog | Strong::NoCheck);
+	ASSERT_FALSE(s);
+	ASSERT_TRUE(!s);
+}
+
+TEST(Strong, xorAdd)
+{
+	Flags<Strong> s(Strong::NoLog | Strong::NoCheck);
+
+	s ^= Strong::NoCheck;
+	ASSERT_TRUE(s & Strong::NoLog);
+	ASSERT_TRUE((s & Strong::NoLog) == Strong::NoLog);
+	ASSERT_FALSE(s & Strong::NoCheck);
+	ASSERT_FALSE((s & Strong::NoCheck) == Strong::NoCheck);
+}
+
+int main(int argc, char **argv)
+{
+	testing::InitGoogleTest(&argc, argv);
+
+	return RUN_ALL_TESTS();
+}
\ No newline at end of file