#ifdef TESTS_BUILD #include #include "../src/Script.hpp" #include "../../src/UserData/UserData.hpp" #include "../../src/UserData/UserDataStorage.hpp" #include "../../src/UserData/UserDataValue.hpp" #include "../../src/UserData/UserDataFunction.hpp" #include "../../src/UserData/UserDataFunctionType.hpp" #include "../../src/UserData/UserDataTemplates.hpp" #include "../../src/Evaluator/EvalValues/EvalValueHelper.hpp" using namespace Porygon; using namespace Porygon::UserData; using namespace Porygon::Utilities; class UserDataTestObject{ public: int foo = 10; int getFoo(){ return foo; } int Addition(int a, int b){ return a + b; } // Declare script properties private: PORYGON_PREPARE_FUNCTION(UserDataTestObject, getFoo, IntegerEvalValue) PORYGON_PREPARE_FUNCTION(UserDataTestObject, Addition, IntegerEvalValue, (par[0] -> EvaluateInteger()), (par[1] -> EvaluateInteger())) public: PORYGON_USERDATA(UserDataTestObject, PORYGON_INTEGER_FIELD(foo) PORYGON_INTEGER_FUNCTION(getFoo) PORYGON_INTEGER_FUNCTION(Addition, PORYGON_INTEGER_TYPE, PORYGON_INTEGER_TYPE) ) }; TEST_CASE( "Gets UserData value", "[integration]" ) { UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::__createUserData()); Script* script = Script::Create(R"( function testFunc(testObject obj) return obj["foo"] end )"); REQUIRE(!script->Diagnostics -> HasErrors()); script->Evaluate(); auto par = new UserDataTestObject(); auto parameter = new UserDataValue(HashedString::ConstHash("testObject"), par); auto variable = script->CallFunction(u"testFunc", {parameter}); REQUIRE(variable != nullptr); REQUIRE(variable->EvaluateInteger() == 10); delete par; delete parameter; delete script; UserDataStorage::ClearTypes(); } TEST_CASE( "Sets UserData value", "[integration]" ) { UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::__createUserData()); Script* script = Script::Create(R"( function testFunc(testObject obj) obj["foo"] = 5000 end )"); REQUIRE(!script->Diagnostics -> HasErrors()); script->Evaluate(); auto obj = new UserDataTestObject(); auto parameter = new UserDataValue(HashedString::ConstHash("testObject"), obj); script->CallFunction(u"testFunc", {parameter}); delete script; REQUIRE(obj->foo == 5000); delete obj; delete parameter; UserDataStorage::ClearTypes(); } TEST_CASE( "Calls UserData function", "[integration]" ) { UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::__createUserData()); Script* script = Script::Create(R"( function testFunc(testObject obj) return obj.getFoo() end )"); REQUIRE(!script->Diagnostics -> HasErrors()); script->Evaluate(); auto obj = new UserDataTestObject(); auto parameter = new UserDataValue(HashedString::ConstHash("testObject"), obj); auto result = script->CallFunction(u"testFunc", {parameter}); REQUIRE(result -> EvaluateInteger() == 10); delete script; delete obj; delete parameter; UserDataStorage::ClearTypes(); } TEST_CASE( "Calls UserData function with parameters", "[integration]" ) { UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::__createUserData()); Script* script = Script::Create(R"( function testFunc(testObject obj) return obj.Addition(5046, 8432) end )"); REQUIRE(!script->Diagnostics -> HasErrors()); script->Evaluate(); auto obj = new UserDataTestObject(); auto parameter = new UserDataValue(HashedString::ConstHash("testObject"), obj); auto result = script->CallFunction(u"testFunc", {parameter}); REQUIRE(result -> EvaluateInteger() == 13478); delete script; delete obj; delete parameter; UserDataStorage::ClearTypes(); } #endif