aboutsummaryrefslogtreecommitdiffstats
path: root/lib/LuaBridge/Tests/Source/RefCountedPtrTests.cpp
diff options
context:
space:
mode:
authorAndy Belle-Isle <drumsetmonkey@gmail.com>2019-08-28 00:57:57 -0400
committerAndy Belle-Isle <drumsetmonkey@gmail.com>2019-08-28 00:57:57 -0400
commit85fb2bff38b2ef6cb17e86c5f602ee09a365b117 (patch)
treea8066d33233ec9b6a2b9bb281a1de040ab96be7b /lib/LuaBridge/Tests/Source/RefCountedPtrTests.cpp
parent787393dd86d6c37b5680847dd4eef14406a86687 (diff)
Added LuaBridge support
Diffstat (limited to 'lib/LuaBridge/Tests/Source/RefCountedPtrTests.cpp')
-rw-r--r--lib/LuaBridge/Tests/Source/RefCountedPtrTests.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/lib/LuaBridge/Tests/Source/RefCountedPtrTests.cpp b/lib/LuaBridge/Tests/Source/RefCountedPtrTests.cpp
new file mode 100644
index 0000000..4e5f582
--- /dev/null
+++ b/lib/LuaBridge/Tests/Source/RefCountedPtrTests.cpp
@@ -0,0 +1,110 @@
+// https://github.com/vinniefalco/LuaBridge
+//
+// Copyright 2019, Dmitry Tarakanov
+// SPDX-License-Identifier: MIT
+
+#include "TestBase.h"
+
+#include "LuaBridge/RefCountedPtr.h"
+
+
+struct RefCountedPtrTests : TestBase
+{
+ template <class T>
+ T variable(const std::string& name)
+ {
+ runLua("result = " + name);
+ return result().cast <T>();
+ }
+};
+
+namespace {
+
+struct RefCounted : luabridge::RefCountedObject
+{
+ explicit RefCounted(bool& deleted)
+ : deleted (deleted)
+ {
+ deleted = false;
+ }
+
+ ~RefCounted()
+ {
+ deleted = true;
+ }
+
+ bool isDeleted () const
+ {
+ return deleted;
+ }
+
+ bool& deleted;
+};
+
+} // namespace
+
+TEST_F (RefCountedPtrTests, Operators)
+{
+ bool deleted1 = false;
+ auto* raw_ptr1 = new RefCounted (deleted1);
+ luabridge::RefCountedObjectPtr <RefCounted> ptr1 (raw_ptr1);
+
+ bool deleted2 = false;
+ auto* raw_ptr2 = new RefCounted (deleted2);
+ luabridge::RefCountedObjectPtr <RefCounted> ptr2 (raw_ptr2);
+
+ ASSERT_TRUE (raw_ptr1 == ptr1.getObject ());
+ ASSERT_TRUE (ptr1.getObject () == raw_ptr1);
+}
+
+TEST_F (RefCountedPtrTests, LastReferenceInLua)
+{
+ luabridge::getGlobalNamespace (L)
+ .beginClass <RefCounted> ("Class")
+ .addProperty ("deleted", &RefCounted::isDeleted)
+ .endClass ();
+
+ bool deleted = false;
+
+ luabridge::RefCountedObjectPtr <RefCounted> object (new RefCounted (deleted));
+
+ luabridge::setGlobal (L, object, "object");
+ runLua("result = object.deleted");
+ ASSERT_EQ (true, result ().isBool ());
+ ASSERT_EQ (false, result <bool> ());
+
+ object = nullptr;
+ runLua("result = object.deleted");
+ ASSERT_EQ(true, result ().isBool ());
+ ASSERT_EQ(false, result <bool>());
+ ASSERT_EQ(false, deleted);
+
+ runLua ("object = nil");
+ lua_gc (L, LUA_GCCOLLECT, 1);
+
+ ASSERT_EQ (true, deleted);
+}
+
+TEST_F (RefCountedPtrTests, LastReferenceInCpp)
+{
+ luabridge::getGlobalNamespace (L)
+ .beginClass <RefCounted> ("Class")
+ .addProperty ("deleted", &RefCounted::isDeleted)
+ .endClass ();
+
+ bool deleted = false;
+
+ luabridge::RefCountedObjectPtr <RefCounted> object (new RefCounted (deleted));
+
+ luabridge::setGlobal (L, object, "object");
+ runLua("result = object.deleted");
+ ASSERT_EQ (true, result ().isBool ());
+ ASSERT_EQ (false, result <bool> ());
+
+ runLua ("object = nil");
+ lua_gc (L, LUA_GCCOLLECT, 1);
+ ASSERT_EQ(false, deleted);
+
+ object = nullptr;
+ ASSERT_EQ (true, deleted);
+}