aboutsummaryrefslogtreecommitdiffstats
path: root/lib/LuaBridge/Tests/Source/LegacyTests.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/LegacyTests.cpp
parent787393dd86d6c37b5680847dd4eef14406a86687 (diff)
Added LuaBridge support
Diffstat (limited to 'lib/LuaBridge/Tests/Source/LegacyTests.cpp')
-rw-r--r--lib/LuaBridge/Tests/Source/LegacyTests.cpp354
1 files changed, 354 insertions, 0 deletions
diff --git a/lib/LuaBridge/Tests/Source/LegacyTests.cpp b/lib/LuaBridge/Tests/Source/LegacyTests.cpp
new file mode 100644
index 0000000..861a418
--- /dev/null
+++ b/lib/LuaBridge/Tests/Source/LegacyTests.cpp
@@ -0,0 +1,354 @@
+// https://github.com/vinniefalco/LuaBridge
+//
+// Copyright 2012, Vinnie Falco <vinnie.falco@gmail.com>
+// Copyright 2007, Nathan Reed
+// SPDX-License-Identifier: MIT
+
+// A set of tests of different types' communication with Lua
+
+#include "TestBase.h"
+
+#include "LuaBridge/RefCountedPtr.h"
+
+#include "JuceLibraryCode/BinaryData.h"
+
+#include <cstring>
+#include <iostream>
+#include <memory>
+#include <string>
+
+namespace LuaBridgeTests {
+
+using namespace std;
+using namespace luabridge;
+
+//==============================================================================
+
+/*
+ * Test classes
+ */
+
+bool g_success = true;
+
+bool testSucceeded ()
+{
+ bool b = g_success;
+ g_success = false;
+ return b;
+}
+
+typedef int fn_type;
+enum {
+ FN_CTOR,
+ FN_DTOR,
+ FN_STATIC,
+ FN_VIRTUAL,
+ FN_PROPGET,
+ FN_PROPSET,
+ FN_STATIC_PROPGET,
+ FN_STATIC_PROPSET,
+ FN_OPERATOR,
+ NUM_FN_TYPES
+};
+
+struct fn_called {
+ bool called [NUM_FN_TYPES];
+ fn_called () { memset(called, 0, NUM_FN_TYPES * sizeof(bool)); }
+};
+
+fn_called A_functions, B_functions;
+
+bool testAFnCalled (fn_type f)
+{
+ bool b = A_functions.called[f];
+ A_functions.called [f] = false;
+ return b;
+}
+
+bool testBFnCalled (fn_type f)
+{
+ bool b = B_functions.called[f];
+ B_functions.called [f] = false;
+ return b;
+}
+
+class A
+{
+protected:
+ string name;
+ mutable bool success;
+public:
+ A (string const& name_) : name (name_), success (false), testProp (47)
+ {
+ A_functions.called [FN_CTOR] = true;
+ }
+ virtual ~A ()
+ {
+ A_functions.called [FN_DTOR] = true;
+ }
+
+ virtual void testVirtual ()
+ {
+ A_functions.called [FN_VIRTUAL] = true;
+ }
+
+ const char * getName () const
+ {
+ return name.c_str();
+ }
+
+ void setSuccess () const
+ {
+ success = true;
+ }
+
+ bool testSucceeded () const
+ {
+ bool b = success;
+ success = false;
+ return b;
+ }
+
+ static void testStatic ()
+ {
+ A_functions.called [FN_STATIC] = true;
+ }
+
+ int testProp;
+ int testPropGet () const
+ {
+ A_functions.called [FN_PROPGET] = true;
+ return testProp;
+ }
+ void testPropSet (int x)
+ {
+ A_functions.called [FN_PROPSET] = true;
+ testProp = x;
+ }
+
+ static int testStaticProp;
+ static int testStaticPropGet ()
+ {
+ A_functions.called [FN_STATIC_PROPGET] = true;
+ return testStaticProp;
+ }
+ static void testStaticPropSet (int x)
+ {
+ A_functions.called [FN_STATIC_PROPSET] = true;
+ testStaticProp = x;
+ }
+
+ RefCountedPtr <A> operator + (A const& other)
+ {
+ A_functions.called [FN_OPERATOR] = true;
+ return new A (name + " + " + other.name);
+ }
+};
+
+int A::testStaticProp = 47;
+
+class B: public A
+{
+public:
+ explicit B (string const& name_) : A (name_)
+ {
+ B_functions.called [FN_CTOR] = true;
+ }
+
+ virtual ~B ()
+ {
+ B_functions.called [FN_DTOR] = true;
+ }
+
+ virtual void testVirtual ()
+ {
+ B_functions.called [FN_VIRTUAL] = true;
+ }
+
+ static void testStatic2 ()
+ {
+ B_functions.called [FN_STATIC] = true;
+ }
+
+};
+
+/*
+ * Test functions
+ */
+
+int testRetInt ()
+{
+ return 47;
+}
+
+float testRetFloat ()
+{
+ return 47.0f;
+}
+
+char const* testRetConstCharPtr ()
+{
+ return "Hello, world";
+}
+
+string testRetStdString ()
+{
+ static string ret ("Hello, world");
+ return ret;
+}
+
+void testParamInt (int a)
+{
+ g_success = (a == 47);
+}
+
+void testParamBool (bool b)
+{
+ g_success = b;
+}
+
+void testParamFloat (float f)
+{
+ g_success = (f == 47.0f);
+}
+
+void testParamConstCharPtr (char const* str)
+{
+ g_success = !strcmp (str, "Hello, world");
+}
+
+void testParamStdString (string str)
+{
+ g_success = !strcmp (str.c_str(), "Hello, world");
+}
+
+void testParamStdStringRef (const string &str)
+{
+ g_success = !strcmp (str.c_str(), "Hello, world");
+}
+
+void testParamAPtr (A * a)
+{
+ a->setSuccess();
+}
+
+void testParamAPtrConst (A * const a)
+{
+ a->setSuccess();
+}
+
+void testParamConstAPtr (const A * a)
+{
+ a->setSuccess();
+}
+
+void testParamSharedPtrA (RefCountedPtr <A> a)
+{
+ a->setSuccess();
+}
+
+RefCountedPtr <A> testRetSharedPtrA ()
+{
+ static RefCountedPtr <A> sp_A (new A("from C"));
+ return sp_A;
+}
+
+RefCountedPtr <A const> testRetSharedPtrConstA ()
+{
+ static RefCountedPtr <A> sp_A (new A("const A"));
+ return sp_A;
+}
+
+// add our own functions and classes to a Lua environment
+void addToState (lua_State *L)
+{
+ getGlobalNamespace (L)
+ .addFunction ("testSucceeded", &testSucceeded)
+ .addFunction ("testAFnCalled", &testAFnCalled)
+ .addFunction ("testBFnCalled", &testBFnCalled)
+ .addFunction ("testRetInt", &testRetInt)
+ .addFunction ("testRetFloat", &testRetFloat)
+ .addFunction ("testRetConstCharPtr", &testRetConstCharPtr)
+ .addFunction ("testRetStdString", &testRetStdString)
+ .addFunction ("testParamInt", &testParamInt)
+ .addFunction ("testParamBool", &testParamBool)
+ .addFunction ("testParamFloat", &testParamFloat)
+ .addFunction ("testParamConstCharPtr", &testParamConstCharPtr)
+ .addFunction ("testParamStdString", &testParamStdString)
+ .addFunction ("testParamStdStringRef", &testParamStdStringRef)
+ .beginClass <A> ("A")
+ .addConstructor <void (*) (const string &), RefCountedPtr <A> > ()
+ .addFunction ("testVirtual", &A::testVirtual)
+ .addFunction ("getName", &A::getName)
+ .addFunction ("testSucceeded", &A::testSucceeded)
+ .addFunction ("__add", &A::operator+)
+ .addData ("testProp", &A::testProp)
+ .addProperty ("testProp2", &A::testPropGet, &A::testPropSet)
+ .addStaticFunction ("testStatic", &A::testStatic)
+ .addStaticData ("testStaticProp", &A::testStaticProp)
+ .addStaticProperty ("testStaticProp2", &A::testStaticPropGet, &A::testStaticPropSet)
+ .endClass ()
+ .deriveClass <B, A> ("B")
+ .addConstructor <void (*) (const string &), RefCountedPtr <B> > ()
+ .addStaticFunction ("testStatic2", &B::testStatic2)
+ .endClass ()
+ .addFunction ("testParamAPtr", &testParamAPtr)
+ .addFunction ("testParamAPtrConst", &testParamAPtrConst)
+ .addFunction ("testParamConstAPtr", &testParamConstAPtr)
+ .addFunction ("testParamSharedPtrA", &testParamSharedPtrA)
+ .addFunction ("testRetSharedPtrA", &testRetSharedPtrA)
+ .addFunction ("testRetSharedPtrConstA", &testRetSharedPtrConstA)
+ ;
+}
+
+void resetTests ()
+{
+ g_success = true;
+ A::testStaticProp = 47;
+}
+
+void printValue (lua_State* L, int index)
+{
+ int type = lua_type (L, index);
+ switch (type)
+ {
+ case LUA_TBOOLEAN:
+ std::cerr << std::boolalpha << (lua_toboolean (L, index) != 0);
+ break;
+ case LUA_TSTRING:
+ std::cerr << lua_tostring (L, index);
+ break;
+ case LUA_TNUMBER:
+ std::cerr << lua_tonumber (L, index);
+ break;
+ case LUA_TTABLE:
+ case LUA_TTHREAD:
+ case LUA_TFUNCTION:
+ std::cerr << lua_topointer (L, index);
+ break;
+ }
+ std::cerr << ": " << lua_typename (L, type) << " (" << type << ")" << std::endl;
+}
+
+} // namespace LuaBridgeTests
+
+struct LegacyTests : TestBase
+{
+};
+
+TEST_F (LegacyTests, AllTests)
+{
+ LuaBridgeTests::addToState (L);
+
+ // Execute lua files in order
+ if (luaL_loadstring (L, BinaryData::Tests_lua) != 0)
+ {
+ // compile-time error
+ FAIL () << lua_tostring (L, -1);
+ }
+ if (lua_pcall (L, 0, 0, -2) != 0)
+ {
+ // runtime error
+ FAIL () << lua_tostring (L, -1);
+ }
+}