///****************************************************************************** //The MIT License(MIT) // //Embedded Template Library. //https://github.com/ETLCPP/etl //https://www.etlcpp.com // //Copyright(c) 2020 John Wellbelove // //Permission is hereby granted, free of charge, to any person obtaining a copy //of this software and associated documentation files(the "Software"), to deal //in the Software without restriction, including without limitation the rights //to use, copy, modify, merge, publish, distribute, sublicense, and / or sell //copies of the Software, and to permit persons to whom the Software is //furnished to do so, subject to the following conditions : // //The above copyright notice and this permission notice shall be included in all //copies or substantial portions of the Software. // //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE //SOFTWARE. //******************************************************************************/ #include "unit_test_framework.h" #include "etl/circular_buffer.h" #include "etl/integral_limits.h" #include "data.h" #include #include #include #include namespace { SUITE(test_circular_buffer) { static const size_t SIZE = 10UL; using ItemM = TestDataM; using DataM = etl::circular_buffer; using CompareM = std::vector; using Ndc = TestDataNDC; using Data = etl::circular_buffer; using Compare = std::vector; //************************************************************************* TEST(test_default_constructor) { Data data; CHECK_EQUAL(0U, data.size()); CHECK_EQUAL(SIZE, data.max_size()); CHECK_EQUAL(SIZE, data.capacity()); CHECK_EQUAL(SIZE, data.available()); CHECK(data.begin() == data.end()); CHECK(data.cbegin() == data.cend()); CHECK(data.rbegin() == data.rend()); CHECK(data.crbegin() == data.crend()); } #if ETL_USING_STL //************************************************************************* TEST(test_constructor_from_literal) { Data data = { Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Compare compare = { Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = etl::equal(data.begin(), data.end(), compare.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_constructor_from_literal_excess) { Data data = { Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Compare compare = { Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(data.begin(), data.end(), compare.begin()); CHECK(isEqual); } #endif #if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST && !defined(ETL_TEMPLATE_DEDUCTION_GUIDE_TESTS_DISABLED) //************************************************************************* TEST(test_cpp17_deduced_constructor) { Data data{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Compare compare{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(data.begin(), data.end(), compare.begin()); CHECK(isEqual); } #endif //************************************************************************* #if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST && !defined(ETL_TEMPLATE_DEDUCTION_GUIDE_TESTS_DISABLED) TEST(test_cpp17_deduced_constructor_excess) { Data data{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Compare compare{ Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(data.begin(), data.end(), compare.begin()); CHECK(isEqual); } #endif //************************************************************************* TEST(test_push) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; for (auto v : test) { data.push(v); } Compare compare{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(SIZE - data.size(), data.available()); bool isEqual = std::equal(compare.begin(), compare.end(), data.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_move_push) { DataM data; CompareM compare; for (uint32_t i = 0U; i < SIZE; ++i) { data.push(ItemM(std::to_string(i))); compare.push_back(ItemM(std::to_string(i))); } CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.begin(), compare.end(), data.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_push_full_range) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(test.begin(), test.end()); Compare compare{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.begin(), compare.end(), data.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_iterator_to_pointer_operator) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(test.begin(), test.end()); Data::iterator itr = data.begin(); CHECK_EQUAL(test[0].value, (itr++)->value); CHECK_EQUAL(test[1].value, (itr++)->value); CHECK_EQUAL(test[2].value, (itr++)->value); CHECK_EQUAL(test[3].value, (itr++)->value); CHECK_EQUAL(test[4].value, (itr++)->value); CHECK_EQUAL(test[5].value, (itr++)->value); CHECK_EQUAL(test[6].value, (itr++)->value); CHECK_EQUAL(test[7].value, (itr++)->value); CHECK_EQUAL(test[8].value, (itr++)->value); CHECK_EQUAL(test[9].value, (itr++)->value); } //************************************************************************* TEST(test_const_iterator_to_pointer_operator) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(test.begin(), test.end()); Data::const_iterator itr = data.begin(); CHECK_EQUAL(test[0].value, (itr++)->value); CHECK_EQUAL(test[1].value, (itr++)->value); CHECK_EQUAL(test[2].value, (itr++)->value); CHECK_EQUAL(test[3].value, (itr++)->value); CHECK_EQUAL(test[4].value, (itr++)->value); CHECK_EQUAL(test[5].value, (itr++)->value); CHECK_EQUAL(test[6].value, (itr++)->value); CHECK_EQUAL(test[7].value, (itr++)->value); CHECK_EQUAL(test[8].value, (itr++)->value); CHECK_EQUAL(test[9].value, (itr++)->value); } //************************************************************************* TEST(test_push_full_range_reverse_iterator) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(test.begin(), test.end()); Compare compare{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; CHECK(data.rbegin() != data.rend()); CHECK(data.crbegin() != data.crend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.rbegin(), compare.rend(), data.rbegin()); CHECK(isEqual); } //************************************************************************* TEST(test_push_excess_range) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(test.begin(), test.end()); Compare compare{ Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.begin(), compare.end(), data.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_push_excess_range_reverse_iterator) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(test.begin(), test.end()); Compare compare{ Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; CHECK(data.rbegin() != data.rend()); CHECK(data.crbegin() != data.crend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.rbegin(), compare.rend(), data.rbegin()); CHECK(isEqual); } //************************************************************************* TEST(test_push_short_range_at_start_of_buffer) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4") }; Data data; data.push(test.begin(), test.end()); Compare compare{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4") }; CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.begin(), compare.end(), data.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_push_short_range_at_start_of_buffer_reverse_iterator) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4") }; Data data; data.push(test.begin(), test.end()); Compare compare{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4") }; CHECK(data.rbegin() != data.rend()); CHECK(data.crbegin() != data.crend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.rbegin(), compare.rend(), data.rbegin()); CHECK(isEqual); } //************************************************************************* TEST(test_push_short_range_at_end_of_buffer) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10") }; Data data; data.push(test.begin(), test.end()); data.pop(5); Compare compare{ Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10") }; CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.begin(), compare.end(), data.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_push_short_range_at_end_of_buffer_reverse_iterator) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10") }; Data data; data.push(test.begin(), test.end()); data.pop(5); Compare compare{ Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10") }; CHECK(data.rbegin() != data.rend()); CHECK(data.crbegin() != data.crend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.rbegin(), compare.rend(), data.rbegin()); CHECK(isEqual); } //************************************************************************* TEST(test_push_short_range_middle_of_buffer) { Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4") }; Compare input2{ Ndc("5"), Ndc("6"), Ndc("7") }; Data data; data.push(input1.begin(), input1.end()); data.pop(3); data.push(input2.begin(), input2.end()); Compare compare{ Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7") }; CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.begin(), compare.end(), data.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_push_short_range_middle_of_buffer_reverse_iterator) { Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4") }; Compare input2{ Ndc("5"), Ndc("6"), Ndc("7") }; Data data; data.push(input1.begin(), input1.end()); data.pop(3); data.push(input2.begin(), input2.end()); Compare compare{ Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7") }; CHECK(data.rbegin() != data.rend()); CHECK(data.crbegin() != data.crend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.rbegin(), compare.rend(), data.rbegin()); CHECK(isEqual); } //************************************************************************* TEST(test_push_short_range_overlap_start_and_end_of_buffer) { Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Compare input2{ Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(input1.begin(), input1.end()); data.pop(7); data.push(input2.begin(), input2.end()); Compare compare{ Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; CHECK(data.begin() != data.end()); CHECK(data.cbegin() != data.cend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.begin(), compare.end(), data.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_push_short_range_overlap_start_and_end_of_buffer_reverse_iterator) { Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Compare input2{ Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(input1.begin(), input1.end()); data.pop(7); data.push(input2.begin(), input2.end()); Compare compare{ Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; CHECK(data.rbegin() != data.rend()); CHECK(data.crbegin() != data.crend()); CHECK_EQUAL(compare.size(), data.size()); bool isEqual = std::equal(compare.rbegin(), compare.rend(), data.rbegin()); CHECK(isEqual); } //************************************************************************* TEST(test_available) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; for (auto v : test) { data.push(v); CHECK_EQUAL(SIZE - data.size(), data.available()); } } //************************************************************************* TEST(test_front) { Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(input1.begin(), input1.end()); Compare compare = { Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Ndc& ref1 = data.front(); CHECK(ref1 == compare.front()); Ndc& ref2 = data.front(); ref2 = compare.back(); CHECK(ref2 == compare.back()); } //************************************************************************* TEST(test_front_const) { Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(input1.begin(), input1.end()); Compare compare = { Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; const Ndc& ref = data.front(); CHECK(ref == compare.front()); } //************************************************************************* TEST(test_back) { Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(input1.begin(), input1.end()); Compare compare = { Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Ndc& ref1 = data.back(); CHECK(ref1 == compare.back()); Ndc& ref2 = data.back(); ref2 = compare.front(); CHECK(ref2 == compare.front()); } //************************************************************************* TEST(test_back_const) { Compare input{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(input.begin(), input.end()); Compare compare = { Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; const Ndc& ref = data.back(); CHECK(ref == compare.back()); } //************************************************************************* TEST(test_index_operator) { // Overrun by 3 Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Compare input2{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(input1.begin(), input1.end()); for (size_t i = 0; i < SIZE; ++i) { CHECK_EQUAL(input1[i + 3], data[i]); } for (size_t i = 0; i < SIZE; ++i) { data[i] = input2[i]; } for (size_t i = 0; i < SIZE; ++i) { CHECK_EQUAL(input2[i], data[i]); } } //************************************************************************* TEST(test_index_operator_const) { // Overrun by 3 Compare input{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(input.begin(), input.end()); for (size_t i = 0; i < SIZE; ++i) { CHECK_EQUAL(input[i + 3], data[i]); } } //************************************************************************* TEST(test_random_iterator_plus) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(test.begin(), test.end()); Compare compare = { Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; for (int step = 1; step < int(data.size()); ++step) { Data::const_iterator itr = data.begin(); int offset = 0; while ((offset += step) < int(data.size() - 1)) { itr = itr + step; CHECK_EQUAL(compare[offset], *itr); } } } //************************************************************************* TEST(test_random_iterator_plus_rollover) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(test.begin(), test.end()); Compare compare = { Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; for (int step = 1; step < int(data.size()); ++step) { Data::const_iterator itr = data.begin(); int offset = 0; while ((offset += step) < int(data.size() - 1)) { itr = itr + step; CHECK_EQUAL(compare[offset], *itr); } } } //************************************************************************* TEST(test_random_iterator_plus_equals) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(test.begin(), test.end()); Compare compare = { Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; for (int step = 1; step < int(data.size()); ++step) { Data::const_iterator itr = data.begin(); int offset = 0; while ((offset += step) < int(data.size() - 1)) { itr += + step; CHECK_EQUAL(compare[offset], *itr); } } } //************************************************************************* TEST(test_random_iterator_plus_equals_rollover) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(test.begin(), test.end()); Compare compare = { Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; for (int step = 1; step < int(data.size()); ++step) { Data::const_iterator itr = data.begin(); int offset = 0; while ((offset += step) < int(data.size() - 1)) { itr += step; CHECK_EQUAL(compare[offset], *itr); } } } //************************************************************************* TEST(test_random_iterator_minus) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(test.begin(), test.end()); Compare compare = { Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; for (int step = 1; step < int(data.size()); ++step) { Data::const_iterator itr = data.end(); int offset = int(data.size()); while ((offset -= step) > 0) { itr = itr - step; CHECK_EQUAL(compare[offset], *itr); } } } //************************************************************************* TEST(test_random_iterator_minus_rollover) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(test.begin(), test.end()); Compare compare = { Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; for (int step = 1; step < int(data.size()); ++step) { Data::const_iterator itr = data.end(); int offset = int(data.size()); while ((offset -= step) > 0) { itr = itr - step; CHECK_EQUAL(compare[offset], *itr); } } } //************************************************************************* TEST(test_random_iterator_minus_equals) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Data data; data.push(test.begin(), test.end()); Compare compare = { Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; for (int step = 1; step < int(data.size()); ++step) { Data::const_iterator itr = data.end(); int offset = int(data.size()); while ((offset -= step) > 0) { itr -= step; CHECK_EQUAL(compare[offset], *itr); } } } //************************************************************************* TEST(test_random_iterator_minus_equals_rollover) { Compare input{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(input.begin(), input.end()); Compare compare = { Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; for (int step = 1; step < int(data.size()); ++step) { Data::const_iterator itr = data.end(); int offset = int(data.size()); while ((offset -= step) > 0) { itr -= step; CHECK_EQUAL(compare[offset], *itr); } } } //************************************************************************* TEST(test_copy_constructor) { Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; Compare input2{ Ndc("9"), Ndc("8"), Ndc("7"), Ndc("6"), Ndc("5"), Ndc("4"), Ndc("3"), Ndc("2"), Ndc("1"), Ndc("0") }; Data data1; data1.push(input1.begin(), input1.end()); // Copy construct from data1 Data data2(data1); // Now change data1 data1.clear(); data1.push(input2.begin(), input2.end()); CHECK(data2.begin() != data2.end()); CHECK(data2.cbegin() != data2.cend()); CHECK_EQUAL(input1.size(), data2.size()); bool isEqual = std::equal(input1.begin(), input1.end(), data2.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_move_constructor) { CompareM input1; CompareM input2; CompareM compare; for (uint32_t i = 0U; i < SIZE; ++i) { input1.push_back(ItemM(std::to_string(i))); input2.push_back(ItemM(std::to_string(SIZE - i))); compare.push_back(ItemM(std::to_string(i))); } DataM data1; for (auto&& v : input1) { data1.push(std::move(v)); } // Move construct from data1 DataM data2(std::move(data1)); // Now change data1 data1.clear(); for (auto&& v : input2) { data1.push(std::move(v)); } CHECK(data2.begin() != data2.end()); CHECK(data2.cbegin() != data2.cend()); CHECK_EQUAL(input1.size(), data2.size()); bool isEqual = std::equal(compare.begin(), compare.end(), data2.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_assignment) { Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8") }; Compare input2{ Ndc("8"), Ndc("7"), Ndc("6"), Ndc("5"), Ndc("4"), Ndc("3"), Ndc("2"), Ndc("1"), Ndc("0") }; Data data1; data1.push(input1.begin(), input1.end()); // Copy construct from data1 Data data2; data2.push(Ndc("0")); data2 = data1; // Now change data1 data1.clear(); data1.push(input2.begin(), input2.end()); CHECK(data2.begin() != data2.end()); CHECK(data2.cbegin() != data2.cend()); CHECK_EQUAL(input1.size(), data2.size()); bool isEqual = std::equal(input1.begin(), input1.end(), data2.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_move_assignment) { Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8") }; Compare input2{ Ndc("8"), Ndc("7"), Ndc("6"), Ndc("5"), Ndc("4"), Ndc("3"), Ndc("2"), Ndc("1"), Ndc("0") }; Data data1; data1.push(input1.begin(), input1.end()); // Copy construct from data1 Data data2; data2.push(Ndc("0")); data2 = etl::move(data1); // Now change data1 data1.clear(); data1.push(input2.begin(), input2.end()); CHECK(data2.begin() != data2.end()); CHECK(data2.cbegin() != data2.cend()); CHECK_EQUAL(input1.size(), data2.size()); bool isEqual = std::equal(input1.begin(), input1.end(), data2.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_swap_iterator) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(test.begin(), test.end()); Data::iterator itr1 = data.begin() + 2; Data::iterator itr2 = data.begin() + 3; const Ndc& original1 = *itr1; const Ndc& original2 = *itr2; std::swap(itr1, itr2); const Ndc& swapped1 = *itr1; const Ndc& swapped2 = *itr2; CHECK(swapped1 == original2); CHECK(swapped2 == original1); } //************************************************************************* TEST(test_swap_const_iterator) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(test.begin(), test.end()); Data::const_iterator itr1 = data.begin() + 2; Data::const_iterator itr2 = data.begin() + 3; const Ndc& original1 = *itr1; const Ndc& original2 = *itr2; std::swap(itr1, itr2); const Ndc& swapped1 = *itr1; const Ndc& swapped2 = *itr2; CHECK(swapped1 == original2); CHECK(swapped2 == original1); } //************************************************************************* TEST(test_iterator_difference) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(test.begin(), test.end()); Data::iterator begin = data.begin(); Data::iterator end = data.begin(); for (uint32_t i = 0U; i < data.size(); ++i) { CHECK_EQUAL(i, end - begin); CHECK_EQUAL(i, -(begin - end)); ++end; } for (uint32_t i = 0U; i < data.size(); ++i) { CHECK_EQUAL(data.size() - i, end - begin); CHECK_EQUAL(data.size() - i, -(begin - end)); ++begin; } } //************************************************************************* TEST(test_const_iterator_difference) { Compare test{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data; data.push(test.begin(), test.end()); Data::const_iterator begin = data.begin(); Data::const_iterator end = data.begin(); for (uint32_t i = 0U; i < data.size(); ++i) { CHECK_EQUAL(i, end - begin); CHECK_EQUAL(i, -(begin - end)); ++end; } for (uint32_t i = 0U; i < data.size(); ++i) { CHECK_EQUAL(data.size() - i, end - begin); CHECK_EQUAL(data.size() - i, -(begin - end)); ++begin; } } //************************************************************************* TEST(test_swap) { Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4") }; Compare input2{ Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data1; Data data2; data1.push(input1.begin(), input1.end()); data2.push(input2.begin(), input2.end()); swap(data1, data2); CHECK_EQUAL(input1.size(), data2.size()); CHECK_EQUAL(input2.size(), data1.size()); CHECK(std::equal(input1.begin(), input1.end(), data2.begin())); CHECK(std::equal(input2.begin(), input2.end(), data1.begin())); } //************************************************************************* TEST(test_equal) { // Over-write by 3 Compare input{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data1; Data data2; data1.push(input.begin(), input.end()); data2.push(input.begin(), input.end()); CHECK(data1 == data2); } //************************************************************************* TEST(test_not_equal) { // Over-write by 3 Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Compare input2{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("6"), Ndc("8"), Ndc("9"), Ndc("10"), Ndc("11"), Ndc("12") }; Data data1; Data data2; data1.push(input1.begin(), input1.end()); data2.push(input2.begin(), input2.end()); CHECK(data1 != data2); } //************************************************************************* TEST(test_fill) { Compare input{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8") }; Compare blank{ Ndc("9"), Ndc("9"), Ndc("9"), Ndc("9"), Ndc("9"), Ndc("9"), Ndc("9"), Ndc("9"), Ndc("9") }; Data data; data.push(input.begin(), input.end()); data.fill(Ndc("9")); bool isEqual = std::equal(blank.begin(), blank.end(), data.begin()); CHECK(isEqual); } //************************************************************************* TEST(test_memcpy_repair) { using CB = etl::circular_buffer; std::vector input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; CB data(input.begin(), input.end());; char buffer[sizeof(CB)]; memcpy(&buffer, (const void*)&data, sizeof(data)); CB& rdata(*reinterpret_cast(buffer)); rdata.repair(); // Check that the memcpy'd vector is the same. CHECK_EQUAL(data.size(), rdata.size()); CHECK(!rdata.empty()); CHECK(rdata.full()); bool is_equal = std::equal(rdata.begin(), rdata.end(), data.begin()); CHECK(is_equal); // Modify the original and check that the memcpy'd vector is not the same. std::reverse(data.begin(), data.end()); is_equal = std::equal(rdata.begin(), rdata.end(), data.begin()); CHECK(!is_equal); } //************************************************************************* TEST(test_memcpy_repair_virtual) { using CB = etl::circular_buffer; using ICB = etl::icircular_buffer; std::vector input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; CB data(input.begin(), input.end());; char buffer[sizeof(CB)]; memcpy(&buffer, (const void*)&data, sizeof(data)); ICB& rdata(*reinterpret_cast(buffer)); rdata.repair(); // Check that the memcpy'd vector is the same. CHECK_EQUAL(data.size(), rdata.size()); CHECK(!rdata.empty()); CHECK(rdata.full()); bool is_equal = std::equal(rdata.begin(), rdata.end(), data.begin()); CHECK(is_equal); // Modify the original and check that the memcpy'd vector is not the same. std::reverse(data.begin(), data.end()); is_equal = std::equal(rdata.begin(), rdata.end(), data.begin()); CHECK(!is_equal); } }; }