From 859780bc7afd4bce9478dcea515d2faae357234a Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Wed, 30 Dec 2015 13:33:15 +0000 Subject: [PATCH] Added: AutoRun parameter (default True) Added: unit tests / showcases for loading and running multiple scripts --- Lua.Wrapper.pas | 37 +++++++++++++++++---------- UnitTests/source/TestWrapper.pas | 44 ++++++++++++++++++++++++++------ 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/Lua.Wrapper.pas b/Lua.Wrapper.pas index f6b5ae5..4f81f2e 100644 --- a/Lua.Wrapper.pas +++ b/Lua.Wrapper.pas @@ -250,10 +250,10 @@ type constructor Create; destructor Destroy; override; - procedure LoadFromString(const AData: string; const AChunkName: string = ''); virtual; - procedure LoadFromStream(AStream: TStream; AOwnership: TStreamOwnership = soReference; const AChunkName: string = ''); virtual; - procedure LoadFromFile(const AFileName: string; const AChunkName: string = ''); virtual; - procedure LoadFromScript(AScript: TLuaScript; AOwnership: TStreamOwnership = soReference; const AChunkName: string = ''); virtual; + procedure LoadFromString(const AData: string; AAutoRun: Boolean = True; const AChunkName: string = ''); virtual; + procedure LoadFromStream(AStream: TStream; AOwnership: TStreamOwnership = soReference; AAutoRun: Boolean = True; const AChunkName: string = ''); virtual; + procedure LoadFromFile(const AFileName: string; AAutoRun: Boolean = True; const AChunkName: string = ''); virtual; + procedure LoadFromScript(AScript: TLuaScript; AOwnership: TStreamOwnership = soReference; AAutoRun: Boolean = True; const AChunkName: string = ''); virtual; function GetGlobalVariable(const AName: string): ILuaVariable; procedure SetGlobalVariable(const AName: string; AVariable: TLuaImplicitVariable); @@ -991,25 +991,25 @@ begin end; -procedure TLua.LoadFromString(const AData: string; const AChunkName: string); +procedure TLua.LoadFromString(const AData: string; AAutoRun: Boolean; const AChunkName: string); begin - LoadFromScript(TLuaScript.Create(AData), soOwned, AChunkName); + LoadFromScript(TLuaScript.Create(AData), soOwned, AAutoRun, AChunkName); end; -procedure TLua.LoadFromStream(AStream: TStream; AOwnership: TStreamOwnership; const AChunkName: string); +procedure TLua.LoadFromStream(AStream: TStream; AOwnership: TStreamOwnership; AAutoRun: Boolean; const AChunkName: string); begin - LoadFromScript(TLuaScript.Create(AStream, AOwnership), soOwned, AChunkName); + LoadFromScript(TLuaScript.Create(AStream, AOwnership), soOwned, AAutoRun, AChunkName); end; -procedure TLua.LoadFromFile(const AFileName, AChunkName: string); +procedure TLua.LoadFromFile(const AFileName: string; AAutoRun: Boolean; const AChunkName: string); begin - LoadFromScript(TLuaScript.Create(TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone), soOwned), soOwned, AChunkName); + LoadFromScript(TLuaScript.Create(TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone), soOwned), soOwned, AAutoRun, AChunkName); end; -procedure TLua.LoadFromScript(AScript: TLuaScript; AOwnership: TStreamOwnership; const AChunkName: string); +procedure TLua.LoadFromScript(AScript: TLuaScript; AOwnership: TStreamOwnership; AAutoRun: Boolean; const AChunkName: string); var chunkName: PAnsiChar; @@ -1023,7 +1023,11 @@ begin FreeLuaString(chunkName); end; - AfterLoad; + if not Loaded then + AfterLoad; + + if AAutoRun then + Run; finally if AOwnership = soOwned then FreeAndNil(AScript); @@ -1139,9 +1143,14 @@ end; procedure TLua.RaiseLastLuaError; +var + errorMessage: string; + begin - // TODO shouldn't we pop the error messag efrom the stack? - raise ELuaException.Create(string(lua_tolstring(State, -1, nil))); + errorMessage := LuaToString(State, -1); + lua_pop(State, 1); + + raise ELuaException.Create(errorMessage); end; diff --git a/UnitTests/source/TestWrapper.pas b/UnitTests/source/TestWrapper.pas index a581afa..6bd8ab3 100644 --- a/UnitTests/source/TestWrapper.pas +++ b/UnitTests/source/TestWrapper.pas @@ -24,6 +24,8 @@ type procedure NewState; procedure LoadAndRunFromString; procedure LoadAndRunFromStream; + procedure LoadMultiple; + procedure ChunkNameInException; procedure Input; procedure Output; @@ -86,7 +88,6 @@ end; procedure TTestWrapper.LoadAndRunFromString; begin Lua.LoadFromString('print("Hello world!")'); - Lua.Run; CheckEquals('Hello world!', Printed.ToString); end; @@ -94,16 +95,23 @@ end; procedure TTestWrapper.LoadAndRunFromStream; begin Lua.LoadFromStream(TStringStream.Create('print("Hello world!")'), soOwned); - Lua.Run; CheckEquals('Hello world!', Printed.ToString); end; +procedure TTestWrapper.LoadMultiple; +begin + Lua.LoadFromString('print "Hello world!"', True, 'Script1'); + Lua.LoadFromString('print "Goodbye world!"', True, 'Script2'); + + CheckEquals('Hello world!Goodbye world!', Printed.ToString); +end; + + procedure TTestWrapper.Input; begin Lua.SetGlobalVariable('thingy', 'world'); Lua.LoadFromString('print("Hello "..thingy.."!")'); - Lua.Run; CheckEquals('Hello world!', Printed.ToString); end; @@ -115,7 +123,6 @@ var begin Lua.LoadFromString('output = "Hello world!"'); - Lua.Run; output := lua.GetGlobalVariable('output'); CheckNotNull(output, 'output is nil'); @@ -123,6 +130,26 @@ begin end; +procedure TTestWrapper.ChunkNameInException; +begin + Lua.LoadFromString('print("This one''s alright")', True, 'Script1'); + + try + Lua.LoadFromString('print("This one isn''t"', True, 'Script2'); + Fail('ELuaException expected'); + except + on E:Exception do + begin + CheckIs(E, ELuaException); + CheckEquals('[string "Script2"]:1: '')'' expected near ', E.Message); + end; + end; + + Lua.LoadFromString('print("Fine again!")', True, 'Script3'); + CheckEquals('This one''s alrightFine again!', Printed.ToString); +end; + + procedure TTestWrapper.DelphiFunction; begin Lua.RegisterFunction('myuppercase', @@ -132,7 +159,6 @@ begin end); Lua.LoadFromString('print(myuppercase("Hello world!"))'); - Lua.Run; CheckEquals('HELLO WORLD!', Printed.ToString); end; @@ -149,6 +175,10 @@ begin returnValues := Lua.Call('sum', [1, 2]); CheckEquals(1, returnValues.Count, 'returnValues Count'); CheckEquals(3, returnValues[0].AsInteger, 'returnValues[0]'); + + returnValues := Lua.Call('sum', [4, 12]); + CheckEquals(1, returnValues.Count, 'returnValues Count'); + CheckEquals(16, returnValues[0].AsInteger, 'returnValues[0]'); end; @@ -211,7 +241,7 @@ begin input := TLuaTable.Create; input.SetValue('text', 'Hello world!'); - Lua.LoadFromString('print(message.text)'); + Lua.LoadFromString('print(message.text)', False); Lua.SetGlobalVariable('message', input); Lua.Run; @@ -226,7 +256,6 @@ var begin Lua.LoadFromString('output = { answer = 42 }'); - Lua.Run; output := lua.GetGlobalVariable('output'); CheckNotNull(output, 'output is nil'); @@ -259,7 +288,6 @@ begin Lua.LoadFromString('table = invertTable({ value = "key" })'#13#10 + 'print(table.key)'); - Lua.Run; CheckEquals('value', Printed.ToString); end;