PorygonLang/tests/integration/UserDataTests.cpp

120 lines
3.9 KiB
C++

#ifdef TESTS_BUILD
#include <catch.hpp>
#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:
#define TYPE UserDataTestObject
PORYGON_PREPARE_FUNCTION(TYPE, getFoo, IntegerEvalValue)
PORYGON_PREPARE_FUNCTION(TYPE, Addition, IntegerEvalValue, (par[0] -> EvaluateInteger()), (par[1] -> EvaluateInteger()))
public:
PORYGON_USERDATA(
PORYGON_INTEGER_FIELD(TYPE, foo)
PORYGON_INTEGER_FUNCTION(TYPE, getFoo)
PORYGON_INTEGER_FUNCTION(TYPE, 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