lazarus/test/bugtestcase.pas
2017-01-29 21:04:32 +00:00

220 lines
6.1 KiB
ObjectPascal

{ $Id$}
{ Copyright (C) 2007 Vincent Snijders
This source is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
This code is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
A copy of the GNU General Public License is available on the World Wide Web
at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
Boston, MA 02110-1335, USA.
}
unit BugTestCase;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Math, process, fpcunit, testregistry,
FileUtil, LazFileUtils, LazUTF8, UTF8Process, InterfaceBase, LCLPlatformDef,
TestGlobals;
type
{ TBugTestCase }
TBugTestCase= class(TTestCase)
private
FPath: string;
FProjectFile: string;
public
constructor Create(APath, ATestName: string); reintroduce;
class function CreateSuite(Path: string) : TTestSuite;
published
procedure Compile;
procedure RunTestApp;
procedure CompareExpectations;
procedure HeaptrcLog;
end;
implementation
var
// a global variable to pass information between tests is not nice, but it works
RunOutput: TStringList;
function FindProjectFile(APath: string):string;
var
SearchRec: TSearchRec;
begin
if FindFirstUTF8(AppendPathDelim(APath)+'*.lpi', faAnyFile, SearchRec)=0 then begin
repeat
if ExtractFileExt(SearchRec.Name)='.lpi' then
Result := SearchRec.Name;
until (Length(Result)>0) or (FindNextUTF8(SearchRec)<>0);
end;
FindCloseUTF8(SearchRec);
if length(Result)>0 then
Result := AppendPathDelim(APath) + Result;
end;
procedure TBugTestCase.Compile;
var
LazBuildPath: string;
LazBuild: TProcessUTF8;
LazarusDir: String;
ExeFile: string;
CmdLine: string;
begin
AssertTrue('Project file '+ FProjectFile + ' does not exist',
FileExistsUTF8(FProjectFile));
LazarusDir := ExpandFileNameUTF8(ExtractFilePath(ParamStrUTF8(0)) + '../');
LazBuildPath := LazarusDir + 'lazbuild' + GetExeExt;
AssertTrue(LazBuildPath + ' does not exist', FileExistsUTF8(LazBuildPath));
ExeFile := ChangeFileExt(FPath,GetExeExt);
if FileExistsUTF8(ExeFile) then
DeleteFileUTF8(ExeFile);
LazBuild := TProcessUTF8.Create(nil);
try
{$IFDEF windows}
LazBuild.Options := [poNewConsole];
{$ELSE}
LazBuild.Options := [poNoConsole];
{$ENDIF}
LazBuild.ShowWindow := swoHIDE;
CmdLine:=LazBuildPath;
CmdLine := LazBuildPath;
if Compiler<>'' then
CmdLine := CmdLine + ' --compiler='+Compiler;
if PrimaryConfigPath<>'' then
CmdLine := CmdLine + ' --pcp='+PrimaryConfigPath;
Cmdline := Cmdline + ' --ws=' + LCLPlatformDirNames[WidgetSet.LCLPlatform];
CmdLine:=CmdLine + ' ' + FProjectFile;
LazBuild.CommandLine := CmdLine;
LazBuild.CurrentDirectory := FPath;
LazBuild.Execute;
LazBuild.WaitOnExit;
AssertEquals('Compilation failed: ExitCode', 0, LazBuild.ExitStatus);
finally
LazBuild.Free;
end;
end;
procedure TBugTestCase.RunTestApp;
var
TestProcess : TProcessUTF8;
ExeName: string;
OutputLines: TStringList;
begin
ExeName := ChangeFileExt(FProjectFile, GetExeExt);
AssertTrue(ExeName + 'does not exist.', FileExistsUTF8(ExeName));
TestProcess := TProcessUTF8.Create(nil);
try
TestProcess.CommandLine := ExeName + ' --runtest';
TestProcess.Options := [poUsePipes];
TestProcess.Execute;
try
OutputLines := ReadOutput(TestProcess);
try
RunOutput.Assign(OutputLines);
finally
OutputLines.Free;
end;
AssertFalse('TestProcess did not auto-terminate', TestProcess.Running);
finally
TestProcess.Terminate(0);
end;
finally
TestProcess.Free;
end;
end;
procedure TBugTestCase.CompareExpectations;
var
ExpectedFileName: string;
ExpectedLines: TStrings;
ActualLines: TStrings;
MinLineCount: integer;
i: integer;
begin
ExpectedFileName := AppendPathDelim(FPath) + 'expected.txt';
AssertTrue('File missing: '+ExpectedFileName, FileExistsUTF8(ExpectedFileName));
ExpectedLines := nil;
ActualLines := nil;
try
ExpectedLines := TStringList.Create;
ExpectedLines.LoadFromFile(UTF8ToSys(ExpectedFileName));
ActualLines := TStringList.Create;
ActualLines.Assign(RunOutput);
MinLineCount := min(ExpectedLines.Count, ActualLines.Count);
for i := 0 to MinLineCount - 1 do begin
AssertEquals('Output difference on line '+IntToStr(i+1),
ExpectedLines[i], ActualLines[i]);
end;
AssertEquals('Difference in line count',
ExpectedLines.Count, ActualLines.Count);
finally
ExpectedLines.Free;
ActualLines.Free;
end;
end;
procedure TBugTestCase.HeaptrcLog;
begin
end;
constructor TBugTestCase.Create(APath, ATestName: string);
begin
CreateWithName(ATestName);
FPath := APath;
FProjectFile := FindProjectFile(FPath);
end;
class function TBugTestCase.CreateSuite(Path: string): TTestSuite;
var
Directory: string;
begin
Directory := ExtractFileName(Path);
Result := TTestSuite.Create(Directory);
Result.AddTest(Create(Path, 'Compile'));
Result.AddTest(Create(Path, 'RunTestApp'));
Result.AddTest(Create(Path, 'CompareExpectations'));
Result.AddTest(Create(Path, 'HeaptrcLog'));
end;
procedure GatherTests;
var
ProgPath: string;
SearchRec: TSearchRec;
begin
ProgPath := ExtractFilePath(ParamStrUTF8(0)) + 'bugs' + pathdelim;
if FindFirstUTF8(ProgPath+'*', faAnyFile, SearchRec)=0 then
repeat
if (SearchRec.Attr and (faDirectory + faHidden)=faDirectory) and
(SearchRec.Name<>'.') and (SearchRec.Name<>'..') and
(SearchRec.Name<>'.svn')
then
BugsTestSuite.AddTest(
TBugTestCase.CreateSuite(ProgPath+SearchRec.Name));
until FindNextUTF8(SearchRec)<>0;
FindCloseUTF8(SearchRec);
end;
initialization
GatherTests;
RunOutput := TStringList.Create;
finalization
FreeAndNil(RunOutput);
end.