mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-26 22:23:49 +02:00
297 lines
11 KiB
ObjectPascal
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.
|
|
|