From 8cde5421f287d7f1f279de309e4ff69d1d432e95 Mon Sep 17 00:00:00 2001 From: kunitoki Date: Thu, 9 Apr 2026 13:56:02 +0200 Subject: [PATCH 1/4] Supports the new idiomatic .new() for constructors --- Distribution/LuaBridge/LuaBridge.h | 34 ++-- Manual.md | 16 +- Source/LuaBridge/Inspect.h | 12 +- Source/LuaBridge/detail/CFunctions.h | 10 +- Source/LuaBridge/detail/Namespace.h | 26 +-- Tests/Source/ArrayTests.cpp | 4 +- Tests/Source/ClassExtensibleTests.cpp | 64 +++--- Tests/Source/ClassTests.cpp | 230 +++++++++++----------- Tests/Source/CoroutineTests.cpp | 6 +- Tests/Source/DynamicLibraryTests.cpp | 12 +- Tests/Source/ExceptionTests.cpp | 56 +++--- Tests/Source/InspectTests.cpp | 4 +- Tests/Source/IssueTests.cpp | 4 +- Tests/Source/LegacyTests.h | 4 +- Tests/Source/LuaRefTests.cpp | 12 +- Tests/Source/MapTests.cpp | 4 +- Tests/Source/MultipleInheritanceTests.cpp | 50 ++--- Tests/Source/OptionalTests.cpp | 12 +- Tests/Source/OverloadTests.cpp | 40 ++-- Tests/Source/RefCountedPtrTests.cpp | 2 +- Tests/Source/SetTests.cpp | 4 +- Tests/Source/Tests.cpp | 56 +++--- Tests/Source/Tests.lua | 4 +- Tests/Source/UnorderedMapTests.cpp | 4 +- Tests/Source/UserdataTests.cpp | 28 +-- Tests/Source/VectorTests.cpp | 4 +- 26 files changed, 350 insertions(+), 352 deletions(-) diff --git a/Distribution/LuaBridge/LuaBridge.h b/Distribution/LuaBridge/LuaBridge.h index bcd226c7..a8bd954f 100644 --- a/Distribution/LuaBridge/LuaBridge.h +++ b/Distribution/LuaBridge/LuaBridge.h @@ -8813,7 +8813,7 @@ int constructor_container_proxy(lua_State* L) try { #endif - object = constructor::construct(detail::make_arguments_list(L)); + object = constructor::construct(detail::make_arguments_list(L)); #if LUABRIDGE_HAS_EXCEPTIONS } @@ -8833,7 +8833,7 @@ int constructor_container_proxy(lua_State* L) template int constructor_placement_proxy(lua_State* L) { - auto args = make_arguments_list(L); + auto args = make_arguments_list(L); std::error_code ec; auto* value = UserdataValue::place(L, ec); @@ -8873,7 +8873,7 @@ struct constructor_forwarder using FnTraits = function_traits; using FnArgs = remove_first_type_t; - auto args = make_arguments_list(L); + auto args = make_arguments_list(L); std::error_code ec; auto* value = UserdataValue::place(L, ec); @@ -8988,7 +8988,7 @@ struct container_forwarder try { #endif - object = container_constructor::construct(m_func, make_arguments_list(L)); + object = container_constructor::construct(m_func, make_arguments_list(L)); #if LUABRIDGE_HAS_EXCEPTIONS } @@ -9408,7 +9408,7 @@ inline ClassInspectInfo inspectClassFromStaticTable(lua_State* L, int stIdx) { MemberInfo m; m.name = key; - if (key == "__call") + if (key == "new") m.kind = MemberKind::Constructor; else if (key.size() >= 2 && key[0] == '_' && key[1] == '_') m.kind = MemberKind::Metamethod; @@ -10072,10 +10072,10 @@ class LuaProxyVisitor : public InspectVisitor { case MemberKind::Constructor: - out_ << "setmetatable(" << qname << ", {__call = function(t"; + out_ << qname << ".new = function("; if (!m.overloads[0].params.empty()) - out_ << ", " << paramNames(m.overloads[0].params); - out_ << ")\n return setmetatable({}, t)\nend})\n\n"; + out_ << paramNames(m.overloads[0].params); + out_ << ") end\n\n"; break; case MemberKind::Method: @@ -13412,10 +13412,10 @@ class Namespace : public detail::Registrar } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); } - rawsetfield(L, -2, "__call"); + rawsetfield(L, -2, "new"); return *this; } @@ -13509,10 +13509,10 @@ class Namespace : public detail::Registrar } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); } - rawsetfield(L, -2, "__call"); + rawsetfield(L, -2, "new"); return *this; } @@ -13558,10 +13558,10 @@ class Namespace : public detail::Registrar } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); } - rawsetfield(L, -2, "__call"); + rawsetfield(L, -2, "new"); return *this; } @@ -13623,10 +13623,10 @@ class Namespace : public detail::Registrar } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); } - rawsetfield(L, -2, "__call"); + rawsetfield(L, -2, "new"); return *this; } @@ -13659,7 +13659,7 @@ class Namespace : public detail::Registrar lua_newuserdata_aligned(L, F(std::move(allocator), std::move(deallocator))); lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); - rawsetfield(L, -2, "__call"); + rawsetfield(L, -2, "new"); return *this; } diff --git a/Manual.md b/Manual.md index ec640145..888dbfe2 100644 --- a/Manual.md +++ b/Manual.md @@ -732,12 +732,12 @@ luabridge::getGlobalNamespace (L) .endNamespace (); ``` -Constructors added in this fashion are called from Lua using the fully qualified name of the class. This Lua code will create instances of `A` and `B`. +Constructors added in this fashion are called from Lua using the `.new` field on the class. This Lua code will create instances of `A` and `B`. ```lua -a = test.A () -- Create a new A. -b = test.B ("hello", 5) -- Create a new B. -b = test.B () -- Error: expected string in argument 1 +a = test.A.new () -- Create a new A. +b = test.B.new ("hello", 5) -- Create a new B. +b = test.B.new () -- Error: expected string in argument 1 ``` ### 2.6.1 - Constructor Proxies @@ -764,16 +764,16 @@ luabridge::getGlobalNamespace (L) Then in lua: ```lua -hard = test.HardToCreate (5) -- Create a new HardToCreate. +hard = test.HardToCreate.new (5) -- Create a new HardToCreate. ``` -The `addConstructor` overload taking a generic functor also accepts a `lua_State*` as last parameter in order to be used for constructors that needs to be overloaded by different numbers of arguments (arguments will start at index 2 of the stack): +The `addConstructor` overload taking a generic functor also accepts a `lua_State*` as last parameter in order to be used for constructors that needs to be overloaded by different numbers of arguments (arguments will start at index 1 of the stack): ```cpp luabridge::getGlobalNamespace (L) .beginNamespace ("test") .beginClass ("HardToCreate") - .addConstructor ([] (void* ptr, lua_State* L) { return new (ptr) HardToCreate (shouldNotSeeMe, lua_checkinteger (L, 2)); }) + .addConstructor ([] (void* ptr, lua_State* L) { return new (ptr) HardToCreate (shouldNotSeeMe, lua_checkinteger (L, 1)); }) .endClass () .endNamespace (); ``` @@ -826,7 +826,7 @@ luabridge::getGlobalNamespace (L) The object is the perfectly instantiable through lua: ```lua -a = test.Object () -- Create a new Object using objectFactoryAllocator +a = test.Object.new () -- Create a new Object using objectFactoryAllocator a = nil -- Remove any reference count collectgarbage ("collect") -- The object is garbage collected using objectFactoryDeallocator ``` diff --git a/Source/LuaBridge/Inspect.h b/Source/LuaBridge/Inspect.h index acf5013f..553443d1 100644 --- a/Source/LuaBridge/Inspect.h +++ b/Source/LuaBridge/Inspect.h @@ -468,7 +468,7 @@ inline ClassInspectInfo inspectClassFromStaticTable(lua_State* L, int stIdx) { MemberInfo m; m.name = key; - if (key == "__call") + if (key == "new") m.kind = MemberKind::Constructor; else if (key.size() >= 2 && key[0] == '_' && key[1] == '_') m.kind = MemberKind::Metamethod; @@ -1008,7 +1008,7 @@ class LuaLSVisitor : public InspectVisitor case MemberKind::Constructor: { // Represent the constructor as @overload annotations before the local declaration. - // LuaBridge constructors are called as ClassName(args), not ClassName.new(args). + // LuaBridge constructors are called as ClassName.new(args). std::string qname = qualifiedName(cls.name); for (const auto& ov : m.overloads) out_ << "---@overload fun(" << overloadParams(ov.params) << "): " << qname << "\n"; @@ -1202,11 +1202,11 @@ class LuaProxyVisitor : public InspectVisitor switch (m.kind) { case MemberKind::Constructor: - // LuaBridge constructors are called as ClassName(args) via __call metamethod. - out_ << "setmetatable(" << qname << ", {__call = function(t"; + // LuaBridge constructors are called as ClassName.new(args). + out_ << qname << ".new = function("; if (!m.overloads[0].params.empty()) - out_ << ", " << paramNames(m.overloads[0].params); - out_ << ")\n return setmetatable({}, t)\nend})\n\n"; + out_ << paramNames(m.overloads[0].params); + out_ << ") end\n\n"; break; case MemberKind::Method: diff --git a/Source/LuaBridge/detail/CFunctions.h b/Source/LuaBridge/detail/CFunctions.h index 0bd474f8..3347b2a4 100644 --- a/Source/LuaBridge/detail/CFunctions.h +++ b/Source/LuaBridge/detail/CFunctions.h @@ -2009,8 +2009,6 @@ bool overload_type_checker(lua_State* L, int start) * 2. Type check via Stack::isInstance in C++ (no pcall) — skips clearly mismatched overloads. * 3. Only calls lua_pcall for type-matched candidates, eliminating failed pcalls for type mismatches. */ - - template inline int try_overload_functions(lua_State* L) { @@ -2890,7 +2888,7 @@ int constructor_container_proxy(lua_State* L) try { #endif - object = constructor::construct(detail::make_arguments_list(L)); + object = constructor::construct(detail::make_arguments_list(L)); #if LUABRIDGE_HAS_EXCEPTIONS } @@ -2913,7 +2911,7 @@ int constructor_container_proxy(lua_State* L) template int constructor_placement_proxy(lua_State* L) { - auto args = make_arguments_list(L); + auto args = make_arguments_list(L); std::error_code ec; auto* value = UserdataValue::place(L, ec); @@ -2957,7 +2955,7 @@ struct constructor_forwarder using FnTraits = function_traits; using FnArgs = remove_first_type_t; - auto args = make_arguments_list(L); + auto args = make_arguments_list(L); std::error_code ec; auto* value = UserdataValue::place(L, ec); @@ -3084,7 +3082,7 @@ struct container_forwarder try { #endif - object = container_constructor::construct(m_func, make_arguments_list(L)); + object = container_constructor::construct(m_func, make_arguments_list(L)); #if LUABRIDGE_HAS_EXCEPTIONS } diff --git a/Source/LuaBridge/detail/Namespace.h b/Source/LuaBridge/detail/Namespace.h index cdc0f60a..0be86a3e 100644 --- a/Source/LuaBridge/detail/Namespace.h +++ b/Source/LuaBridge/detail/Namespace.h @@ -1262,7 +1262,7 @@ class Namespace : public detail::Registrar /** * @brief Add or replace a primary Constructor. * - * The primary Constructor is invoked when calling the class type table like a function. + * The primary Constructor is invoked by calling `ClassName.new(args...)`. * * The template parameter should be a function pointer type that matches the desired Constructor (since you can't take the * address of a Constructor and pass it as an argument). @@ -1337,10 +1337,10 @@ class Namespace : public detail::Registrar } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); } - rawsetfield(L, -2, "__call"); + rawsetfield(L, -2, "new"); return *this; } @@ -1349,10 +1349,10 @@ class Namespace : public detail::Registrar /** * @brief Add or replace a placement constructor. * - * The primary placement constructor is invoked when calling the class type table like a function. + * The primary placement constructor is invoked by calling `ClassName.new(args...)`. * * The provider of the Function argument is responsible of doing placement new of the type T over the void* pointer provided to - * the method as first argument. + * the method as first argument. Invoked by calling `ClassName.new(args...)`. */ template auto addConstructor(Functions... functions) @@ -1445,10 +1445,10 @@ class Namespace : public detail::Registrar } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); } - rawsetfield(L, -2, "__call"); // Stack: co, cl, st + rawsetfield(L, -2, "new"); // Stack: co, cl, st return *this; } @@ -1499,10 +1499,10 @@ class Namespace : public detail::Registrar } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); } - rawsetfield(L, -2, "__call"); + rawsetfield(L, -2, "new"); return *this; } @@ -1571,10 +1571,10 @@ class Namespace : public detail::Registrar } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); } - rawsetfield(L, -2, "__call"); // Stack: co, cl, st + rawsetfield(L, -2, "new"); // Stack: co, cl, st return *this; } @@ -1603,7 +1603,7 @@ class Namespace : public detail::Registrar /** * @brief Add or replace a factory. * - * The primary Constructor is invoked when calling the class type table like a function. + * The factory is invoked by calling `ClassName.new()`. * * The template parameter should be a function pointer type that matches the desired Constructor (since you can't take the * address of a Constructor and pass it as an argument). @@ -1617,7 +1617,7 @@ class Namespace : public detail::Registrar lua_newuserdata_aligned(L, F(std::move(allocator), std::move(deallocator))); // Stack: co, cl, st, upvalue lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); // Stack: co, cl, st, function - rawsetfield(L, -2, "__call"); // Stack: co, cl, st + rawsetfield(L, -2, "new"); // Stack: co, cl, st return *this; } diff --git a/Tests/Source/ArrayTests.cpp b/Tests/Source/ArrayTests.cpp index 4d39375a..db3b2007 100644 --- a/Tests/Source/ArrayTests.cpp +++ b/Tests/Source/ArrayTests.cpp @@ -117,12 +117,12 @@ TEST_F(ArrayTests, PassFromLua) .addFunction("processPointers", &processPointers<3>); resetResult(); - runLua("result = processValues ({Data (-1), Data (2), Data (5)})"); + runLua("result = processValues ({Data.new(-1), Data.new(2), Data.new(5)})"); ASSERT_EQ((std::array({-1, 2, 5})), (result>())); resetResult(); - runLua("result = processPointers ({Data (-3), Data (4), Data (9)})"); + runLua("result = processPointers ({Data.new(-3), Data.new(4), Data.new(9)})"); ASSERT_EQ((std::array({-3, 4, 9})), (result>())); } diff --git a/Tests/Source/ClassExtensibleTests.cpp b/Tests/Source/ClassExtensibleTests.cpp index 56f0ee72..93c843dd 100644 --- a/Tests/Source/ClassExtensibleTests.cpp +++ b/Tests/Source/ClassExtensibleTests.cpp @@ -309,7 +309,7 @@ TEST_F(ClassExtensibleTests, ExtensibleClass) runLua(R"( function ExtensibleBase:test() return 41 + self:baseClass() end - local base = ExtensibleBase(); result = base:test() + local base = ExtensibleBase.new(); result = base:test() )"); EXPECT_EQ(42, result()); @@ -330,7 +330,7 @@ TEST_F(ClassExtensibleTests, ExtensibleBaseClassNotDerived) runLua(R"( function ExtensibleBase:test() return 41 + self:baseClass() end - local derived = ExtensibleDerived(); result = derived:test() + local derived = ExtensibleDerived.new(); result = derived:test() )"); EXPECT_EQ(42, result()); @@ -351,7 +351,7 @@ TEST_F(ClassExtensibleTests, ExtensibleDerivedClassNotBase) runLua(R"( function ExtensibleDerived:test() return 41 + self:baseClass() end - local derived = ExtensibleDerived(); result = derived:test() + local derived = ExtensibleDerived.new(); result = derived:test() )"); EXPECT_EQ(42, result()); @@ -374,7 +374,7 @@ TEST_F(ClassExtensibleTests, ExtensibleDerivedClassAndBase) function ExtensibleBase:test1() return self:baseClass() end function ExtensibleDerived:test2() return self:derivedClass() end - local derived = ExtensibleDerived(); result = derived:test1() - derived:test2() + local derived = ExtensibleDerived.new(); result = derived:test1() - derived:test2() )"); EXPECT_EQ(-10, result()); @@ -397,7 +397,7 @@ TEST_F(ClassExtensibleTests, ExtensibleDerivedClassAndBaseCascading) function ExtensibleBase:testBase() return self:baseClass() end function ExtensibleDerived:testDerived() return self:testBase() end - local derived = ExtensibleDerived(); result = derived:testDerived() + local derived = ExtensibleDerived.new(); result = derived:testDerived() )"); EXPECT_EQ(1, result()); @@ -419,7 +419,7 @@ TEST_F(ClassExtensibleTests, ExtensibleParentLuaMethodVisibleFromDerived) return 123 end - local derived = ExtensibleDerived() + local derived = ExtensibleDerived.new() result = derived:luaOnlyMethod() )"); @@ -436,7 +436,7 @@ TEST_F(ClassExtensibleTests, SimpleUserdataPropertyLookupFastPath) ; runLua(R"( - local obj = SimplePropertyClass() + local obj = SimplePropertyClass.new() local valueOk = obj.value == 17 local missingIsNil = obj.missing == nil result = valueOk and missingIsNil @@ -461,7 +461,7 @@ TEST_F(ClassExtensibleTests, ExtensibleDerivedClassAndBaseSameMethod) function ExtensibleBase:test() return 1338 end -- This is on purpose function ExtensibleDerived:test() return 42 end - local derived = ExtensibleDerived() + local derived = ExtensibleDerived.new() result = derived:test() )"); @@ -482,13 +482,13 @@ TEST_F(ClassExtensibleTests, ExtensibleClassExtendExistingMethod) EXPECT_ANY_THROW(runLua(R"( function ExtensibleBase:baseClass() return 42 end - local base = ExtensibleBase(); result = base:baseClass() + local base = ExtensibleBase.new(); result = base:baseClass() )")); #else EXPECT_FALSE(runLua(R"( function ExtensibleBase:baseClass() return 42 end - local base = ExtensibleBase(); result = base:baseClass() + local base = ExtensibleBase.new(); result = base:baseClass() )")); #endif @@ -496,13 +496,13 @@ TEST_F(ClassExtensibleTests, ExtensibleClassExtendExistingMethod) EXPECT_ANY_THROW(runLua(R"( function ExtensibleBase:baseClassConst() return 42 end - local base = ExtensibleBase(); result = base:baseClassConst() + local base = ExtensibleBase.new(); result = base:baseClassConst() )")); #else EXPECT_FALSE(runLua(R"( function ExtensibleBase:baseClassConst() return 42 end - local base = ExtensibleBase(); result = base:baseClassConst() + local base = ExtensibleBase.new(); result = base:baseClassConst() )")); #endif } @@ -522,7 +522,7 @@ TEST_F(ClassExtensibleTests, ExtensibleClassExtendExistingMethodAllowingOverride return 42 + self:super_baseClass() end - local base = ExtensibleBase() + local base = ExtensibleBase.new() result = base:baseClass() )"); @@ -533,7 +533,7 @@ TEST_F(ClassExtensibleTests, ExtensibleClassExtendExistingMethodAllowingOverride return 42 + self:super_baseClassConst() end - local base = ExtensibleBase() + local base = ExtensibleBase.new() result = base:baseClassConst() )"); @@ -560,7 +560,7 @@ TEST_F(ClassExtensibleTests, ExtensibleDerivedOverrideOneFunctionCallBaseForTheO runLua(R"( function ExtensibleDerived:baseClass() return 100 + self:super_baseClass() end - local derived = ExtensibleDerived() + local derived = ExtensibleDerived.new() result = derived:baseClass() + derived:baseClassConst() )"); @@ -584,8 +584,8 @@ TEST_F(ClassExtensibleTests, ExtensibleDerivedDoesNotPollutBaseMethod) function ExtensibleBase:init() return 100 end function ExtensibleDerived:init() return 200 end - local base = ExtensibleBase() - local derived = ExtensibleDerived() + local base = ExtensibleBase.new() + local derived = ExtensibleDerived.new() result = base:init() )"); @@ -609,8 +609,8 @@ TEST_F(ClassExtensibleTests, ExtensibleDerivedMethodIsolatedFromBase) function ExtensibleBase:getValue() return 10 end function ExtensibleDerived:getValue() return 20 end - local base = ExtensibleBase() - local derived = ExtensibleDerived() + local base = ExtensibleBase.new() + local derived = ExtensibleDerived.new() result = derived:getValue() * 100 + base:getValue() )"); @@ -640,8 +640,8 @@ TEST_F(ClassExtensibleTests, ExtensibleDerivedOverridePreservesCppBaseMethod) return 100 + self:super_baseClass() end - local base = ExtensibleBase() - local derived = ExtensibleDerived() + local base = ExtensibleBase.new() + local derived = ExtensibleDerived.new() result = derived:baseClass() * 1000 + base:baseClass() )"); @@ -662,7 +662,7 @@ TEST_F(ClassExtensibleTests, ExtensibleObjectNonFunctionWriteCanReplaceMethodWit ; ASSERT_TRUE(runLua(R"( - local base = ExtensibleBase() + local base = ExtensibleBase.new() base.baseClass = 41 result = true )")); @@ -682,7 +682,7 @@ TEST_F(ClassExtensibleTests, ExtensibleObjectNonFunctionWriteTraversesParentAndU ; runLua(R"( - local derived = ExtensibleDerived() + local derived = ExtensibleDerived.new() derived.dynamicValue = 10 derived.dynamicValue = 20 result = derived.dynamicValue @@ -707,7 +707,7 @@ TEST_F(ClassExtensibleTests, ExtensibleClassCustomMetamethods) return ('ExtensibleBase(%d)'):format(self:baseClass()) end - local base = ExtensibleBase(); result = tostring(base) + local base = ExtensibleBase.new(); result = tostring(base) )"); EXPECT_EQ("ExtensibleBase(1)", result()); @@ -728,7 +728,7 @@ TEST_F(ClassExtensibleTests, ExtensibleClassCustomMetamethodsSuper) return '123456 - ' .. self:super__tostring() end - local base = ExtensibleBase(); result = tostring(base) + local base = ExtensibleBase.new(); result = tostring(base) )"); EXPECT_EQ(0u, result().find("123456")); @@ -751,8 +751,8 @@ TEST_F(ClassExtensibleTests, ExtensibleClassCustomMetamethodEq) return self:baseClass() == other:baseClass() end - local base1 = ExtensibleBase() - local base2 = ExtensibleBase() + local base1 = ExtensibleBase.new() + local base2 = ExtensibleBase.new() result = base1 == base2 )"); @@ -787,7 +787,7 @@ TEST_F(ClassExtensibleTests, ExtensibleClassWithCustomIndexMethod) return 41 + self.xyz + self:baseClass() end - local base = ExtensibleBase() + local base = ExtensibleBase.new() base.xyz = 1000 result = base:test() )"); @@ -861,7 +861,7 @@ TEST_F(ClassExtensibleTests, IndexAndNewMetaMethodCalledInBaseClass) self.property = value end - local test = DerivedExtensible() + local test = DerivedExtensible.new() test:setProperty(2) result = test:getProperty() + DerivedExtensible.property )"); @@ -869,7 +869,7 @@ TEST_F(ClassExtensibleTests, IndexAndNewMetaMethodCalledInBaseClass) EXPECT_EQ(102, result()); runLua(R"( - local test = DerivedExtensible() + local test = DerivedExtensible.new() test.property = 3 result = test.property )"); @@ -915,7 +915,7 @@ TEST_F(ClassExtensibleTests, MetatableSecurityNotHidden) .addFunction("__tostring", &ExampleStringifiableClass::tostring) .endClass(); - runLua("local t = ExampleStringifiableClass(); result = getmetatable(t)"); + runLua("local t = ExampleStringifiableClass.new(); result = getmetatable(t)"); const auto res = result(); ASSERT_TRUE(res.isTable()); @@ -943,7 +943,7 @@ TEST_F(ClassExtensibleTests, MetatableSecurity) .addFunction("__tostring", &ExampleStringifiableClass::tostring) .endClass(); - runLua("local t = ExampleStringifiableClass(); result = getmetatable(t)"); + runLua("local t = ExampleStringifiableClass.new(); result = getmetatable(t)"); const auto res = result(); ASSERT_TRUE(res.isBool()); diff --git a/Tests/Source/ClassTests.cpp b/Tests/Source/ClassTests.cpp index 131ea54a..d85a374f 100644 --- a/Tests/Source/ClassTests.cpp +++ b/Tests/Source/ClassTests.cpp @@ -241,9 +241,9 @@ TEST_F(ClassTests, IsInstanceRef) .endClass(); runLua(R"( - local fooFirst = Foo('first') + local fooFirst = Foo.new('first') - local bar = Bar() + local bar = Bar.new() bar:setFoo(fooFirst) result = bar:getFooName() .. " " .. tostring(fooFirst) )"); @@ -252,7 +252,7 @@ TEST_F(ClassTests, IsInstanceRef) runLua(R"( local fooSecond = Foo.createRef('second') - local bar = Bar() + local bar = Bar.new() bar:setFoo(fooSecond) result = bar:getFooName() .. " " .. tostring(fooSecond) )"); @@ -278,9 +278,9 @@ TEST_F(ClassTests, IsInstanceConstRef) .endClass(); runLua(R"( - local fooFirst = Foo('first') + local fooFirst = Foo.new('first') - local bar = Bar() + local bar = Bar.new() bar:setFoo(fooFirst) result = bar:getFooName() .. " " .. tostring(fooFirst) )"); @@ -289,7 +289,7 @@ TEST_F(ClassTests, IsInstanceConstRef) runLua(R"( local fooSecond = Foo.createConstRef('second') - local bar = Bar() + local bar = Bar.new() bar:setFoo(fooSecond) result = bar:getFooName() .. " " .. tostring(fooSecond) )"); @@ -389,9 +389,9 @@ TEST_F(ClassTests, PassWrongClassFromLuaThrows) // bad argument #1 to 'processRight' (Right expected, got Wrong) #if LUABRIDGE_HAS_EXCEPTIONS - ASSERT_THROW(runLua("result = processRight (Wrong (5))"), std::exception); + ASSERT_THROW(runLua("result = processRight (Wrong.new(5))"), std::exception); #else - ASSERT_FALSE(runLua("result = processRight (Wrong (5))")); + ASSERT_FALSE(runLua("result = processRight (Wrong.new(5))")); #endif ASSERT_TRUE(result().isNil()); @@ -410,7 +410,7 @@ TEST_F(ClassTests, PassDerivedClassInsteadOfBase) .endClass() .addFunction("processBase", &Base::staticFunction); - runLua("result = processBase (Derived (3.14))"); + runLua("result = processBase (Derived.new(3.14))"); ASSERT_EQ(0, result().data); } @@ -480,9 +480,9 @@ TEST_F(ClassTests, PassRegisteredClassInsteadOfUnregisteredThrows) // bad argument #1 to 'processUnregisteredInt' (unregistered class expected, got Float) #if LUABRIDGE_HAS_EXCEPTIONS - ASSERT_THROW(runLua("result = processUnregisteredInt (Float (1.2))"), std::exception); + ASSERT_THROW(runLua("result = processUnregisteredInt (Float.new(1.2))"), std::exception); #else - ASSERT_FALSE(runLua("result = processUnregisteredInt (Float (1.2))")); + ASSERT_FALSE(runLua("result = processUnregisteredInt (Float.new(1.2))")); #endif ASSERT_TRUE(result().isNil()); @@ -663,7 +663,7 @@ TEST_F(ClassFunctions, Destructor) }) .endClass(); - runLua("local x = Int(42)"); + runLua("local x = Int.new(42)"); ASSERT_TRUE(result().isNil()); closeLuaState(); @@ -851,10 +851,10 @@ TEST_F(ClassFunctions, ClassWithTemplateMembers) .addFunction("methodNoexcept", &ClassWithTemplateMembers::templateMethodNoexcept) .endClass(); - runLua("local a = ClassWithTemplateMembers(); result = a:method()"); + runLua("local a = ClassWithTemplateMembers.new(); result = a:method()"); ASSERT_EQ(0, result()); - runLua("local a = ClassWithTemplateMembers(); result = a:methodNoexcept()"); + runLua("local a = ClassWithTemplateMembers.new(); result = a:methodNoexcept()"); ASSERT_EQ(0, result()); } @@ -1152,9 +1152,9 @@ TEST_F(ClassProperties, FieldPointersNonRegistered) .endClass(); #if LUABRIDGE_HAS_EXCEPTIONS - ASSERT_THROW(runLua("result = Int().data"), std::exception); + ASSERT_THROW(runLua("result = Int.new().data"), std::exception); #else - ASSERT_FALSE(runLua("result = Int().data")); + ASSERT_FALSE(runLua("result = Int.new().data")); #endif } @@ -1168,7 +1168,7 @@ TEST_F(ClassProperties, FieldPointers) .addProperty("data", &Int::data, &Int::data) .endClass(); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(501, result()["data"].cast()); @@ -1176,7 +1176,7 @@ TEST_F(ClassProperties, FieldPointers) ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(2, result()["data"].cast()); - runLua("result = Int (42).data"); + runLua("result = Int.new(42).data"); ASSERT_TRUE(result().isNumber()); ASSERT_EQ(42, result()); } @@ -1191,7 +1191,7 @@ TEST_F(ClassProperties, FieldPointers_ReadOnly) .addProperty("data", &Int::data) .endClass(); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(501, result()["data"].cast()); @@ -1201,7 +1201,7 @@ TEST_F(ClassProperties, FieldPointers_ReadOnly) ASSERT_FALSE(runLua("result.data = 2")); #endif - runLua("result = Int (42).data"); + runLua("result = Int.new(42).data"); ASSERT_TRUE(result().isNumber()); ASSERT_EQ(42, result()); } @@ -1219,7 +1219,7 @@ TEST_F(ClassProperties, MemberFunctions) .addFunction("setDataNoexcept", &Int::setDataNoexcept) .endClass(); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(501, result()["data"].cast()); ASSERT_TRUE(result()["dataNoexcept"].isNumber()); @@ -1245,7 +1245,7 @@ TEST_F(ClassProperties, MemberFunctions_PassState) .addProperty("dataNoexcept", &Int::getDataStateNoexcept, &Int::setDataStateNoexcept) .endClass(); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(501, result()["data"].cast()); ASSERT_TRUE(result()["dataNoexcept"].isNumber()); @@ -1270,7 +1270,7 @@ TEST_F(ClassProperties, MemberFunctions_ReadOnly) .addProperty("data", &Int::getData) .endClass(); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(501, result()["data"].cast()); @@ -1383,7 +1383,7 @@ TEST_F(ClassProperties, ProxyFunctions) .addProperty("data", &getData, &setData) .endClass(); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(501, result()["data"].cast()); @@ -1402,7 +1402,7 @@ TEST_F(ClassProperties, ProxyFunctionsNoexcept) .addProperty("data", &getDataNoexcept, &setDataNoexcept) .endClass(); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(501, result()["data"].cast()); @@ -1421,7 +1421,7 @@ TEST_F(ClassProperties, ProxyFunctions_ReadOnly) .addProperty("data", &getData) .endClass(); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(501, result()["data"].cast()); @@ -1532,7 +1532,7 @@ TEST_F(ClassProperties, ProxyCFunctions) .addProperty("data", &getDataC, &setDataC) .endClass(); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(501, result()["data"].cast()); @@ -1551,7 +1551,7 @@ TEST_F(ClassProperties, ProxyCFunctions_ReadOnly) .addProperty("data", &getDataC) .endClass(); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(501, result()["data"].cast()); @@ -1663,7 +1663,7 @@ TEST_F(ClassProperties, StdFunctions) sharedSetterData.reset(); ASSERT_FALSE(setterData.expired()); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_EQ(501, result()["data"].cast()); runLua("result.data = -2"); @@ -1702,7 +1702,7 @@ TEST_F(ClassProperties, StdFunctions_ReadOnly) sharedGetterData.reset(); ASSERT_FALSE(getterData.expired()); - runLua("result = Int (501)"); + runLua("result = Int.new(501)"); ASSERT_TRUE(result()["data"].isNumber()); ASSERT_EQ(501, result()["data"].cast()); @@ -1734,7 +1734,7 @@ TEST_F(ClassStaticFunctions, Functions) .addStaticFunction("static", &Int::staticFunction) .endClass(); - runLua("result = Int.static (Int (35))"); + runLua("result = Int.static (Int.new(35))"); ASSERT_EQ(35, result().data); } @@ -1751,7 +1751,7 @@ TEST_F(ClassStaticFunctions, Functions_Derived) .deriveClass("Derived") .endClass(); - runLua("result = Derived.static (Base ('abc'))"); + runLua("result = Derived.static (Base.new('abc'))"); ASSERT_EQ("abc", result().data); } @@ -1770,10 +1770,10 @@ TEST_F(ClassStaticFunctions, Functions_Overridden) .addStaticFunction("staticFunction", &Derived::staticFunction) .endClass(); - runLua("result = Base.staticFunction (Base ('abc'))"); + runLua("result = Base.staticFunction (Base.new('abc'))"); ASSERT_EQ("abc", result().data); - runLua("result = Derived.staticFunction (Derived (123))"); + runLua("result = Derived.staticFunction (Derived.new(123))"); ASSERT_EQ(123, result().data); } @@ -1787,7 +1787,7 @@ TEST_F(ClassStaticFunctions, StdFunctions) .addStaticFunction("static", std::function(&Int::staticFunction)) .endClass(); - runLua("result = Int.static (Int (35))"); + runLua("result = Int.static (Int.new(35))"); ASSERT_EQ(35, result().data); } @@ -2103,11 +2103,11 @@ TEST_F(ClassMetaMethods, __call) .addFunction("__call", &Int::operator()) .endClass(); - runLua("result = Int (1) (-1)"); + runLua("result = Int.new(1)(-1)"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ(-1, result().data); - runLua("result = Int (2) (5)"); + runLua("result = Int.new(2)(5)"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ(5, result().data); } @@ -2127,12 +2127,12 @@ TEST_F(ClassMetaMethods, __tostring) .addFunction("__tostring", &StringClass::toString) .endClass(); - runLua("result = tostring (Int (-123))"); + runLua("result = tostring (Int.new(-123))"); ASSERT_EQ("-123", result()); #if LUA_VERSION_NUM >= 502 // Lua 5.1 string.format doesn't use __tostring - runLua("result = string.format ('%s%s', String ('abc'), Int (-123))"); + runLua("result = string.format ('%s%s', String.new('abc'), Int.new(-123))"); ASSERT_EQ("abc-123", result()); #endif } @@ -2147,16 +2147,16 @@ TEST_F(ClassMetaMethods, __eq) .addFunction("__eq", &Int::operator==) .endClass(); - runLua("result = Int (1) == Int (1)"); + runLua("result = Int.new(1) == Int.new(1)"); ASSERT_EQ(true, result()); - runLua("result = Int (1) ~= Int (1)"); + runLua("result = Int.new(1) ~= Int.new(1)"); ASSERT_EQ(false, result()); - runLua("result = Int (1) == Int (2)"); + runLua("result = Int.new(1) == Int.new(2)"); ASSERT_EQ(false, result()); - runLua("result = Int (1) ~= Int (2)"); + runLua("result = Int.new(1) ~= Int.new(2)"); ASSERT_EQ(true, result()); } @@ -2170,13 +2170,13 @@ TEST_F(ClassMetaMethods, __lt) .addFunction("__lt", &Int::operator<) .endClass(); - runLua("result = Int (1) < Int (1)"); + runLua("result = Int.new(1) < Int.new(1)"); ASSERT_EQ(false, result()); - runLua("result = Int (1) < Int (2)"); + runLua("result = Int.new(1) < Int.new(2)"); ASSERT_EQ(true, result()); - runLua("result = Int (2) < Int (1)"); + runLua("result = Int.new(2) < Int.new(1)"); ASSERT_EQ(false, result()); } @@ -2190,13 +2190,13 @@ TEST_F(ClassMetaMethods, __le) .addFunction("__le", &Int::operator<=) .endClass(); - runLua("result = Int (1) <= Int (1)"); + runLua("result = Int.new(1) <= Int.new(1)"); ASSERT_EQ(true, result()); - runLua("result = Int (1) <= Int (2)"); + runLua("result = Int.new(1) <= Int.new(2)"); ASSERT_EQ(true, result()); - runLua("result = Int (2) <= Int (1)"); + runLua("result = Int.new(2) <= Int.new(1)"); ASSERT_EQ(false, result()); } @@ -2210,7 +2210,7 @@ TEST_F(ClassMetaMethods, __add) .addFunction("__add", &Int::operator+) .endClass(); - runLua("result = Int (1) + Int (2)"); + runLua("result = Int.new(1) + Int.new(2)"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ(3, result().data); } @@ -2225,7 +2225,7 @@ TEST_F(ClassMetaMethods, __sub) .addFunction("__sub", &Int::operator-) .endClass(); - runLua("result = Int (1) - Int (2)"); + runLua("result = Int.new(1) - Int.new(2)"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ(-1, result().data); } @@ -2240,7 +2240,7 @@ TEST_F(ClassMetaMethods, __mul) .addFunction("__mul", &Int::operator*) .endClass(); - runLua("result = Int (-2) * Int (-5)"); + runLua("result = Int.new(-2) * Int.new(-5)"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ(10, result().data); } @@ -2255,7 +2255,7 @@ TEST_F(ClassMetaMethods, __div) .addFunction("__div", &Int::operator/) .endClass(); - runLua("result = Int (10) / Int (2)"); + runLua("result = Int.new(10) / Int.new(2)"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ(5, result().data); } @@ -2270,7 +2270,7 @@ TEST_F(ClassMetaMethods, __mod) .addFunction("__mod", &Int::operator%) .endClass(); - runLua("result = Int (7) % Int (2)"); + runLua("result = Int.new(7) % Int.new(2)"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ(1, result().data); } @@ -2285,7 +2285,7 @@ TEST_F(ClassMetaMethods, __pow) .addFunction("__pow", &Int::operator-) .endClass(); - runLua("result = Int (5) ^ Int (2)"); + runLua("result = Int.new(5) ^ Int.new(2)"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ(3, result().data); } @@ -2300,7 +2300,7 @@ TEST_F(ClassMetaMethods, __unm) .addFunction("__unm", &Int::negate) .endClass(); - runLua("result = -Int (-3)"); + runLua("result = -Int.new(-3)"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ(3, result().data); } @@ -2316,12 +2316,12 @@ TEST_F(ClassMetaMethods, __concat) .endClass(); #if LUABRIDGE_HAS_EXCEPTIONS - ASSERT_THROW(runLua("result = String ('a') + String ('b')"), std::exception); + ASSERT_THROW(runLua("result = String.new('a') + String.new('b')"), std::exception); #else - ASSERT_FALSE(runLua("result = String ('a') + String ('b')")); + ASSERT_FALSE(runLua("result = String.new('a') + String.new('b')")); #endif - runLua("result = String ('ab') .. String ('cd')"); + runLua("result = String.new('ab') .. String.new('cd')"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ("abcd", result().data); } @@ -2336,11 +2336,11 @@ TEST_F(ClassMetaMethods, __len) .addFunction("__len", &Int::len) .endClass(); - runLua("result = #Int (1)"); + runLua("result = #Int.new(1)"); ASSERT_TRUE(result().isNumber()); ASSERT_EQ(1, result()); - runLua("result = #Int (5)"); + runLua("result = #Int.new(5)"); ASSERT_TRUE(result().isNumber()); ASSERT_EQ(5, result()); } @@ -2462,35 +2462,35 @@ TEST_F(ClassMetaMethods, MetamethodsShouldNotBePartOfClassInstances) .endClass(); #if LUABRIDGE_HAS_EXCEPTIONS - EXPECT_ANY_THROW(runLua("local x = Int(1); x.__gc()")); - EXPECT_ANY_THROW(runLua("local x = Int(1); x:__gc()")); - EXPECT_ANY_THROW(runLua("local x = Int(1); x.__index()")); - EXPECT_ANY_THROW(runLua("local x = Int(1); x:__index()")); - EXPECT_ANY_THROW(runLua("local x = Int(1); x.__newindex()")); - EXPECT_ANY_THROW(runLua("local x = Int(1); x:__newindex()")); - EXPECT_TRUE(runLua("local x = Int(1); result = x.__gc")); + EXPECT_ANY_THROW(runLua("local x = Int.new(1); x.__gc()")); + EXPECT_ANY_THROW(runLua("local x = Int.new(1); x:__gc()")); + EXPECT_ANY_THROW(runLua("local x = Int.new(1); x.__index()")); + EXPECT_ANY_THROW(runLua("local x = Int.new(1); x:__index()")); + EXPECT_ANY_THROW(runLua("local x = Int.new(1); x.__newindex()")); + EXPECT_ANY_THROW(runLua("local x = Int.new(1); x:__newindex()")); + EXPECT_TRUE(runLua("local x = Int.new(1); result = x.__gc")); EXPECT_TRUE(result().isNil()); - EXPECT_TRUE(runLua("local x = Int(1); result = x.__index")); + EXPECT_TRUE(runLua("local x = Int.new(1); result = x.__index")); EXPECT_TRUE(result().isNil()); - EXPECT_TRUE(runLua("local x = Int(1); result = x.__newindex")); + EXPECT_TRUE(runLua("local x = Int.new(1); result = x.__newindex")); EXPECT_TRUE(result().isNil()); #else - EXPECT_FALSE(runLua("local x = Int(1); x.__gc()")); - EXPECT_FALSE(runLua("local x = Int(1); x:__gc()")); - EXPECT_FALSE(runLua("local x = Int(1); x.__index()")); - EXPECT_FALSE(runLua("local x = Int(1); x:__index()")); - EXPECT_FALSE(runLua("local x = Int(1); x.__newindex()")); - EXPECT_FALSE(runLua("local x = Int(1); x:__newindex()")); - EXPECT_TRUE(runLua("local x = Int(1); result = x.__gc")); + EXPECT_FALSE(runLua("local x = Int.new(1); x.__gc()")); + EXPECT_FALSE(runLua("local x = Int.new(1); x:__gc()")); + EXPECT_FALSE(runLua("local x = Int.new(1); x.__index()")); + EXPECT_FALSE(runLua("local x = Int.new(1); x:__index()")); + EXPECT_FALSE(runLua("local x = Int.new(1); x.__newindex()")); + EXPECT_FALSE(runLua("local x = Int.new(1); x:__newindex()")); + EXPECT_TRUE(runLua("local x = Int.new(1); result = x.__gc")); EXPECT_TRUE(result().isNil()); - EXPECT_TRUE(runLua("local x = Int(1); result = x.__index")); + EXPECT_TRUE(runLua("local x = Int.new(1); result = x.__index")); EXPECT_TRUE(result().isNil()); - EXPECT_TRUE(runLua("local x = Int(1); result = x.__newindex")); + EXPECT_TRUE(runLua("local x = Int.new(1); result = x.__newindex")); EXPECT_TRUE(result().isNil()); #endif - EXPECT_TRUE(runLua("local x = Int(1); x:__xyz()")); - EXPECT_TRUE(runLua("local x = Int(1); result = x.__xyz")); + EXPECT_TRUE(runLua("local x = Int.new(1); x:__xyz()")); + EXPECT_TRUE(runLua("local x = Int.new(1); result = x.__xyz")); EXPECT_TRUE(result().isFunction()); } @@ -2544,13 +2544,13 @@ TEST_F(ClassMetaMethods, MetamethodsShouldNotBeWritable) .endClass(); #if LUABRIDGE_HAS_EXCEPTIONS - EXPECT_ANY_THROW(runLua("local x = Int(1); x.__gc = function() end")); - EXPECT_ANY_THROW(runLua("local x = Int(1); x.__index = function() end")); - EXPECT_ANY_THROW(runLua("local x = Int(1); x.__newindex = function() end")); + EXPECT_ANY_THROW(runLua("local x = Int.new(1); x.__gc = function() end")); + EXPECT_ANY_THROW(runLua("local x = Int.new(1); x.__index = function() end")); + EXPECT_ANY_THROW(runLua("local x = Int.new(1); x.__newindex = function() end")); #else - EXPECT_FALSE(runLua("local x = Int(1); x.__gc = function() end")); - EXPECT_FALSE(runLua("local x = Int(1); x.__index = function() end")); - EXPECT_FALSE(runLua("local x = Int(1); x.__newindex = function() end")); + EXPECT_FALSE(runLua("local x = Int.new(1); x.__gc = function() end")); + EXPECT_FALSE(runLua("local x = Int.new(1); x.__index = function() end")); + EXPECT_FALSE(runLua("local x = Int.new(1); x.__newindex = function() end")); #endif } @@ -2577,7 +2577,7 @@ TEST_F(ClassMetaMethods, ErrorLineWithProperties) try { runLua(R"( - local myStringGetter = StringGetter() + local myStringGetter = StringGetter.new() myStringGetter.str = 12 )"); @@ -2594,7 +2594,7 @@ TEST_F(ClassMetaMethods, ErrorLineWithProperties) try { runLua(R"( - local myStringGetter = StringGetter() + local myStringGetter = StringGetter.new() myStringGetter:setString(12) )"); @@ -2611,7 +2611,7 @@ TEST_F(ClassMetaMethods, ErrorLineWithProperties) { auto [result, errorString] = runLuaCaptureError(R"( - local myStringGetter = StringGetter() + local myStringGetter = StringGetter.new() myStringGetter.str = 12 )"); @@ -2621,7 +2621,7 @@ TEST_F(ClassMetaMethods, ErrorLineWithProperties) { auto [result, errorString] = runLuaCaptureError(R"( - local myStringGetter = StringGetter() + local myStringGetter = StringGetter.new() myStringGetter:setString(12) )"); @@ -2741,7 +2741,7 @@ TEST_F(ClassTests, ConstructorWithReferences) .addConstructor() .endClass(); - runLua("x = InnerClass () result = OuterClass (x)"); + runLua("x = InnerClass.new() result = OuterClass.new(x)"); } TEST_F(ClassTests, DestructorIsNotCalledIfConstructorThrows) @@ -2754,7 +2754,7 @@ TEST_F(ClassTests, DestructorIsNotCalledIfConstructorThrows) InnerClass::destructorCallCount = 0; OuterClass::destructorCallCount = 0; - ASSERT_THROW(runLua("result = OuterClass ()"), std::exception); + ASSERT_THROW(runLua("result = OuterClass.new()"), std::exception); ASSERT_EQ(1, InnerClass::destructorCallCount); closeLuaState(); // Force garbage collection @@ -2772,7 +2772,7 @@ TEST_F(ClassTests, DestructorIsCalledOnce) .endClass(); InnerClass::destructorCallCount = 0; - runLua("result = InnerClass ()"); + runLua("result = InnerClass.new()"); closeLuaState(); // Force garbage collection @@ -2805,7 +2805,7 @@ TEST_F(ClassTests, ConstructorTakesMoreThanEightArgs) .addConstructor() .endClass(); - runLua("result = WideClass (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)"); + runLua("result = WideClass.new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ(1, result().a1_); @@ -2849,7 +2849,7 @@ TEST_F(ClassTests, MethodTakesMoreThanEightArgs) .addFunction("testLotsOfArgs", &WideClass::testLotsOfArgs) .endClass(); - runLua("result = WideClass () result:testLotsOfArgs (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)"); + runLua("result = WideClass.new() result:testLotsOfArgs (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)"); ASSERT_TRUE(result().isUserdata()); ASSERT_EQ(1, result().a1_); @@ -2881,7 +2881,7 @@ TEST_F(ClassTests, ConstructorFactory) .addProperty("x", &FactoryConstructibleClass::x_) .endClass(); - runLua("obj = FactoryConstructibleClass (); result = obj.x"); + runLua("obj = FactoryConstructibleClass.new(); result = obj.x"); ASSERT_TRUE(result().isNumber()); ASSERT_EQ(33, result()); @@ -2894,7 +2894,7 @@ TEST_F(ClassTests, ConstructorFactory) .addProperty("x", &FactoryConstructibleClass::x_) .endClass(); - runLua("obj = FactoryConstructibleClass2 (42); result = obj.x"); + runLua("obj = FactoryConstructibleClass2.new(42); result = obj.x"); ASSERT_TRUE(result().isNumber()); ASSERT_EQ(42, result()); @@ -2903,11 +2903,11 @@ TEST_F(ClassTests, ConstructorFactory) { luabridge::getGlobalNamespace(L) .beginClass("FactoryConstructibleClass3") - .addConstructor([](void* ptr, lua_State* L) { return new(ptr) FactoryConstructibleClass(static_cast(luaL_checkinteger(L, 2))); }) + .addConstructor([](void* ptr, lua_State* L) { return new(ptr) FactoryConstructibleClass(static_cast(luaL_checkinteger(L, 1))); }) .addProperty("x", &FactoryConstructibleClass::x_) .endClass(); - runLua("obj = FactoryConstructibleClass3 (42); result = obj.x"); + runLua("obj = FactoryConstructibleClass3.new(42); result = obj.x"); ASSERT_TRUE(result().isNumber()); ASSERT_EQ(42, result()); @@ -2984,7 +2984,7 @@ TEST_F(ClassTests, NonVirtualMethodInBaseClassCannotBeExposed) .endClass(); runLua(R"( - result = DerivedExampleClass () + result = DerivedExampleClass.new() result:baseFunction(1) result:baseCFunction() result:baseFunctionConst(1) @@ -3076,13 +3076,13 @@ TEST_F(ClassTests, OveralignedClasses) .addFunction("checkIsAligned", &Vec<32>::isAligned) .endClass(); - runLua("result = Vec8(3.0, 2.0, 1.0, 0.5):checkIsAligned()"); + runLua("result = Vec8.new(3.0, 2.0, 1.0, 0.5):checkIsAligned()"); EXPECT_TRUE(result()); - runLua("result = Vec16(3.0, 2.0, 1.0, 0.5):checkIsAligned()"); + runLua("result = Vec16.new(3.0, 2.0, 1.0, 0.5):checkIsAligned()"); EXPECT_TRUE(result()); - runLua("result = Vec32(3.0, 2.0, 1.0, 0.5):checkIsAligned()"); + runLua("result = Vec32.new(3.0, 2.0, 1.0, 0.5):checkIsAligned()"); EXPECT_TRUE(result()); } @@ -3147,7 +3147,7 @@ TEST_F(ClassTests, WrongThrowBadArgObjectDescription) try { - runLua("textXYZ(1, 1.0, ABC())"); + runLua("textXYZ(1, 1.0, ABC.new())"); EXPECT_TRUE(false); } catch (const std::exception& ex) @@ -3188,7 +3188,7 @@ TEST_F(ClassTests, WrongThrowBadArgObjectDescription) } { - auto [result, errorMessage] = runLuaCaptureError("textXYZ(1, 1.0, ABC())"); + auto [result, errorMessage] = runLuaCaptureError("textXYZ(1, 1.0, ABC.new())"); ASSERT_FALSE(result); expectBadArgOrInvalidCast(errorMessage, "got ABC"); } @@ -3310,8 +3310,8 @@ TEST_F(ClassTests, BugWithPlacementConstructor) .endNamespace(); runLua(R"( - local foo = foobar.foo(5000) - local bar = foobar.bar(foo) + local foo = foobar.foo.new(5000) + local bar = foobar.bar.new(foo) local next = bar:first() while next do next = bar:next(next) @@ -3343,8 +3343,8 @@ TEST_F(ClassTests, BugWithFactoryConstructor) .endNamespace(); runLua(R"( - local foo = foobar.foo() - local bar = foobar.bar(foo) + local foo = foobar.foo.new() + local bar = foobar.bar.new(foo) local next = bar:first() while next do next = bar:next(next) @@ -3387,7 +3387,7 @@ TEST_F(ClassTests, BugWithLuauNotPrintingClassConstructorNameInErrors) .endNamespace(); auto [result, error] = runLuaCaptureError(R"( - local bar = foo.ClassWithMethod() + local bar = foo.ClassWithMethod.new() result = bar )"); @@ -3451,8 +3451,8 @@ TEST_F(ClassTests, BugWithSharedPtrPropertyGetterFromClassNotDerivingFromSharedF .addProperty("getAsProperty", &fooClassGetter) .endNamespace(); - EXPECT_TRUE(runLua("result = BarClass():getAsFunction()")); - EXPECT_TRUE(runLua("result = BarClass().getAsProperty")); + EXPECT_TRUE(runLua("result = BarClass.new():getAsFunction()")); + EXPECT_TRUE(runLua("result = BarClass.new().getAsProperty")); EXPECT_TRUE(runLua("result = bar.getAsFunction()")); EXPECT_TRUE(runLua("result = bar.getAsProperty")); } @@ -3482,7 +3482,7 @@ TEST_F(ClassTests, DerivedClassAccessesParentProperty) .addConstructor() .endClass(); - EXPECT_TRUE(runLua("result = CoverageDerived().value")); + EXPECT_TRUE(runLua("result = CoverageDerived.new().value")); EXPECT_EQ(42, result()); } @@ -3498,7 +3498,7 @@ TEST_F(ClassTests, DerivedClassAccessesMetamethodNameReturnsNil) .addConstructor() .endClass(); - EXPECT_TRUE(runLua("result = CoverageDerived().__index")); + EXPECT_TRUE(runLua("result = CoverageDerived.new().__index")); EXPECT_TRUE(result().isNil()); } diff --git a/Tests/Source/CoroutineTests.cpp b/Tests/Source/CoroutineTests.cpp index 9ef3b973..d31d4091 100644 --- a/Tests/Source/CoroutineTests.cpp +++ b/Tests/Source/CoroutineTests.cpp @@ -134,7 +134,7 @@ TEST_F(CoroutineTests, ThreadedRegistration) lua_State* thread1 = lua_newthread(L); { - auto result = luaL_loadstring(thread1, "x = SomeClass(42)"); + auto result = luaL_loadstring(thread1, "x = SomeClass.new(42)"); ASSERT_EQ(LUABRIDGE_LUA_OK, result); } @@ -187,9 +187,9 @@ TEST_F(CoroutineTests, ThreadedRegistration) // Another coroutine will see no luabridge registration #if LUABRIDGE_HAS_EXCEPTIONS - EXPECT_THROW(runLua("x = SomeClass(42)", thread2), std::exception); + EXPECT_THROW(runLua("x = SomeClass.new(42)", thread2), std::exception); #else - EXPECT_FALSE(runLua("x = SomeClass(42)", thread2)); + EXPECT_FALSE(runLua("x = SomeClass.new(42)", thread2)); #endif } diff --git a/Tests/Source/DynamicLibraryTests.cpp b/Tests/Source/DynamicLibraryTests.cpp index 9e323fc2..36d54f3e 100644 --- a/Tests/Source/DynamicLibraryTests.cpp +++ b/Tests/Source/DynamicLibraryTests.cpp @@ -146,10 +146,10 @@ TEST_F(DynamicLibraryTests, ExampleUsageFromLibrary) runLua("result = callSharedClassMethod(shared)"); EXPECT_EQ(1379, result()); - runLua("a = SharedClass(); result = callSharedClassMethod(a)"); + runLua("a = SharedClass.new(); result = callSharedClassMethod(a)"); EXPECT_EQ(1379, result()); - runLua("b = SharedClass(); result = b"); + runLua("b = SharedClass.new(); result = b"); auto ptr = result(); ASSERT_NE(nullptr, ptr); EXPECT_EQ(1379, callSharedClassMethod(ptr)); @@ -198,16 +198,16 @@ TEST_F(DynamicLibraryTests, ExampleRegistrationFromLibrary) registerAnotherClass(L); - runLua("a = dll.AnotherClass(); result = a.value"); + runLua("a = dll.AnotherClass.new(); result = a.value"); EXPECT_EQ(30, result()); - runLua("b = dll.AnotherClass(); b:publicMethod(12); result = b.value"); + runLua("b = dll.AnotherClass.new(); b:publicMethod(12); result = b.value"); EXPECT_EQ(12, result()); - runLua("c = dll.AnotherClass(); result = c:publicMethod(12)"); + runLua("c = dll.AnotherClass.new(); result = c:publicMethod(12)"); EXPECT_EQ(12, result()); - runLua("d = dll.AnotherClass(); result = d:publicConstMethod(12)"); + runLua("d = dll.AnotherClass.new(); result = d:publicConstMethod(12)"); EXPECT_EQ(42, result()); closeLuaState(); // Force garbage collection diff --git a/Tests/Source/ExceptionTests.cpp b/Tests/Source/ExceptionTests.cpp index aacce795..531d78e9 100644 --- a/Tests/Source/ExceptionTests.cpp +++ b/Tests/Source/ExceptionTests.cpp @@ -80,7 +80,7 @@ TEST_F(ExceptionTests, ThrowingPrimaryConstructors) .addConstructor() .endClass(); - EXPECT_ANY_THROW(runLua("result = ThrowingClass()")); + EXPECT_ANY_THROW(runLua("result = ThrowingClass.new()")); } TEST_F(ExceptionTests, ThrowingPlacementConstructors) @@ -93,9 +93,9 @@ TEST_F(ExceptionTests, ThrowingPlacementConstructors) return new(ptr) ThrowingClass(); }) .endClass(); - - EXPECT_ANY_THROW(runLua("result = ThrowingClass()")); - + + EXPECT_ANY_THROW(runLua("result = ThrowingClass.new()")); + luabridge::getGlobalNamespace(L) .beginClass("ThrowingClass2") .addConstructor([](void* ptr) @@ -103,8 +103,8 @@ TEST_F(ExceptionTests, ThrowingPlacementConstructors) return new(ptr) ThrowingClass(); }) .endClass(); - - EXPECT_ANY_THROW(runLua("result = ThrowingClass2()")); + + EXPECT_ANY_THROW(runLua("result = ThrowingClass2.new()")); } TEST_F(ExceptionTests, ThrowingContainerPrimaryConstructors) @@ -114,7 +114,7 @@ TEST_F(ExceptionTests, ThrowingContainerPrimaryConstructors) .addConstructorFrom, void(*)()>() .endClass(); - EXPECT_ANY_THROW(runLua("result = ThrowingClass()")); + EXPECT_ANY_THROW(runLua("result = ThrowingClass.new()")); } TEST_F(ExceptionTests, ThrowingContainerPlacementConstructors) @@ -127,9 +127,9 @@ TEST_F(ExceptionTests, ThrowingContainerPlacementConstructors) return std::make_shared(); }) .endClass(); - - EXPECT_ANY_THROW(runLua("result = ThrowingClass()")); - + + EXPECT_ANY_THROW(runLua("result = ThrowingClass.new()")); + luabridge::getGlobalNamespace(L) .beginClass("ThrowingClass2") .addConstructorFrom>([] @@ -138,7 +138,7 @@ TEST_F(ExceptionTests, ThrowingContainerPlacementConstructors) }) .endClass(); - EXPECT_ANY_THROW(runLua("result = ThrowingClass2()")); + EXPECT_ANY_THROW(runLua("result = ThrowingClass2.new()")); } TEST_F(ExceptionTests, ThrowingFactoryConstructors) @@ -149,19 +149,19 @@ TEST_F(ExceptionTests, ThrowingFactoryConstructors) +[]() -> ThrowingClass* { throw std::runtime_error("Throwing during construction"); return new ThrowingClass(); }, - +[](ThrowingClass* x) { delete x; }) + +[](ThrowingClass* x) { delete x; }) .endClass(); - - EXPECT_ANY_THROW(runLua("result = ThrowingClass()")); - + + EXPECT_ANY_THROW(runLua("result = ThrowingClass.new()")); + luabridge::getGlobalNamespace(L) .beginClass("ThrowingClass2") .addFactory( +[]() -> ThrowingClass* { return new ThrowingClass(); }, - +[](ThrowingClass* x) { delete x; }) + +[](ThrowingClass* x) { delete x; }) .endClass(); - EXPECT_ANY_THROW(runLua("result = ThrowingClass2()")); + EXPECT_ANY_THROW(runLua("result = ThrowingClass2.new()")); } TEST_F(ExceptionTests, ThrowingMethodInvocation) @@ -181,14 +181,14 @@ TEST_F(ExceptionTests, ThrowingMethodInvocation) throw std::runtime_error("Throwing during const lambda"); self.throwingMethodConst(); }) .endClass(); - EXPECT_ANY_THROW(runLua("local t = ThrowingClass(1); result = t:throwingMethod()")); - EXPECT_ANY_THROW(runLua("local t = ThrowingClass(2); result = t:throwingMethodConst()")); - EXPECT_ANY_THROW(runLua("local t = ThrowingClass(3); result = t:throwingCMethod()")); - EXPECT_ANY_THROW(runLua("local t = ThrowingClass(4); result = t:throwingCMethodConst()")); - EXPECT_ANY_THROW(runLua("local t = ThrowingClass(5); result = t:throwingMethodLambda()")); - EXPECT_ANY_THROW(runLua("local t = ThrowingClass(6); result = t:throwingMethodLambdaConst()")); - EXPECT_ANY_THROW(runLua("local t = ThrowingClass(7); result = t:throwingMethodLambdaRaise()")); - EXPECT_ANY_THROW(runLua("local t = ThrowingClass(8); result = t:throwingMethodLambdaConstRaise()")); + EXPECT_ANY_THROW(runLua("local t = ThrowingClass.new(1); result = t:throwingMethod()")); + EXPECT_ANY_THROW(runLua("local t = ThrowingClass.new(2); result = t:throwingMethodConst()")); + EXPECT_ANY_THROW(runLua("local t = ThrowingClass.new(3); result = t:throwingCMethod()")); + EXPECT_ANY_THROW(runLua("local t = ThrowingClass.new(4); result = t:throwingCMethodConst()")); + EXPECT_ANY_THROW(runLua("local t = ThrowingClass.new(5); result = t:throwingMethodLambda()")); + EXPECT_ANY_THROW(runLua("local t = ThrowingClass.new(6); result = t:throwingMethodLambdaConst()")); + EXPECT_ANY_THROW(runLua("local t = ThrowingClass.new(7); result = t:throwingMethodLambdaRaise()")); + EXPECT_ANY_THROW(runLua("local t = ThrowingClass.new(8); result = t:throwingMethodLambdaConstRaise()")); } namespace { @@ -302,7 +302,7 @@ TEST_F(ExceptionTests, PassFromLua) { auto result = runLuaCaptureError(R"( - local errorClass = test.ErrorClass() + local errorClass = test.ErrorClass.new() local x = errorClass:memberFunctionError() )"); @@ -315,7 +315,7 @@ TEST_F(ExceptionTests, PassFromLua) { auto result = runLuaCaptureError(R"( - local errorClass = test.ErrorClass() + local errorClass = test.ErrorClass.new() local y = errorClass.memberPropertyError )"); @@ -328,7 +328,7 @@ TEST_F(ExceptionTests, PassFromLua) { auto result = runLuaCaptureError(R"( - local errorClass = test.ErrorClass() + local errorClass = test.ErrorClass.new() local y = errorClass.memberPropertyError2 )"); diff --git a/Tests/Source/InspectTests.cpp b/Tests/Source/InspectTests.cpp index 2dc469ef..1fde0a2d 100644 --- a/Tests/Source/InspectTests.cpp +++ b/Tests/Source/InspectTests.cpp @@ -103,7 +103,7 @@ TEST_F(InspectTests, InspectSimpleClass) ASSERT_NE(nullptr, staticFn); EXPECT_EQ(luabridge::MemberKind::StaticMethod, staticFn->kind); - auto* ctor = findMember(info, "__call"); + auto* ctor = findMember(info, "new"); ASSERT_NE(nullptr, ctor); EXPECT_EQ(luabridge::MemberKind::Constructor, ctor->kind); } @@ -502,7 +502,7 @@ TEST_F(InspectTests, ReflectConstructorTypeInfo) .endClass(); auto info = luabridge::inspect(L); - auto* ctor = findMember(info, "__call"); + auto* ctor = findMember(info, "new"); ASSERT_NE(nullptr, ctor); ASSERT_EQ(1u, ctor->overloads.size()); diff --git a/Tests/Source/IssueTests.cpp b/Tests/Source/IssueTests.cpp index 032fa252..fe14dc19 100644 --- a/Tests/Source/IssueTests.cpp +++ b/Tests/Source/IssueTests.cpp @@ -130,7 +130,7 @@ TEST_F(IssueTests, Issue178) .addProperty("x", &Vector::x, &Vector::x) .endClass(); - runLua("result = WideVector (0, 1, 2, 3).x"); + runLua("result = WideVector.new(0, 1, 2, 3).x"); ASSERT_TRUE(result().isNumber()); ASSERT_EQ(3.f, result()); @@ -244,7 +244,7 @@ TEST_F(IssueTests, IssueMainThread) end )"; - const char* threadSource = "c = SomeClass()"; + const char* threadSource = "c = SomeClass.new()"; lua_State* thread = lua_newthread(L); diff --git a/Tests/Source/LegacyTests.h b/Tests/Source/LegacyTests.h index d46e9faf..db84d430 100644 --- a/Tests/Source/LegacyTests.h +++ b/Tests/Source/LegacyTests.h @@ -71,10 +71,10 @@ A.testStaticProp2 = 49; assert(testAFnCalled(FN_STATIC_PROPSET) and A.t -- test classes registered from C++ -object1 = A("object1"); assert(testAFnCalled(FN_CTOR)); +object1 = A.new("object1"); assert(testAFnCalled(FN_CTOR)); object1:testVirtual(); assert(testAFnCalled(FN_VIRTUAL)); -object2 = B("object2"); assert(testAFnCalled(FN_CTOR) and testBFnCalled(FN_CTOR)); +object2 = B.new("object2"); assert(testAFnCalled(FN_CTOR) and testBFnCalled(FN_CTOR)); object2:testVirtual(); assert(testBFnCalled(FN_VIRTUAL) and not testAFnCalled(FN_VIRTUAL)); -- test functions taking and returning objects diff --git a/Tests/Source/LuaRefTests.cpp b/Tests/Source/LuaRefTests.cpp index 96a532df..f237079f 100644 --- a/Tests/Source/LuaRefTests.cpp +++ b/Tests/Source/LuaRefTests.cpp @@ -742,7 +742,7 @@ TEST_F(LuaRefTests, IsInstance) .addConstructor() .endClass(); - runLua("result = Base ()"); + runLua("result = Base.new()"); EXPECT_TRUE(result().isInstance()); EXPECT_FALSE(result().isInstance()); EXPECT_FALSE(result().isInstance()); @@ -751,7 +751,7 @@ TEST_F(LuaRefTests, IsInstance) EXPECT_FALSE(result().isNil()); EXPECT_EQ("Base", result().getClassName().value_or("")); - runLua("result = Derived ()"); + runLua("result = Derived.new()"); EXPECT_TRUE(result().isInstance()); EXPECT_TRUE(result().isInstance()); EXPECT_FALSE(result().isInstance()); @@ -760,7 +760,7 @@ TEST_F(LuaRefTests, IsInstance) EXPECT_FALSE(result().isNil()); EXPECT_EQ("Derived", result().getClassName().value_or("")); - runLua("result = Other ()"); + runLua("result = Other.new()"); EXPECT_FALSE(result().isInstance()); EXPECT_FALSE(result().isInstance()); EXPECT_TRUE(result().isInstance()); @@ -906,10 +906,10 @@ TEST_F(LuaRefTests, RegisterLambdaInFunction) luabridge::setGlobal(L, luabridge::newFunction(L, [](const Class* obj, int x) { return obj->test() + x; }), "takeClass"); luabridge::setGlobal(L, luabridge::newFunction(L, [](Class* obj, int x, int y, lua_State* L) { return obj->test() + x + y + lua_gettop(L); }), "takeClassState"); - runLua("obj = Class(); result = takeClass (obj, 10)"); + runLua("obj = Class.new(); result = takeClass (obj, 10)"); ASSERT_EQ(1 + 10, result()); - runLua("obj = Class(); result = takeClassState (obj, 10, 100)"); + runLua("obj = Class.new(); result = takeClassState (obj, 10, 100)"); ASSERT_EQ(1 + 10 + 100 + 3, result()); } @@ -1100,7 +1100,7 @@ TEST_F(LuaRefTests, UserdataIndexMetamethodPropgetFastPath) }) .endClass(); - runLua("obj = PropsClass(); result = obj"); + runLua("obj = PropsClass.new(); result = obj"); auto obj = result(); ASSERT_TRUE(obj.isUserdata()); diff --git a/Tests/Source/MapTests.cpp b/Tests/Source/MapTests.cpp index 7d140a29..7f7a943d 100644 --- a/Tests/Source/MapTests.cpp +++ b/Tests/Source/MapTests.cpp @@ -193,7 +193,7 @@ TEST_F(MapTests, PassFromLua) { resetResult(); - runLua("result = processValues ({[Data (-1)] = Data (2)})"); + runLua("result = processValues ({[Data.new(-1)] = Data.new(2)})"); std::map expected{{Data(-1), Data(2)}}; const auto actual = result>(); ASSERT_EQ(expected, actual); @@ -201,7 +201,7 @@ TEST_F(MapTests, PassFromLua) { resetResult(); - runLua("result = processPointers ({[Data (3)] = Data (-4)})"); + runLua("result = processPointers ({[Data.new(3)] = Data.new(-4)})"); std::map expected{{Data(3), Data(-4)}}; const auto actual = result>(); ASSERT_EQ(expected, actual); diff --git a/Tests/Source/MultipleInheritanceTests.cpp b/Tests/Source/MultipleInheritanceTests.cpp index b3a3ecef..daa2bf54 100644 --- a/Tests/Source/MultipleInheritanceTests.cpp +++ b/Tests/Source/MultipleInheritanceTests.cpp @@ -137,7 +137,7 @@ TEST_F(MultipleInheritanceTests, BasicTwoBasesMethods) registerAB(L); runLua(R"( - local d = D() + local d = D.new() result = d:methodA() + d:methodB() )"); @@ -154,7 +154,7 @@ TEST_F(MultipleInheritanceTests, BasicTwoBasesProperties) // TODO: Fix property access across multiple base classes runLua(R"( - local d = D() + local d = D.new() -- Access methods which work correctly result = d:methodA() + d:methodB() )"); @@ -178,7 +178,7 @@ TEST_F(MultipleInheritanceTests, MethodResolutionOrder_DeclOrder) .endClass(); runLua(R"( - local d = D() + local d = D.new() result = d:greet() )"); @@ -190,7 +190,7 @@ TEST_F(MultipleInheritanceTests, DerivedOverrideShadowsBases) registerAB(L); runLua(R"( - local d = D() + local d = D.new() result = d:greet() )"); @@ -217,7 +217,7 @@ TEST_F(MultipleInheritanceTests, DiamondInheritance) .endClass(); runLua(R"( - local d = DiamondD() + local d = DiamondD.new() result = d:fromB() .. d:fromC() .. d:sharedAncestor() )"); @@ -243,7 +243,7 @@ TEST_F(MultipleInheritanceTests, DiamondDFSOrder) .endClass(); runLua(R"( - local d = DiamondD() + local d = DiamondD.new() result = d:dfsPriority() )"); @@ -267,7 +267,7 @@ TEST_F(MultipleInheritanceTests, PassDerivedAsBase1) luabridge::getGlobalNamespace(L).addFunction("consumeA", &consumeA); runLua(R"( - local d = D() + local d = D.new() result = consumeA(d) )"); @@ -280,7 +280,7 @@ TEST_F(MultipleInheritanceTests, PassDerivedAsBase2) luabridge::getGlobalNamespace(L).addFunction("consumeB", &consumeB); runLua(R"( - local d = D() + local d = D.new() result = consumeB(d) )"); @@ -292,7 +292,7 @@ TEST_F(MultipleInheritanceTests, ConstMethodInheritance) registerAB(L); runLua(R"( - local d = D() + local d = D.new() result = d:constMethod() )"); @@ -330,7 +330,7 @@ TEST_F(MultipleInheritanceTests, ThreeBaseClasses) .endClass(); runLua(R"( - local d = D3() + local d = D3.new() result = d:methodA() + d:methodB() + d:methodC() )"); @@ -361,7 +361,7 @@ TEST_F(MultipleInheritanceTests, MultiLevelMultiple) .endClass(); runLua(R"( - local e = E() + local e = E.new() result = e:methodA() + e:methodB() + e:methodC() )"); @@ -386,7 +386,7 @@ TEST_F(MultipleInheritanceTests, SharedPtrMultipleBases) .endClass(); runLua(R"( - local d = D() + local d = D.new() result = d:methodA() + d:methodB() )"); @@ -407,7 +407,7 @@ TEST_F(MultipleInheritanceTests, SharedPtrIsInstance) .endClass(); runLua(R"( - result = D() + result = D.new() )"); EXPECT_TRUE(result().isInstance()); @@ -420,7 +420,7 @@ TEST_F(MultipleInheritanceTests, PropertySetterFromBase) registerAB(L); runLua(R"( - local d = D() + local d = D.new() d.b = 13 result = d.b )"); @@ -440,7 +440,7 @@ TEST_F(MultipleInheritanceTests, ExistingSingleInheritanceUnchanged) .endClass(); runLua(R"( - local d = SingleDerived() + local d = SingleDerived.new() result = d:value() )"); @@ -452,7 +452,7 @@ TEST_F(MultipleInheritanceTests, ReadOnlyPropertyFromBase) registerAB(L); runLua(R"( - local d = D() + local d = D.new() result = d.readOnlyA )"); @@ -464,7 +464,7 @@ TEST_F(MultipleInheritanceTests, ConstructorWithMultipleBases) registerAB(L); runLua(R"( - local d = D() + local d = D.new() result = d:methodA() + d:methodB() )"); @@ -477,7 +477,7 @@ TEST_F(MultipleInheritanceTests, VirtualMethodResolution) luabridge::getGlobalNamespace(L).addFunction("callVirtual", &callVirtual); runLua(R"( - local d = D() + local d = D.new() result = callVirtual(d) )"); @@ -512,7 +512,7 @@ TEST_F(MultipleInheritanceTests, ExtensibleMultipleBases) .endClass(); runLua(R"( - local d = DExtensible() + local d = DExtensible.new() result = d:methodA() + d:methodB() )"); @@ -529,7 +529,7 @@ TEST_F(MultipleInheritanceTests, ExtensibleMultipleBasesWithMethods) .endClass(); runLua(R"( - local d = DExtWithMethods() + local d = DExtWithMethods.new() -- Add custom Lua methods that call base methods function d:combined() return self:methodA() + self:methodB() + 100 @@ -553,7 +553,7 @@ TEST_F(MultipleInheritanceTests, ExtensibleMultipleBasesPropertyStorage) .endClass(); runLua(R"( - local d = DExtensibleStore() + local d = DExtensibleStore.new() -- Test calling through extensible derived with multiple bases local a_val = d:methodA() local b_val = d:methodB() @@ -571,8 +571,8 @@ TEST_F(MultipleInheritanceTests, MultipleBasesWithCopySemantics) registerAB(L); runLua(R"( - local d1 = D() - local d2 = D() + local d1 = D.new() + local d2 = D.new() -- Both should be independent D instances result = (d1:methodA() == d2:methodA() and 1 or 0) + @@ -603,7 +603,7 @@ TEST_F(MultipleInheritanceTests, MultipleInheritanceChainLookup) .endClass(); runLua(R"( - local e = E() + local e = E.new() result = e:methodA() + e:methodB() )"); @@ -615,7 +615,7 @@ TEST_F(MultipleInheritanceTests, ReferencingAcrossBases) registerAB(L); runLua(R"( - local d = D() + local d = D.new() -- D is-a A local a_ref = d local as_array = {d, d, d} diff --git a/Tests/Source/OptionalTests.cpp b/Tests/Source/OptionalTests.cpp index 3ad73e57..5fe453ca 100644 --- a/Tests/Source/OptionalTests.cpp +++ b/Tests/Source/OptionalTests.cpp @@ -234,12 +234,12 @@ TEST_F(OptionalTests, PassFromLua) .addFunction("processValue", &processValue) .addFunction("processPointer", &processPointer); - testPassFromLua(*this, "processValue", "Data(-1)", Data(-1)); - testPassFromLua(*this, "processValue", "Data(2)", Data(2)); + testPassFromLua(*this, "processValue", "Data.new(-1)", Data(-1)); + testPassFromLua(*this, "processValue", "Data.new(2)", Data(2)); testPassFromLua(*this, "processValue", "nil", std::nullopt); - testPassFromLua(*this, "processPointer", "Data(-1)", Data(-1)); - testPassFromLua(*this, "processPointer", "Data(2)", Data(2)); + testPassFromLua(*this, "processPointer", "Data.new(-1)", Data(-1)); + testPassFromLua(*this, "processPointer", "Data.new(2)", Data(2)); testPassFromLua(*this, "processPointer", "nil", std::nullopt); } @@ -311,13 +311,13 @@ TEST_F(OptionalTests, FromCppApi) .endClass(); resetResult(); - runLua("result = OptionalClass () result:testOptionalAsArg (1337)"); + runLua("result = OptionalClass.new() result:testOptionalAsArg (1337)"); EXPECT_TRUE(result().isUserdata()); EXPECT_EQ(1337, *result().x); resetResult(); - runLua("x = OptionalClass () result = x:testOptionalAsReturn ()"); + runLua("x = OptionalClass.new() result = x:testOptionalAsReturn ()"); EXPECT_FALSE(result().isNil()); EXPECT_EQ("abcdef", *result>()); diff --git a/Tests/Source/OverloadTests.cpp b/Tests/Source/OverloadTests.cpp index d7e49e05..1ed1965b 100644 --- a/Tests/Source/OverloadTests.cpp +++ b/Tests/Source/OverloadTests.cpp @@ -230,43 +230,43 @@ TEST_F(OverloadTests, BaseAndDerivedClassOverloads) [](Derived* d) { return d->test5(); }, [](Base* b) { return b->test3(); }); - runLua("b = Base(); result = b:testx ()"); + runLua("b = Base.new(); result = b:testx ()"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(1, result()); - runLua("b = Base(); result = b:testx (1)"); + runLua("b = Base.new(); result = b:testx (1)"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(2, result()); - runLua("b = Derived(); result = b:testx ()"); + runLua("b = Derived.new(); result = b:testx ()"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(5, result()); - runLua("b = Derived(); result = b:testx (1)"); + runLua("b = Derived.new(); result = b:testx (1)"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(6, result()); - runLua("b = Derived(); result = b:testy ()"); + runLua("b = Derived.new(); result = b:testy ()"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(3, result()); - runLua("b = Derived(); result = b:testy (1)"); + runLua("b = Derived.new(); result = b:testy (1)"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(4, result()); - runLua("b = Base(); result = testBase (b)"); + runLua("b = Base.new(); result = testBase (b)"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(3, result()); - runLua("b = Derived(); result = testBase (b)"); + runLua("b = Derived.new(); result = testBase (b)"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(3, result()); - runLua("b = Base(); result = testDerived (b)"); + runLua("b = Base.new(); result = testDerived (b)"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(3, result()); - runLua("b = Derived(); result = testDerived (b)"); + runLua("b = Derived.new(); result = testDerived (b)"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(7, result()); } @@ -519,12 +519,12 @@ TEST_F(OverloadTests, OverloadOperatorClass) luabridge::overload(&X::operator*)) .endClass(); - runLua("x1 = X(2); x2 = X(3); result = x1 * x2"); + runLua("x1 = X.new(2); x2 = X.new(3); result = x1 * x2"); ASSERT_TRUE(result().isUserdata()); auto result1 = result(); EXPECT_EQ(6, result1.value); - runLua("x1 = X(2); result = x1 * 3"); + runLua("x1 = X.new(2); result = x1 * 3"); ASSERT_TRUE(result().isUserdata()); auto result2 = result(); EXPECT_EQ(6, result2.value); @@ -872,32 +872,32 @@ TEST_F(OverloadTests, ConstructorOverloading) .addProperty("value", &X::value) .endClass(); - runLua("x = X(1); result = x.value"); + runLua("x = X.new(1); result = x.value"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(1, result()); - runLua("x = X(1, 10); result = x.value"); + runLua("x = X.new(1, 10); result = x.value"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(11, result()); #if LUABRIDGE_HAS_EXCEPTIONS - ASSERT_ANY_THROW(runLua("x = X(1, 10, 100); result = x.value")); + ASSERT_ANY_THROW(runLua("x = X.new(1, 10, 100); result = x.value")); #else - ASSERT_FALSE(runLua("x = X(1, 10, 100); result = x.value")); + ASSERT_FALSE(runLua("x = X.new(1, 10, 100); result = x.value")); #endif - runLua("y = Y(1); result = y.value"); + runLua("y = Y.new(1); result = y.value"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(1, result()); - runLua("y = Y(1, 10); result = y.value"); + runLua("y = Y.new(1, 10); result = y.value"); ASSERT_TRUE(result().isNumber()); EXPECT_EQ(11, result()); #if LUABRIDGE_HAS_EXCEPTIONS - ASSERT_ANY_THROW(runLua("y = Y(1, 10, 100); result = y.value")); + ASSERT_ANY_THROW(runLua("y = Y.new(1, 10, 100); result = y.value")); #else - ASSERT_FALSE(runLua("y = Y(1, 10, 100); result = y.value")); + ASSERT_FALSE(runLua("y = Y.new(1, 10, 100); result = y.value")); #endif } diff --git a/Tests/Source/RefCountedPtrTests.cpp b/Tests/Source/RefCountedPtrTests.cpp index c087d8bf..8d504032 100644 --- a/Tests/Source/RefCountedPtrTests.cpp +++ b/Tests/Source/RefCountedPtrTests.cpp @@ -120,7 +120,7 @@ TEST_F(RefCountedPtrTests, LastReferenceInstantiatedFromLua) EXPECT_FALSE(RefCountedStatic::constructed); EXPECT_FALSE(RefCountedStatic::deleted); - runLua("local o = Class(); result = false"); + runLua("local o = Class.new(); result = false"); EXPECT_TRUE(RefCountedStatic::constructed); EXPECT_FALSE(RefCountedStatic::deleted); diff --git a/Tests/Source/SetTests.cpp b/Tests/Source/SetTests.cpp index e151ab99..99a6057e 100644 --- a/Tests/Source/SetTests.cpp +++ b/Tests/Source/SetTests.cpp @@ -183,7 +183,7 @@ TEST_F(SetTests, PassFromLua) { resetResult(); - runLua("result = processValues ({ Data(-1), Data(2) })"); + runLua("result = processValues ({ Data.new(-1), Data.new(2) })"); std::set expected{ Data(-1), Data(2) }; const auto actual = result>(); ASSERT_EQ(expected, actual); @@ -191,7 +191,7 @@ TEST_F(SetTests, PassFromLua) { resetResult(); - runLua("result = processPointers ({ Data(3), Data(-4) })"); + runLua("result = processPointers ({ Data.new(3), Data.new(-4) })"); std::set expected{ Data(3), Data(-4) }; const auto actual = result>(); ASSERT_EQ(expected, actual); diff --git a/Tests/Source/Tests.cpp b/Tests/Source/Tests.cpp index 5f2a7457..0095a98f 100644 --- a/Tests/Source/Tests.cpp +++ b/Tests/Source/Tests.cpp @@ -138,12 +138,12 @@ TEST_F(LuaBridgeTest, LambdaClassMethods) .addFunction("normalMethod1", &Inner::normalMethod1) .endClass(); - runLua("x = Inner () result = x:test (255)"); + runLua("x = Inner.new() result = x:test (255)"); EXPECT_EQ(true, result().isNumber()); EXPECT_EQ(355, result()); resetResult(); - runLua("x = Inner () result = x:test (255)"); + runLua("x = Inner.new() result = x:test (255)"); EXPECT_EQ(true, result().isNumber()); EXPECT_EQ(355, result()); } @@ -311,7 +311,7 @@ TEST_F(LuaBridgeTest, TupleAsFunctionReturnValue) .addFunction("test", [x](Inner*) { return std::make_tuple(x, 42); }) .endClass(); - runLua("x = Inner () result1, result2 = x:test ()"); + runLua("x = Inner.new() result1, result2 = x:test ()"); auto z1 = luabridge::getGlobal(L, "result1"); auto z2 = luabridge::getGlobal(L, "result2"); EXPECT_EQ(true, z1.isNumber()); @@ -904,7 +904,7 @@ TEST_F(LuaBridgeTest, StdSharedPtrSingle) auto a3 = result>(); EXPECT_EQ(1, a3->x); - EXPECT_TRUE(runLua("result = test.A(2)")); + EXPECT_TRUE(runLua("result = test.A.new(2)")); auto a4 = result>(); EXPECT_EQ(2, a4->x); } @@ -929,19 +929,19 @@ TEST_F(LuaBridgeTest, StdSharedPtrSingleCustomConstructor) .endClass() .endNamespace(); - EXPECT_TRUE(runLua("result = test.A1()")); + EXPECT_TRUE(runLua("result = test.A1.new()")); auto a0 = result>(); EXPECT_EQ(42, a0->x); - EXPECT_TRUE(runLua("result = test.A2()")); + EXPECT_TRUE(runLua("result = test.A2.new()")); auto a1 = result>(); EXPECT_EQ(42, a1->x); - EXPECT_TRUE(runLua("result = test.A2(1337)")); + EXPECT_TRUE(runLua("result = test.A2.new(1337)")); auto a2 = result>(); EXPECT_EQ(1337, a2->x); - EXPECT_TRUE(runLua("result = test.A2(11, 22)")); + EXPECT_TRUE(runLua("result = test.A2.new(11, 22)")); auto a3 = result>(); EXPECT_EQ(33, a3->x); } @@ -955,11 +955,11 @@ TEST_F(LuaBridgeTest, StdSharedPtrMultiple) .endClass() .endNamespace(); - EXPECT_TRUE(runLua("result = test.A()")); + EXPECT_TRUE(runLua("result = test.A.new()")); auto a1 = result>(); EXPECT_EQ(42, a1->x); - EXPECT_TRUE(runLua("result = test.A(2)")); + EXPECT_TRUE(runLua("result = test.A.new(2)")); auto a2 = result>(); EXPECT_EQ(2, a2->x); } @@ -987,7 +987,7 @@ TEST_F(LuaBridgeTest, StdSharedPtrDerived) auto a2 = result>(); EXPECT_EQ(1, a2->x); - EXPECT_TRUE(runLua("result = test.B(2)")); + EXPECT_TRUE(runLua("result = test.B.new(2)")); auto a3 = result>(); EXPECT_EQ(2, a3->x); } @@ -1000,7 +1000,7 @@ TEST_F(LuaBridgeTest, StdSharedPtrDerived) auto b2 = result>(); EXPECT_EQ(1, b2->x); - EXPECT_TRUE(runLua("result = test.B(2)")); + EXPECT_TRUE(runLua("result = test.B.new(2)")); auto b3 = result>(); EXPECT_EQ(2, b3->x); } @@ -1036,7 +1036,7 @@ TEST_F(LuaBridgeTest, StdSharedPtrDerivedPolymorphic) auto a2 = result>(); EXPECT_EQ(1, a2->x); - EXPECT_TRUE(runLua("result = test.B(2)")); + EXPECT_TRUE(runLua("result = test.B.new(2)")); auto a3 = result>(); EXPECT_EQ(2, a3->x); } @@ -1049,7 +1049,7 @@ TEST_F(LuaBridgeTest, StdSharedPtrDerivedPolymorphic) auto b2 = result>(); EXPECT_EQ(1, b2->x); - EXPECT_TRUE(runLua("result = test.B(2)")); + EXPECT_TRUE(runLua("result = test.B.new(2)")); auto b3 = result>(); EXPECT_EQ(2, b3->x); } @@ -1068,15 +1068,15 @@ TEST_F(LuaBridgeTest, StdSharedPtrDerivedPolymorphic) return; // TODO - Ravi asserts on the lua state being invalid because of the previous exception #endif - EXPECT_TRUE(runLua("local x = test.A(2); result = x:myNameIs()")); + EXPECT_TRUE(runLua("local x = test.A.new(2); result = x:myNameIs()")); auto x1 = result(); EXPECT_EQ("VirtualA", x1); - EXPECT_TRUE(runLua("local x = test.B(2); result = x:myNameIs()")); + EXPECT_TRUE(runLua("local x = test.B.new(2); result = x:myNameIs()")); auto x2 = result(); EXPECT_EQ("VirtualB", x2); - EXPECT_TRUE(runLua("local x = test.C(2); result = x:myNameIs()")); + EXPECT_TRUE(runLua("local x = test.C.new(2); result = x:myNameIs()")); auto x3 = result(); EXPECT_EQ("VirtualC", x3); } @@ -1119,13 +1119,13 @@ TEST_F(LuaBridgeTest, StdSharedPtrAsProperty) .endClass() .endNamespace(); - ASSERT_TRUE(runLua("local x = test.TestClassOuter(); result = x.getNested:getValue()")); + ASSERT_TRUE(runLua("local x = test.TestClassOuter.new(); result = x.getNested:getValue()")); EXPECT_EQ(42, result()); - ASSERT_TRUE(runLua("local x = test.TestClassOuter(); result = x.valueNested:getValue()")); + ASSERT_TRUE(runLua("local x = test.TestClassOuter.new(); result = x.valueNested:getValue()")); EXPECT_EQ(42, result()); - ASSERT_TRUE(runLua("local x = test.TestClassOuter(); result = x.sharedPointerNested:getValue()")); + ASSERT_TRUE(runLua("local x = test.TestClassOuter.new(); result = x.sharedPointerNested:getValue()")); EXPECT_EQ(42, result()); } @@ -1200,26 +1200,26 @@ TEST_F(LuaBridgeTest, PointersBoom) .endNamespace(); runLua(R"( - local foo = test.BoomyClass() + local foo = test.BoomyClass.new() result = foo:nullconst() )"); EXPECT_TRUE(result().isNil()); runLua(R"( - local foo = test.BoomyClass() + local foo = test.BoomyClass.new() result = foo:null() )"); EXPECT_TRUE(result().isNil()); runLua(R"( - local foo = test.BoomyClass() + local foo = test.BoomyClass.new() result = foo:twochars("aaa", nil) )"); ASSERT_TRUE(result().isString()); EXPECT_EQ("aaa", result()); runLua(R"( - local foo = test.BoomyClass() + local foo = test.BoomyClass.new() result = foo:twochars("aaa", "bbb") )"); ASSERT_TRUE(result().isString()); @@ -1251,20 +1251,20 @@ TEST_F(LuaBridgeTest, BooleanNoValue) #if !LUABRIDGE_STRICT_STACK_CONVERSIONS // Non-strict mode: no value at the argument index is accepted as false via lua_toboolean - runLua("local foo = test.ConstructibleFromBool(); result = foo:val()"); + runLua("local foo = test.ConstructibleFromBool.new(); result = foo:val()"); ASSERT_TRUE(result().isBool()); EXPECT_FALSE(result()); #else // Strict mode: missing bool argument must fail #if LUABRIDGE_HAS_EXCEPTIONS - EXPECT_THROW(runLua("local foo = test.ConstructibleFromBool(); result = foo:val()"), std::runtime_error); + EXPECT_THROW(runLua("local foo = test.ConstructibleFromBool.new(); result = foo:val()"), std::runtime_error); #else - EXPECT_FALSE(runLua("local foo = test.ConstructibleFromBool(); result = foo:val()")); + EXPECT_FALSE(runLua("local foo = test.ConstructibleFromBool.new(); result = foo:val()")); #endif #endif // Passing false explicitly must work - runLua("local foo = test.ConstructibleFromBool(false); result = foo:val()"); + runLua("local foo = test.ConstructibleFromBool.new(false); result = foo:val()"); ASSERT_TRUE(result().isBool()); EXPECT_FALSE(result()); } diff --git a/Tests/Source/Tests.lua b/Tests/Source/Tests.lua index 7bc4aa9b..2653f05b 100644 --- a/Tests/Source/Tests.lua +++ b/Tests/Source/Tests.lua @@ -63,10 +63,10 @@ A.testStaticProp2 = 49; assert(testAFnCalled(FN_STATIC_PROPSET) and A.te -- test classes registered from C++ -object1 = A("object1"); assert(testAFnCalled(FN_CTOR)); +object1 = A.new("object1"); assert(testAFnCalled(FN_CTOR)); object1:testVirtual(); assert(testAFnCalled(FN_VIRTUAL)); -object2 = B("object2"); assert(testAFnCalled(FN_CTOR) and testBFnCalled(FN_CTOR)); +object2 = B.new("object2"); assert(testAFnCalled(FN_CTOR) and testBFnCalled(FN_CTOR)); object2:testVirtual(); assert(testBFnCalled(FN_VIRTUAL) and not testAFnCalled(FN_VIRTUAL)); -- test functions taking and returning objects diff --git a/Tests/Source/UnorderedMapTests.cpp b/Tests/Source/UnorderedMapTests.cpp index 114dcf31..fb1a2b70 100644 --- a/Tests/Source/UnorderedMapTests.cpp +++ b/Tests/Source/UnorderedMapTests.cpp @@ -199,7 +199,7 @@ TEST_F(UnorderedMapTests, PassFromLua) { resetResult(); - runLua("result = processValues ({[Data (-1)] = Data (2)})"); + runLua("result = processValues ({[Data.new(-1)] = Data.new(2)})"); std::unordered_map expected{{Data(-1), Data(2)}}; const auto actual = result>(); ASSERT_EQ(expected, actual); @@ -207,7 +207,7 @@ TEST_F(UnorderedMapTests, PassFromLua) { resetResult(); - runLua("result = processPointers ({[Data (3)] = Data (-4)})"); + runLua("result = processPointers ({[Data.new(3)] = Data.new(-4)})"); std::unordered_map expected{{Data(3), Data(-4)}}; const auto actual = result>(); ASSERT_EQ(expected, actual); diff --git a/Tests/Source/UserdataTests.cpp b/Tests/Source/UserdataTests.cpp index 3b34b1e6..196d3d00 100644 --- a/Tests/Source/UserdataTests.cpp +++ b/Tests/Source/UserdataTests.cpp @@ -57,28 +57,28 @@ struct UserDataTest : TestBase TEST_F(UserDataTest, Object) { - runLua("object = TestClass(123); result = testFunctionObject(object)"); + runLua("object = TestClass.new(123); result = testFunctionObject(object)"); ASSERT_EQ(result(), 123); } TEST_F(UserDataTest, ObjectConst) { - runLua("object = TestClass(123); result = testFunctionObjectConst(object)"); + runLua("object = TestClass.new(123); result = testFunctionObjectConst(object)"); ASSERT_EQ(result(), 123); } TEST_F(UserDataTest, Ref) { - runLua("object = TestClass(123); result = testFunctionRef(object)"); + runLua("object = TestClass.new(123); result = testFunctionRef(object)"); ASSERT_EQ(result(), 123); } TEST_F(UserDataTest, RefConst) { - runLua("object = TestClass(123); result = testFunctionRefConst(object)"); + runLua("object = TestClass.new(123); result = testFunctionRefConst(object)"); ASSERT_EQ(result(), 123); } @@ -246,21 +246,21 @@ TEST_F(TypeResultErrorHandlingTest, MemberFunctionWithNil) // Test 5: Verify correct behavior with valid object TEST_F(TypeResultErrorHandlingTest, ValidObjectPropertyAccess) { - runLua("obj = ClassWithProperties(); result = obj.value"); + runLua("obj = ClassWithProperties.new(); result = obj.value"); ASSERT_EQ(result(), 42); } // Test 6: Verify correct behavior with property setter TEST_F(TypeResultErrorHandlingTest, ValidObjectPropertySetter) { - runLua("obj = ClassWithProperties(); obj.value = 99; result = obj.value"); + runLua("obj = ClassWithProperties.new(); obj.value = 99; result = obj.value"); ASSERT_EQ(result(), 99); } // Test 7: Verify correct behavior with member function TEST_F(TypeResultErrorHandlingTest, ValidObjectMemberFunction) { - runLua("obj = ClassWithProperties(); result = obj:callSomething(21)"); + runLua("obj = ClassWithProperties.new(); result = obj:callSomething(21)"); ASSERT_EQ(result(), 42); } @@ -268,10 +268,10 @@ TEST_F(TypeResultErrorHandlingTest, ValidObjectMemberFunction) TEST_F(TypeResultErrorHandlingTest, WrongTypeToMemberFunction) { #if LUABRIDGE_HAS_EXCEPTIONS - runLua("obj = ClassWithProperties()"); // Setup valid object + runLua("obj = ClassWithProperties.new()"); // Setup valid object ASSERT_THROW(runLua("result = obj:callSomething('string')"), std::runtime_error); #else - runLua("obj = ClassWithProperties()"); + runLua("obj = ClassWithProperties.new()"); auto [result, errorMsg] = runLuaCaptureError("result = obj:callSomething('string')"); ASSERT_FALSE(result); #endif @@ -291,7 +291,7 @@ TEST_F(TypeResultErrorHandlingTest, UnregisteredClassError) // Test 10: Nil handling consistency across different property access patterns TEST_F(TypeResultErrorHandlingTest, PropertyAccessConsistency) { - runLua("obj = ClassWithProperties(); " + runLua("obj = ClassWithProperties.new(); " "v1 = obj.value; " "result = (v1 == 42)"); @@ -301,7 +301,7 @@ TEST_F(TypeResultErrorHandlingTest, PropertyAccessConsistency) // Test 11: Multiple operations in sequence to verify stack management TEST_F(TypeResultErrorHandlingTest, SequentialPropertyAccess) { - runLua("obj = ClassWithProperties(); " + runLua("obj = ClassWithProperties.new(); " "v1 = obj.value; " "obj.value = 50; " "v2 = obj.value; " @@ -313,10 +313,10 @@ TEST_F(TypeResultErrorHandlingTest, SequentialPropertyAccess) // Test 12: Verify error when passing wrong object type to function expecting specific class TEST_F(TypeResultErrorHandlingTest, WrongClassTypeError) { - runLua("obj = ClassWithProperties()"); - + runLua("obj = ClassWithProperties.new()"); + #if LUABRIDGE_HAS_EXCEPTIONS - ASSERT_THROW(runLua("otherObj = TestClass(10)"), std::runtime_error); + ASSERT_THROW(runLua("otherObj = TestClass.new(10)"), std::runtime_error); #else // This test mainly checks that registering TestClass succeeds EXPECT_TRUE(true); diff --git a/Tests/Source/VectorTests.cpp b/Tests/Source/VectorTests.cpp index 435c01dc..2e8d09d1 100644 --- a/Tests/Source/VectorTests.cpp +++ b/Tests/Source/VectorTests.cpp @@ -109,12 +109,12 @@ TEST_F(VectorTests, PassFromLua) .addFunction("processPointers", &processPointers); resetResult(); - runLua("result = processValues ({Data (-1), Data (2)})"); + runLua("result = processValues ({Data.new(-1), Data.new(2)})"); ASSERT_EQ(std::vector({-1, 2}), result>()); resetResult(); - runLua("result = processPointers ({Data (-3), Data (4)})"); + runLua("result = processPointers ({Data.new(-3), Data.new(4)})"); ASSERT_EQ(std::vector({-3, 4}), result>()); } From 294b9d8ff112d75046378ee2c1f34080d650f11f Mon Sep 17 00:00:00 2001 From: kunitoki Date: Thu, 9 Apr 2026 14:19:02 +0200 Subject: [PATCH 2/4] Fix issue --- Distribution/LuaBridge/LuaBridge.h | 3 +-- Source/LuaBridge/detail/CFunctions.h | 3 +-- Tests/Source/ClassTests.cpp | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Distribution/LuaBridge/LuaBridge.h b/Distribution/LuaBridge/LuaBridge.h index a8bd954f..8879905e 100644 --- a/Distribution/LuaBridge/LuaBridge.h +++ b/Distribution/LuaBridge/LuaBridge.h @@ -8003,8 +8003,7 @@ bool overload_check_args_impl(lua_State* L, int start, std::index_sequence template bool overload_check_args(lua_State* L, int start) { - return overload_check_args_impl(L, start, - std::make_index_sequence>{}); + return overload_check_args_impl(L, start, std::make_index_sequence>{}); } template diff --git a/Source/LuaBridge/detail/CFunctions.h b/Source/LuaBridge/detail/CFunctions.h index 3347b2a4..6b0c9464 100644 --- a/Source/LuaBridge/detail/CFunctions.h +++ b/Source/LuaBridge/detail/CFunctions.h @@ -1981,8 +1981,7 @@ bool overload_check_args_impl(lua_State* L, int start, std::index_sequence template bool overload_check_args(lua_State* L, int start) { - return overload_check_args_impl(L, start, - std::make_index_sequence>{}); + return overload_check_args_impl(L, start, std::make_index_sequence>{}); } /** diff --git a/Tests/Source/ClassTests.cpp b/Tests/Source/ClassTests.cpp index d85a374f..f01f2ff7 100644 --- a/Tests/Source/ClassTests.cpp +++ b/Tests/Source/ClassTests.cpp @@ -3392,7 +3392,7 @@ TEST_F(ClassTests, BugWithLuauNotPrintingClassConstructorNameInErrors) )"); EXPECT_FALSE(result); - EXPECT_TRUE(error.find("ClassWithMethod") != std::string::npos); + EXPECT_TRUE(error.find("new") != std::string::npos); } TEST_F(ClassTests, BugWithLuauNotPrintingClassMethodNameInErrors) From 0383b7d6b6fd2d5de037eae872430e9a1c9c04dc Mon Sep 17 00:00:00 2001 From: kunitoki Date: Thu, 9 Apr 2026 15:26:15 +0200 Subject: [PATCH 3/4] More fixes --- Distribution/LuaBridge/LuaBridge.h | 30 ++++++++++++++--------------- Source/LuaBridge/detail/Namespace.h | 30 ++++++++++++++--------------- Tests/Source/ClassTests.cpp | 2 -- Tests/Source/Tests.cpp | 8 ++++---- 4 files changed, 34 insertions(+), 36 deletions(-) diff --git a/Distribution/LuaBridge/LuaBridge.h b/Distribution/LuaBridge/LuaBridge.h index 8879905e..95fb0ab8 100644 --- a/Distribution/LuaBridge/LuaBridge.h +++ b/Distribution/LuaBridge/LuaBridge.h @@ -13369,13 +13369,13 @@ class Namespace : public detail::Registrar entry.paramTypes = detail::reflect_param_type_names(); overload_set->entries.push_back(std::move(entry)); - lua_pushcclosure_x(L, &detail::constructor_placement_proxy, className, 1); + lua_pushcclosure_x(L, &detail::constructor_placement_proxy, "new", 1); } (), ...); #else ([&] { - lua_pushcclosure_x(L, &detail::constructor_placement_proxy>, className, 0); + lua_pushcclosure_x(L, &detail::constructor_placement_proxy>, "new", 0); } (), ...); #endif @@ -13406,12 +13406,12 @@ class Namespace : public detail::Registrar ([&] { - lua_pushcclosure_x(L, &detail::constructor_placement_proxy>, className, 0); + lua_pushcclosure_x(L, &detail::constructor_placement_proxy>, "new", 0); lua_rawseti(L, -2, idx++); } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, "new", 2); } rawsetfield(L, -2, "new"); @@ -13453,10 +13453,10 @@ class Namespace : public detail::Registrar } lua_newuserdata_aligned(L, F(detail::get_underlying(std::move(functions)))); - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 2); + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 2); #else lua_newuserdata_aligned(L, F(detail::get_underlying(std::move(functions)))); - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 1); #endif } (), ...); } @@ -13503,12 +13503,12 @@ class Namespace : public detail::Registrar using F = detail::constructor_forwarder; lua_newuserdata_aligned(L, F(detail::get_underlying(std::move(functions)))); - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 1); lua_rawseti(L, -2, idx++); } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, "new", 2); } rawsetfield(L, -2, "new"); @@ -13526,7 +13526,7 @@ class Namespace : public detail::Registrar { ([&] { - lua_pushcclosure_x(L, &detail::constructor_container_proxy>, className, 0); + lua_pushcclosure_x(L, &detail::constructor_container_proxy>, "new", 0); } (), ...); } @@ -13552,12 +13552,12 @@ class Namespace : public detail::Registrar ([&] { - lua_pushcclosure_x(L, &detail::constructor_container_proxy>, className, 0); + lua_pushcclosure_x(L, &detail::constructor_container_proxy>, "new", 0); lua_rawseti(L, -2, idx++); } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, "new", 2); } rawsetfield(L, -2, "new"); @@ -13580,7 +13580,7 @@ class Namespace : public detail::Registrar using F = detail::container_forwarder; lua_newuserdata_aligned(L, F(std::move(functions))); - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 1); } (), ...); } @@ -13617,12 +13617,12 @@ class Namespace : public detail::Registrar using F = detail::container_forwarder; lua_newuserdata_aligned(L, F(std::move(functions))); - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 1); lua_rawseti(L, -2, idx++); } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, "new", 2); } rawsetfield(L, -2, "new"); @@ -13657,7 +13657,7 @@ class Namespace : public detail::Registrar using F = detail::factory_forwarder; lua_newuserdata_aligned(L, F(std::move(allocator), std::move(deallocator))); - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 1); rawsetfield(L, -2, "new"); return *this; diff --git a/Source/LuaBridge/detail/Namespace.h b/Source/LuaBridge/detail/Namespace.h index 0be86a3e..213f6053 100644 --- a/Source/LuaBridge/detail/Namespace.h +++ b/Source/LuaBridge/detail/Namespace.h @@ -1294,13 +1294,13 @@ class Namespace : public detail::Registrar overload_set->entries.push_back(std::move(entry)); // OverloadSet is at stack top (upvalue[1]); constructor_placement_proxy ignores it. - lua_pushcclosure_x(L, &detail::constructor_placement_proxy, className, 1); + lua_pushcclosure_x(L, &detail::constructor_placement_proxy, "new", 1); } (), ...); #else ([&] { - lua_pushcclosure_x(L, &detail::constructor_placement_proxy>, className, 0); + lua_pushcclosure_x(L, &detail::constructor_placement_proxy>, "new", 0); } (), ...); #endif @@ -1332,12 +1332,12 @@ class Namespace : public detail::Registrar ([&] { - lua_pushcclosure_x(L, &detail::constructor_placement_proxy>, className, 0); + lua_pushcclosure_x(L, &detail::constructor_placement_proxy>, "new", 0); lua_rawseti(L, -2, idx++); } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, "new", 2); } rawsetfield(L, -2, "new"); @@ -1389,10 +1389,10 @@ class Namespace : public detail::Registrar } // OverloadSet is now at stack top (upvalue[1]). lua_newuserdata_aligned(L, F(detail::get_underlying(std::move(functions)))); // upvalue[2] - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 2); + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 2); #else lua_newuserdata_aligned(L, F(detail::get_underlying(std::move(functions)))); // Stack: co, cl, st, upvalue - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); // Stack: co, cl, st, function + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 1); // Stack: co, cl, st, function #endif } (), ...); } @@ -1440,12 +1440,12 @@ class Namespace : public detail::Registrar using F = detail::constructor_forwarder; lua_newuserdata_aligned(L, F(detail::get_underlying(std::move(functions)))); - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 1); lua_rawseti(L, -2, idx++); } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, "new", 2); } rawsetfield(L, -2, "new"); // Stack: co, cl, st @@ -1467,7 +1467,7 @@ class Namespace : public detail::Registrar { ([&] { - lua_pushcclosure_x(L, &detail::constructor_container_proxy>, className, 0); + lua_pushcclosure_x(L, &detail::constructor_container_proxy>, "new", 0); } (), ...); } @@ -1494,12 +1494,12 @@ class Namespace : public detail::Registrar ([&] { - lua_pushcclosure_x(L, &detail::constructor_container_proxy>, className, 0); + lua_pushcclosure_x(L, &detail::constructor_container_proxy>, "new", 0); lua_rawseti(L, -2, idx++); } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, "new", 2); } rawsetfield(L, -2, "new"); @@ -1528,7 +1528,7 @@ class Namespace : public detail::Registrar using F = detail::container_forwarder; lua_newuserdata_aligned(L, F(std::move(functions))); // Stack: co, cl, st, upvalue - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); // Stack: co, cl, st, function + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 1); // Stack: co, cl, st, function } (), ...); } @@ -1566,12 +1566,12 @@ class Namespace : public detail::Registrar using F = detail::container_forwarder; lua_newuserdata_aligned(L, F(std::move(functions))); - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 1); lua_rawseti(L, -2, idx++); } (), ...); - lua_pushcclosure_x(L, &detail::try_overload_functions, className, 2); + lua_pushcclosure_x(L, &detail::try_overload_functions, "new", 2); } rawsetfield(L, -2, "new"); // Stack: co, cl, st @@ -1616,7 +1616,7 @@ class Namespace : public detail::Registrar using F = detail::factory_forwarder; lua_newuserdata_aligned(L, F(std::move(allocator), std::move(deallocator))); // Stack: co, cl, st, upvalue - lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, className, 1); // Stack: co, cl, st, function + lua_pushcclosure_x(L, &detail::invoke_proxy_constructor, "new", 1); // Stack: co, cl, st, function rawsetfield(L, -2, "new"); // Stack: co, cl, st return *this; diff --git a/Tests/Source/ClassTests.cpp b/Tests/Source/ClassTests.cpp index f01f2ff7..dd58236a 100644 --- a/Tests/Source/ClassTests.cpp +++ b/Tests/Source/ClassTests.cpp @@ -3382,7 +3382,6 @@ TEST_F(ClassTests, BugWithLuauNotPrintingClassConstructorNameInErrors) .beginNamespace("foo") .beginClass("ClassWithMethod") .addConstructor() - .addFunction("methodWithError", &ClassWithMethod::methodWithError) .endClass() .endNamespace(); @@ -3400,7 +3399,6 @@ TEST_F(ClassTests, BugWithLuauNotPrintingClassMethodNameInErrors) luabridge::getGlobalNamespace(L) .beginNamespace("foo") .beginClass("ClassWithMethod") - .addConstructor() .addFunction("methodWithError", &ClassWithMethod::methodWithError) .endClass() .endNamespace(); diff --git a/Tests/Source/Tests.cpp b/Tests/Source/Tests.cpp index 0095a98f..4f587cc6 100644 --- a/Tests/Source/Tests.cpp +++ b/Tests/Source/Tests.cpp @@ -751,13 +751,13 @@ TEST_F(LuaBridgeTest, InvokePassingUnregisteredClassShouldThrowAndRestoreStack) auto f1 = luabridge::getGlobal(L, "f1"); #if LUABRIDGE_HAS_EXCEPTIONS - EXPECT_THROW(f1.call(unregistered), luabridge::LuaException); + EXPECT_THROW(f1.call(unregistered), luabridge::LuaException); #else int stackTop = lua_gettop(L); - auto result = f1.call(unregistered); - EXPECT_FALSE(result); - EXPECT_EQ(luabridge::makeErrorCode(luabridge::ErrorCode::ClassNotRegistered), result.error()); + auto result = f1.call(unregistered); + EXPECT_FALSE(result); + EXPECT_EQ(luabridge::makeErrorCode(luabridge::ErrorCode::ClassNotRegistered), result.error()); EXPECT_EQ(stackTop, lua_gettop(L)); #endif From d92f934b41d28afa5620014294b417c147479e86 Mon Sep 17 00:00:00 2001 From: kunitoki Date: Thu, 9 Apr 2026 15:42:31 +0200 Subject: [PATCH 4/4] Fix coroutines tests --- Tests/Source/CoroutineTests.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Tests/Source/CoroutineTests.cpp b/Tests/Source/CoroutineTests.cpp index d31d4091..747c5eb3 100644 --- a/Tests/Source/CoroutineTests.cpp +++ b/Tests/Source/CoroutineTests.cpp @@ -1084,7 +1084,7 @@ TEST_F(CppCoroutineClassTests, MemberCoroutine_NonConst) .endClass(); ASSERT_TRUE(runLua( - "local obj = Counter()\n" + "local obj = Counter.new()\n" "local f = coroutine.wrap(Counter.generate)\n" "a = f(obj, 3)\n" "b = f()\n" @@ -1115,7 +1115,7 @@ TEST_F(CppCoroutineClassTests, MemberCoroutine_ConstAccessible) .endClass(); ASSERT_TRUE(runLua( - "local obj = Counter()\n" + "local obj = Counter.new()\n" "local f = coroutine.wrap(Counter.peek)\n" "first = f(obj)\n" "second = f()\n" @@ -1141,7 +1141,7 @@ TEST_F(CppCoroutineClassTests, MemberCoroutine_MultipleYields) .endClass(); ASSERT_TRUE(runLua( - "local obj = Counter()\n" + "local obj = Counter.new()\n" "local f = coroutine.wrap(Counter.count)\n" "a = f(obj)\n" "b = f()\n" @@ -1171,7 +1171,7 @@ TEST_F(CppCoroutineClassTests, MemberCoroutine_VoidReturn) .endClass(); ASSERT_TRUE(runLua( - "local obj = Counter()\n" + "local obj = Counter.new()\n" "local f = coroutine.wrap(Counter.stamp)\n" "f(obj)\n" "result = obj.value\n" @@ -1198,7 +1198,7 @@ TEST_F(CppCoroutineClassTests, MemberCoroutine_AbandonedNoLeak) .endClass(); ASSERT_TRUE(runLua( - "local obj = Counter()\n" + "local obj = Counter.new()\n" "local f = coroutine.wrap(Counter.guarded)\n" "first = f(obj)\n" )); @@ -1309,7 +1309,7 @@ TEST_F(CppCoroutineClassTests, MemberCoroutine_ExceptionOnFirstResume) .endClass(); ASSERT_TRUE(runLua( - "local obj = Counter()\n" + "local obj = Counter.new()\n" "local ok, err = pcall(coroutine.wrap(Counter.boom), obj)\n" "success = ok\n" "errmsg = err\n" @@ -1334,7 +1334,7 @@ TEST_F(CppCoroutineClassTests, MemberCoroutine_ExceptionOnContinuation) .endClass(); ASSERT_TRUE(runLua( - "local obj = Counter()\n" + "local obj = Counter.new()\n" "local f = coroutine.wrap(Counter.boom2)\n" "first = f(obj)\n" "local ok, err = pcall(f)\n" @@ -1384,7 +1384,7 @@ TEST_F(CppCoroutineClassTests, MemberCoroutine_ResumeAfterDone) .endClass(); ASSERT_TRUE(runLua( - "local obj = Counter()\n" + "local obj = Counter.new()\n" "local f = coroutine.wrap(Counter.once)\n" "result = f(obj)\n" // finishes immediately "local ok, err = pcall(f)\n" // second resume on dead coroutine