lazarus/test/ideintf/testsearchpathprocs.pas

297 lines
11 KiB
ObjectPascal

{
Test all with:
./runtests --format=plain --suite=TTestSearchPathProcs
Test specific with:
./runtests --format=plain --suite=TTestSearchPathProcs.TestRelateDirectoryMasks
}
unit TestSearchPathProcs;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Types, fpcunit, testglobals, LazLogger, LazFileUtils,
SearchPathProcs, LazUTF8;
type
{ TTestSearchPathProcs }
TTestSearchPathProcs = class(TTestCase)
published
procedure TestRelateDirectoryMasks;
procedure TestFileIsInSPDirectory;
procedure TestTrimSearchPath;
end;
implementation
{ TTestSearchPathProcs }
procedure TTestSearchPathProcs.TestRelateDirectoryMasks;
procedure t(const Paths: TStringDynArray; Left, Right: integer; Expected: TSPFileMaskRelation);
var
SearchPath: String;
i, LeftStart, RightStart: Integer;
Actual: TSPFileMaskRelation;
begin
SearchPath:='';
LeftStart:=10000;
RightStart:=10000;
for i:=0 to length(Paths)-1 do begin
if i>0 then
SearchPath+=';';
if i=Left then
LeftStart:=length(SearchPath)+1;
if i=Right then
RightStart:=length(SearchPath)+1;
SearchPath+=SetDirSeparators(Paths[i]);
end;
Actual:=RelateDirectoryMasks(SearchPath,LeftStart,SearchPath,RightStart);
if Actual<>Expected then begin
Fail('SearchPath="'+SearchPath+'" LeftStart='+IntToStr(LeftStart)+' RightStart='+IntToStr(RightStart)+' Actual='+dbgs(Actual)+' Expected='+dbgs(Expected));
end;
// try the other way round
case Expected of
TSPFileMaskRelation.LeftMoreGeneral: Expected:=TSPFileMaskRelation.RightMoreGeneral;
TSPFileMaskRelation.RightMoreGeneral: Expected:=TSPFileMaskRelation.LeftMoreGeneral;
end;
Actual:=RelateDirectoryMasks(SearchPath,RightStart,SearchPath,LeftStart);
if Actual<>Expected then begin
Fail('SearchPath="'+SearchPath+'" LeftStart='+IntToStr(LeftStart)+' RightStart='+IntToStr(RightStart)+' Actual='+dbgs(Actual)+' Expected='+dbgs(Expected));
end;
end;
begin
t([''],1,1,TSPFileMaskRelation.None);
t([''],0,0,TSPFileMaskRelation.None);
t(['a'],0,0,TSPFileMaskRelation.Equal);
t(['foo'],0,0,TSPFileMaskRelation.Equal);
{$IFDEF MSWindows}
t(['C:\foo'],0,0,TSPFileMaskRelation.Equal);
t(['C:\foo\bar'],0,0,TSPFileMaskRelation.Equal);
t(['C:\foo\bar','C:\foo\bar\'],0,1,TSPFileMaskRelation.Equal);
{$ELSE}
t(['/foo'],0,0,TSPFileMaskRelation.Equal);
t(['/foo/bar'],0,0,TSPFileMaskRelation.Equal);
t(['/foo/bar','/foo/bar/'],0,1,TSPFileMaskRelation.Equal);
{$ENDIF}
// star
t(['*'],0,0,TSPFileMaskRelation.Equal);
t(['*','a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['*','.'],0,1,TSPFileMaskRelation.None);
t(['*','..'],0,1,TSPFileMaskRelation.None);
{$IFDEF MSWindows}
t(['C:\*'],0,0,TSPFileMaskRelation.Equal);
t(['C:\foo\*'],0,0,TSPFileMaskRelation.Equal);
t(['*','a\'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['C:\*','C:\a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['C:\*','a'],0,1,TSPFileMaskRelation.None);
t(['C:\foo\*','C:\foo\a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['C:\foo\*','C:\foo\a\'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['foo\*','foo\a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['C:\foo\*','C:\a'],0,1,TSPFileMaskRelation.None);
t(['foo\*','a'],0,1,TSPFileMaskRelation.None);
t(['C:\foo\*','C:\foo\bar\a'],0,1,TSPFileMaskRelation.None);
t(['foo\*','foo\bar\a'],0,1,TSPFileMaskRelation.None);
t(['C:\*','C:\'],0,1,TSPFileMaskRelation.None);
{$ELSE}
t(['/*'],0,0,TSPFileMaskRelation.Equal);
t(['/foo/*'],0,0,TSPFileMaskRelation.Equal);
t(['*','a/'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['/*','/a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['/*','a'],0,1,TSPFileMaskRelation.None);
t(['/foo/*','/foo/a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['/foo/*','/foo/a/'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['foo/*','foo/a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['/foo/*','/a'],0,1,TSPFileMaskRelation.None);
t(['foo/*','a'],0,1,TSPFileMaskRelation.None);
t(['/foo/*','/foo/bar/a'],0,1,TSPFileMaskRelation.None);
t(['foo/*','foo/bar/a'],0,1,TSPFileMaskRelation.None);
t(['/*','/'],0,1,TSPFileMaskRelation.None);
{$ENDIF}
// star star
t(['**'],0,0,TSPFileMaskRelation.Equal);
t(['**','a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['**','.'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['**','..'],0,1,TSPFileMaskRelation.None);
t(['**','foo\a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
{$IFDEF MSWindows}
t(['C:\**'],0,0,TSPFileMaskRelation.Equal);
t(['C:\bar\**'],0,0,TSPFileMaskRelation.Equal);
t(['**','C:\foo\a'],0,1,TSPFileMaskRelation.None);
t(['C:\**','foo\a'],0,1,TSPFileMaskRelation.None);
t(['C:\foo\**','foo\a'],0,1,TSPFileMaskRelation.None);
t(['C:\foo\**','C:\foo\a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['C:\foo\**','C:\foo\bar\a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
{$ELSE}
t(['/**'],0,0,TSPFileMaskRelation.Equal);
t(['/bar/**'],0,0,TSPFileMaskRelation.Equal);
t(['**','foo/a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['**','/foo/a'],0,1,TSPFileMaskRelation.None);
t(['/**','foo/a'],0,1,TSPFileMaskRelation.None);
t(['/foo/**','foo/a'],0,1,TSPFileMaskRelation.None);
t(['/foo/**','/foo/a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
t(['/foo/**','/foo/bar/a'],0,1,TSPFileMaskRelation.LeftMoreGeneral);
{$ENDIF}
end;
procedure TTestSearchPathProcs.TestFileIsInSPDirectory;
procedure t(Filename, Directory: string; MaskType: TSPMaskType; Expected: boolean);
var
Actual: Boolean;
begin
Filename:=SetDirSeparators(Filename);
Directory:=SetDirSeparators(Directory);
Actual:=FileIsInSPDirectory(Filename,Directory,MaskType);
if Actual=Expected then exit;
Fail('Filename="'+Filename+'" Directory="'+Directory+'" MaskType='+dbgs(MaskType)+' Expected='+dbgs(Expected)+', but was '+dbgs(Actual));
end;
begin
t('','',TSPMaskType.None,false);
t('.','',TSPMaskType.None,false);
t('..','',TSPMaskType.None,false);
t('../','',TSPMaskType.None,false);
t('a','',TSPMaskType.None,true);
t('a/b','',TSPMaskType.None,false);
t('','foo',TSPMaskType.None,false);
t('a','foo',TSPMaskType.None,false);
t('foo/','foo',TSPMaskType.None,true);
t('foo/a','foo',TSPMaskType.None,true);
t('foo/bar/a','foo',TSPMaskType.None,false);
{$IFDEF MSWindows}
t('C:\a','',TSPMaskType.None,false);
t('C:\a\b','',TSPMaskType.None,false);
t('C:\','foo',TSPMaskType.None,false);
t('C:\','C:\foo',TSPMaskType.None,false);
t('C:\a','C:\foo',TSPMaskType.None,false);
t('C:\foo\','C:\foo',TSPMaskType.None,true);
t('C:\foo\a','C:\foo',TSPMaskType.None,true);
t('C:\foo\bar\a','C:\foo',TSPMaskType.None,false);
{$ELSE}
t('/a','',TSPMaskType.None,false);
t('/a/b','',TSPMaskType.None,false);
t('/','foo',TSPMaskType.None,false);
t('/','/foo',TSPMaskType.None,false);
t('/a','/foo',TSPMaskType.None,false);
t('/foo/','/foo',TSPMaskType.None,true);
t('/foo/a','/foo',TSPMaskType.None,true);
t('/foo/bar/a','/foo',TSPMaskType.None,false);
{$ENDIF}
t('','',TSPMaskType.Star,false);
t('.','',TSPMaskType.Star,false);
t('..','',TSPMaskType.Star,false);
t('../','',TSPMaskType.Star,false);
t('a','',TSPMaskType.Star,false);
t('a/b','',TSPMaskType.Star,true);
t('a/b/c','',TSPMaskType.Star,false);
t('','foo',TSPMaskType.Star,false);
t('a','foo',TSPMaskType.Star,false);
t('foo/','foo',TSPMaskType.Star,false);
t('foo/bar','foo',TSPMaskType.Star,false);
t('foo/bar/a','foo',TSPMaskType.Star,true);
t('foo/bar/a/b','foo',TSPMaskType.Star,false);
{$IFDEF MSWindows}
t('C:\a','',TSPMaskType.Star,false);
t('C:\a','C:\',TSPMaskType.Star,false);
t('C:\a\b','C:\',TSPMaskType.Star,true);
t('C:\a\b\c','C:\',TSPMaskType.Star,false);
t('C:\','C:\foo',TSPMaskType.Star,false);
t('C:\a','C:\foo',TSPMaskType.Star,false);
t('C:\foo\','C:\foo',TSPMaskType.Star,false);
t('C:\foo\bar','C:\foo',TSPMaskType.Star,false);
t('C:\foo\bar\a','C:\foo',TSPMaskType.Star,true);
t('C:\foo\bar\a\b','C:\foo',TSPMaskType.Star,false);
{$ELSE}
t('/a','',TSPMaskType.Star,false);
t('/a','/',TSPMaskType.Star,false);
t('/a/b','/',TSPMaskType.Star,true);
t('/a/b/c','/',TSPMaskType.Star,false);
t('/','/foo',TSPMaskType.Star,false);
t('/a','/foo',TSPMaskType.Star,false);
t('/foo/','/foo',TSPMaskType.Star,false);
t('/foo/bar','/foo',TSPMaskType.Star,false);
t('/foo/bar/a','/foo',TSPMaskType.Star,true);
t('/foo/bar/a/b','/foo',TSPMaskType.Star,false);
{$ENDIF}
t('','',TSPMaskType.StarStar,false);
t('.','',TSPMaskType.StarStar,true);
t('..','',TSPMaskType.StarStar,false);
t('../','',TSPMaskType.StarStar,false);
t('a','',TSPMaskType.StarStar,true);
t('a/b','',TSPMaskType.StarStar,true);
t('a/b/c','',TSPMaskType.StarStar,true);
t('','foo',TSPMaskType.StarStar,false);
t('a','foo',TSPMaskType.StarStar,false);
t('foo/','foo',TSPMaskType.StarStar,true);
t('foo/bar','foo',TSPMaskType.StarStar,true);
t('foo/bar','foo/bar',TSPMaskType.StarStar,false);
t('foo/bar/a','foo',TSPMaskType.StarStar,true);
t('foo/bar/a','foo/bar',TSPMaskType.StarStar,true);
{$IFDEF MSWindows}
t('foo\','C:\foo',TSPMaskType.StarStar,false);
t('C:\a','C:\',TSPMaskType.StarStar,true);
t('C:\a\b','C:\',TSPMaskType.StarStar,true);
t('C:\a\b\c','C:\',TSPMaskType.StarStar,true);
t('C:\','C:\foo',TSPMaskType.StarStar,false);
t('C:\a','C:\foo',TSPMaskType.StarStar,false);
t('C:\foo\','C:\foo',TSPMaskType.StarStar,true);
t('C:\foo\bar','C:\foo',TSPMaskType.StarStar,true);
t('C:\foo\bar','C:\foo\bar',TSPMaskType.StarStar,false);
t('C:\foo\bar\a','C:\foo',TSPMaskType.StarStar,true);
t('C:\foo\bar\a','C:\foo\bar',TSPMaskType.StarStar,true);
{$ELSE}
t('foo/','/foo',TSPMaskType.StarStar,false);
t('/a','/',TSPMaskType.StarStar,true);
t('/a/b','/',TSPMaskType.StarStar,true);
t('/a/b/c','/',TSPMaskType.StarStar,true);
t('/','/foo',TSPMaskType.StarStar,false);
t('/a','/foo',TSPMaskType.StarStar,false);
t('/foo/','/foo',TSPMaskType.StarStar,true);
t('/foo/bar','/foo',TSPMaskType.StarStar,true);
t('/foo/bar','/foo/bar',TSPMaskType.StarStar,false);
t('/foo/bar/a','/foo',TSPMaskType.StarStar,true);
t('/foo/bar/a','/foo/bar',TSPMaskType.StarStar,true);
{$ENDIF}
end;
procedure TTestSearchPathProcs.TestTrimSearchPath;
procedure t(SearchPath, BaseDirectory: string;
DeleteDoubles, ExpandPaths: boolean; Expected: string);
var
Actual: String;
begin
SearchPath:=SetDirSeparators(SearchPath);
BaseDirectory:=SetDirSeparators(BaseDirectory);
Actual:=TrimSearchPath(SearchPath,BaseDirectory,DeleteDoubles,ExpandPaths);
if Actual=Expected then exit;
Fail('SearchPath="'+SearchPath+'" BaseDirectory="'+BaseDirectory+'" DeleteDoubles='+dbgs(DeleteDoubles)+' ExpandPaths='+dbgs(ExpandPaths)+' expected "'+Expected+'", but was "'+Actual+'"');
end;
begin
t('/a','',true,false,'/a');
t('/foo/*;/foo/*','',true,false,'/foo/*');
t('/foo/*;/foo/bar','',true,false,'/foo/*');
t('/foo/bar;/foo/*','',true,false,'/foo/bar;/foo/*');
t('/a;/foo/*;/b;/foo/bar','',true,false,'/a;/foo/*;/b');
t('/a;/foo/*;/b;/foo/**','',true,false,'/a;/foo/*;/b;/foo/**');
t('/a;/foo/**;/b;/foo/*','',true,false,'/a;/foo/**;/b');
end;
initialization
AddToIDEIntfTestSuite(TTestSearchPathProcs);
end.