diff --git a/test/common_helper/test.hpp b/test/common_helper/test.hpp index 45fc833..6753f40 100644 --- a/test/common_helper/test.hpp +++ b/test/common_helper/test.hpp @@ -18,7 +18,7 @@ #define _LOCATION " (at " _EXPAND_MACRO(__FILE__) ":" _EXPAND_MACRO(__LINE__) ")" template -consteval std::size_t c_array_len(T (&arr)[N]) { return N; } +consteval std::size_t c_arr_len(T (&arr)[N]) { return N; } #define ADD_TYPE_HINT(type) template <> constexpr const char* const to_type_hint_str::value = #type @@ -26,6 +26,7 @@ consteval std::size_t c_array_len(T (&arr)[N]) { return N; } #define TEST_PASS() ret_val_s { "", ReturnCode::PASSED, nullptr } #define TEST_PASS_MSG(msg) ret_val_s { "", ReturnCode::PASSED, msg } #define TEST_SKIP() ret_val_s { "", ReturnCode::SKIPPED, nullptr} +#define TEST_SKIP_MSG(msg) ret_val_s { "", ReturnCode::SKIPPED, msg} #define TEST_FAIL_TYPE(msg, type_hint) ret_val_s { "", ReturnCode::FAILED, msg, to_type_hint_str::value } #define TEST_PASS_TYPE(type_hint) ret_val_s { "", ReturnCode::PASSED, nullptr, to_type_hint_str::value } @@ -169,7 +170,24 @@ struct test_context_params { constexpr static auto value = empty_param{}; }; -template +template +constexpr auto& get_test_param() { + return test_common_params::value; +} + +template + requires requires { typename Ctx::type; { Ctx::nr } -> std::convertible_to; } +constexpr auto& get_test_param() { + return test_context_params::template value; +} + +template + requires requires { typename Ctx::type; } && (!requires { Ctx::nr; }) +constexpr auto& get_test_param() { + return test_context_params::template value; +} + +/*template struct test_params { constexpr static auto get() { if constexpr (requires { typename Ctx::type; }) { @@ -182,7 +200,19 @@ struct test_params { return test_common_params::template value; } } -}; + + constexpr static auto get_arr_len() { + if constexpr (requires { typename Ctx::type; }) { + if constexpr (requires { { Ctx::nr } -> std::convertible_to; }) { + return c_arr_len(test_context_params::template value); + } else { + return c_arr_len(test_context_params::template value); + } + } else { + return c_arr_len(test_common_params::template value); + } + } +};*/ #define CONTEXT_PARAM(type, name, ...) template<> template<> constexpr type test_context_params<__VA_ARGS__>::value< #name > #define CONTEXT_PARAM_ARR(type, name, ...) template<> template<> constexpr type test_context_params<__VA_ARGS__>::value< #name >[] diff --git a/test/const_vector/CMakeLists.txt b/test/const_vector/CMakeLists.txt index b53f2b6..2301617 100644 --- a/test/const_vector/CMakeLists.txt +++ b/test/const_vector/CMakeLists.txt @@ -8,7 +8,12 @@ add_executable(test_const_vector_constructor const_vector_constructor.test.cpp target_link_libraries(test_const_vector_constructor const_container test_common) add_test(NAME "const_vector constructor" COMMAND test_const_vector_constructor) +add_executable(test_const_vector_assignment const_vector_assignment.test.cpp + test_params.h) +target_link_libraries(test_const_vector_assignment const_container test_common) +add_test(NAME "const_vector assignment" COMMAND test_const_vector_assignment) + add_executable(test_const_vector_data_access const_vector_data_access.test.cpp test_params.h) target_link_libraries(test_const_vector_data_access const_container test_common) -add_test(NAME "const_vector data access" COMMAND test_const_vector_constructor) +add_test(NAME "const_vector data access" COMMAND test_const_vector_data_access) diff --git a/test/const_vector/const_vector_assignment.test.cpp b/test/const_vector/const_vector_assignment.test.cpp new file mode 100644 index 0000000..c10e410 --- /dev/null +++ b/test/const_vector/const_vector_assignment.test.cpp @@ -0,0 +1,179 @@ +#include + +#include +#include "test_params.h" + +constexpr test_suite tests = define_tests("Assignment") + ("const_vector::operator=(const const_vector& other)", []() constexpr { + + REPEAT_FOR_TYPES_N(([]() { + + cc::const_vector original(Ctx::template value<"arr">); + + decltype(original) v1; + cc::const_vector()> v2; + cc::const_vector) - 1> too_small; + + v1 = original; + v2 = original; + ASSERT_TYPE_NUM_THROWS((too_small = original), std::invalid_argument, T, N); + + ASSERT_TYPE_NUM(std::ranges::equal(v1, Ctx::template value<"arr">), T, N); + ASSERT_TYPE_NUM(std::ranges::equal(v2, Ctx::template value<"arr">), T, N); + ASSERT_TYPE_NUM(std::ranges::equal(original, Ctx::template value<"arr">), T, N); + + return TEST_PASS(); + }), 2, int, char, const char *, TestObj); + + return TEST_PASS(); + }, EvalFlag::RUNTIME_CONSTEVAL) + ("const_vector::operator=(const_vector&& other)", []() constexpr { + + REPEAT_FOR_TYPES_N(([]() { + + cc::const_vector original1(Ctx::template value<"arr">); + cc::const_vector original2(Ctx::template value<"arr">); + cc::const_vector original3(Ctx::template value<"arr">); + + decltype(original1) v1; + cc::const_vector> v2; + cc::const_vector) - 1> too_small; + + v1 = force_move(original1); + v2 = force_move(original2); + ASSERT_TYPE_NUM_THROWS((too_small = force_move(original3)), std::invalid_argument, T, N); + + ASSERT_TYPE_NUM(std::ranges::equal(v1, Ctx::template value<"arr">), T, N); + ASSERT_TYPE_NUM(std::ranges::equal(v2, Ctx::template value<"arr">), T, N); + + return TEST_PASS(); + }), 2, int, char, const char *, TestObj); + + return TEST_PASS(); + }, EvalFlag::RUNTIME_CONSTEVAL) + ("const_vector::operator=(const value_type (&array)[])", []() constexpr { + + REPEAT_FOR_TYPES_N(([]() { + + std::remove_cvref_t)> arr = {}; + std::copy(std::begin(Ctx::template value<"arr">), std::end(Ctx::template value<"arr">), std::begin(arr)); + + cc::const_vector v1; + cc::const_vector> v2; + cc::const_vector) - 1> too_small; + + v1 = arr; + v2 = arr; + ASSERT_TYPE_NUM_THROWS((too_small = arr), std::invalid_argument, T, N); + + ASSERT_TYPE_NUM(std::ranges::equal(v1, Ctx::template value<"arr">), T, N); + ASSERT_TYPE_NUM(std::ranges::equal(v2, Ctx::template value<"arr">), T, N); + ASSERT_TYPE_NUM(std::ranges::equal(arr, Ctx::template value<"arr">), T, N); + + return TEST_PASS(); + }), 2, int, char, const char *, TestObj); + + return TEST_PASS(); + }, EvalFlag::RUNTIME_CONSTEVAL) + ("const_vector::operator=(std::initializer_list values)", []() constexpr { + + REPEAT_FOR_TYPES_N(([]() { + + cc::const_vector.size()> v1; + cc::const_vector> v2; + cc::const_vector.size() - 1> too_small; + + v1 = test_params<"ilist", Ctx>; + v2 = test_params<"ilist", Ctx>; + ASSERT_TYPE_NUM_THROWS((too_small = test_params<"ilist", Ctx>), std::invalid_argument, T, N); + + ASSERT_TYPE_NUM(std::ranges::equal(v1, test_params<"ilist", Ctx>), T, N); + ASSERT_TYPE_NUM(std::ranges::equal(v2, test_params<"ilist", Ctx>), T, N); + + return TEST_PASS(); + }), 2, int, char, const char *, TestObj); + + return TEST_PASS(); + }, EvalFlag::RUNTIME_CONSTEVAL) + + ("const_vector::assign(size_type count, const value_type& value)", []() constexpr { + + REPEAT_FOR_TYPES_N(([]() constexpr { + + std::remove_cvref_t)> value = test_params<"value", Ctx>; + + cc::const_vector v1(test_params<"arr", Ctx>); + cc::const_vector v2(test_params<"arr", Ctx>); + + auto count1 = v1.size(); + auto count2 = v2.size() / 2; + + v1.assign(count1, value); + v2.assign(count2, value); + + ASSERT_TYPE_NUM(v1.size() == count1, T, N); + ASSERT_TYPE_NUM(v2.size() == count2, T, N); + ASSERT_TYPE_NUM(std::ranges::all_of(v1, [value](auto&& e) { return e == value; }), T, N); + ASSERT_TYPE_NUM(std::ranges::all_of(v1, [value](auto&& e) { return e == value; }), T, N); + + ASSERT_TYPE_NUM((value == test_params<"value", Ctx>), T, N); + + return TEST_PASS(); + }), 2, int, char, const char*, TestObj); + + return TEST_PASS(); + }, EvalFlag::RUNTIME_CONSTEVAL) + /*("const_vector::assign(InputIt first, InputIt last)", []() constexpr { + + REPEAT_FOR_TYPES_N(([]() constexpr { + constexpr std::size_t N = n+1; + cc::const_vector::template arr_len()> v1; + cc::const_vector::template il_len()> v2; + cc::const_vector::template il_len()> v3; + cc::const_vector::template arr_len() - 1> v4; + + std::vector container = test_defs::get::template i_list; + + v1.assign(std::begin(test_defs::get::template arr), std::end(test_defs::get::template arr)); + v2.assign(container.begin(), container.end()); + v3.assign(container.begin(), std::next(container.begin(), test_defs::get::template il_len() / 2)); + + ASSERT_TYPE_NUM_THROWS( + (v4.assign(std::begin(test_defs::get::template arr), + std::end(test_defs::get::template arr))), std::invalid_argument, T, N); + + ASSERT_TYPE_NUM_VEC_ARR_EQ(v1, test_defs::get::template arr, T, N); + ASSERT_TYPE_NUM(v1.size() == test_defs::get::template arr_len(), T, N); + ASSERT_TYPE_NUM_VEC_ARR_EQ(v2, container, T, N); + ASSERT_TYPE_NUM(v2.size() == container.size(), T, N); + ASSERT_TYPE_NUM_VEC_ARR_EQ(v3, container, T, N); + ASSERT_TYPE_NUM(v3.size() == container.size() / 2, T, N); + + return TEST_PASS(); + }), 3, int, char, const char *, TestStruct); + + return TEST_PASS(); + }, EvalFlag::RUNTIME_CONSTEVAL) + ("const_vector::assign(std::initializer_list values)", []() constexpr { + + REPEAT_FOR_TYPES_N(([]() constexpr { + + cc::const_vector).size()> v1; + cc::const_vector).size() - 1> v2; + + v1.assign(test_params<"ilist", Ctx>); + + ASSERT_TYPE_NUM_VEC_ARR_EQ(v1, (test_params<"ilist", Ctx>), T, N); + ASSERT_TYPE_NUM((v1.size() == test_params<"ilist", Ctx>.size()), T, N); + + ASSERT_TYPE_NUM_THROWS(v2.assign(test_params<"ilist", Ctx>), std::invalid_argument, T, N); + + return TEST_PASS(); + }), 2, int, char, const char *, TestObj); + + return TEST_PASS(); + }, EvalFlag::RUNTIME_CONSTEVAL)*/; + +int main() { + return tests.run(); +} \ No newline at end of file diff --git a/test/const_vector/const_vector_constructor.test.cpp b/test/const_vector/const_vector_constructor.test.cpp index 107c21b..7bb8579 100644 --- a/test/const_vector/const_vector_constructor.test.cpp +++ b/test/const_vector/const_vector_constructor.test.cpp @@ -668,558 +668,6 @@ constexpr test_suite tests = define_tests("Constructors") ASSERT_VEC_ARR_EQ(vo3, test_defs::get::arr<1>); ASSERT_VEC_ARR_EQ(vo4, test_defs::get::arr<2>); - return TEST_PASS(); - }, EvalFlag::RUNTIME_CONSTEVAL) - - ("const_vector::operator=(const const_vector& other)", []() constexpr { - - cc::const_vector vi1(test_defs::get::arr<1>); - cc::const_vector vi2(test_defs::get::arr<2>); - decltype(vi1) vi1c; - decltype(vi2) vi2c; - cc::const_vector::capacity<1>()> vi3; - cc::const_vector::capacity<2>()> vi4; - cc::const_vector::arr_len<1>() - 1)> too_small_vi1c; - cc::const_vector::arr_len<2>() - 1)> too_small_vi2c; - - cc::const_vector vc1(test_defs::get::arr<1>); - cc::const_vector vc2(test_defs::get::arr<2>); - decltype(vc1) vc1c; - decltype(vc2) vc2c; - cc::const_vector::capacity<1>()> vc3; - cc::const_vector::capacity<2>()> vc4; - cc::const_vector::arr_len<1>() - 1)> too_small_vc1c; - cc::const_vector::arr_len<2>() - 1)> too_small_vc2c; - - cc::const_vector vs1(test_defs::get::arr<1>); - cc::const_vector vs2(test_defs::get::arr<2>); - decltype(vs1) vs1c; - decltype(vs2) vs2c; - cc::const_vector::capacity<1>()> vs3; - cc::const_vector::capacity<2>()> vs4; - cc::const_vector::arr_len<1>() - 1)> too_small_vs1c; - cc::const_vector::arr_len<2>() - 1)> too_small_vs2c; - - cc::const_vector vo1(test_defs::get::arr<1>); - cc::const_vector vo2(test_defs::get::arr<2>); - decltype(vo1) vo1c; - decltype(vo2) vo2c; - cc::const_vector::capacity<1>()> vo3; - cc::const_vector::capacity<2>()> vo4; - cc::const_vector::arr_len<1>() - 1)> too_small_vo1c; - cc::const_vector::arr_len<2>() - 1)> too_small_vo2c; - - vi1c = vi1; - vi2c = vi2; - vi3 = vi1; - vi4 = vi2; - - vi1 = vi1; - vi2 = vi2; - - ASSERT_THROWS((too_small_vi1c = vi1), std::invalid_argument); - ASSERT_THROWS((too_small_vi2c = vi2), std::invalid_argument); - - // Due to self assignment - ASSERT(vi1.size() == test_defs::get::arr_len<1>()); - ASSERT(vi2.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vi1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vi2, test_defs::get::arr<2>); - - ASSERT(vi1c.size() == vi1.size()); - ASSERT(vi2c.size() == vi2.size()); - ASSERT_VEC_EQ(vi1c, vi1); - ASSERT_VEC_EQ(vi2c, vi2); - ASSERT(vi3.size() == vi1.size()); - ASSERT(vi4.size() == vi2.size()); - ASSERT_VEC_EQ(vi3, vi1); - ASSERT_VEC_EQ(vi4, vi2); - - vc1c = vc1; - vc2c = vc2; - vc3 = vc1; - vc4 = vc2; - - vc1 = vc1; - vc2 = vc2; - - ASSERT_THROWS((too_small_vc1c = vc1), std::invalid_argument); - ASSERT_THROWS((too_small_vc2c = vc2), std::invalid_argument); - - ASSERT(vc1.size() == test_defs::get::arr_len<1>()); - ASSERT(vc2.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vc1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vc2, test_defs::get::arr<2>); - - ASSERT(vc1c.size() == vc1.size()); - ASSERT(vc2c.size() == vc2.size()); - ASSERT_VEC_EQ(vc1c, vc1); - ASSERT_VEC_EQ(vc2c, vc2); - ASSERT(vc3.size() == vc1.size()); - ASSERT(vc4.size() == vc2.size()); - ASSERT_VEC_EQ(vc3, vc1); - ASSERT_VEC_EQ(vc4, vc2); - - vs1c = vs1; - vs2c = vs2; - vs3 = vs1; - vs4 = vs2; - - vs1 = vs1; - vs2 = vs2; - - ASSERT_THROWS((too_small_vs1c = vs1), std::invalid_argument); - ASSERT_THROWS((too_small_vs2c = vs2), std::invalid_argument); - - ASSERT(vs1.size() == test_defs::get::arr_len<1>()); - ASSERT(vs2.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vs1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vs2, test_defs::get::arr<2>); - - ASSERT(vs1c.size() == vs1.size()); - ASSERT(vs2c.size() == vs2.size()); - ASSERT_VEC_EQ(vs1c, vs1); - ASSERT_VEC_EQ(vs2c, vs2); - ASSERT(vs3.size() == vs1.size()); - ASSERT(vs4.size() == vs2.size()); - ASSERT_VEC_EQ(vs3, vs1); - ASSERT_VEC_EQ(vs4, vs2); - - vo1c = vo1; - vo2c = vo2; - vo3 = vo1; - vo4 = vo2; - - vo1 = vo1; - vo2 = vo2; - - ASSERT_THROWS((too_small_vo1c = vo1), std::invalid_argument); - ASSERT_THROWS((too_small_vo2c = vo2), std::invalid_argument); - - ASSERT(vo1.size() == test_defs::get::arr_len<1>()); - ASSERT(vo2.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vo1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vo2, test_defs::get::arr<2>); - - ASSERT(vo1c.size() == vo1.size()); - ASSERT(vo2c.size() == vo2.size()); - ASSERT_VEC_EQ(vo1c, vo1); - ASSERT_VEC_EQ(vo2c, vo2); - ASSERT(vo3.size() == vo1.size()); - ASSERT(vo4.size() == vo2.size()); - ASSERT_VEC_EQ(vo3, vo1); - ASSERT_VEC_EQ(vo4, vo2); - - return TEST_PASS(); - }, EvalFlag::RUNTIME_CONSTEVAL) - ("const_vector::operator=(const_vector&& other)", []() constexpr { - - cc::const_vector vi11(test_defs::get::arr<1>); - cc::const_vector vi21(test_defs::get::arr<2>); - cc::const_vector vi12(test_defs::get::arr<1>); - cc::const_vector vi22(test_defs::get::arr<2>); - cc::const_vector vi13(test_defs::get::arr<1>); - cc::const_vector vi23(test_defs::get::arr<2>); - decltype(vi11) vi1; - decltype(vi21) vi2; - cc::const_vector::capacity<1>()> vi3; - cc::const_vector::capacity<2>()> vi4; - cc::const_vector::arr_len<1>() - 1)> too_small_vi1c; - cc::const_vector::arr_len<2>() - 1)> too_small_vi2c; - - - vi1 = force_move(vi11); - vi2 = force_move(vi21); - vi3 = force_move(vi12); - vi4 = force_move(vi22); - - ASSERT_THROWS((too_small_vi1c = force_move(vi13)), std::invalid_argument); - ASSERT_THROWS((too_small_vi2c = force_move(vi23)), std::invalid_argument); - - ASSERT(vi1.size() == test_defs::get::arr_len<1>()); - ASSERT(vi2.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vi1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vi2, test_defs::get::arr<2>); - ASSERT(vi3.size() == test_defs::get::arr_len<1>()); - ASSERT(vi4.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vi3, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vi4, test_defs::get::arr<2>); - - - cc::const_vector vc11(test_defs::get::arr<1>); - cc::const_vector vc21(test_defs::get::arr<2>); - cc::const_vector vc12(test_defs::get::arr<1>); - cc::const_vector vc22(test_defs::get::arr<2>); - cc::const_vector vc13(test_defs::get::arr<1>); - cc::const_vector vc23(test_defs::get::arr<2>); - decltype(vc11) vc1; - decltype(vc21) vc2; - cc::const_vector::capacity<1>()> vc3; - cc::const_vector::capacity<2>()> vc4; - cc::const_vector::arr_len<1>() - 1)> too_small_vc1c; - cc::const_vector::arr_len<2>() - 1)> too_small_vc2c; - - - vc1 = force_move(vc11); - vc2 = force_move(vc21); - vc3 = force_move(vc12); - vc4 = force_move(vc22); - - ASSERT_THROWS((too_small_vc1c = force_move(vc13)), std::invalid_argument); - ASSERT_THROWS((too_small_vc2c = force_move(vc23)), std::invalid_argument); - - ASSERT(vc1.size() == test_defs::get::arr_len<1>()); - ASSERT(vc2.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vc1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vc2, test_defs::get::arr<2>); - ASSERT(vc3.size() == test_defs::get::arr_len<1>()); - ASSERT(vc4.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vc3, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vc4, test_defs::get::arr<2>); - - - cc::const_vector vs11(test_defs::get::arr<1>); - cc::const_vector vs21(test_defs::get::arr<2>); - cc::const_vector vs12(test_defs::get::arr<1>); - cc::const_vector vs22(test_defs::get::arr<2>); - cc::const_vector vs13(test_defs::get::arr<1>); - cc::const_vector vs23(test_defs::get::arr<2>); - decltype(vs11) vs1; - decltype(vs21) vs2; - cc::const_vector::capacity<1>()> vs3; - cc::const_vector::capacity<2>()> vs4; - cc::const_vector::arr_len<1>() - 1)> too_small_vs1c; - cc::const_vector::arr_len<2>() - 1)> too_small_vs2c; - - - vs1 = force_move(vs11); - vs2 = force_move(vs21); - vs3 = force_move(vs12); - vs4 = force_move(vs22); - - ASSERT_THROWS((too_small_vs1c = force_move(vs13)), std::invalid_argument); - ASSERT_THROWS((too_small_vs2c = force_move(vs23)), std::invalid_argument); - - ASSERT(vs1.size() == test_defs::get::arr_len<1>()); - ASSERT(vs2.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vs1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vs2, test_defs::get::arr<2>); - ASSERT(vs3.size() == test_defs::get::arr_len<1>()); - ASSERT(vs4.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vs3, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vs4, test_defs::get::arr<2>); - - - cc::const_vector vo11(test_defs::get::arr<1>); - cc::const_vector vo21(test_defs::get::arr<2>); - cc::const_vector vo12(test_defs::get::arr<1>); - cc::const_vector vo22(test_defs::get::arr<2>); - cc::const_vector vo13(test_defs::get::arr<1>); - cc::const_vector vo23(test_defs::get::arr<2>); - decltype(vo11) vo1; - decltype(vo21) vo2; - cc::const_vector::capacity<1>()> vo3; - cc::const_vector::capacity<2>()> vo4; - cc::const_vector::arr_len<1>() - 1)> too_small_vo1c; - cc::const_vector::arr_len<2>() - 1)> too_small_vo2c; - - - vo1 = force_move(vo11); - vo2 = force_move(vo21); - vo3 = force_move(vo12); - vo4 = force_move(vo22); - - ASSERT_THROWS((too_small_vo1c = force_move(vo13)), std::invalid_argument); - ASSERT_THROWS((too_small_vo2c = force_move(vo23)), std::invalid_argument); - - ASSERT(vo1.size() == test_defs::get::arr_len<1>()); - ASSERT(vo2.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vo1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vo2, test_defs::get::arr<2>); - ASSERT(vo3.size() == test_defs::get::arr_len<1>()); - ASSERT(vo4.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vo3, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vo4, test_defs::get::arr<2>); - - return TEST_PASS(); - }, EvalFlag::RUNTIME_CONSTEVAL) - ("const_vector::operator=(const value_type (&array)[])", []() constexpr { - - cc::const_vector::arr_len<1>()> vi1; - cc::const_vector::arr_len<2>()> vi2; - cc::const_vector::capacity<1>()> vi3; - cc::const_vector::capacity<2>()> vi4; - cc::const_vector::arr_len<1>() - 1> too_small_vi1; - cc::const_vector::arr_len<2>() - 1> too_small_vi2; - - vi1 = test_defs::get::arr<1>; - vi2 = test_defs::get::arr<2>; - vi3 = test_defs::get::arr<1>; - vi4 = test_defs::get::arr<2>; - - ASSERT_THROWS((too_small_vi1 = test_defs::get::arr<1>), std::invalid_argument); - ASSERT_THROWS((too_small_vi1 = test_defs::get::arr<2>), std::invalid_argument); - - ASSERT(vi1.size() == test_defs::get::arr_len<1>()); - ASSERT(vi2.size() == test_defs::get::arr_len<2>()); - ASSERT(vi3.size() == test_defs::get::arr_len<1>()); - ASSERT(vi4.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vi1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vi2, test_defs::get::arr<2>); - ASSERT_VEC_ARR_EQ(vi3, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vi4, test_defs::get::arr<2>); - - cc::const_vector::arr_len<1>()> vc1; - cc::const_vector::arr_len<2>()> vc2; - cc::const_vector::capacity<1>()> vc3; - cc::const_vector::capacity<2>()> vc4; - cc::const_vector::arr_len<1>() - 1> too_small_vc1; - cc::const_vector::arr_len<2>() - 1> too_small_vc2; - - vc1 = test_defs::get::arr<1>; - vc2 = test_defs::get::arr<2>; - vc3 = test_defs::get::arr<1>; - vc4 = test_defs::get::arr<2>; - - ASSERT_THROWS((too_small_vc1 = test_defs::get::arr<1>), std::invalid_argument); - ASSERT_THROWS((too_small_vc1 = test_defs::get::arr<2>), std::invalid_argument); - - ASSERT(vc1.size() == test_defs::get::arr_len<1>()); - ASSERT(vc2.size() == test_defs::get::arr_len<2>()); - ASSERT(vc3.size() == test_defs::get::arr_len<1>()); - ASSERT(vc4.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vc1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vc2, test_defs::get::arr<2>); - ASSERT_VEC_ARR_EQ(vc3, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vc4, test_defs::get::arr<2>); - - cc::const_vector::arr_len<1>()> vs1; - cc::const_vector::arr_len<2>()> vs2; - cc::const_vector::capacity<1>()> vs3; - cc::const_vector::capacity<2>()> vs4; - cc::const_vector::arr_len<1>() - 1> too_small_vs1; - cc::const_vector::arr_len<2>() - 1> too_small_vs2; - - vs1 = test_defs::get::arr<1>; - vs2 = test_defs::get::arr<2>; - vs3 = test_defs::get::arr<1>; - vs4 = test_defs::get::arr<2>; - - ASSERT_THROWS((too_small_vs1 = test_defs::get::arr<1>), std::invalid_argument); - ASSERT_THROWS((too_small_vs1 = test_defs::get::arr<2>), std::invalid_argument); - - ASSERT(vs1.size() == test_defs::get::arr_len<1>()); - ASSERT(vs2.size() == test_defs::get::arr_len<2>()); - ASSERT(vs3.size() == test_defs::get::arr_len<1>()); - ASSERT(vs4.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vs1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vs2, test_defs::get::arr<2>); - ASSERT_VEC_ARR_EQ(vs3, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vs4, test_defs::get::arr<2>); - - cc::const_vector::arr_len<1>()> vo1; - cc::const_vector::arr_len<2>()> vo2; - cc::const_vector::capacity<1>()> vo3; - cc::const_vector::capacity<2>()> vo4; - cc::const_vector::arr_len<1>() - 1> too_small_vo1; - cc::const_vector::arr_len<2>() - 1> too_small_vo2; - - vo1 = test_defs::get::arr<1>; - vo2 = test_defs::get::arr<2>; - vo3 = test_defs::get::arr<1>; - vo4 = test_defs::get::arr<2>; - - ASSERT_THROWS((too_small_vo1 = test_defs::get::arr<1>), std::invalid_argument); - ASSERT_THROWS((too_small_vo1 = test_defs::get::arr<2>), std::invalid_argument); - - ASSERT(vo1.size() == test_defs::get::arr_len<1>()); - ASSERT(vo2.size() == test_defs::get::arr_len<2>()); - ASSERT(vo3.size() == test_defs::get::arr_len<1>()); - ASSERT(vo4.size() == test_defs::get::arr_len<2>()); - ASSERT_VEC_ARR_EQ(vo1, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vo2, test_defs::get::arr<2>); - ASSERT_VEC_ARR_EQ(vo3, test_defs::get::arr<1>); - ASSERT_VEC_ARR_EQ(vo4, test_defs::get::arr<2>); - - return TEST_PASS(); - }, EvalFlag::RUNTIME_CONSTEVAL) - ("const_vector::operator=(std::initializer_list values)", []() constexpr { - - cc::const_vector::il_len<1>()> vi1; - cc::const_vector::il_len<2>()> vi2; - cc::const_vector::capacity<1>()> vi3; - cc::const_vector::capacity<2>()> vi4; - cc::const_vector::il_len<1>() - 1> too_small_vi1; - cc::const_vector::il_len<2>() - 1> too_small_vi2; - - OPERATOR_EQ_IL(vi1, test_defs::get::i_list<1>, test_defs::get::il_len<1>()); - OPERATOR_EQ_IL(vi2, test_defs::get::i_list<2>, test_defs::get::il_len<2>()); - OPERATOR_EQ_IL(vi3, test_defs::get::i_list<1>, test_defs::get::il_len<1>()); - OPERATOR_EQ_IL(vi4, test_defs::get::i_list<2>, test_defs::get::il_len<2>()); - - ASSERT_THROWS((too_small_vi1 = test_defs::get::i_list<1>), std::invalid_argument); - ASSERT_THROWS((too_small_vi1 = test_defs::get::i_list<2>), std::invalid_argument); - - ASSERT(vi1.size() == test_defs::get::il_len<1>()); - ASSERT(vi2.size() == test_defs::get::il_len<2>()); - ASSERT(vi3.size() == test_defs::get::il_len<1>()); - ASSERT(vi4.size() == test_defs::get::il_len<2>()); - ASSERT_VEC_ARR_EQ(vi1, test_defs::get::i_list<1>); - ASSERT_VEC_ARR_EQ(vi2, test_defs::get::i_list<2>); - ASSERT_VEC_ARR_EQ(vi3, test_defs::get::i_list<1>); - ASSERT_VEC_ARR_EQ(vi4, test_defs::get::i_list<2>); - - cc::const_vector::il_len<1>()> vc1; - cc::const_vector::il_len<2>()> vc2; - cc::const_vector::capacity<1>()> vc3; - cc::const_vector::capacity<2>()> vc4; - cc::const_vector::il_len<1>() - 1> too_small_vc1; - cc::const_vector::il_len<2>() - 1> too_small_vc2; - - OPERATOR_EQ_IL(vc1, test_defs::get::i_list<1>, test_defs::get::il_len<1>()); - OPERATOR_EQ_IL(vc2, test_defs::get::i_list<2>, test_defs::get::il_len<2>()); - OPERATOR_EQ_IL(vc3, test_defs::get::i_list<1>, test_defs::get::il_len<1>()); - OPERATOR_EQ_IL(vc4, test_defs::get::i_list<2>, test_defs::get::il_len<2>()); - - ASSERT_THROWS((too_small_vc1 = test_defs::get::i_list<1>), std::invalid_argument); - ASSERT_THROWS((too_small_vc1 = test_defs::get::i_list<2>), std::invalid_argument); - - ASSERT(vc1.size() == test_defs::get::il_len<1>()); - ASSERT(vc2.size() == test_defs::get::il_len<2>()); - ASSERT(vc3.size() == test_defs::get::il_len<1>()); - ASSERT(vc4.size() == test_defs::get::il_len<2>()); - ASSERT_VEC_ARR_EQ(vc1, test_defs::get::i_list<1>); - ASSERT_VEC_ARR_EQ(vc2, test_defs::get::i_list<2>); - ASSERT_VEC_ARR_EQ(vc3, test_defs::get::i_list<1>); - ASSERT_VEC_ARR_EQ(vc4, test_defs::get::i_list<2>); - - cc::const_vector::il_len<1>()> vs1; - cc::const_vector::il_len<2>()> vs2; - cc::const_vector::capacity<1>()> vs3; - cc::const_vector::capacity<2>()> vs4; - cc::const_vector::il_len<1>() - 1> too_small_vs1; - cc::const_vector::il_len<2>() - 1> too_small_vs2; - - OPERATOR_EQ_IL(vs1, test_defs::get::i_list<1>, test_defs::get::il_len<1>()); - OPERATOR_EQ_IL(vs2, test_defs::get::i_list<2>, test_defs::get::il_len<2>()); - OPERATOR_EQ_IL(vs3, test_defs::get::i_list<1>, test_defs::get::il_len<1>()); - OPERATOR_EQ_IL(vs4, test_defs::get::i_list<2>, test_defs::get::il_len<2>()); - - ASSERT_THROWS((too_small_vs1 = test_defs::get::i_list<1>), std::invalid_argument); - ASSERT_THROWS((too_small_vs1 = test_defs::get::i_list<2>), std::invalid_argument); - - ASSERT(vs1.size() == test_defs::get::il_len<1>()); - ASSERT(vs2.size() == test_defs::get::il_len<2>()); - ASSERT(vs3.size() == test_defs::get::il_len<1>()); - ASSERT(vs4.size() == test_defs::get::il_len<2>()); - ASSERT_VEC_ARR_EQ(vs1, test_defs::get::i_list<1>); - ASSERT_VEC_ARR_EQ(vs2, test_defs::get::i_list<2>); - ASSERT_VEC_ARR_EQ(vs3, test_defs::get::i_list<1>); - ASSERT_VEC_ARR_EQ(vs4, test_defs::get::i_list<2>); - - cc::const_vector::il_len<1>()> vo1; - cc::const_vector::il_len<2>()> vo2; - cc::const_vector::capacity<1>()> vo3; - cc::const_vector::capacity<2>()> vo4; - cc::const_vector::il_len<1>() - 1> too_small_vo1; - cc::const_vector::il_len<2>() - 1> too_small_vo2; - - OPERATOR_EQ_IL(vo1, test_defs::get::i_list<1>, test_defs::get::il_len<1>()); - OPERATOR_EQ_IL(vo2, test_defs::get::i_list<2>, test_defs::get::il_len<2>()); - OPERATOR_EQ_IL(vo3, test_defs::get::i_list<1>, test_defs::get::il_len<1>()); - OPERATOR_EQ_IL(vo4, test_defs::get::i_list<2>, test_defs::get::il_len<2>()); - - ASSERT_THROWS((too_small_vo1 = test_defs::get::i_list<1>), std::invalid_argument); - ASSERT_THROWS((too_small_vo1 = test_defs::get::i_list<2>), std::invalid_argument); - - ASSERT(vo1.size() == test_defs::get::il_len<1>()); - ASSERT(vo2.size() == test_defs::get::il_len<2>()); - ASSERT(vo3.size() == test_defs::get::il_len<1>()); - ASSERT(vo4.size() == test_defs::get::il_len<2>()); - ASSERT_VEC_ARR_EQ(vo1, test_defs::get::i_list<1>); - ASSERT_VEC_ARR_EQ(vo2, test_defs::get::i_list<2>); - ASSERT_VEC_ARR_EQ(vo3, test_defs::get::i_list<1>); - ASSERT_VEC_ARR_EQ(vo4, test_defs::get::i_list<2>); - - return TEST_PASS(); - }, EvalFlag::RUNTIME_CONSTEVAL) - - ("const_vector::assign(size_type count, const value_type& value)", []() constexpr { - - REPEAT_FOR_TYPES(([]() constexpr { - - cc::const_vector v1(test_defs::get::template arr<1>); - cc::const_vector v2(test_defs::get::template arr<2>); - cc::const_vector::template capacity<1>()> v3; - - auto count1 = test_defs::get::template arr_len<1>() / 2; - auto count2 = test_defs::get::template arr_len<2>() / 2; - - v1.assign(count1, test_defs::get::template value<1>()); - v2.assign(count2, test_defs::get::template value<2>()); - v3.assign(test_defs::get::template capacity<1>() + 1, test_defs::get::template value<1>()); - - ASSERT_TYPE(v1.size() == count1, T); - ASSERT_TYPE(v2.size() == count2, T); - ASSERT_TYPE_ALL_VEC_EQ(v1, test_defs::get::template value<1>(), T); - ASSERT_TYPE_ALL_VEC_EQ(v2, test_defs::get::template value<2>(), T); - - ASSERT_TYPE(v3.size() == test_defs::get::template capacity<1>(), T); - ASSERT_TYPE_ALL_VEC_EQ(v1, test_defs::get::template value<1>(), T); - - return TEST_PASS(); - }), int, char, const char*, TestStruct); - - return TEST_PASS(); - }, EvalFlag::RUNTIME_CONSTEVAL) - ("const_vector::assign(InputIt first, InputIt last)", []() constexpr { - - REPEAT_FOR_TYPES_N(([]() constexpr { - constexpr std::size_t N = n+1; - cc::const_vector::template arr_len()> v1; - cc::const_vector::template il_len()> v2; - cc::const_vector::template il_len()> v3; - cc::const_vector::template arr_len() - 1> v4; - - std::vector container = test_defs::get::template i_list; - - v1.assign(std::begin(test_defs::get::template arr), std::end(test_defs::get::template arr)); - v2.assign(container.begin(), container.end()); - v3.assign(container.begin(), std::next(container.begin(), test_defs::get::template il_len() / 2)); - - ASSERT_TYPE_NUM_THROWS( - (v4.assign(std::begin(test_defs::get::template arr), - std::end(test_defs::get::template arr))), std::invalid_argument, T, N); - - ASSERT_TYPE_NUM_VEC_ARR_EQ(v1, test_defs::get::template arr, T, N); - ASSERT_TYPE_NUM(v1.size() == test_defs::get::template arr_len(), T, N); - ASSERT_TYPE_NUM_VEC_ARR_EQ(v2, container, T, N); - ASSERT_TYPE_NUM(v2.size() == container.size(), T, N); - ASSERT_TYPE_NUM_VEC_ARR_EQ(v3, container, T, N); - ASSERT_TYPE_NUM(v3.size() == container.size() / 2, T, N); - - return TEST_PASS(); - }), 3, int, char, const char *, TestStruct); - - return TEST_PASS(); - }, EvalFlag::RUNTIME_CONSTEVAL) - ("const_vector::assign(std::initializer_list values)", []() constexpr { - - REPEAT_FOR_TYPES_N(([]() constexpr { - - cc::const_vector::get()).size()> v1; - cc::const_vector::get()).size() - 1> v2; - - v1.assign(test_params<"ilist", Ctx>::get()); - - ASSERT_TYPE_NUM_VEC_ARR_EQ(v1, (test_params<"ilist", Ctx>::get()), T, N); - ASSERT_TYPE_NUM((v1.size() == test_params<"ilist", Ctx>::get().size()), T, N); - - ASSERT_TYPE_NUM_THROWS(v2.assign(test_params<"ilist", Ctx>::get()), std::invalid_argument, T, N); - - return TEST_PASS(); - }), 2, int, char, const char *, TestObj); - return TEST_PASS(); }, EvalFlag::RUNTIME_CONSTEVAL);