mirror of
https://github.com/danieleteti/delphimvcframework.git
synced 2024-11-16 08:15:53 +01:00
580 lines
16 KiB
ObjectPascal
580 lines
16 KiB
ObjectPascal
|
unit TestLuaWrapper;
|
|||
|
{
|
|||
|
|
|||
|
Delphi DUnit Test Case
|
|||
|
----------------------
|
|||
|
This unit contains a skeleton test case class generated by the Test Case Wizard.
|
|||
|
Modify the generated code to correctly setup and call the methods from the unit
|
|||
|
being tested.
|
|||
|
|
|||
|
}
|
|||
|
{ .$RTTI EXPLICIT METHODS([vcPublished, vcPublic]) }
|
|||
|
|
|||
|
interface
|
|||
|
|
|||
|
uses
|
|||
|
TestFramework,
|
|||
|
System.Classes,
|
|||
|
LuaBind.Intf,
|
|||
|
LuaBind,
|
|||
|
System.Rtti,
|
|||
|
System.SysUtils;
|
|||
|
|
|||
|
type
|
|||
|
// Test methods for class TLuaEngine
|
|||
|
|
|||
|
TestTLuaEngine = class(TTestCase)
|
|||
|
strict private
|
|||
|
FLuaEngine: TLuaEngine;
|
|||
|
|
|||
|
private
|
|||
|
|
|||
|
public
|
|||
|
procedure SetUp; override;
|
|||
|
procedure TearDown; override;
|
|||
|
|
|||
|
published
|
|||
|
procedure TestLoadScript;
|
|||
|
procedure TestLoadScript1;
|
|||
|
procedure TestLoadFromFile;
|
|||
|
procedure TestDeclareGlobalNil;
|
|||
|
procedure TestDeclareGlobalNumber;
|
|||
|
procedure TestDeclareGlobalInteger;
|
|||
|
procedure TestDeclareGlobalString;
|
|||
|
procedure TestDeclareGlobalBoolean;
|
|||
|
procedure TestDeclareGlobalLightUserData;
|
|||
|
procedure TestDeclareGlobalUserData;
|
|||
|
/// /////
|
|||
|
procedure TestDeclareGlobalFunction;
|
|||
|
procedure TestGetGlobal;
|
|||
|
|
|||
|
/// ///test core extensions
|
|||
|
procedure TestExposeDataSet;
|
|||
|
procedure TestExposeDelphiObject;
|
|||
|
procedure TestExposeDelphiObjectNoDeps;
|
|||
|
procedure TestExposeVCLDelphiObject;
|
|||
|
procedure TestExposeVCLDelphiObjectSetProperty;
|
|||
|
procedure TestCreateDelphiObject;
|
|||
|
procedure TestCreateDelphiObjectWithWringConstructor;
|
|||
|
|
|||
|
/// ///// test helper pusher
|
|||
|
procedure TestPushTableWithIntegerKeys;
|
|||
|
procedure TestPushTableWithStringKeys;
|
|||
|
procedure TestPushTableWithTValueValues;
|
|||
|
procedure TestPushTableFromCompoundObject;
|
|||
|
|
|||
|
/// ////
|
|||
|
procedure TestExecuteFunction;
|
|||
|
|
|||
|
procedure TestMyDirtyTests;
|
|||
|
|
|||
|
end;
|
|||
|
|
|||
|
implementation
|
|||
|
|
|||
|
uses
|
|||
|
System.IOUtils,
|
|||
|
LuaBind.CustomType.DataSet,
|
|||
|
Datasnap.DBClient,
|
|||
|
LuaBind.CustomType.PODO,
|
|||
|
LuaBind.CustomType.UserType,
|
|||
|
System.Generics.Collections,
|
|||
|
TestObjects;
|
|||
|
|
|||
|
procedure TestTLuaEngine.SetUp;
|
|||
|
begin
|
|||
|
FLuaEngine := TLuaEngine.Create;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TearDown;
|
|||
|
begin
|
|||
|
FLuaEngine.Free;
|
|||
|
FLuaEngine := nil;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestLoadScript;
|
|||
|
var
|
|||
|
AScript: AnsiString;
|
|||
|
begin
|
|||
|
FLuaEngine.LoadScript(AScript);
|
|||
|
FLuaEngine.Execute;
|
|||
|
|
|||
|
FLuaEngine.LoadScript('local x = 1+2+3;');
|
|||
|
FLuaEngine.Execute;
|
|||
|
|
|||
|
ExpectedException := ELuaRuntimeException;
|
|||
|
FLuaEngine.LoadScript('local x = pippo.makeBooom();');
|
|||
|
FLuaEngine.Execute;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestLoadScript1;
|
|||
|
var
|
|||
|
AStream: TStream;
|
|||
|
begin
|
|||
|
AStream := TFile.OpenRead('test_01.lua');
|
|||
|
FLuaEngine.LoadScript(AStream, true);
|
|||
|
FLuaEngine.Execute;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestMyDirtyTests;
|
|||
|
begin
|
|||
|
FLuaEngine.LoadExternalLibraries(TLuaMyTest.Create);
|
|||
|
FLuaEngine.LoadFromFile('test_mydirtytest.lua');
|
|||
|
FLuaEngine.Execute;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestPushTableFromCompoundObject;
|
|||
|
var
|
|||
|
father, Child: TPerson;
|
|||
|
begin
|
|||
|
father := TPerson.Create;
|
|||
|
try
|
|||
|
father.Child := TPerson.Create;
|
|||
|
try
|
|||
|
father.FirstName := 'Daniele';
|
|||
|
father.LastName := 'Teti';
|
|||
|
father.Age := 32;
|
|||
|
father.Child.FirstName := 'Daniele Son';
|
|||
|
father.Child.LastName := 'Teti';
|
|||
|
father.Child.Age := 2;
|
|||
|
father.Child.Child := nil;
|
|||
|
FLuaEngine.DeclareTable('person', father);
|
|||
|
FLuaEngine.LoadScript
|
|||
|
('s = person.FirstName .. person.LastName .. tostring(person.Age) .. person.Child.FirstName .. person.Child.LastName .. person.Child.Age');
|
|||
|
FLuaEngine.Execute;
|
|||
|
CheckEquals('DanieleTeti32Daniele SonTeti2', FLuaEngine.GetGlobal('s').GetAsString);
|
|||
|
finally
|
|||
|
father.Child.Free;
|
|||
|
end;
|
|||
|
finally
|
|||
|
father.Free;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestPushTableWithIntegerKeys;
|
|||
|
begin
|
|||
|
FLuaEngine.DeclareTable('mytable', [1, 2, 3, 4], ['daniele', 'teti', 'peter', 'parker']);
|
|||
|
FLuaEngine.LoadScript('s = mytable[1]..mytable[2]..mytable[3]..mytable[4]');
|
|||
|
FLuaEngine.Execute;
|
|||
|
CheckEquals('danieletetipeterparker', FLuaEngine.GetGlobal('s').GetAsString)
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestPushTableWithStringKeys;
|
|||
|
begin
|
|||
|
FLuaEngine.DeclareTable('mytable', ['a', 'b', 'c', 'd'], ['daniele', 'teti', 'peter', 'parker']);
|
|||
|
FLuaEngine.LoadScript(
|
|||
|
's1 = mytable["a"] .. mytable["b"] .. mytable["c"] .. mytable["d"];' +
|
|||
|
's2 = mytable.a .. mytable.b .. mytable.c .. mytable.d');
|
|||
|
FLuaEngine.Execute;
|
|||
|
CheckEquals('danieletetipeterparker', FLuaEngine.GetGlobal('s1').GetAsString);
|
|||
|
CheckEquals('danieletetipeterparker', FLuaEngine.GetGlobal('s2').GetAsString)
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestPushTableWithTValueValues;
|
|||
|
var
|
|||
|
dict: TDictionary<TValue, TValue>;
|
|||
|
begin
|
|||
|
dict := TDictionary<TValue, TValue>.Create;
|
|||
|
try
|
|||
|
dict.AddOrSetValue('hello', 'world');
|
|||
|
dict.AddOrSetValue(1234, 'onetwothree');
|
|||
|
dict.AddOrSetValue('yes', true);
|
|||
|
dict.AddOrSetValue('no', false);
|
|||
|
FLuaEngine.DeclareTable('mytable', dict);
|
|||
|
FLuaEngine.LoadScript
|
|||
|
('s = mytable.hello .. mytable[1234] .. tostring(mytable.yes) .. tostring(mytable["no"])');
|
|||
|
FLuaEngine.Execute;
|
|||
|
CheckEquals('worldonetwothreetruefalse', FLuaEngine.GetGlobal('s').GetAsString)
|
|||
|
finally
|
|||
|
dict.Free;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestLoadFromFile;
|
|||
|
begin
|
|||
|
FLuaEngine.LoadFromFile('test_01.lua');
|
|||
|
FLuaEngine.Execute;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestDeclareGlobalNil;
|
|||
|
begin
|
|||
|
FLuaEngine.DeclareGlobalNil('_nil');
|
|||
|
FLuaEngine.LoadScript('');
|
|||
|
FLuaEngine.Execute;
|
|||
|
CheckTrue(FLuaEngine.GetGlobal('_nil').IsNil);
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestDeclareGlobalNumber;
|
|||
|
var
|
|||
|
Value : ILuaValue;
|
|||
|
_tot, _number1, _number2, _number3, _number4: Double;
|
|||
|
begin
|
|||
|
_number1 := 1;
|
|||
|
_number2 := 1.1234;
|
|||
|
_number3 := 1234.5678;
|
|||
|
_number4 := 12345678;
|
|||
|
FLuaEngine.DeclareGlobalNumber('_number1', _number1);
|
|||
|
FLuaEngine.DeclareGlobalNumber('_number2', _number2);
|
|||
|
FLuaEngine.DeclareGlobalNumber('_number3', _number3);
|
|||
|
FLuaEngine.DeclareGlobalNumber('_number4', _number4);
|
|||
|
|
|||
|
FLuaEngine.LoadScript('_tot = _number1 + _number2 + _number3 + _number4;');
|
|||
|
FLuaEngine.Execute;
|
|||
|
Value := FLuaEngine.GetGlobal('_tot');
|
|||
|
|
|||
|
CheckTrue(Value.IsNumber);
|
|||
|
CheckFalse(Value.IsInteger);
|
|||
|
CheckFalse(Value.IsString);
|
|||
|
CheckFalse(Value.IsNil);
|
|||
|
CheckFalse(Value.IsBoolean);
|
|||
|
CheckFalse(Value.IsLightUserData);
|
|||
|
|
|||
|
_tot := _number1 + _number2 + _number3 + _number4;
|
|||
|
CheckTrue(abs(_tot - Value.GetAsNumber) < 0.0001);
|
|||
|
|
|||
|
ExpectedException := ELuaException;
|
|||
|
Value.GetAsString;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestDeclareGlobalInteger;
|
|||
|
var
|
|||
|
Value : ILuaValue;
|
|||
|
_tot, _number1, _number2, _number3, _number4: Integer;
|
|||
|
begin
|
|||
|
_number1 := 1;
|
|||
|
_number2 := 1234;
|
|||
|
_number3 := 12345678;
|
|||
|
_number4 := 12345678;
|
|||
|
FLuaEngine.DeclareGlobalInteger('_number1', _number1);
|
|||
|
FLuaEngine.DeclareGlobalInteger('_number2', _number2);
|
|||
|
FLuaEngine.DeclareGlobalInteger('_number3', _number3);
|
|||
|
FLuaEngine.DeclareGlobalInteger('_number4', _number4);
|
|||
|
|
|||
|
FLuaEngine.LoadScript('_tot = _number1 + _number2 + _number3 + _number4;');
|
|||
|
FLuaEngine.Execute;
|
|||
|
Value := FLuaEngine.GetGlobal('_tot');
|
|||
|
|
|||
|
CheckTrue(Value.IsNumber);
|
|||
|
/// a sum of integers returns a NUMBER result type.. :-(
|
|||
|
CheckFalse(Value.IsInteger);
|
|||
|
CheckFalse(Value.IsString);
|
|||
|
CheckFalse(Value.IsNil);
|
|||
|
CheckFalse(Value.IsBoolean);
|
|||
|
CheckFalse(Value.IsLightUserData);
|
|||
|
|
|||
|
_tot := _number1 + _number2 + _number3 + _number4;
|
|||
|
CheckTrue(abs(_tot - Value.GetAsNumber) < 0.0001);
|
|||
|
|
|||
|
ExpectedException := ELuaException;
|
|||
|
Value.GetAsString;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestDeclareGlobalString;
|
|||
|
var
|
|||
|
Value : ILuaValue;
|
|||
|
_tot, _string1, _string2, _string3, _string4: AnsiString;
|
|||
|
begin
|
|||
|
_string1 := '';
|
|||
|
_string2 := 'hello';
|
|||
|
_string3 := 'Lua';
|
|||
|
_string4 := 'world <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>$%';
|
|||
|
FLuaEngine.DeclareGlobalString('_string1', _string1);
|
|||
|
FLuaEngine.DeclareGlobalString('_string2', _string2);
|
|||
|
FLuaEngine.DeclareGlobalString('_string3', _string3);
|
|||
|
FLuaEngine.DeclareGlobalString('_string4', _string4);
|
|||
|
|
|||
|
FLuaEngine.LoadScript('_tot = _string1 .. _string2 .. _string3 .. _string4;');
|
|||
|
FLuaEngine.Execute;
|
|||
|
Value := FLuaEngine.GetGlobal('_tot');
|
|||
|
|
|||
|
CheckFalse(Value.IsNumber);
|
|||
|
CheckFalse(Value.IsInteger);
|
|||
|
CheckTrue(Value.IsString);
|
|||
|
CheckFalse(Value.IsNil);
|
|||
|
CheckFalse(Value.IsBoolean);
|
|||
|
CheckFalse(Value.IsLightUserData);
|
|||
|
|
|||
|
_tot := _string1 + _string2 + _string3 + _string4;
|
|||
|
CheckEquals('helloLuaworld <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>$%', _tot);
|
|||
|
|
|||
|
ExpectedException := ELuaException;
|
|||
|
Value.GetAsInteger;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestDeclareGlobalUserData;
|
|||
|
begin
|
|||
|
// FLuaEngine.DeclareGlobalUserData('pippo', nil);
|
|||
|
// FLuaEngine.LoadScript('');
|
|||
|
// FLuaEngine.Execute;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestExecuteFunction;
|
|||
|
var
|
|||
|
r: AnsiString;
|
|||
|
begin
|
|||
|
FLuaEngine.LoadScript('function myfunc(a,b,c) return a..b..c end');
|
|||
|
FLuaEngine.Execute;
|
|||
|
r := FLuaEngine.ExecuteFunction('myfunc', ['hello', 'Lua', 'world']).AsString;
|
|||
|
CheckEquals('helloLuaworld', r);
|
|||
|
FLuaEngine.Reset;
|
|||
|
FLuaEngine.LoadFromFile('test_08.lua');
|
|||
|
FLuaEngine.Execute;
|
|||
|
r := FLuaEngine.ExecuteFunction('myfunc', ['hello', 'Lua', 'world']).AsString;
|
|||
|
CheckEquals('helloLuaworld', r);
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestExposeDataSet;
|
|||
|
var
|
|||
|
ds: TClientDataSet;
|
|||
|
_1: string;
|
|||
|
_2: string;
|
|||
|
begin
|
|||
|
ds := TClientDataSet.Create(nil);
|
|||
|
try
|
|||
|
ds.LoadFromFile('samplecds.xml');
|
|||
|
ds.Open;
|
|||
|
FLuaEngine.LoadExternalLibraries(TLuaDataSetExposerLibraries.Create);
|
|||
|
ExposeDataSet(FLuaEngine, ds, 'people');
|
|||
|
FLuaEngine.LoadFromFile('test_02.lua');
|
|||
|
FLuaEngine.Execute;
|
|||
|
finally
|
|||
|
ds.Free;
|
|||
|
end;
|
|||
|
_1 := TFile.ReadAllText('test_02_expected.txt');
|
|||
|
_2 := TFile.ReadAllText('test_02.txt');
|
|||
|
CheckEquals(_1, _2);
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestExposeDelphiObject;
|
|||
|
var
|
|||
|
person: TPerson;
|
|||
|
begin
|
|||
|
person := TPerson.Create;
|
|||
|
try
|
|||
|
FLuaEngine.LoadExternalLibraries(TLuaDelphiObjectExposerLibraries.Create);
|
|||
|
ExposeDelphiObject(FLuaEngine, person, 'person');
|
|||
|
FLuaEngine.LoadFromFile('test_03.lua');
|
|||
|
FLuaEngine.Execute;
|
|||
|
CheckEquals('Teti', FLuaEngine.GetGlobal('last_name').GetAsString);
|
|||
|
CheckEquals('Daniele', FLuaEngine.GetGlobal('first_name').GetAsString);
|
|||
|
CheckEquals('Mr. Daniele Teti', FLuaEngine.GetGlobal('full_name').GetAsString);
|
|||
|
CheckEquals(32, FLuaEngine.GetGlobal('age').GetAsInteger);
|
|||
|
CheckEquals('Teti', person.LastName);
|
|||
|
CheckEquals('Daniele', person.FirstName);
|
|||
|
CheckEquals(32, person.Age);
|
|||
|
finally
|
|||
|
person.Free;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestExposeDelphiObjectNoDeps;
|
|||
|
var
|
|||
|
person: TPerson;
|
|||
|
begin
|
|||
|
person := TPerson.Create;
|
|||
|
try
|
|||
|
person.FirstName := 'Daniele';
|
|||
|
person.LastName := 'Teti';
|
|||
|
person.Age := 33;
|
|||
|
FLuaEngine.DeclareGlobalDelphiObjectAsTable(person, 'person');
|
|||
|
// FLuaEngine.ExecuteScript('r = person.FirstName .. person.LastName .. tostring(person.Age)');
|
|||
|
// CheckEquals('DanieleTeti33', FLuaEngine.GetGlobal('r').GetAsString);
|
|||
|
|
|||
|
FLuaEngine.LoadScript('x = person:hello("parametro1", "parametro2")');
|
|||
|
FLuaEngine.Execute;
|
|||
|
// FLuaEngine.ExecuteScript('person:BecomeOlder(1)');
|
|||
|
CheckEquals('DanieleTeti34', FLuaEngine.GetGlobal('x').GetAsString);
|
|||
|
finally
|
|||
|
person.Free;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestExposeVCLDelphiObject;
|
|||
|
var
|
|||
|
sl: TStringList;
|
|||
|
begin
|
|||
|
sl := TStringList.Create;
|
|||
|
try
|
|||
|
sl.Add('first');
|
|||
|
FLuaEngine.LoadExternalLibraries(TLuaDelphiObjectExposerLibraries.Create);
|
|||
|
ExposeDelphiObject(FLuaEngine, sl, 'stringlist');
|
|||
|
FLuaEngine.LoadFromFile('test_04.lua');
|
|||
|
FLuaEngine.Execute;
|
|||
|
CheckEquals(4, sl.Count);
|
|||
|
finally
|
|||
|
sl.Free;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestExposeVCLDelphiObjectSetProperty;
|
|||
|
var
|
|||
|
sl: TStringList;
|
|||
|
begin
|
|||
|
sl := TStringList.Create;
|
|||
|
try
|
|||
|
sl.Add('first');
|
|||
|
sl.Add('two');
|
|||
|
sl.Add('three');
|
|||
|
FLuaEngine.LoadExternalLibraries(TLuaDelphiObjectExposerLibraries.Create);
|
|||
|
ExposeDelphiObject(FLuaEngine, sl, 'stringlist');
|
|||
|
FLuaEngine.LoadFromFile('test_05.lua');
|
|||
|
FLuaEngine.Execute;
|
|||
|
CheckEquals(1, sl.Count);
|
|||
|
CheckEquals('Daniele Teti', sl[0]);
|
|||
|
finally
|
|||
|
sl.Free;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestCreateDelphiObject;
|
|||
|
begin
|
|||
|
FLuaEngine.LoadExternalLibraries(TLuaDelphiObjectExposerLibraries.Create);
|
|||
|
FLuaEngine.LoadFromFile('test_06.lua');
|
|||
|
FLuaEngine.Execute;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestCreateDelphiObjectWithWringConstructor;
|
|||
|
begin
|
|||
|
FLuaEngine.LoadExternalLibraries(TLuaDelphiObjectExposerLibraries.Create);
|
|||
|
FLuaEngine.LoadFromFile('test_07.lua');
|
|||
|
ExpectedException := ELuaRuntimeException;
|
|||
|
FLuaEngine.Execute;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestDeclareGlobalBoolean;
|
|||
|
var
|
|||
|
Value : ILuaValue;
|
|||
|
_tot, _boolean1, _boolean2, _boolean3, _boolean4: boolean;
|
|||
|
begin
|
|||
|
_boolean1 := true;
|
|||
|
_boolean2 := false;
|
|||
|
_boolean3 := true;
|
|||
|
_boolean4 := false;
|
|||
|
FLuaEngine.DeclareGlobalBoolean('_boolean1', _boolean1);
|
|||
|
FLuaEngine.DeclareGlobalBoolean('_boolean2', _boolean2);
|
|||
|
FLuaEngine.DeclareGlobalBoolean('_boolean3', _boolean3);
|
|||
|
FLuaEngine.DeclareGlobalBoolean('_boolean4', _boolean4);
|
|||
|
|
|||
|
FLuaEngine.LoadScript('_tot = _boolean1 or _boolean2 and _boolean3 or _boolean4;');
|
|||
|
FLuaEngine.Execute;
|
|||
|
Value := FLuaEngine.GetGlobal('_tot');
|
|||
|
|
|||
|
CheckFalse(Value.IsNumber);
|
|||
|
CheckFalse(Value.IsInteger);
|
|||
|
CheckFalse(Value.IsString);
|
|||
|
CheckFalse(Value.IsNil);
|
|||
|
CheckTrue(Value.IsBoolean);
|
|||
|
CheckFalse(Value.IsLightUserData);
|
|||
|
|
|||
|
_tot := _boolean1 or _boolean2 and _boolean3 or _boolean4;
|
|||
|
CheckEquals(_tot, Value.GetAsBoolean);
|
|||
|
|
|||
|
ExpectedException := ELuaException;
|
|||
|
Value.GetAsString;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestDeclareGlobalFunction;
|
|||
|
function SayHello(L: Plua_State): Integer; cdecl;
|
|||
|
var
|
|||
|
s: AnsiString;
|
|||
|
begin
|
|||
|
s := lua_tostring(L, - 1);
|
|||
|
s := 'before ' + s + ' after';
|
|||
|
lua_pop(L, 1);
|
|||
|
lua_pushstring(L, PAnsiChar(s));
|
|||
|
Result := 1;
|
|||
|
end;
|
|||
|
|
|||
|
var
|
|||
|
Value: ILuaValue;
|
|||
|
begin
|
|||
|
FLuaEngine.DeclareGlobalFunction('sayhello', @SayHello);
|
|||
|
FLuaEngine.LoadScript('x = sayhello("hello world")');
|
|||
|
FLuaEngine.Execute;
|
|||
|
Value := FLuaEngine.GetGlobal('x');
|
|||
|
CheckEquals('before hello world after', Value.GetAsString);
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestDeclareGlobalLightUserData;
|
|||
|
var
|
|||
|
Value: ILuaValue;
|
|||
|
_ptr : Pointer;
|
|||
|
Obj : TStringList;
|
|||
|
Obj2 : TStringList;
|
|||
|
|
|||
|
function AddToTStringList(L: Plua_State): Integer; cdecl;
|
|||
|
var
|
|||
|
sl: TStringList;
|
|||
|
s : AnsiString;
|
|||
|
begin
|
|||
|
s := lua_tostring(L, - 1);
|
|||
|
lua_pop(L, 1);
|
|||
|
sl := TStringList(lua_topointer(L, - 1));
|
|||
|
lua_pop(L, 1);
|
|||
|
sl.Add(s);
|
|||
|
Result := 0;
|
|||
|
end;
|
|||
|
|
|||
|
begin
|
|||
|
_ptr := nil;
|
|||
|
FLuaEngine.DeclareGlobalLightUserData('_ptr', _ptr);
|
|||
|
FLuaEngine.LoadScript('x = _ptr');
|
|||
|
FLuaEngine.Execute;
|
|||
|
Value := FLuaEngine.GetGlobal('x');
|
|||
|
CheckTrue(Value.IsLightUserData);
|
|||
|
CheckTrue(Value.GetAsLightUserData = nil);
|
|||
|
|
|||
|
// Now try to pass a tstringlist
|
|||
|
Obj := TStringList.Create;
|
|||
|
try
|
|||
|
Obj.Add('Hello World');
|
|||
|
_ptr := Pointer(Obj);
|
|||
|
FLuaEngine.DeclareGlobalLightUserData('_ptr1', _ptr);
|
|||
|
|
|||
|
FLuaEngine.DeclareGlobalFunction('additem', @AddToTStringList);
|
|||
|
|
|||
|
FLuaEngine.LoadScript('x = _ptr1; additem(x,"added from Lua")');
|
|||
|
FLuaEngine.Execute;
|
|||
|
Value := FLuaEngine.GetGlobal('x');
|
|||
|
|
|||
|
CheckFalse(Value.IsNumber);
|
|||
|
CheckFalse(Value.IsInteger);
|
|||
|
CheckFalse(Value.IsString);
|
|||
|
CheckFalse(Value.IsNil);
|
|||
|
CheckFalse(Value.IsBoolean);
|
|||
|
CheckTrue(Value.IsLightUserData);
|
|||
|
|
|||
|
CheckNotNull(Value.GetAsLightUserData);
|
|||
|
_ptr := Value.GetAsLightUserData;
|
|||
|
|
|||
|
Obj2 := TStringList(_ptr);
|
|||
|
CheckEquals(2, Obj2.Count);
|
|||
|
CheckEquals('Hello World', Obj2[0]);
|
|||
|
CheckEquals('added from Lua', Obj2[1]);
|
|||
|
finally
|
|||
|
Obj.Free;
|
|||
|
end;
|
|||
|
|
|||
|
ExpectedException := ELuaException;
|
|||
|
Value.GetAsString;
|
|||
|
end;
|
|||
|
|
|||
|
procedure TestTLuaEngine.TestGetGlobal;
|
|||
|
var
|
|||
|
ReturnValue: ILuaValue;
|
|||
|
AName : AnsiString;
|
|||
|
begin
|
|||
|
// TODO: Setup method call parameters
|
|||
|
ReturnValue := FLuaEngine.GetGlobal(AName);
|
|||
|
// TODO: Validate method results
|
|||
|
end;
|
|||
|
|
|||
|
{ TPerson }
|
|||
|
|
|||
|
initialization
|
|||
|
|
|||
|
// Register any test cases with the test runner
|
|||
|
RegisterTest(TestTLuaEngine.Suite);
|
|||
|
|
|||
|
end.
|