#include #include #include #include TEST_CASE( "FixedOrderedMultimap Tests", "[TestFixedOrderedMultimap]") { INFO("FixedOrderedMultimap Tests"); FixedOrderedMultimap map(30); REQUIRE(map.size() == 0); REQUIRE(map.maxSize() == 30); SECTION("Test insert, find, exists"){ for (uint16_t i=0;i<30;i++){ REQUIRE(map.insert(std::make_pair(i, i+1))== static_cast(HasReturnvaluesIF::RETURN_OK)); REQUIRE(map.exists(i) == static_cast(HasReturnvaluesIF::RETURN_OK)); REQUIRE(map.find(i)->second==i+1); } REQUIRE(map.insert(0, 0) == static_cast(FixedOrderedMultimap::MAP_FULL)); REQUIRE(map.exists(31) == static_cast(FixedOrderedMultimap::KEY_DOES_NOT_EXIST)); REQUIRE(map.size() == 30); { uint16_t* ptr; REQUIRE(map.find(5,&ptr) == static_cast(HasReturnvaluesIF::RETURN_OK)); REQUIRE(*ptr == 6); REQUIRE(map.find(31,&ptr) == static_cast(FixedOrderedMultimap::KEY_DOES_NOT_EXIST)); } REQUIRE(map.erase(2) == static_cast(HasReturnvaluesIF::RETURN_OK)); REQUIRE(map.erase(31) == static_cast(FixedOrderedMultimap::KEY_DOES_NOT_EXIST)); REQUIRE(map.exists(2) == static_cast(FixedOrderedMultimap::KEY_DOES_NOT_EXIST)); REQUIRE(map.size() == 29); for (auto element: map){ if (element.first == 5){ REQUIRE(element.second == 6); } } for (FixedOrderedMultimap::Iterator it = map.begin(); it != map.end(); it++){ REQUIRE(it->second == it->first + 1); REQUIRE((*it).second == (*it).first + 1); it->second = it->second + 1; REQUIRE(it->second == it->first + 2); } { FixedOrderedMultimap::Iterator it = map.begin(); while(it != map.end()){ REQUIRE(map.erase(&it) == static_cast(HasReturnvaluesIF::RETURN_OK)); } REQUIRE(map.size() == 0); } for (FixedOrderedMultimap::Iterator it = map.begin(); it != map.end(); it++){ // This line should never executed if begin and end is correct FAIL("Should never be reached, Iterators invalid"); } }; SECTION("Test different insert variants") { FixedOrderedMultimap::Iterator it = map.end(); REQUIRE(map.insert(36, 37, &it) == static_cast(HasReturnvaluesIF::RETURN_OK)); REQUIRE(it->first == 36); REQUIRE(it->second == 37); REQUIRE(map.size() == 1); REQUIRE(map.insert(37, 38, nullptr) == static_cast(HasReturnvaluesIF::RETURN_OK)); REQUIRE(map.find(37)->second == 38); REQUIRE(map.size() == 2); REQUIRE(map.insert(37, 24, nullptr) == static_cast(HasReturnvaluesIF::RETURN_OK)); REQUIRE(map.find(37)->second == 38); REQUIRE(map.insert(0, 1, nullptr) == static_cast(HasReturnvaluesIF::RETURN_OK)); REQUIRE(map.find(0)->second == 1); REQUIRE(map.size() == 4); map.clear(); REQUIRE(map.size() == 0); } SECTION("Test different erase and find with no entries"){ FixedOrderedMultimap::Iterator it; it = map.end(); REQUIRE(map.erase(&it) == static_cast(FixedOrderedMultimap::KEY_DOES_NOT_EXIST)); REQUIRE(map.find(1)== map.end()); } } TEST_CASE( "FixedOrderedMultimap Non Trivial Type", "[TestFixedOrderedMultimapNonTrivial]") { INFO("FixedOrderedMultimap Non Trivial Type"); class TestClass{ public: TestClass(){}; TestClass(uint32_t number1, uint64_t number2): number1(number1),number2(number2){}; ~TestClass(){}; bool operator==(const TestClass& lhs){ return ((this->number1 == lhs.number1) and (this->number2 == lhs.number2)); } bool operator!=(const TestClass& lhs){ return not(this->operator ==(lhs)); } TestClass(const TestClass& other){ this->number1 = other.number1; this->number2 = other.number2; }; TestClass& operator=(const TestClass& other){ this->number1 = other.number1; this->number2 = other.number2; return *this; }; private: uint32_t number1 = 0; uint64_t number2 = 5; }; FixedOrderedMultimap map(30); REQUIRE(map.size() == 0); REQUIRE(map.maxSize() == 30); SECTION("Test insert, find, exists"){ for (uint16_t i=0;i<30;i++){ REQUIRE(map.insert(std::make_pair(i, TestClass(i+1,i)))== static_cast(HasReturnvaluesIF::RETURN_OK)); REQUIRE(map.exists(i) == static_cast(HasReturnvaluesIF::RETURN_OK)); bool compare = map.find(i)->second == TestClass(i+1,i); REQUIRE(compare); } REQUIRE(map.insert(0, TestClass()) == static_cast(FixedOrderedMultimap::MAP_FULL)); REQUIRE(map.exists(31) == static_cast(FixedOrderedMultimap::KEY_DOES_NOT_EXIST)); REQUIRE(map.size() == 30); { TestClass* ptr = nullptr; REQUIRE(map.find(5,&ptr) == static_cast(HasReturnvaluesIF::RETURN_OK)); bool compare = *ptr == TestClass(6, 5); REQUIRE(compare); REQUIRE(map.find(31,&ptr) == static_cast(FixedOrderedMultimap::KEY_DOES_NOT_EXIST)); } REQUIRE(map.erase(2) == static_cast(HasReturnvaluesIF::RETURN_OK)); REQUIRE(map.erase(31) == static_cast(FixedOrderedMultimap::KEY_DOES_NOT_EXIST)); REQUIRE(map.exists(2) == static_cast(FixedOrderedMultimap::KEY_DOES_NOT_EXIST)); REQUIRE(map.size() == 29); for (auto element: map){ if (element.first == 5){ bool compare = element.second == TestClass(6, 5); REQUIRE(compare); } } for (FixedOrderedMultimap::Iterator it = map.begin(); it != map.end(); it++){ bool compare = it->second == TestClass(it->first + 1, it->first); REQUIRE(compare); compare = (*it).second == TestClass((*it).first + 1, (*it).first); REQUIRE(compare); it->second = TestClass(it->first + 2, it->first); compare = it->second == TestClass(it->first + 2, it->first); REQUIRE(compare); } { FixedOrderedMultimap::Iterator it = map.begin(); while(it != map.end()){ REQUIRE(map.erase(&it) == static_cast(HasReturnvaluesIF::RETURN_OK)); } REQUIRE(map.size() == 0); } for (FixedOrderedMultimap::Iterator it = map.begin(); it != map.end(); it++){ // This line should never executed if begin and end is correct FAIL("Should never be reached, Iterators invalid"); } }; SECTION("Test different insert variants") { FixedOrderedMultimap::Iterator it = map.end(); REQUIRE(map.insert(36, TestClass(37, 36), &it) == static_cast(HasReturnvaluesIF::RETURN_OK)); REQUIRE(it->first == 36); bool compare = it->second == TestClass(37, 36); REQUIRE(compare); REQUIRE(map.size() == 1); REQUIRE(map.insert(37, TestClass(38, 37), nullptr) == static_cast(HasReturnvaluesIF::RETURN_OK)); compare = map.find(37)->second == TestClass(38, 37); REQUIRE(compare); REQUIRE(map.size() == 2); REQUIRE(map.insert(37, TestClass(24, 37), nullptr) == static_cast(HasReturnvaluesIF::RETURN_OK)); compare = map.find(37)->second == TestClass(38, 37); REQUIRE(compare); REQUIRE(map.insert(0, TestClass(1, 0), nullptr) == static_cast(HasReturnvaluesIF::RETURN_OK)); compare = map.find(0)->second == TestClass(1, 0); REQUIRE(compare); REQUIRE(map.size() == 4); map.clear(); REQUIRE(map.size() == 0); } SECTION("Test different erase and find with no entries"){ FixedOrderedMultimap::Iterator it; it = map.end(); REQUIRE(map.erase(&it) == static_cast(FixedOrderedMultimap::KEY_DOES_NOT_EXIST)); REQUIRE(map.find(1)== map.end()); } }