Files
RuntimeBuilder/Tests/Unit1.pas
2018-06-26 22:08:36 +03:00

108 lines
2.9 KiB
ObjectPascal

unit Unit1;
interface
uses
System.SysUtils,DUnitX.TestFramework,RuntimeBuilder,RuntimeBuilder.Fasm,RuntimeBuilder.Lua;
type
[TestFixture]
TRuntimeBuilderTestObject=class(TObject)
public
[TestCase]
procedure FasmTest();
[TestCase]
procedure LuaTest();
end;
implementation
procedure TRuntimeBuilderTestObject.FasmTest();
var
Fasm:TRTBFasmCompiler;
Src:TRTBSource;
Module:TRTBModule;
Func1,Func2,Func3:TRTBFunc;
Var1:TRTBVar;
begin
Fasm:=TRTBFasmCompiler.Create('..\..\..\lib\FasmOnDelphi\fasmw172\fasm');
Src:=Fasm.GenNewSrc;
with Src do
begin
Text:='main:'+sLineBreak+
'pop ecx'+sLineBreak+
'pop eax'+sLineBreak+
'jmp ecx'+sLineBreak+
'Pmain dd 0'+sLineBreak+
'varmain:'+sLineBreak+
'mov eax,[Pmain]'+sLineBreak+
'ret'+sLineBreak+
'callbacktest:'+sLineBreak+
'push 80'+sLineBreak+
'call CallBack'+sLineBreak+
'ret';
RegisterFunction('','main');
RegisterFunction('','varmain');
RegisterFunction('','callbacktest');
AddCallBack('','CallBack',function(arg:array of const):TRTBCallBackOut
begin
Result:=arg[0];
end);
Register('','Pmain',TypeInfo(integer));
end;
Module:=Src.Compilate;
Func1:=Module.Funtion['main'];
Func2:=Module.Funtion['varmain'];
Func3:=Module.Funtion['callbacktest'];
if 454<>Func1.Call(TypeInfo(integer),[454],CRTBCallTypeStdCall).AsInteger then
raise Exception.Create('Error in FasmTest');
Var1:=Module.&Var['Pmain'];
Var1.Val:=424;
if Var1.Val.AsInteger<>Func2.Call(TypeInfo(integer),[],CRTBCallTypeStdCall).AsInteger then
raise Exception.Create('Error in FasmTest');
if PByte(Func3.Call(TypeInfo(integer),[],CRTBCallTypeStdCall).AsInteger)^<>80 then
raise Exception.Create('Error in FasmTest');
FreeAndNil(Var1);
FreeAndNil(Func3);
FreeAndNil(Func2);
FreeAndNil(Func1);
FreeAndNil(module);
FreeAndNil(Src);
FreeAndNil(Fasm);
end;
procedure TRuntimeBuilderTestObject.LuaTest();
var
Lua:TRTBLuaCompiler;
Src:TRTBSource;
Module:TRTBModule;
Func1,Func2:TRTBFunc;
//Var1:TRTBVar;
begin
Lua:=TRTBLuaCompiler.Create();
Src:=Lua.GenNewSrc;
Src.Text:='function main(n)'+sLineBreak+' return n'+sLineBreak+'end';
//Src.RegisterFunction('','main');
//Src.RegisterFunction('','varmain');
//Src.Register('','Pmain',TypeInfo(integer));
Module:=Src.Compilate;
Func1:=Module.Funtion['main'];
//Func2:=Module.Funtion['varmain'];
if 1<>Func1.Call(TypeInfo(integer),[454],CRTBCallTypeStdCall).AsInteger then
raise Exception.Create('Error in LuaTest');
//Var1:=Module.&Var['Pmain'];
//Var1.Val:=424;
//if Var1.Val.AsInteger<>Func2.Call(TypeInfo(integer),[],CRTBCallTypeStdCall).AsInteger then
// raise Exception.Create('Error in LuaTest');
//FreeAndNil(Var1);
//FreeAndNil(Func2);
FreeAndNil(Func1);
FreeAndNil(module);
FreeAndNil(Src);
FreeAndNil(Lua);
end;
initialization
TDUnitX.RegisterTestFixture(TRuntimeBuilderTestObject);
end.