aboutsummaryrefslogtreecommitdiff
path: root/test/base/SelfResolvableTest.cpp
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-23 19:42:29 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-23 19:42:29 +0800
commitf8360f3242d99c2a560532ade1598205400c1292 (patch)
tree403b284b493f8eec67dbab43f44caa0092f4dcd0 /test/base/SelfResolvableTest.cpp
parent8f8b7dfd056dfa23dd1989d3f3dfd3d5d91d0168 (diff)
downloadcru-f8360f3242d99c2a560532ade1598205400c1292.tar.gz
cru-f8360f3242d99c2a560532ade1598205400c1292.tar.bz2
cru-f8360f3242d99c2a560532ade1598205400c1292.zip
Refactor SelfResolvable.
Diffstat (limited to 'test/base/SelfResolvableTest.cpp')
-rw-r--r--test/base/SelfResolvableTest.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/test/base/SelfResolvableTest.cpp b/test/base/SelfResolvableTest.cpp
new file mode 100644
index 00000000..17d9309d
--- /dev/null
+++ b/test/base/SelfResolvableTest.cpp
@@ -0,0 +1,82 @@
+#include "cru/base/SelfResolvable.h"
+
+#include <catch2/catch_test_macros.hpp>
+
+#include <memory>
+
+namespace {
+class SelfResolvableTestClassBase {
+ public:
+ virtual ~SelfResolvableTestClassBase() = default;
+};
+
+class SelfResolvableTestClass
+ : public SelfResolvableTestClassBase,
+ public cru::SelfResolvable<SelfResolvableTestClass> {
+ public:
+ SelfResolvableTestClass() : ptr_(new int(123)) {}
+ ~SelfResolvableTestClass() override = 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_copy.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 should work for casted type.", "[self-resolvable]") {
+ auto test_object = new SelfResolvableTestClass();
+
+ cru::ObjectResolver<SelfResolvableTestClassBase> base_resolver =
+ test_object->CreateResolver();
+ auto resolver = test_object->CreateResolver();
+
+ REQUIRE(base_resolver.Resolve() == test_object);
+ REQUIRE(resolver.Resolve() == test_object);
+
+ auto base_resolver2 = base_resolver;
+ REQUIRE(base_resolver2.Resolve() == test_object);
+
+ auto base_resolver3 = std::move(base_resolver2);
+ REQUIRE(base_resolver3.Resolve() == test_object);
+
+ delete test_object;
+
+ REQUIRE(base_resolver.Resolve() == nullptr);
+ REQUIRE(base_resolver3.Resolve() == nullptr);
+ REQUIRE(resolver.Resolve() == nullptr);
+}