{ Test with: ./runtests --format=plain --suite=TTestCodetoolsH2Pas ./runtests --format=plain --suite=TestCTH2PMergeHeaderFiles ./runtests --format=plain --suite=TestCTH2PReplaceMacros ./runtests --format=plain --suite=TestCTH2PConvertSimpleVars ./runtests --format=plain --suite=TestCTH2PConvertEnumsTypes ./runtests --format=plain --suite=TestCTH2PConvertConst ./runtests --format=plain --suite=TestCTH2PConvertSimpleTypedefs ./runtests --format=plain --suite=TestCTH2PConvertSimpleStructs } unit TestCTH2Pas; {$mode objfpc}{$H+} {$DEFINE VerboseTestCTH2Pas} interface uses Classes, SysUtils, fpcunit, testregistry, FileProcs, CodeToolManager, BasicCodeTools, CodeCache, CCodeParserTool, H2PasTool; type { TTestCodetoolsH2Pas } TTestCodetoolsH2Pas = class(TTestCase) protected procedure Test(Title, CHeaderSrc, ExpectedPasSrc: string); procedure TestIntf(Title, CHeaderSrc, ExpectedPasSrc: string); published procedure TestCTH2PMergeHeaderFiles; procedure TestCTH2PReplaceMacros; procedure TestCTH2PConvertSimpleVars; procedure TestCTH2PConvertEnumsTypes; procedure TestCTH2PConvertConst; procedure TestCTH2PConvertSimpleTypedefs; procedure TestCTH2PConvertSimpleStructs; end; implementation { TTestCodetoolsH2Pas } procedure TTestCodetoolsH2Pas.Test(Title, CHeaderSrc, ExpectedPasSrc: string); var Tool: TH2PasTool; Header1: TCodeBuffer; PasCode: TCodeBuffer; begin Tool:=TH2PasTool.Create; Header1:=nil; PasCode:=nil; try Header1:=CodeToolBoss.CreateFile('header1.h'); PasCode:=CodeToolBoss.CreateFile('header1.pas'); Header1.Source:=CHeaderSrc; Tool.Convert(Header1,PasCode); if CompareTextIgnoringSpace(ExpectedPasSrc,PasCode.Source,true)<>0 then begin // failed debugln(['TTestCodetoolsH2Pas.Test C Source="',CHeaderSrc,'"']); debugln(['TTestCodetoolsH2Pas.Test Expected pas="',ExpectedPasSrc,'"']); debugln(['TTestCodetoolsH2Pas.Test Found pas="',PasCode.Source,'"']); Tool.WriteH2PNodeReport; Tool.WriteH2PDirectivesNodeReport; AssertEquals(Title,ExpectedPasSrc,PasCode.Source); end else begin //debugln(['TTestCodetoolsH2Pas.Test Found pas="',PasCode.Source,'"']); AssertEquals(Title,true,true); end; finally if Header1<>nil then Header1.IsDeleted:=true; if PasCode<>nil then PasCode.IsDeleted:=true; Tool.Free; end; end; procedure TTestCodetoolsH2Pas.TestIntf(Title, CHeaderSrc, ExpectedPasSrc: string ); var UsesCTypes: String; EmpytImplementation: String; begin UsesCTypes:='uses ctypes;'+LineEnding; EmpytImplementation:=LineEnding+'implementation'+LineEnding+'end.'; Test(Title,CHeaderSrc,UsesCTypes+ExpectedPasSrc+EmpytImplementation); end; procedure TTestCodetoolsH2Pas.TestCTH2PMergeHeaderFiles; var Header1, Header2: TCodeBuffer; Merger: TCHeaderFileMerger; Filenames: TStringList; Src: String; Header1Start: LongInt; Header2Start: LongInt; Header1End: LongInt; begin Header1:=CodeToolBoss.CreateFile('header1.h'); Header2:=CodeToolBoss.CreateFile('header2.h'); Header1.Source:='// header1.h'+LineEnding +'#include header2.h'+LineEnding +'// end of header1.h'; Header2.Source:='// header2.h'; Merger:=TCHeaderFileMerger.Create; Filenames:=TStringList.Create; try Filenames.Add('header1.h'); Filenames.Add('header2.h'); Merger.Merge(Filenames,CodeToolBoss.SourceCache,[]); Src:=Merger.CombinedSource.Source; Header1Start:=System.Pos('// header1.h',Src); Header2Start:=System.Pos('// header2.h',Src); Header1End:=System.Pos('// end of header1.h',Src); //debugln(['TTestCodetoolsH2Pas.TestCTH2PMergeHeaderFiles ',Src]); AssertEquals('start comment header1.h',1,Header1Start); AssertEquals('start comment header1.h in front of header2.h',true,Header1Start