diff --git a/CMakeLists.txt b/CMakeLists.txt index fc7626b..571da96 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,8 @@ set(TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/tests/main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/in_place.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/relops.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/observers.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/tests/monadic.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/tests/monadic.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/tests/constexpr.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/nullopt.cpp) add_executable(tests ${TEST_SOURCES}) diff --git a/tests/constexpr.cpp b/tests/constexpr.cpp index 6366f37..ba8c3c5 100644 --- a/tests/constexpr.cpp +++ b/tests/constexpr.cpp @@ -1,4 +1,47 @@ #include "catch.hpp" #include "optional.hpp" -TEST_CASE("Constexpr", "[constexpr]") {} +#define TOKENPASTE(x, y) x##y +#define TOKENPASTE2(x, y) TOKENPASTE(x, y) +#define STATIC_REQUIRE(e) \ + constexpr bool TOKENPASTE2(rqure, __LINE__) = e; \ + REQUIRE(e); + +TEST_CASE("Constexpr", "[constexpr]") { + SECTION("empty construct") { + constexpr tl::optional o1; + constexpr tl::optional o2{}; + constexpr tl::optional o3 = {}; + constexpr tl::optional o4 = tl::nullopt; + constexpr tl::optional o5 = {tl::nullopt}; + constexpr tl::optional o6(tl::nullopt); + + STATIC_REQUIRE(!o1); + STATIC_REQUIRE(!o2); + STATIC_REQUIRE(!o3); + STATIC_REQUIRE(!o4); + STATIC_REQUIRE(!o5); + STATIC_REQUIRE(!o6); + } + + SECTION("value construct") { + constexpr tl::optional o1 = 42; + constexpr tl::optional o2{42}; + constexpr tl::optional o3(42); + constexpr tl::optional o4 = {42}; + constexpr int i = 42; + constexpr tl::optional o5 = std::move(i); + constexpr tl::optional o6{std::move(i)}; + constexpr tl::optional o7(std::move(i)); + constexpr tl::optional o8 = {std::move(i)}; + + STATIC_REQUIRE(*o1 == 42); + STATIC_REQUIRE(*o2 == 42); + STATIC_REQUIRE(*o3 == 42); + STATIC_REQUIRE(*o4 == 42); + STATIC_REQUIRE(*o5 == 42); + STATIC_REQUIRE(*o6 == 42); + STATIC_REQUIRE(*o7 == 42); + STATIC_REQUIRE(*o8 == 42); + } +}