From 0950f2e7213a5eb90e52b0a29705743e70b28a28 Mon Sep 17 00:00:00 2001 From: Simon Brand Date: Sat, 21 Oct 2017 21:24:34 +0100 Subject: [PATCH] More tests --- CMakeLists.txt | 2 ++ optional.hpp | 8 ++++---- tests/assignment.cpp | 32 +++++++++++++++++++++++++++++++- tests/constructors.cpp | 29 ++++++++++++++++++++++++++++- 4 files changed, 65 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2deb4fd..88b6419 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,8 @@ set(TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/tests/main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/observers.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/extensions.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/constexpr.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/tests/constructors.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/tests/assignment.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/nullopt.cpp) add_executable(tests ${TEST_SOURCES}) diff --git a/optional.hpp b/optional.hpp index e8efe9d..090014e 100644 --- a/optional.hpp +++ b/optional.hpp @@ -977,7 +977,7 @@ public: optional &operator=(const optional &rhs) { if (has_value()) { if (rhs.has_value()) { - this->m_value = rhs.m_value; + this->m_value = *rhs; } else { this->m_value.~T(); this->m_has_value = false; @@ -985,7 +985,7 @@ public: } if (rhs.has_value()) { - new (std::addressof(this->m_value)) T(rhs.m_value); + new (std::addressof(this->m_value)) T(*rhs); this->m_has_value = true; } } @@ -999,7 +999,7 @@ public: optional &operator=(optional &&rhs) { if (has_value()) { if (rhs.has_value()) { - this->m_value = std::move(rhs.m_value); + this->m_value = std::move(*rhs); } else { this->m_value.~T(); this->m_has_value = false; @@ -1007,7 +1007,7 @@ public: } if (rhs.has_value()) { - new (std::addressof(this->m_value)) T(std::move(rhs.m_value)); + new (std::addressof(this->m_value)) T(std::move(*rhs)); this->m_has_value = true; } } diff --git a/tests/assignment.cpp b/tests/assignment.cpp index 603033e..6e4bd10 100644 --- a/tests/assignment.cpp +++ b/tests/assignment.cpp @@ -1,4 +1,34 @@ #include "catch.hpp" #include "optional.hpp" -TEST_CASE("Assignment", "[assignment]") {} +TEST_CASE("Assignment", "[assignment]") { + tl::optional o1 = 42; + tl::optional o2 = 12; + tl::optional o3; + + o1 = o1; + REQUIRE(*o1 == 42); + + o1 = o2; + REQUIRE(*o1 == 12); + + o1 = o3; + REQUIRE(!o1); + + o1 = 42; + REQUIRE(*o1 == 42); + + o1 = tl::nullopt; + REQUIRE(!o1); + + o1 = std::move(o2); + REQUIRE(*o1 == 12); + + tl::optional o4 = 42; + + o1 = o4; + REQUIRE(*o1 == 42); + + o1 = std::move(o4); + REQUIRE(*o1 == 42); +} diff --git a/tests/constructors.cpp b/tests/constructors.cpp index ec4f736..7b583f1 100644 --- a/tests/constructors.cpp +++ b/tests/constructors.cpp @@ -1,4 +1,31 @@ #include "catch.hpp" #include "optional.hpp" -TEST_CASE("Constructors", "[constructors]") {} +TEST_CASE("Constructors", "[constructors]") { + tl::optional o1; + REQUIRE(!o1); + + tl::optional o2 = tl::nullopt; + REQUIRE(!o2); + + tl::optional o3 = 42; + REQUIRE(*o3 == 42); + + tl::optional o4 = o3; + REQUIRE(*o4 == 42); + + tl::optional o5 = o1; + REQUIRE(!o5); + + tl::optional o6 = std::move(o3); + REQUIRE(*o6 == 42); + + tl::optional o7 = 42; + REQUIRE(*o7 == 42); + + tl::optional o8 = o7; + REQUIRE(*o8 == 42); + + tl::optional o9 = std::move(o7); + REQUIRE(*o9 == 42); +}