Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- @name: Jake Ojero
- @date: September, 26th, 2016
- @purpose: Test the Sorted Vector header file using BOOST Unit Tests
- */
- #define BOOST_TEST_MODULE SortedVectorTest
- #define _SCL_SECURE_NO_WARNINGS
- #include <boost\test\unit_test.hpp>
- #include <boost\mpl\list.hpp>
- #include <iostream>
- #include <string>
- #include <stdlib.h> /* srand, rand */
- #include <time.h>
- using namespace std;
- #include "sorted_vector.hpp"
- typedef boost::mpl::list<short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, double, float> test_types;
- /* Intro */
- BOOST_AUTO_TEST_CASE(intro) {
- cout << "\nSorted Vector Test. \n";
- cout << "Last compiled: " << __TIMESTAMP__ << "\n\n";
- }
- /***********************************************
- CONSTRUCTORS
- ************************************************/
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(default_constructor_test, T, test_types) {
- sorted_vector<T> v;
- BOOST_CHECK_EQUAL(v.size(), 0);
- BOOST_CHECK(v.empty());
- }
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(elements_constructor_test, T, test_types) {
- sorted_vector<T> v(10);
- BOOST_CHECK(!v.empty());
- BOOST_CHECK(v.begin() != nullptr);
- BOOST_CHECK_EQUAL(v.size(), 10);
- BOOST_CHECK_EQUAL(v.end(), v.begin() + 10);
- BOOST_CHECK_EQUAL(v.capacity(), 10);
- for (size_t i = 0; i < v.size(); ++i) {
- BOOST_CHECK_EQUAL(v.at(i), 0);
- }
- // Check for a given value of 1 instead of using default #
- sorted_vector<T> v2(10,1);
- BOOST_CHECK(!v2.empty());
- BOOST_CHECK(v2.begin() != nullptr);
- BOOST_CHECK_EQUAL(v2.size(), 10);
- BOOST_CHECK_EQUAL(v2.end(), v2.begin() + 10);
- BOOST_CHECK_EQUAL(v2.capacity(), 10);
- for (size_t i = 0; i < v2.size(); ++i) {
- BOOST_CHECK_EQUAL(v2.at(i), 1);
- }
- }
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(copy_constructor_test, T, test_types) {
- sorted_vector<T> v1;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- v1.insert(num++);
- BOOST_CHECK(!v1.empty());
- BOOST_CHECK_EQUAL(v1.size(), i);
- BOOST_REQUIRE_EQUAL(v1.end(), v1.begin() + i);
- BOOST_CHECK_EQUAL(*(v1.end() -1), i);
- }
- BOOST_CHECK(v1.begin() != nullptr);
- BOOST_CHECK(v1.end() != nullptr);
- BOOST_CHECK_MESSAGE(check_sorted(v1), "Vector [v1] is not sorted correctly");
- sorted_vector<T> v2(v1);
- BOOST_CHECK(v2.begin() != nullptr);
- BOOST_CHECK(v2.begin() != nullptr);
- BOOST_CHECK_MESSAGE(check_sorted(v2), "Vector [v2] is not sorted correctly");
- BOOST_CHECK_EQUAL(v1.size(), v2.size());
- BOOST_CHECK_EQUAL(v2.end(), v2.begin() + v1.size());
- for (size_t i = 10; i >= 1; --i) {
- BOOST_CHECK(!v2.empty());
- BOOST_CHECK_EQUAL(*(v1.end() - 1), *(v2.end() - 1));
- BOOST_CHECK_EQUAL(v1.size(), i);
- v1.erase(v1.end()-1);
- v2.erase(v2.end()-1);
- }
- BOOST_CHECK(v1.empty());
- BOOST_CHECK(v2.empty());
- }
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(move_constructor_test, T, test_types) {
- sorted_vector<T> v1;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- v1.insert(num++);
- BOOST_CHECK(!v1.empty());
- BOOST_CHECK_EQUAL(v1.size(), i);
- BOOST_CHECK_EQUAL(*(v1.end() - 1), i);
- }
- BOOST_CHECK_MESSAGE(check_sorted(v1), "Vector [v1] is not sorted correctly");
- auto beg = v1.begin();
- auto end = v1.end();
- auto cap = v1.capacity();
- sorted_vector<T> v2(move(v1));
- BOOST_CHECK(v1.empty());
- BOOST_CHECK_EQUAL(v2.begin(), beg);
- BOOST_CHECK_EQUAL(v2.end(), end);
- BOOST_CHECK_EQUAL(v2.capacity(), cap);
- BOOST_CHECK(v1.begin() == nullptr);
- BOOST_CHECK(v1.end() == nullptr);
- BOOST_CHECK_MESSAGE(check_sorted(v2), "Vector [v2] is not sorted correctly");
- }
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(iterator_constructor_test, T, test_types) {
- sorted_vector<T> sv;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- sv.insert(num++);
- BOOST_CHECK(!sv.empty());
- BOOST_CHECK_EQUAL(sv.size(), i);
- }
- BOOST_CHECK_MESSAGE(check_sorted(sv), "Vector [sv] is not sorted correctly");
- BOOST_CHECK(sv.begin() != nullptr);
- BOOST_CHECK(sv.end() != nullptr);
- sorted_vector<T> dsv(sv.begin(), sv.end());
- BOOST_CHECK_EQUAL(dsv.end(), dsv.begin() + 10);
- BOOST_CHECK(dsv.begin() != nullptr);
- BOOST_CHECK(dsv.end() != nullptr);
- BOOST_CHECK_MESSAGE(check_sorted(dsv), "Vector [dsv] is not sorted correctly");
- for (size_t i = 0; i < 10; ++i) {
- BOOST_CHECK_EQUAL(dsv.at(i), sv.at(i));
- }
- // Check when an unsorted vector is passed, that it gets sorted;
- sorted_vector<T> sv2(10);
- T a[10] = { 3, 4, 1, 7, 5, 8, 6, 9, 10 , 2};
- for (size_t i = 0; i < 10; ++i) {
- sv2[i] = a[i];
- }
- BOOST_CHECK(sv2.begin() != nullptr);
- BOOST_CHECK(sv2.end() != nullptr);
- BOOST_CHECK_EQUAL(sv2.size(), 10);
- sorted_vector<T> iterCopy(sv2.begin(), sv2.end());
- BOOST_CHECK_MESSAGE(check_sorted(iterCopy), "Vector [iterCopy] is not sorted correctly");
- }
- /***********************************************
- METHODS
- ************************************************/
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(find_method_test, T, test_types) {
- sorted_vector<T> v;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- v.insert(num++);
- BOOST_CHECK(!v.empty());
- BOOST_CHECK_EQUAL(v.size(), i);
- BOOST_CHECK_EQUAL(*(v.end() - 1), i);
- }
- BOOST_REQUIRE_MESSAGE(v.begin() != nullptr, "begin() is equal to nullptr");
- BOOST_REQUIRE_MESSAGE(v.end() != nullptr, "end() is equal to nullptr");
- // Check that it is sorted
- BOOST_CHECK_MESSAGE( check_sorted(v), "Vector [v] in find() is not sorted correctly" );
- // Check that find returns a number inside of the vector
- auto numReturned = v.find(6);
- BOOST_CHECK(numReturned != nullptr);
- BOOST_CHECK(numReturned <= v.end());
- BOOST_CHECK(numReturned >= v.begin());
- BOOST_CHECK_EQUAL(*numReturned, 6);
- // 15 not in vector should return v.end()
- auto numReturned2 = v.find(15);
- BOOST_CHECK(numReturned2 != nullptr);
- BOOST_CHECK_EQUAL(numReturned2, v.end());
- }
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(at_method_test, T, test_types) {
- sorted_vector<T> v;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- v.insert(num++);
- BOOST_CHECK(!v.empty());
- BOOST_CHECK_EQUAL(v.size(), i);
- BOOST_CHECK_EQUAL(*(v.end() - 1), i);
- }
- BOOST_CHECK_MESSAGE(check_sorted(v), "Vector is not sorted correctly");
- size_t index = 10;
- BOOST_CHECK_THROW(v.at(index), std::out_of_range);
- index = 5;
- auto numRef = v.at(index);
- BOOST_CHECK_EQUAL(numRef, *(v.begin() + index));
- }
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(erase_method_test, T, test_types) {
- sorted_vector<T> v;
- sorted_vector<T> v2;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- v.insert(num);
- v2.insert(num++);
- BOOST_CHECK(!v.empty());
- BOOST_CHECK_EQUAL(v.size(), i);
- BOOST_CHECK_EQUAL(*(v.end() - 1), i);
- BOOST_CHECK(!v2.empty());
- BOOST_CHECK_EQUAL(v2.size(), i);
- BOOST_CHECK_EQUAL(*(v2.end() - 1), i);
- }
- BOOST_CHECK_MESSAGE(v.begin() != nullptr, "v begin() iterator is null");
- BOOST_CHECK_MESSAGE(v.end() != nullptr, "v end() iterator is null");
- BOOST_CHECK_MESSAGE(check_sorted(v), "Vector [v] is not sorted correctly");
- BOOST_CHECK_MESSAGE(v2.begin() != nullptr, "v2 begin() iterator is null");
- BOOST_CHECK_MESSAGE(v2.end() != nullptr, "v2 end() iterator is null");
- BOOST_CHECK_MESSAGE(check_sorted(v2), "Vector [v2] is not sorted correctly");
- auto startend = v.end();
- auto startendv2 = v2.end();
- BOOST_CHECK(startend != nullptr);
- BOOST_CHECK(startendv2 != nullptr);
- auto locationToErase = v.begin() + 5;
- BOOST_REQUIRE_MESSAGE(locationToErase < v.end() && locationToErase >= v.begin(), "Location being erased is not in vector [v], accessing invalid data");
- auto locationToErase2 = v2.begin() + 5;
- BOOST_REQUIRE_MESSAGE(locationToErase2 < v2.end() && locationToErase2 >= v2.begin(), "Location being erased is not in vector [v2], accessing invalid data");
- auto numberErased = v.erase(locationToErase);
- auto numberErased2 = v2.erase(locationToErase2);
- BOOST_CHECK_MESSAGE(numberErased != nullptr, "Position erased is null");
- BOOST_CHECK_MESSAGE(numberErased2 != nullptr, "Position erased is null");
- BOOST_CHECK_MESSAGE(check_sorted(v), "Vector [v] is not sorted correctly");
- BOOST_CHECK_MESSAGE(check_sorted(v2), "Vector [v2] is not sorted correctly");
- BOOST_CHECK_EQUAL(numberErased, locationToErase);
- BOOST_CHECK_EQUAL(numberErased2, locationToErase2);
- BOOST_CHECK(v.cbegin() != nullptr);
- BOOST_CHECK(v.cend() != nullptr);
- BOOST_CHECK(v2.cbegin() != nullptr);
- auto result = v == v2;
- auto equalResult = gats::equal(v.cbegin(), v.cend(), v2.cbegin());
- BOOST_CHECK(result == true || result == false);
- BOOST_CHECK(equalResult == true || equalResult == false);
- BOOST_CHECK_EQUAL(v.size(), v2.size());
- BOOST_CHECK_EQUAL(equalResult, true);
- BOOST_CHECK_EQUAL(result, true);
- BOOST_CHECK_EQUAL(result, equalResult);
- BOOST_CHECK(v.end() != startend);
- BOOST_CHECK(v2.end() != startendv2);
- }
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(insert_method_test, T, test_types) {
- sorted_vector<T> v1;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- auto it = v1.insert(num++);
- BOOST_CHECK(!v1.empty());
- BOOST_CHECK(v1.begin() != nullptr);
- BOOST_CHECK(v1.end() != nullptr);
- BOOST_CHECK_EQUAL(v1.size(), i);
- BOOST_CHECK_EQUAL(*(v1.end() - 1), i);
- BOOST_CHECK(v1.size() <= v1.capacity());
- BOOST_CHECK_MESSAGE(it != nullptr, "Error: iterator for postition inserted is equal to nullptr");
- BOOST_CHECK_EQUAL(it, v1.end() - 1);
- }
- //Check insert point is in correct space
- auto it = v1.insert(4);
- BOOST_CHECK_MESSAGE(*it == 4, "Insert point value is incorrect" << " [" << *it << " != " << "4]");
- BOOST_CHECK_MESSAGE(*(v1.end() - 1) == 10, "end iterator's value was modified instead of the insertPoint's" << " [" << *(v1.end() - 1) << " != " << 10 << "]");
- BOOST_CHECK_MESSAGE(check_sorted(v1), "Vector is not sorted correctly");
- }
- /***********************************************
- OPERATORS
- ************************************************/
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(assign_test, T, test_types) {
- sorted_vector<T> sv;
- sorted_vector<T> dsv;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- sv.insert(num + 100);
- dsv.insert(num + 200);
- }
- BOOST_CHECK(!sv.empty());
- BOOST_CHECK_EQUAL(sv.size(), 10);
- BOOST_CHECK(!dsv.empty());
- BOOST_CHECK_EQUAL(dsv.size(), 10);
- BOOST_CHECK_MESSAGE(check_sorted(sv), "Vector is not sorted correctly");
- BOOST_CHECK_MESSAGE(check_sorted(dsv), "Vector is not sorted correctly");
- dsv = sv;
- BOOST_CHECK(!dsv.empty());
- BOOST_CHECK(!sv.empty());
- BOOST_CHECK(dsv.begin() != nullptr);
- BOOST_CHECK(dsv.end() != nullptr);
- BOOST_CHECK_EQUAL(dsv.end(), dsv.begin() + sv.size());
- for (size_t i = 0; i < 10; ++i) {
- BOOST_CHECK(!dsv.empty());
- BOOST_CHECK_EQUAL(*dsv.begin(), *sv.begin());
- BOOST_CHECK_EQUAL(dsv.size(), dsv.end() - dsv.begin());
- dsv.erase(dsv.begin());
- sv.erase(sv.begin());
- }
- // Different Sizes
- sorted_vector<T> sv2;
- sorted_vector<T> dsv2;
- T num2 = 1;
- for (size_t i = 1; i <= 10; ++i) {
- sv2.insert(num2 + 100);
- }
- dsv2.insert(num2 + 200);
- BOOST_CHECK(!sv2.empty());
- BOOST_CHECK_EQUAL(sv2.size(), 10);
- BOOST_CHECK(!dsv2.empty());
- BOOST_CHECK_EQUAL(dsv2.size(), 1);
- BOOST_CHECK_MESSAGE(check_sorted(sv2), "Vector [sv2] is not sorted correctly");
- BOOST_CHECK_MESSAGE(check_sorted(dsv2), "Vector [dsv2] is not sorted correctly");
- dsv2 = sv2;
- BOOST_CHECK(!dsv2.empty());
- BOOST_CHECK(!sv2.empty());
- BOOST_CHECK(dsv2.begin() != nullptr);
- BOOST_CHECK(dsv2.end() != nullptr);
- BOOST_CHECK_EQUAL(dsv2.end(), dsv2.begin() + sv2.size());
- BOOST_CHECK_MESSAGE(dsv2.capacity() == sv2.size(), "Capacity pointer error, capacity() should be equal to begin() + size()" << " [" << dsv2.capacity() << " != " << sv2.size() << "]");
- BOOST_CHECK_EQUAL(dsv2.size(), sv2.size());
- }
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(assign_move_test, T, test_types) {
- sorted_vector<T> sv;
- sorted_vector<T> dsv;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- sv.insert(num + 100);
- dsv.insert(num + 200);
- }
- BOOST_CHECK(!sv.empty());
- BOOST_CHECK_EQUAL(sv.size(), 10);
- BOOST_CHECK(!dsv.empty());
- BOOST_CHECK_EQUAL(dsv.size(), 10);
- BOOST_CHECK_MESSAGE(check_sorted(sv), "Vector is not sorted correctly");
- BOOST_CHECK_MESSAGE(check_sorted(dsv), "Vector is not sorted correctly");
- auto beg = sv.begin();
- auto end = sv.end();
- auto cap = sv.capacity();
- dsv = move(sv);
- BOOST_CHECK(sv.empty());
- BOOST_CHECK(sv.begin() == nullptr);
- BOOST_CHECK(sv.end() == nullptr);
- BOOST_CHECK_EQUAL(dsv.begin(), beg);
- BOOST_CHECK_EQUAL(dsv.end(), end);
- BOOST_CHECK_EQUAL(dsv.capacity(), cap);
- for (size_t i = 0; i < 10; ++i) {
- BOOST_CHECK(!dsv.empty());
- BOOST_CHECK_EQUAL(dsv.size(), dsv.end() - dsv.begin());
- dsv.erase(dsv.begin());
- }
- BOOST_CHECK(dsv.empty());
- // test chaining
- sorted_vector<T> ddsv;
- T num2 = 1;
- for (size_t i = 1; i <= 10; ++i) {
- sv.insert(num2 + 100);
- dsv.insert(num2 + 200);
- }
- ddsv = dsv = move(sv);
- BOOST_CHECK(sv.begin() == nullptr);
- BOOST_CHECK(sv.end() == nullptr);
- BOOST_CHECK(!ddsv.empty());
- BOOST_CHECK_EQUAL(ddsv.size(), 10);
- BOOST_CHECK(ddsv.begin() != nullptr);
- BOOST_CHECK(ddsv.end() != nullptr);
- }
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(equality_test, T, test_types) {
- sorted_vector<T> sv;
- sorted_vector<T> dsv;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- sv.insert(num + 100);
- dsv.insert(num + 100);
- }
- BOOST_CHECK(!sv.empty());
- BOOST_CHECK_EQUAL(sv.size(), 10);
- BOOST_CHECK(!dsv.empty());
- BOOST_CHECK_EQUAL(dsv.size(), 10);
- BOOST_CHECK(dsv.cbegin() != nullptr);
- BOOST_CHECK(dsv.cend() != nullptr);
- BOOST_CHECK(sv.cbegin() != nullptr);
- BOOST_CHECK_MESSAGE(check_sorted(sv), "Vector is not sorted correctly");
- BOOST_CHECK_MESSAGE(check_sorted(dsv), "Vector is not sorted correctly");
- bool result = dsv == sv;
- bool equalResult = gats::equal(dsv.cbegin(), dsv.cend(), sv.cbegin());
- BOOST_CHECK(equalResult == true || equalResult == false);
- BOOST_CHECK(result == true || result == false);
- BOOST_CHECK_EQUAL(dsv.size(), sv.size());
- BOOST_CHECK_EQUAL(equalResult, true);
- BOOST_CHECK_EQUAL(result, true);
- BOOST_CHECK_EQUAL(result, equalResult);
- }
- /* DONE */
- BOOST_AUTO_TEST_CASE_TEMPLATE(not_equal_test, T, test_types) {
- sorted_vector<T> sv;
- sorted_vector<T> dsv;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- sv.insert(num + 100);
- dsv.insert(num + 200);
- }
- BOOST_CHECK(!sv.empty());
- BOOST_CHECK_EQUAL(sv.size(), 10);
- BOOST_CHECK(!dsv.empty());
- BOOST_CHECK_EQUAL(dsv.size(), 10);
- BOOST_CHECK(dsv.cbegin() != nullptr);
- BOOST_CHECK(dsv.cend() != nullptr);
- BOOST_CHECK(sv.cbegin() != nullptr);
- BOOST_CHECK_MESSAGE(check_sorted(sv), "Vector is not sorted correctly");
- BOOST_CHECK_MESSAGE(check_sorted(dsv), "Vector is not sorted correctly");
- bool result = dsv != sv;
- bool GATS_equalResult = gats::equal(dsv.cbegin(), dsv.cend(), sv.cbegin());
- BOOST_CHECK(GATS_equalResult == true || GATS_equalResult == false);
- BOOST_CHECK(result == true || result == false);
- BOOST_CHECK_EQUAL(dsv.size(), sv.size());
- BOOST_CHECK_EQUAL(GATS_equalResult, false);
- BOOST_CHECK_EQUAL(result, true);
- // If Equal make sure result returns true
- for (auto &a : sv)
- a = 5;
- for (auto& a : dsv)
- a = 5;
- bool result2 = dsv != sv;
- bool GATS_equalResult2 = gats::equal(dsv.cbegin(), dsv.cend(), sv.cbegin());
- BOOST_CHECK(GATS_equalResult2 == true || GATS_equalResult2 == false);
- BOOST_CHECK(result2 == true || result2 == false);
- BOOST_CHECK_EQUAL(dsv.size(), sv.size());
- BOOST_CHECK_EQUAL(GATS_equalResult2, true);
- BOOST_CHECK_EQUAL(result2, false);
- }
- /***********************************************
- Other Tests
- ************************************************/
- BOOST_AUTO_TEST_CASE_TEMPLATE(capacity_test, T, test_types) {
- sorted_vector<T> v;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- v.insert(num + 100);
- BOOST_CHECK(!v.empty());
- BOOST_CHECK_EQUAL(v.size(), i);
- }
- BOOST_CHECK_EQUAL(v.capacity(), 16);
- }
- BOOST_AUTO_TEST_CASE_TEMPLATE(end_test, T, test_types) {
- sorted_vector<T> v;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- v.insert(num + 100);
- BOOST_CHECK(!v.empty());
- BOOST_CHECK_EQUAL(v.size(), i);
- }
- BOOST_CHECK_EQUAL(v.end(), v.begin() + 10);
- }
- BOOST_AUTO_TEST_CASE_TEMPLATE(reverse_iter_test, T, test_types) {
- sorted_vector<T> v;
- T num = 1;
- for (size_t i = 1; i <= 10; ++i) {
- v.insert(num++ + 100);
- BOOST_CHECK(!v.empty());
- BOOST_CHECK_EQUAL(v.size(), i);
- }
- auto rbeg = v.rbegin();
- auto rend = v.rend();
- auto beg = v.begin();
- auto end = v.end()-1;
- for (; rbeg != rend; ++rbeg, --end) {
- BOOST_CHECK_EQUAL(*rbeg, *end);
- }
- }
- template <typename T>
- boost::test_tools::predicate_result check_sorted(sorted_vector<T> v) {
- auto beg = v.begin();
- auto end = v.end();
- auto next = beg+1;
- auto endNums = end - 1;
- for (; beg != endNums; ++beg, ++next) {
- if (*beg > *next) {
- // failed
- boost::test_tools::predicate_result res(false);
- res.message() << "[" << *beg << " > " << *next << "]";
- return res;
- }
- }
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement