aboutsummaryrefslogtreecommitdiff
path: root/test/common/SelfResolvableTest.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2023-12-30 01:43:18 +0800
committercrupest <crupest@outlook.com>2023-12-30 14:11:23 +0800
commitc4641cadc0070b38f4efec740023a9300a7602d1 (patch)
treee9bb34d284445923217bea479ee4bc5a4a78b029 /test/common/SelfResolvableTest.cpp
parentf7a40005ec854131629acac8d03aed0e8a5da415 (diff)
downloadcru-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.cpp76
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);
+}
+