From 6200242c9e85d4906c4debc5ade5f04881e51621 Mon Sep 17 00:00:00 2001 From: Artem3213212 Date: Sat, 26 May 2018 11:13:32 +0300 Subject: [PATCH] Initall commit: new repo for los lib+some fixes --- .gitignore | 81 ++++++++ AG.Logs.pas | 355 ++++++++++++++++++++++++++++++++ LICENSE | 8 + README.md | 7 + Tests/Project2.dpr | 60 ++++++ Tests/Project2.dproj | 473 +++++++++++++++++++++++++++++++++++++++++++ Tests/Unit2.pas | 43 ++++ 7 files changed, 1027 insertions(+) create mode 100644 .gitignore create mode 100644 AG.Logs.pas create mode 100644 LICENSE create mode 100644 README.md create mode 100644 Tests/Project2.dpr create mode 100644 Tests/Project2.dproj create mode 100644 Tests/Unit2.pas diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..61c33a8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,81 @@ +# Uncomment these types if you want even more clean repository. But be careful. +# Uncomment these types if you want even more clean repository. But be careful. +# It can make harm to an existing project source. Read explanations below. +# +# Resource files are binaries containing manifest, project icon and version info. +# They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. +#*.res +# +# Type library file (binary). In old Delphi versions it should be stored. +# Since Delphi 2009 it is produced from .ridl file and can safely be ignored. +#*.tlb +# +# Diagram Portfolio file. Used by the diagram editor up to Delphi 7. +# Uncomment this if you are not using diagrams or use newer Delphi version. +#*.ddp +# +# Visual LiveBindings file. Added in Delphi XE2. +# Uncomment this if you are not using LiveBindings Designer. +#*.vlb +# +# Deployment Manager configuration file for your project. Added in Delphi XE2. +# Uncomment this if it is not mobile development and you do not use remote debug feature. +#*.deployproj +# +# C++ object files produced when C/C++ Output file generation is configured. +# Uncomment this if you are not using external objects (zlib library for example). +#*.obj +# + +# Delphi compiler-generated binaries (safe to delete) +*.exe +*.dll +*.bpl +*.bpi +*.dcp +*.so +*.apk +*.drc +*.map +*.dres +*.rsm +*.tds +*.dcu +*.lib +*.a +*.o +*.ocx +*.tmp + +*.res + +# Delphi autogenerated files (duplicated info) +*.cfg +*.hpp +*Resource.rc + +# Delphi local files (user-specific info) +*.local +*.identcache +*.projdata +*.tvsconfig +*.dsk + +# Delphi history and backups +__history/ +__recovery/ +*.~* + +# Castalia statistics file (since XE7 Castalia is distributed with Delphi) +*.stat + +#FPC +backup/ +*.compiled +*.ppu +*.o +*.or +FPCTests/*.ico +*.ini + +Tests/Win32 \ No newline at end of file diff --git a/AG.Logs.pas b/AG.Logs.pas new file mode 100644 index 0000000..3456642 --- /dev/null +++ b/AG.Logs.pas @@ -0,0 +1,355 @@ +unit AG.Logs; + +interface + +//{$UNDEF MSWINDOWS} + +uses + {$IFDEF MSWINDOWS}{$IFDEF FPC}Windows{$ELSE}Winapi.Windows{$ENDIF},{$ENDIF} + {$IFDEF FPC}FGL{$ELSE}System.Generics.Collections,{$ENDIF} + {$IFDEF FPC}System.SysUtils{$ELSE}SysUtils{$ENDIF}, + {$IFDEF FPC}System.Classes{$ELSE}Classes{$ENDIF}, + {$IFDEF FPC}System.DateUtils{$ELSE}DateUtils{$ENDIF}, + {$IFDEF FPC}System.SyncObjs{$ELSE}SyncObjs{$ENDIF}; + +type + TAGLog=class abstract + strict protected + tabs:cardinal; + tabstr:widestring; + constructor Create(); + const + CBaseTab='--------------------------'; + public + class function SisebleWordtoStr(i:word;size:int8):widestring;static;inline; + class function GenerateLogString(s:widestring;o:TObject=nil):widestring;static;inline; + procedure Tab();virtual; + procedure UnTab();virtual; + procedure Write(Text:WideString;o:TObject=nil);virtual;abstract; + destructor Destroy();override; + end; + + TAGRamLog=class(TAGLog) + public + buf:WideString; + constructor Create();overload; + procedure Write(Text:WideString;o:TObject=nil);overload;override; + end; + + TAGDiskLog=class(TAGLog) + strict protected + LogHandle,ThreadHandle:NativeUInt; + ThreadID:cardinal; + buf1:WideString; + onbuf:boolean; + Lock:TCriticalSection; + WantTerminate:Boolean; + public + constructor Create(FileName:WideString);overload; + procedure Init();{override;}stdcall; + procedure Write(Text:WideString;o:TObject=nil);overload;override; + destructor Destroy();overload;override; + end; + + TAGNullLog=class(TAGLog) + public + constructor Create();overload; + procedure Write(Text:WideString;o:TObject=nil);overload;override; + end; + + {$IFDEF MSWINDOWS} + TAGCommandLineLog=class(TAGLog) + strict protected + CommandLine:THandle; + public + constructor Create(Handele:THandle);overload; + procedure Write(Text:WideString;o:TObject=nil);overload;override; + destructor Destroy();overload;override; + end; + {$ENDIF} + + TAGStreamLog=class(TAGLog) + strict protected + stream:TStream; + public + constructor Create(stream:TStream);overload; + procedure Write(Text:WideString;o:TObject=nil);overload;override; + end; + + TAGCallBackLog=class(TAGLog) + strict protected type + TCallBack=procedure(s:string); + var + CallBack:TCallBack; + public + constructor Create(CallBack:TCallBack);overload; + procedure Write(Text:WideString;o:TObject=nil);overload;override; + end; + + TAGMultiLog=class(TAGLog) + public + type + TLogsList=TList; + var + Logs:TLogsList; + constructor Create(Default:TLogsList);overload; + procedure Write(Text:WideString;o:TObject=nil);overload;override; + procedure Tab();override; + procedure UnTab();override; + destructor Destroy();overload;override; + end; + +const + SisebleWordtoStr:function(i:word;size:int8):widestring=TAGLog.SisebleWordtoStr; + +Implementation + +constructor TAGLog.Create(); +begin +Self.Write(sLineBreak+CBaseTab+'Logging init'+CBaseTab+sLineBreak); +end; + +class function TAGLog.SisebleWordtoStr(i:word;size:int8):widestring; +begin + Result:=inttostr(i); + size:=size-Length(Result); + case size of + 0:Result:=Result; + 1:Result:='0'+Result; + 2:Result:='00'+Result; + 3:Result:='000'+Result; + 4:Result:='0000'+Result; + end; +end; + +class function TAGLog.GenerateLogString(s:widestring;o:TObject=nil):widestring; +var + D:TDateTime; +begin +D:=Time; +if o<>nil then + Result:=o.QualifiedClassName+'['+IntToStr(o.GetHashCode)+']:' +else + Result:=''; +Result:='['+Siseblewordtostr(DayOfTheMonth(D),2)+'.'+Siseblewordtostr(MonthOfTheYear(D),2)+'.'+ + Siseblewordtostr(YearOf(D),4)+' '+Siseblewordtostr(HourOfTheDay(D),2)+':'+ + Siseblewordtostr(MinuteOfTheHour(D),2)+':'+Siseblewordtostr(SecondOfTheMinute(D),2)+'.' + +Siseblewordtostr(MilliSecondOfTheSecond(D),3)+'] '+Result+s+#13#10; +end; + +procedure TAGLog.Tab(); +begin +inc(tabs); +tabstr:=tabstr+' '; +end; + +procedure TAGLog.UnTab(); +begin +dec(tabs); +Delete(tabstr,1,2); +end; + +destructor TAGLog.Destroy(); +begin +Self.Write(sLineBreak+CBaseTab+'Logging ended'+CBaseTab+sLineBreak); +inherited; +end; + +constructor TAGRamLog.Create(); +begin +buf:=''; +tabs:=0; +tabstr:=''; +inherited Create; +end; + +procedure TAGRamLog.Write(Text:WideString;o:TObject=nil); +begin +buf:=buf+GenerateLogString(tabstr+Text,o); +end; + +constructor TAGDiskLog.Create(FileName:WideString); +begin +{} +Lock:=TCriticalSection.Create; +WantTerminate:=False; +tabs:=0; +tabstr:=''; +buf1:=''; +LogHandle:=CreateFileW(Pwidechar(FileName),GENERIC_WRITE,0,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); +SetFilePointer(LogHandle,0,nil,FILE_END); +ThreadHandle:=CreateThread(nil,0,addr(TAGDiskLog.Init),self,0,ThreadID); +inherited Create; +{} +end; + +procedure TAGDiskLog.Init();stdcall; +var + n:cardinal; + buf:PWideChar; +begin +buf:=''; +while Lock<>nil do +begin + Lock.Enter; + if buf<>'' then + WriteFile(LogHandle,buf^,2*n,n,nil); + n:=Length(buf1); + buf:=Pwidechar(Copy(buf1,0,n)); + buf1:=''; + Lock.Leave; + if WantTerminate then + begin + Sleep(0); + Lock.Enter; + if buf<>'' then + WriteFile(LogHandle,buf^,2*n,n,nil); + n:=Length(buf1); + buf:=Pwidechar(Copy(buf1,0,n)); + buf1:=''; + Lock.Leave; + WantTerminate:=False; + exit; + end; + sleep(0); +end; +end; + +procedure TAGDiskLog.Write(Text:WideString;o:TObject=nil); +begin +Lock.Enter; +buf1:=buf1+GenerateLogString(tabstr+text,o); +Lock.Leave; +end; + +destructor TAGDiskLog.Destroy(); +begin +inherited; +WantTerminate:=True; +While WantTerminate do + sleep(0); +FreeAndNil(Lock); +TerminateThread(ThreadID,0); +CloseHandle(ThreadHandle); +CloseHandle(LogHandle); +end; + +constructor TAGNullLog.Create(); +begin +inherited; +end; + +procedure TAGNullLog.Write(Text:WideString;o:TObject=nil); +begin +end; + +{TAGCommandLineLog} + +{$IFDEF MSWINDOWS} +constructor TAGCommandLineLog.Create(Handele:THandle); +begin +CommandLine:=Handele; +inherited Create; +end; + +procedure TAGCommandLineLog.Write(Text:WideString;o:TObject=nil); +var + p:PWideChar; + a,b:cardinal; +begin +Text:=GenerateLogString(tabstr+text,o); +p:=addr(Text[1]); +a:=length(Text); +while a<>0 do +begin + b:=0; + WriteConsoleW(CommandLine,p,a,b,nil); + inc(p,b); + dec(a,b); +end; +end; + +destructor TAGCommandLineLog.Destroy(); +begin +inherited; +CloseHandle(CommandLine); +end; +{$ENDIF} + +{TAGStreamLog} + +constructor TAGStreamLog.Create(stream:TStream); +begin +Self.stream:=stream; +inherited Create; +end; + +procedure TAGStreamLog.Write(Text:WideString;o:TObject=nil); +var + s:string; +begin +s:=GenerateLogString(Text,o); +stream.Write(PWideChar(s)^,2*length(s)); +end; + +{TAGCallBackLog} + +constructor TAGCallBackLog.Create(CallBack:TCallBack); +begin +Self.CallBack:=CallBack; +inherited Create; +end; + +procedure TAGCallBackLog.Write(Text:WideString;o:TObject=nil); +begin +CallBack(GenerateLogString(Text,o)); +end; + +{TAGMultiLog} + +constructor TAGMultiLog.Create(Default:TList); +begin +//inherited Create; +if Default<>nil then + Logs:=Default +else + Logs:=TList.Create; +end; + +procedure TAGMultiLog.Write(Text:WideString;o:TObject=nil); +var + i:TAGLog; +begin +for i in Logs.List do + i.Write(Text,o); +end; + +procedure TAGMultiLog.Tab(); +var + i:TAGLog; +begin +for i in Logs.List do + i.Tab(); +end; + +procedure TAGMultiLog.UnTab(); +var + i:TAGLog; +begin +for i in Logs.List do + i.UnTab(); +end; + +destructor TAGMultiLog.Destroy(); +var + i:TAGLog; +begin +for i in Logs.List do + i.Free(); +FreeAndNil(Logs); +//inherited; +end; + +initialization +finalization +end. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..170acf7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,8 @@ +MIT License +Copyright (c) 2018 Artem Gavrilov + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2821bba --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +Library for logging all what you waunt. + +Supported Delphi and FPC. + +Donate: https://money.yandex.ru/to/410014959153552 + +Site: \ No newline at end of file diff --git a/Tests/Project2.dpr b/Tests/Project2.dpr new file mode 100644 index 0000000..1d97bcc --- /dev/null +++ b/Tests/Project2.dpr @@ -0,0 +1,60 @@ +program Project2; + +{$IFNDEF TESTINSIGHT} +{$APPTYPE CONSOLE} +{$ENDIF}{$STRONGLINKTYPES ON} +uses + SysUtils, + {$IFDEF TESTINSIGHT} + TestInsight.DUnitX, + {$ENDIF } + DUnitX.Loggers.Console, + DUnitX.Loggers.Xml.NUnit, + DUnitX.TestFramework, + Unit2 in 'Unit2.pas', + AG.Logs in '..\AG.Logs.pas'; + +var + runner : ITestRunner; + results : IRunResults; + logger : ITestLogger; + nunitLogger : ITestLogger; +begin +{$IFDEF TESTINSIGHT} + TestInsight.DUnitX.RunRegisteredTests; + exit; +{$ENDIF} + try + //Check command line options, will exit if invalid + TDUnitX.CheckCommandLine; + //Create the test runner + runner := TDUnitX.CreateRunner; + //Tell the runner to use RTTI to find Fixtures + runner.UseRTTI := True; + //tell the runner how we will log things + //Log to the console window + logger := TDUnitXConsoleLogger.Create(true); + runner.AddLogger(logger); + //Generate an NUnit compatible XML File + nunitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile); + runner.AddLogger(nunitLogger); + runner.FailsOnNoAsserts := False; //When true, Assertions must be made during tests; + + //Run tests + results := runner.Execute; + if not results.AllPassed then + System.ExitCode := EXIT_ERRORS; + + {$IFNDEF CI} + //We don't want this happening when running under CI. + if TDUnitX.Options.ExitBehavior = TDUnitXExitBehavior.Pause then + begin + System.Write('Done.. press key to quit.'); + System.Readln; + end; + {$ENDIF} + except + on E: Exception do + System.Writeln(E.ClassName, ': ', E.Message); + end; +end. diff --git a/Tests/Project2.dproj b/Tests/Project2.dproj new file mode 100644 index 0000000..4580630 --- /dev/null +++ b/Tests/Project2.dproj @@ -0,0 +1,473 @@ + + + {9A1E6BA7-906E-4E34-A7E0-880ADC92F76C} + 17.2 + Project2.dpr + True + Debug + Win32 + 5 + Console + None + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + $(BDS)\bin\delphi_PROJECTICON.ico + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + $(DUnitX);$(DCC_UnitSearchPath) + $(BDS)\bin\delphi_PROJECTICNS.icns + Project2 + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + + + true + FireDACTDataDriver;FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;FireDACPgDriver;fmx;IndySystem;tethering;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;DataSnapProviderClient;DbxCommonDriver;dbxcds;fmxFireDAC;DBXOracleDriver;CustomIPTransport;dsnap;IndyIPServer;fmxase;IndyCore;CloudService;IndyIPCommon;FmxTeeUI;FireDACIBDriver;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;dsnapxml;FireDACASADriver;bindcompfmx;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;ibmonitor;xmlrtl;DataSnapNativeClient;ibxpress;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindcompdbx;bindengine;FMXTee;soaprtl;emsclient;FireDAC;DBXInformixDriver;FireDACMSSQLDriver;DataSnapServerMidas;DBXFirebirdDriver;inet;fmxobj;FireDACMySQLDriver;soapmidas;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;dbexpress;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + FireDACTDataDriver;FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;FireDACPgDriver;fmx;IndySystem;TeeDB;tethering;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;DataSnapProviderClient;DBXSybaseASEDriver;DbxCommonDriver;vclimg;DUnitXRuntime;dbxcds;DatasnapConnectorsFreePascal;appanalytics;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;fmxase;vcl;IndyCore;DBXMSSQLDriver;CloudService;IndyIPCommon;FmxTeeUI;FireDACIBDriver;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;dsnapxml;FireDACInfxDriver;FireDACDb2Driver;adortl;FireDACASADriver;bindcompfmx;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;Tee;DBXOdbcDriver;ibmonitor;vclFireDAC;xmlrtl;DataSnapNativeClient;ibxpress;svnui;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindcompdbx;bindengine;vclactnband;FMXTee;soaprtl;TeeUI;bindcompvcl;vclie;FireDACADSDriver;vcltouch;emsclient;VCLRESTComponents;FireDAC;DBXInformixDriver;FireDACMSSQLDriver;Intraweb;VclSmp;DataSnapConnectors;DataSnapServerMidas;DBXFirebirdDriver;dsnapcon;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;svn;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;dbexpress;FireDACMSAccDriver;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) + + + FireDACTDataDriver;FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;FireDACPgDriver;fmx;IndySystem;TeeDB;tethering;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;DataSnapProviderClient;DBXSybaseASEDriver;DbxCommonDriver;vclimg;dbxcds;DatasnapConnectorsFreePascal;appanalytics;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;fmxase;vcl;IndyCore;DBXMSSQLDriver;CloudService;IndyIPCommon;FmxTeeUI;FireDACIBDriver;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;dsnapxml;FireDACInfxDriver;FireDACDb2Driver;adortl;FireDACASADriver;bindcompfmx;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;Tee;DBXOdbcDriver;ibmonitor;vclFireDAC;xmlrtl;DataSnapNativeClient;ibxpress;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindcompdbx;bindengine;vclactnband;FMXTee;soaprtl;TeeUI;bindcompvcl;vclie;FireDACADSDriver;vcltouch;emsclient;VCLRESTComponents;FireDAC;DBXInformixDriver;FireDACMSSQLDriver;Intraweb;VclSmp;DataSnapConnectors;DataSnapServerMidas;DBXFirebirdDriver;dsnapcon;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;dbexpress;FireDACMSAccDriver;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Console + + + + Project2.dpr + + + + + + Project2.exe + true + + + + + true + + + + + true + + + + + 1 + .dylib + + + 0 + .bpl + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + + + 1 + + + 1 + + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + res\drawable-normal + 1 + + + + + library\lib\x86 + 1 + + + + + 1 + + + 1 + + + 1 + + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-xlarge + 1 + + + + + res\drawable-xhdpi + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + library\lib\mips + 1 + + + + + res\drawable + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 0 + + + + + res\drawable-small + 1 + + + + + + 1 + + + Contents\MacOS + 0 + + + + + classes + 1 + + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable + 1 + + + + + Contents\Resources + 1 + + + + + + 1 + + + 1 + + + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 0 + + + 1 + + + 1 + + + 1 + + + + + library\lib\armeabi + 1 + + + + + res\drawable-large + 1 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-ldpi + 1 + + + + + res\values + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + 1 + + + + + + + + + + + + True + True + False + + + 12 + + + + + diff --git a/Tests/Unit2.pas b/Tests/Unit2.pas new file mode 100644 index 0000000..e6db40f --- /dev/null +++ b/Tests/Unit2.pas @@ -0,0 +1,43 @@ +unit Unit2; + +interface +uses + DUnitX.TestFramework,AG.Logs,System.Classes,System.IOUtils,System.SysUtils,Winapi.Windows; + +type + + [TestFixture] + TMyTestObject = class(TObject) + public + // Sample Methods + // Simple single Test + [Test] + procedure Test1; + // Test with TestCase Atribute to supply parameters. + end; + +implementation + +procedure TMyTestObject.Test1; +var + MultiLog:TAGLog; + Stream:TStream; + s:string; +begin +MultiLog:=TAGMultiLog.Create(nil); +(MultiLog as TAGMultiLog).Logs.Add(TAGNullLog.Create()); +(MultiLog as TAGMultiLog).Logs.Add(TAGDiskLog.Create('test.log')); +(MultiLog as TAGMultiLog).Logs.Add(TAGRamLog.Create()); +//(MultiLog as TAGMultiLog).Logs.Add(TAGCommandLineLog.Create(GetStdHandle())); +s:=TFile.ReadAllText('test2.log'); +Stream:=TFileStream.Create('test2.log',fmCreate+fmOpenReadWrite+fmShareDenyWrite); +Stream.Write(PWidechar(s)^,2*length(s)); +(MultiLog as TAGMultiLog).Logs.Add(TAGStreamLog.Create(Stream)); +//(MultiLog as TAGMultiLog).Logs.Add(TAGCallBackLog.Create()); +MultiLog.Write('aaaaaaaaaaa',self); +FreeAndNil(MultiLog); +end; + +initialization + TDUnitX.RegisterTestFixture(TMyTestObject); +end.