aboutsummaryrefslogtreecommitdiffstats
path: root/lib/LuaBridge/Tests/Source/IssueTests.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/IssueTests.cpp
parent787393dd86d6c37b5680847dd4eef14406a86687 (diff)
Added LuaBridge support
Diffstat (limited to 'lib/LuaBridge/Tests/Source/IssueTests.cpp')
-rw-r--r--lib/LuaBridge/Tests/Source/IssueTests.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/lib/LuaBridge/Tests/Source/IssueTests.cpp b/lib/LuaBridge/Tests/Source/IssueTests.cpp
new file mode 100644
index 0000000..f6c6514
--- /dev/null
+++ b/lib/LuaBridge/Tests/Source/IssueTests.cpp
@@ -0,0 +1,145 @@
+// https://github.com/vinniefalco/LuaBridge
+//
+// Copyright 2019, Dmitry Tarakanov
+// SPDX-License-Identifier: MIT
+
+#include "TestBase.h"
+
+struct IssueTests : TestBase
+{
+};
+
+struct AbstractClass
+{
+ virtual int sum (int a, int b) = 0;
+};
+
+struct ConcreteClass : AbstractClass
+{
+ int sum (int a, int b) override
+ {
+ return a + b;
+ }
+
+ static AbstractClass& get ()
+ {
+ static ConcreteClass instance;
+ return instance;
+ }
+};
+
+TEST_F (IssueTests, Issue87)
+{
+ luabridge::getGlobalNamespace (L)
+ .beginClass <AbstractClass> ("Class")
+ .addFunction ("sum", &AbstractClass::sum)
+ .endClass ()
+ .addFunction ("getAbstractClass", &ConcreteClass::get);
+
+ runLua ("result = getAbstractClass ():sum (1, 2)");
+ ASSERT_TRUE (result ().isNumber ());
+ ASSERT_EQ (3, result <int> ());
+}
+
+TEST_F (IssueTests, Issue121)
+{
+ runLua (R"(
+ first = {
+ second = {
+ actual = "data"
+ }
+ }
+ )");
+ auto first = luabridge::getGlobal (L, "first");
+ ASSERT_TRUE (first.isTable ());
+ ASSERT_EQ (0, first.length ());
+ ASSERT_TRUE (first ["second"].isTable ());
+ ASSERT_EQ (0, first ["second"].length ());
+}
+
+void pushArgs (lua_State*)
+{
+}
+
+template <class Arg, class... Args>
+void pushArgs (lua_State* L, Arg arg, Args... args)
+{
+ luabridge::Stack <Arg>::push (L, arg);
+ pushArgs (L, args...);
+}
+
+template <class... Args>
+std::vector <luabridge::LuaRef> callFunction (const luabridge::LuaRef& function, Args... args)
+{
+ assert (function.isFunction ());
+
+ lua_State* L = function.state ();
+ int originalTop = lua_gettop (L);
+ function.push (L);
+ pushArgs (L, args...);
+
+ luabridge::LuaException::pcall (L, sizeof... (args), LUA_MULTRET);
+
+ std::vector <luabridge::LuaRef> results;
+ int top = lua_gettop (L);
+ results.reserve (top - originalTop);
+ for (int i = originalTop + 1; i <= top; ++i)
+ {
+ results.push_back (luabridge::LuaRef::fromStack (L, i));
+ }
+ return results;
+}
+
+TEST_F (IssueTests, Issue160)
+{
+ runLua (
+ "function isConnected (arg1, arg2) "
+ " return 1, 'srvname', 'ip:10.0.0.1', arg1, arg2 "
+ "end");
+
+ luabridge::LuaRef f_isConnected = luabridge::getGlobal (L, "isConnected");
+
+ auto v = callFunction (f_isConnected, 2, "abc");
+ ASSERT_EQ (5u, v.size ());
+ ASSERT_EQ (1, v [0].cast <int> ());
+ ASSERT_EQ ("srvname", v [1].cast <std::string> ());
+ ASSERT_EQ ("ip:10.0.0.1", v [2].cast <std::string> ());
+ ASSERT_EQ (2, v [3].cast <int> ());
+ ASSERT_EQ ("abc", v [4].cast <std::string> ());
+}
+
+struct Vector
+{
+ float getX () const
+ {
+ return x;
+ }
+
+ float x = 0;
+};
+
+struct WideVector : Vector
+{
+ WideVector (float, float, float, float w)
+ {
+ x = w;
+ }
+};
+
+TEST_F (IssueTests, Issue178)
+{
+ luabridge::getGlobalNamespace (L)
+ .beginClass <Vector> ("Vector")
+ .addFunction ("getX", &Vector::getX)
+ .addProperty ("X", &Vector::getX)
+ .addData ("x", &Vector::x, true)
+ .endClass ()
+ .deriveClass <WideVector, Vector> ("WideVector")
+ .addConstructor <void (*) (float, float, float, float)> ()
+ .endClass ();
+
+ runLua ("result = WideVector (0, 1, 2, 3).x");
+
+ ASSERT_TRUE (result ().isNumber ());
+ ASSERT_EQ (3.f, result <float> ());
+}