blob: ecf6d1163bc6ac1a1c0276eeaa24174a169064b9 [file] [log] [blame]
#include <cstdint>
#include <initializer_list>
#include <iostream>
#include <iterator>
#include <set>
#include <utility>
#include <cmext/enum_set>
namespace {
int failed = 0;
void testDeclaration()
{
std::cout << "testDeclaration()" << std::endl;
enum class Test : std::uint8_t
{
A,
B,
C,
D
};
cm::enum_set<Test> testSet1;
cm::enum_set<Test> testSet2{ Test::A, Test::C };
cm::enum_set<Test> testSet3 = testSet2;
if (!testSet1.empty()) {
++failed;
}
if (testSet2.size() != 2) {
++failed;
}
if (testSet3.size() != 2) {
++failed;
}
}
void testIteration()
{
std::cout << "testIteration()" << std::endl;
enum class Test : std::uint8_t
{
A,
B,
C,
D
};
cm::enum_set<Test> testSet{ Test::A, Test::C, Test::B };
if (testSet.size() != 3) {
++failed;
}
std::set<std::uint8_t> reference{ static_cast<std::uint8_t>(Test::A),
static_cast<std::uint8_t>(Test::B),
static_cast<std::uint8_t>(Test::C) };
std::set<std::uint8_t> s;
for (auto e : testSet) {
s.insert(static_cast<std::uint8_t>(e));
}
if (s != reference) {
++failed;
}
s.clear();
for (auto rit = testSet.rbegin(); rit != testSet.rend(); rit++) {
s.insert(static_cast<std::uint8_t>(*rit));
}
if (s != reference) {
++failed;
}
}
void testEdition()
{
std::cout << "testEdition()" << std::endl;
enum class Test : std::uint8_t
{
A,
B,
C,
D,
E
};
{
cm::enum_set<Test> testSet{ Test::A, Test::C, Test::B };
auto pos = testSet.insert(Test::E);
if (!pos.second || testSet.size() != 4 || *(pos.first) != Test::E ||
testSet.find(Test::E) == testSet.end()) {
++failed;
}
testSet.insert(Test::E);
if (testSet.size() != 4 || testSet.find(Test::E) == testSet.end()) {
++failed;
}
testSet.erase(Test::A);
if (testSet.size() != 3 || testSet.find(Test::A) != testSet.end()) {
++failed;
}
testSet.erase(Test::A);
if (testSet.size() != 3 || testSet.find(Test::A) != testSet.end()) {
++failed;
}
}
{
cm::enum_set<Test> testSet{ Test::A, Test::C, Test::B };
testSet += { Test::D, Test::E };
std::set<std::uint8_t> reference{ static_cast<std::uint8_t>(Test::A),
static_cast<std::uint8_t>(Test::B),
static_cast<std::uint8_t>(Test::C),
static_cast<std::uint8_t>(Test::D),
static_cast<std::uint8_t>(Test::E) };
std::set<std::uint8_t> s;
for (auto e : testSet) {
s.insert(static_cast<std::uint8_t>(e));
}
if (s != reference) {
++failed;
}
testSet -= { Test::D, Test::B };
reference.erase(static_cast<std::uint8_t>(Test::D));
reference.erase(static_cast<std::uint8_t>(Test::B));
s.clear();
for (auto e : testSet) {
s.insert(static_cast<std::uint8_t>(e));
}
if (s != reference) {
++failed;
}
}
{
cm::enum_set<Test> testSet1{ Test::A, Test::C, Test::B };
cm::enum_set<Test> testSet2{ Test::A, Test::D, Test::E };
testSet1.insert(testSet2.cbegin(), testSet2.cend());
std::set<std::uint8_t> reference{ static_cast<std::uint8_t>(Test::A),
static_cast<std::uint8_t>(Test::B),
static_cast<std::uint8_t>(Test::C),
static_cast<std::uint8_t>(Test::D),
static_cast<std::uint8_t>(Test::E) };
std::set<std::uint8_t> s;
for (auto e : testSet1) {
s.insert(static_cast<std::uint8_t>(e));
}
if (s != reference) {
++failed;
}
testSet1.erase(testSet2);
reference.erase(static_cast<std::uint8_t>(Test::A));
reference.erase(static_cast<std::uint8_t>(Test::D));
reference.erase(static_cast<std::uint8_t>(Test::E));
s.clear();
for (auto e : testSet1) {
s.insert(static_cast<std::uint8_t>(e));
}
if (s != reference) {
++failed;
}
}
{
cm::enum_set<Test> testSet1{ Test::A, Test::C, Test::B };
cm::enum_set<Test> testSet2{ Test::C, Test::E };
testSet1.flip(Test::A);
if (testSet1.size() != 2 || testSet1.contains(Test::A)) {
++failed;
}
testSet1.flip(testSet2);
std::set<std::uint8_t> reference{ static_cast<std::uint8_t>(Test::B),
static_cast<std::uint8_t>(Test::E) };
std::set<std::uint8_t> s;
for (auto e : testSet1) {
s.insert(static_cast<std::uint8_t>(e));
}
if (s != reference) {
++failed;
}
}
{
cm::enum_set<Test> testSet1;
cm::enum_set<Test> testSet2{ Test::A, Test::C, Test::B };
testSet1 = { Test::A, Test::C, Test::B };
if (testSet1.size() != 3 || testSet1 != testSet2) {
++failed;
}
}
}
}
int testCMExtEnumSet(int /*unused*/, char* /*unused*/[])
{
testDeclaration();
testIteration();
testEdition();
return failed;
}