Template helpers to help define UserData types
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2019-06-28 17:02:38 +02:00
parent 0d63543ff4
commit 88ea4ed8cd
3 changed files with 106 additions and 57 deletions

View File

@@ -7,6 +7,7 @@
#include "../../src/UserData/UserDataValue.hpp"
#include "../../src/UserData/UserDataFunction.hpp"
#include "../../src/UserData/UserDataFunctionType.hpp"
#include "../../src/UserData/UserDataTemplates.hpp"
using namespace Porygon;
using namespace Porygon::UserData;
@@ -23,65 +24,20 @@ public:
return a + b;
}
// Declare script properties
private:
static EvalValue* GetFoo(void* obj){
return new IntegerEvalValue(((UserDataTestObject*)obj)->foo);
}
static void SetFoo(void* obj, EvalValue* val){
((UserDataTestObject*)obj)->foo = val->EvaluateInteger();
}
static EvalValue* CallFooFunction(void* obj, EvalValue* parameters[], int parameterCount){
return new IntegerEvalValue(((UserDataTestObject*)obj)->getFoo());
}
static EvalValue* GetFooFunction(void* obj){
return new UserDataFunction(CallFooFunction, obj);
}
static EvalValue* CallAddition(void* obj, EvalValue* parameters[], int parameterCount){
return new IntegerEvalValue(((UserDataTestObject*)obj)->Addition(
parameters[0] -> EvaluateInteger(),
parameters[1] -> EvaluateInteger()
));
}
static GenericFunctionScriptType* AdditionFunctionType();
static EvalValue* GetAdditionFunction(void* obj){
return new UserDataFunction(CallAddition, obj);
}
PORYGON_PREPARE_FUNCTION(UserDataTestObject, getFoo, IntegerEvalValue)
PORYGON_PREPARE_FUNCTION(UserDataTestObject, Addition, IntegerEvalValue, (parameters[0] -> EvaluateInteger()), (parameters[1] -> EvaluateInteger()))
public:
static Porygon::UserData::UserData* CreateData(){
return new Porygon::UserData::UserData({
{
HashedString::ConstHash("foo"),
new UserDataField(new NumericScriptType(true, false), GetFoo, SetFoo)
},
{
HashedString::ConstHash("getFoo"),
new UserDataField(new UserDataFunctionType(make_shared<NumericScriptType>(true, false), {}), GetFooFunction, nullptr)
},
{
HashedString::ConstHash("Addition"),
new UserDataField(AdditionFunctionType(), GetAdditionFunction, nullptr)
}
});
}
PORYGON_USERDATA_START()
PORYGON_INTEGER_FIELD(UserDataTestObject, foo)
PORYGON_INTEGER_FUNCTION(UserDataTestObject, getFoo)
PORYGON_INTEGER_FUNCTION(UserDataTestObject, Addition, PORYGON_INTEGER_TYPE, PORYGON_INTEGER_TYPE)
PORYGON_USERDATA_END()
};
GenericFunctionScriptType* UserDataTestObject::AdditionFunctionType(){
return new UserDataFunctionType(make_shared<NumericScriptType>(true, false),
vector<shared_ptr<ScriptType>>{
make_shared<NumericScriptType>(true, false),
make_shared<NumericScriptType>(true, false)
});
}
TEST_CASE( "Gets UserData value", "[integration]" ) {
UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::CreateData());
UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::__createUserData());
Script* script = Script::Create(R"(
function testFunc(testObject obj)
return obj["foo"]
@@ -101,7 +57,7 @@ end
}
TEST_CASE( "Sets UserData value", "[integration]" ) {
UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::CreateData());
UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::__createUserData());
Script* script = Script::Create(R"(
function testFunc(testObject obj)
obj["foo"] = 5000
@@ -120,7 +76,7 @@ end
}
TEST_CASE( "Calls UserData function", "[integration]" ) {
UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::CreateData());
UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::__createUserData());
Script* script = Script::Create(R"(
function testFunc(testObject obj)
return obj.getFoo()
@@ -139,7 +95,7 @@ end
}
TEST_CASE( "Calls UserData function with parameters", "[integration]" ) {
UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::CreateData());
UserDataStorage::RegisterType(HashedString::ConstHash("testObject"), UserDataTestObject::__createUserData());
Script* script = Script::Create(R"(
function testFunc(testObject obj)
return obj.Addition(5046, 8432)