diff options
author | crupest <crupest@outlook.com> | 2023-12-30 01:43:18 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2023-12-30 14:11:23 +0800 |
commit | c4641cadc0070b38f4efec740023a9300a7602d1 (patch) | |
tree | e9bb34d284445923217bea479ee4bc5a4a78b029 /test/common/SelfResolvableTest.cpp | |
parent | f7a40005ec854131629acac8d03aed0e8a5da415 (diff) | |
download | cru-c4641cadc0070b38f4efec740023a9300a7602d1.tar.gz cru-c4641cadc0070b38f4efec740023a9300a7602d1.tar.bz2 cru-c4641cadc0070b38f4efec740023a9300a7602d1.zip |
Fix bugs and write unit tests for SelfResolvable.
Diffstat (limited to 'test/common/SelfResolvableTest.cpp')
-rw-r--r-- | test/common/SelfResolvableTest.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/test/common/SelfResolvableTest.cpp b/test/common/SelfResolvableTest.cpp new file mode 100644 index 00000000..3664a223 --- /dev/null +++ b/test/common/SelfResolvableTest.cpp @@ -0,0 +1,76 @@ +#include "cru/common/Base.h" +#include "cru/common/SelfResolvable.h" + +#include <catch2/catch_test_macros.hpp> + +#include <memory> + +namespace { +class SelfResolvableTestClass + : public cru::SelfResolvable<SelfResolvableTestClass> { + public: + SelfResolvableTestClass() : ptr_(new int(123)) {} + CRU_DELETE_COPY(SelfResolvableTestClass) + CRU_DEFAULT_MOVE(SelfResolvableTestClass) + ~SelfResolvableTestClass() = default; + + private: + std::shared_ptr<int> ptr_; +}; +} // namespace + +TEST_CASE("SelfResolvable resolver should work.", "[self-resolvable]") { + SelfResolvableTestClass test_object; + + auto resolver = test_object.CreateResolver(); + REQUIRE(resolver.Resolve() == &test_object); + + auto resolver_copy = resolver; + REQUIRE(resolver.Resolve() == &test_object); + REQUIRE(resolver.Resolve() == &test_object); + + auto resolver_move = std::move(resolver_copy); + REQUIRE(resolver.Resolve() == &test_object); + REQUIRE(resolver_copy.IsValid() == false); + REQUIRE(resolver_move.Resolve() == &test_object); +} + +TEST_CASE("SelfResolvable object destructed should work.", + "[self-resolvable]") { + SelfResolvableTestClass* test_object = new SelfResolvableTestClass(); + + auto resolver = test_object->CreateResolver(); + auto resolver_copy = resolver; + + delete test_object; + + REQUIRE(resolver.Resolve() == nullptr); + REQUIRE(resolver_copy.Resolve() == nullptr); + + auto resolver_copy2 = resolver_copy; + REQUIRE(resolver_copy2.Resolve() == nullptr); + + auto resolver_move = std::move(resolver_copy); + REQUIRE(resolver_copy.IsValid() == false); + REQUIRE(resolver_move.Resolve() == nullptr); +} + +TEST_CASE("SelfResolvable object moved should work.", "[self-resolvable]") { + SelfResolvableTestClass test_object; + + auto resolver = test_object.CreateResolver(); + auto resolver_copy = resolver; + + SelfResolvableTestClass moved_object = std::move(test_object); + + REQUIRE(resolver.Resolve() == &moved_object); + REQUIRE(resolver_copy.Resolve() == &moved_object); + + auto resolver_copy2 = resolver_copy; + REQUIRE(resolver_copy2.Resolve() == &moved_object); + + auto resolver_move = std::move(resolver_copy); + REQUIRE(resolver_copy.IsValid() == false); + REQUIRE(resolver_move.Resolve() == &moved_object); +} + |