mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-02 11:52:37 +02:00
149 lines
4.2 KiB
ObjectPascal
149 lines
4.2 KiB
ObjectPascal
{
|
|
Test with:
|
|
./runtests --format=plain --suite=TTestBasicCodeTools
|
|
./runtests --format=plain --suite=TestFindLineEndOrCodeInFrontOfPosition
|
|
./runtests --format=plain --suite=TestHasTxtWord
|
|
./runtests --format=plain --suite=TestBasicFindCommentEnd
|
|
./runtests --format=plain --suite=TestBasicFindNextComment
|
|
}
|
|
unit TestBasicCodetools;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
fpcunit, Classes, SysUtils, testglobals, FileProcs, BasicCodeTools;
|
|
|
|
type
|
|
{ TTestBasicCodeTools }
|
|
|
|
TTestBasicCodeTools = class(TTestCase)
|
|
protected
|
|
published
|
|
procedure TestFindLineEndOrCodeInFrontOfPosition;
|
|
procedure TestHasTxtWord;
|
|
procedure TestBasicFindCommentEnd;
|
|
procedure TestBasicFindNextComment;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ TTestBasicCodeTools }
|
|
|
|
procedure TTestBasicCodeTools.TestFindLineEndOrCodeInFrontOfPosition;
|
|
|
|
procedure t(Src: string; SkipSemicolonComma: boolean = true;
|
|
StopAtDirectives: boolean = true;
|
|
SkipEmptyLines: boolean = false; NestedComments: boolean = true);
|
|
var
|
|
Position: integer;
|
|
Expected: integer;
|
|
Actual: LongInt;
|
|
OrigSrc: String;
|
|
begin
|
|
OrigSrc:=Src;
|
|
Expected:=Pos('$',Src);
|
|
if Expected<1 then
|
|
raise Exception.Create('TTestBasicCodeTools.TestFindLineEndOrCodeInFrontOfPosition missing # expected position');
|
|
Delete(Src,Expected,1);
|
|
Position:=Pos('|',Src);
|
|
if Position<1 then
|
|
raise Exception.Create('TTestBasicCodeTools.TestFindLineEndOrCodeInFrontOfPosition missing | start position');
|
|
Delete(Src,Position,1);
|
|
Actual:=FindLineEndOrCodeInFrontOfPosition(Src,Position,1,NestedComments,
|
|
StopAtDirectives,SkipSemicolonComma,SkipEmptyLines);
|
|
AssertEquals('['+dbgstr(OrigSrc)+']',Expected,Actual);
|
|
end;
|
|
|
|
var
|
|
e: String;
|
|
begin
|
|
//writeln('TTestBasicCodeTools.TestFindLineEndOrCodeInFrontOfPosition ');
|
|
e:=#13#10; // use windows line endings, they are more complicated
|
|
t(' $'+e+'|a:=1;');
|
|
t('a$'+e+'// comment'+e+' { comment } '+e+'|');
|
|
t('$'+e+' (* *)'+e+' |a:=1');
|
|
t('a:=1;(* comment of first line'+e+' *)$ |b:=1');
|
|
t('a:=1; // comment$'+e+'|b:=1');
|
|
t('a:=1; (* comment'+e+' *) $'+e+'|b:=1');
|
|
t('a:=1; (* comment'+e+' *) { comment'+e+' } $'+e+'|b:=1');
|
|
end;
|
|
|
|
procedure TTestBasicCodeTools.TestHasTxtWord;
|
|
|
|
procedure t(aWord,aText: PChar; ExpectedWholeWord: boolean; ExpectedCount: SizeInt);
|
|
var
|
|
WholeWord: boolean;
|
|
Count: SizeInt;
|
|
begin
|
|
HasTxtWord(aWord,aText,WholeWord,Count);
|
|
AssertEquals('Word="'+aWord+'" Text="'+aText+'" WholeWord',ExpectedWholeWord,WholeWord);
|
|
AssertEquals('Word="'+aWord+'" Text="'+aText+'" Count',ExpectedCount,Count);
|
|
end;
|
|
|
|
begin
|
|
t(nil,nil,false,0);
|
|
t('a','a',true,1);
|
|
t('ab','a',false,0); // ab not in a
|
|
t('a','ab',false,1); // a in ab
|
|
t('a','aba',false,2);
|
|
t('a','a a',true,2);
|
|
t('a','ab a',true,1);
|
|
t('abc','ab abcd',false,1);
|
|
t('ab','abab',false,2);
|
|
end;
|
|
|
|
procedure TTestBasicCodeTools.TestBasicFindCommentEnd;
|
|
|
|
procedure TestFindCommentEnd(Src: string;
|
|
NestedComments: boolean; ExpectedEndPos: integer);
|
|
var
|
|
EndPos: Integer;
|
|
p: PChar;
|
|
EndP: PChar;
|
|
begin
|
|
EndPos:=FindCommentEnd(Src,1,NestedComments);
|
|
AssertEquals('FindCommentEnd(string) '+dbgstr(Src),ExpectedEndPos,EndPos);
|
|
p:=PChar(Src);
|
|
EndP:=FindCommentEnd(p,NestedComments);
|
|
EndPos:=EndP-PChar(Src)+1;
|
|
AssertEquals('FindCommentEnd(pchar) '+dbgstr(Src),ExpectedEndPos,EndPos);
|
|
end;
|
|
|
|
begin
|
|
TestFindCommentEnd(' ',false,1);
|
|
TestFindCommentEnd('{}',false,3);
|
|
TestFindCommentEnd('(**)',false,5);
|
|
TestFindCommentEnd('(*)',false,4);
|
|
TestFindCommentEnd('{{}}',false,4);
|
|
TestFindCommentEnd('{{}}',true,5);
|
|
TestFindCommentEnd('{'#3#3'}',false,5);
|
|
TestFindCommentEnd('{'#3'}'#3'}',false,6);
|
|
TestFindCommentEnd('//',false,3);
|
|
end;
|
|
|
|
procedure TTestBasicCodeTools.TestBasicFindNextComment;
|
|
|
|
procedure TestFindNextComment(Src: string; ExpectedPos: integer);
|
|
var
|
|
StartPos: Integer;
|
|
begin
|
|
StartPos:=FindNextComment(Src,1);
|
|
AssertEquals('FindNextComment '+dbgstr(Src),ExpectedPos,StartPos);
|
|
end;
|
|
|
|
begin
|
|
TestFindNextComment('{',1);
|
|
TestFindNextComment('//',1);
|
|
TestFindNextComment('(*',1);
|
|
TestFindNextComment('(',2);
|
|
TestFindNextComment('/',2);
|
|
end;
|
|
|
|
initialization
|
|
AddToCodetoolsTestSuite(TTestBasicCodeTools);
|
|
|
|
end.
|
|
|