123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422 |
- unit utcregexapi;
- {$mode objfpc}{$H+}
- { $DEFINE USEWIDESTRING}
- interface
- uses
- Classes, SysUtils, fpcunit, testutils, testregistry, system.regularexpressionscore, system.regularexpressions;
- type
- { TTestRegExpCore }
- TTestRegExp = class(TTestCase)
- private
- FRegex: TRegEx;
- function DoReplacer(const Match: TMatch): TREString;
- Protected
- Property Regex : TRegEx Read FRegex Write FRegex;
- Public
- Procedure SetUp; override;
- Procedure TearDown; override;
- Published
- Procedure TestIsMatch;
- Procedure TestIsMatchStartPos;
- Procedure TestClassIsMatch;
- Procedure TestClassIsMatchOptions;
- Procedure TestEscape;
- Procedure TestMatch;
- Procedure TestMatchNoMatch;
- Procedure TestMatchStartPos;
- Procedure TestMatchStartPosLength;
- Procedure TestClassMatch;
- Procedure TestClassMatchOptions;
- Procedure TestMatches;
- Procedure TestMatchesStartPos;
- Procedure TestClassMatches;
- Procedure TestClassMatchesOptions;
- Procedure TestReplace;
- Procedure TestReplaceEval;
- Procedure TestReplaceCount;
- Procedure TestReplaceEvalCount;
- Procedure TestClassReplace;
- Procedure TestClassReplaceEval;
- Procedure TestClassReplaceOptions;
- Procedure TestClassReplaceEvalOptions;
- {
- function Split(const aInput: TREString): TREStringDynArray; overload; inline;
- function Split(const aInput: TREString; aCount: Integer): TREStringDynArray; overload; inline;
- function Split(const aInput: TREString; aCount, aStartPos: Integer): TREStringDynArray; overload;
- class function Split(const aInput, aPattern: TREString): TREStringDynArray; overload; static;
- class function Split(const aInput, aPattern: TREString; aOptions: TRegExOptions): TREStringDynArray; overload; static;
- }
- end;
- implementation
- Const
- TestStr = 'xyz abba abbba abbbba zyx';
- TestExpr = 'a(b*)a';
- { TTestRegExpr}
- procedure TTestRegExp.SetUp;
- begin
- inherited SetUp;
- FRegex:=Default(TRegex);
- end;
- procedure TTestRegExp.TearDown;
- begin
- FRegex:=Default(TRegex);
- inherited TearDown;
- end;
- procedure TTestRegExp.TestIsMatch;
- begin
- // function IsMatch(const aInput: TREString): Boolean; overload;
- Regex:=TRegex.Create(TestExpr);
- AssertTrue('Correct match',Regex.IsMatch(TestStr));
- end;
- procedure TTestRegExp.TestIsMatchStartPos;
- begin
- // function IsMatch(const aInput: TREString; aStartPos: Integer): Boolean; overload;
- Regex:=TRegex.Create(TestExpr);
- AssertTrue('Correct match',Regex.IsMatch(TestStr,Pos('abbba',TestStr)));
- AssertFalse('No match match at pos',Regex.IsMatch(TestStr,Pos('zyx',TestStr)));
- end;
- procedure TTestRegExp.TestClassIsMatch;
- begin
- // class function IsMatch(const aInput, aPattern: TREString): Boolean;overload; static;
- AssertTrue('Correct match',TRegex.IsMatch(TestStr,TestExpr));
- AssertFalse('No match',TRegex.IsMatch(TestStr,TestExpr+'xyz'));
- end;
- procedure TTestRegExp.TestClassIsMatchOptions;
- begin
- // class function IsMatch(const aInput, aPattern: TREString; aOptions: TRegExOptions): Boolean; overload; static;
- AssertTrue('Correct match',TRegex.IsMatch(UpperCase(TestStr),TestExpr,[roIgnoreCase]));
- AssertFalse('No match',TRegex.IsMatch(UpperCase(TestStr),TestExpr+'xyz',[roIgnoreCase]));
- end;
- procedure TTestRegExp.TestEscape;
- begin
- // class function Escape(const aString: TREString; aUseWildCards: Boolean = False): TREString; static;
- AssertEquals('Wildcard ?','(.)',TRegex.Escape('?',True));
- AssertEquals('Wildcard ?','\?',TRegex.Escape('??',True));
- AssertEquals('Wildcard *','(.*)',TRegex.Escape('*',True));
- AssertEquals('Wildcard ?','\*',TRegex.Escape('**',True));
- AssertEquals('CRLF','\r\n',TRegex.Escape(#13#10,True));
- end;
- Procedure DumpMatch(M : TMatch);
- var
- I : Integer;
- begin
- Writeln('Match value: ',M.Value);
- Writeln('Match index: ',M.Index);
- Writeln('Match length: ',M.Length);
- Writeln('Match group count: ',M.Groups.Count);
- for I:=0 to M.Groups.Count-1 do
- begin
- Writeln('Group ',I);
- Writeln(Format('Match group %d value: ',[i]),M.Groups[i].Value);
- Writeln(Format('Match group %d index: ',[i]),M.Groups[i].Index);
- Writeln(Format('Match group %d length: ',[i]),M.Groups[i].Length);
- end;
- end;
- procedure TTestRegExp.TestMatch;
- var
- M : TMatch;
- begin
- // function Match(const aInput: TREString): TMatch; overload;
- RegEx:=TRegex.Create(TestExpr);
- M:=RegEx.Match(TestStr);
- AssertTrue('Match 0 result: ',M.Success);
- AssertEquals('Match 0 value: ','abba',M.Value);
- AssertEquals('Match 0 index: ',5,M.Index);
- AssertEquals('Match 0 length: ',4,M.Length);
- AssertEquals('Match 0 group count: ',2,M.Groups.Count);
- AssertEquals('Match 0 group 0 value: ','abba',M.Groups[0].Value);
- AssertEquals('Match 0 group 0 index: ',5,M.Groups[0].Index);
- AssertEquals('Match 0 group 0 length: ',4,M.Groups[0].Length);
- AssertEquals('Match 0 group 1 value: ','bb',M.Groups[1].Value);
- AssertEquals('Match 0 group 1 index: ',6,M.Groups[1].Index);
- AssertEquals('Match 0 group 1 length: ',2,M.Groups[1].Length);
- M:=M.NextMatch;
- AssertTrue('Match 1 result: ',M.Success);
- AssertEquals('Match 1 value: ','abbba',M.Value);
- AssertEquals('Match 1 index: ',10,M.Index);
- AssertEquals('Match 1 length: ',5,M.Length);
- M:=M.NextMatch;
- AssertTrue('Match 2 result: ',M.Success);
- AssertEquals('Match 2 value: ','abbbba',M.Value);
- AssertEquals('Match 2 index: ',16,M.Index);
- AssertEquals('Match 2 length: ',6,M.Length);
- M:=M.NextMatch;
- AssertFalse('Match 3 value: ',M.Success);
- end;
- procedure TTestRegExp.TestMatchNoMatch;
- var
- M : TMatch;
- begin
- RegEx:=TRegex.Create(TestExpr+'xyz');
- M:=RegEx.Match(TestStr);
- AssertFalse('Success',M.Success);
- AssertEquals('No match value','',M.Value);
- AssertEquals('No match Index',0,M.Index);
- AssertEquals('No match legth',0,M.Length);
- end;
- procedure TTestRegExp.TestMatchStartPos;
- var
- M : TMatch;
- P : Integer;
- begin
- // function Match(const aInput: TREString): TMatch; overload;
- RegEx:=TRegex.Create(TestExpr);
- P:=Pos('abbba',TestStr);
- M:=RegEx.Match(TestStr,P);
- // DumpMatch(M);
- AssertTrue('Match value: ',M.Success);
- AssertEquals('Match value: ','abbba',M.Value);
- AssertEquals('Match index: ',10,M.Index);
- AssertEquals('Match length: ',5,M.Length);
- AssertEquals('Match group count: ',2,M.Groups.Count);
- AssertEquals('Match group 0 value: ','abbba',M.Groups[0].Value);
- AssertEquals('Match group 0 index: ',10,M.Groups[0].Index);
- AssertEquals('Match group 0 length: ',5,M.Groups[0].Length);
- AssertEquals('Match group 1 value: ','bbb',M.Groups[1].Value);
- AssertEquals('Match group 1 index: ',11,M.Groups[1].Index);
- AssertEquals('Match group 1 length: ',3,M.Groups[1].Length);
- M:=M.NextMatch;
- AssertTrue('Match value: ',M.Success);
- end;
- procedure TTestRegExp.TestMatchStartPosLength;
- var
- M : TMatch;
- P : Integer;
- begin
- // function Match(const aInput: TREString): TMatch; overload;
- RegEx:=TRegex.Create(TestExpr);
- P:=Pos('abbba',TestStr);
- M:=RegEx.Match(TestStr,P,5);
- // DumpMatch(M);
- AssertTrue('Match value: ',M.Success);
- AssertEquals('Match value: ','abbba',M.Value);
- AssertEquals('Match index: ',10,M.Index);
- AssertEquals('Match length: ',5,M.Length);
- M:=M.NextMatch;
- AssertFalse('No more matches: ',M.Success);
- end;
- procedure TTestRegExp.TestClassMatch;
- var
- M : TMatch;
- begin
- // class function Match(const aInput, aPattern: TREString): TMatch; overload; static;
- M:=TRegex.Match(TestStr,TestExpr);
- AssertTrue('Match result: ',M.Success);
- AssertEquals('Match value: ','abba',M.Value);
- end;
- procedure TTestRegExp.TestClassMatchOptions;
- // class function Match(const aInput, aPattern: TREString; aOptions: TRegExOptions): TMatch; overload; static;
- var
- M : TMatch;
- begin
- // class function Match(const aInput, aPattern: TREString): TMatch; overload; static;
- M:=TRegex.Match(UpperCase(TestStr),TestExpr,[roIgnoreCase]);
- AssertTrue('Match result: ',M.Success);
- AssertEquals('Match value: ','ABBA',M.Value);
- end;
- procedure TTestRegExp.TestMatches;
- var
- MS : TMatchCollection;
- M,M2 : TMatch;
- begin
- // function Matches(const aInput: TREString): TMatchCollection; overload;
- RegEx:=TRegex.Create(TestExpr);
- MS:=RegEx.Matches(TestStr);
- AssertEquals('Match count',3,MS.Count);
- M:=MS[0];
- AssertTrue('Match 0 result: ',M.Success);
- AssertEquals('Match 0 value: ','abba',M.Value);
- AssertEquals('Match 0 index: ',5,M.Index);
- AssertEquals('Match 0 length: ',4,M.Length);
- AssertEquals('Match 0 group count: ',2,M.Groups.Count);
- AssertEquals('Match 0 group 0 value: ','abba',M.Groups[0].Value);
- AssertEquals('Match 0 group 0 index: ',5,M.Groups[0].Index);
- AssertEquals('Match 0 group 0 length: ',4,M.Groups[0].Length);
- AssertEquals('Match 0 group 1 value: ','bb',M.Groups[1].Value);
- AssertEquals('Match 0 group 1 index: ',6,M.Groups[1].Index);
- AssertEquals('Match 0 group 1 length: ',2,M.Groups[1].Length);
- M2:=M.NextMatch;
- M:=MS[1];
- AssertTrue('Match 1 resul: ',M.Success);
- AssertEquals('Match 1 value: ','abbba',M.Value);
- AssertEquals('NextMatch value: ','abbba',M2.Value);
- AssertEquals('Match 1 index: ',10,M.Index);
- AssertEquals('Match 1 length: ',5,M.Length);
- M:=MS[2];
- AssertTrue('Match 2 result: ',M.Success);
- AssertEquals('Match 2 value: ','abbbba',M.Value);
- AssertEquals('Match 2 index: ',16,M.Index);
- AssertEquals('Match 2 length: ',6,M.Length);
- M:=M.NextMatch;
- AssertFalse('Match value: ',M.Success);
- end;
- procedure TTestRegExp.TestMatchesStartPos;
- var
- MS : TMatchCollection;
- M : TMatch;
- begin
- // function Matches(const aInput: TREString; aStartPos: Integer): TMatchCollection; overload;
- RegEx:=TRegex.Create(TestExpr);
- MS:=RegEx.Matches(TestStr,9);
- AssertEquals('Match count',2,MS.Count);
- M:=MS[0];
- AssertTrue('Match 1 resul: ',M.Success);
- AssertEquals('Match 1 value: ','abbba',M.Value);
- M:=MS[1];
- AssertTrue('Match 1 resul: ',M.Success);
- AssertEquals('Match 1 value: ','abbbba',M.Value);
- end;
- procedure TTestRegExp.TestClassMatches;
- var
- MS : TMatchCollection;
- M : TMatch;
- begin
- // class function Matches(const aInput, aPattern: TREString): TMatchCollection; overload; static;
- MS:=TRegEx.Matches(TestStr,TestExpr);
- AssertEquals('Match count',3,MS.Count);
- M:=MS[0];
- AssertTrue('Match 0 result: ',M.Success);
- AssertEquals('Match 0 value: ','abba',M.Value);
- M:=MS[1];
- AssertTrue('Match 0 result: ',M.Success);
- AssertEquals('Match 0 value: ','abbba',M.Value);
- M:=MS[2];
- AssertTrue('Match 0 result: ',M.Success);
- AssertEquals('Match 0 value: ','abbbba',M.Value);
- end;
- procedure TTestRegExp.TestClassMatchesOptions;
- var
- MS : TMatchCollection;
- M : TMatch;
- begin
- // class function Matches(const aInput, aPattern: TREString; aOptions: TRegExOptions): TMatchCollection; overload; static;
- MS:=TRegEx.Matches(TestStr,UpperCase(TestExpr),[roIgnoreCase]);
- AssertEquals('Match count',3,MS.Count);
- M:=MS[0];
- AssertTrue('Match 0 result: ',M.Success);
- AssertEquals('Match 0 value: ','abba',M.Value);
- M:=MS[1];
- AssertTrue('Match 0 result: ',M.Success);
- AssertEquals('Match 0 value: ','abbba',M.Value);
- M:=MS[2];
- AssertTrue('Match 0 result: ',M.Success);
- AssertEquals('Match 0 value: ','abbbba',M.Value);
- end;
- procedure TTestRegExp.TestReplace;
- begin
- // function Replace(const aInput, aReplacement: TREString): TREString; overload;
- RegEx:=TRegex.Create(TestExpr);
- AssertEquals('Result','xyz c c c zyx',RegEx.Replace(TestStr,'c'));
- end;
- function TTestRegExp.DoReplacer(const Match: TMatch): TREString;
- begin
- Result:='<'+Match.Value+'>';
- // Writeln('Replace "',Match.Value,'" -> "',Result,'"')
- end;
- procedure TTestRegExp.TestReplaceEval;
- begin
- // function Replace(const aInput: TREString; aEvaluator: TMatchEvaluator): TREString; overload;
- RegEx:=TRegex.Create(TestExpr);
- AssertEquals('Result','xyz <abba> <abbba> <abbbba> zyx',RegEx.Replace(TestStr,@DoReplacer));
- end;
- procedure TTestRegExp.TestReplaceCount;
- begin
- // function Replace(const aInput, aReplacement: TREString; aCount: Integer): TREString; overload;
- RegEx:=TRegex.Create(TestExpr);
- AssertEquals('Result','xyz c c abbbba zyx',RegEx.Replace(TestStr,'c',2));
- end;
- procedure TTestRegExp.TestReplaceEvalCount;
- begin
- // function Replace(const aInput: TREString; aEvaluator: TMatchEvaluator; aCount: Integer): TREString; overload;
- RegEx:=TRegex.Create(TestExpr);
- AssertEquals('Result','xyz <abba> <abbba> abbbba zyx',RegEx.Replace(TestStr,@DoReplacer,2));
- end;
- procedure TTestRegExp.TestClassReplace;
- begin
- // class function Replace(const aInput, aPattern, aReplacement: TREString): TREString; overload; static;
- AssertEquals('Result','xyz c c c zyx',TRegEx.Replace(TestStr,TestExpr,'c'));
- end;
- procedure TTestRegExp.TestClassReplaceEval;
- begin
- // class function Replace(const aInput, aPattern: TREString; aEvaluator: TMatchEvaluator): TREString; overload; static;
- AssertEquals('Result','xyz <abba> <abbba> <abbbba> zyx',TRegEx.Replace(TestStr,TestExpr,@DoReplacer));
- end;
- procedure TTestRegExp.TestClassReplaceOptions;
- begin
- // class function Replace(const aInput, aPattern, aReplacement: TREString; aOptions: TRegExOptions): TREString; overload; static;
- AssertEquals('Result','xyz c c c zyx',TRegEx.Replace(TestStr,UpperCase(TestExpr),'c',[roIgnoreCase]));
- end;
- procedure TTestRegExp.TestClassReplaceEvalOptions;
- begin
- // class function Replace(const aInput, aPattern: TREString; aEvaluator: TMatchEvaluator; aOptions: TRegExOptions): TREString; overload; static;
- AssertEquals('Result','xyz <abba> <abbba> <abbbba> zyx',TRegEx.Replace(TestStr,UpperCase(TestExpr),@DoReplacer,[roIgnoreCase]));
- end;
- initialization
- RegisterTest(TTestRegExp);
- end.
|