mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-19 23:41:07 +01:00
113 lines
2.6 KiB
ObjectPascal
113 lines
2.6 KiB
ObjectPascal
unit utcstrutils;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
{$COPERATORS ON}
|
|
|
|
interface
|
|
|
|
uses
|
|
sysutils, strutils, fpcunit, testregistry;
|
|
|
|
Type
|
|
|
|
{ TTestStrUtils }
|
|
|
|
TTestStrUtils = class(TTestCase)
|
|
Published
|
|
Procedure TestNaturalCompareText;
|
|
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ TTestStrUtils }
|
|
|
|
type
|
|
CaseRec = record
|
|
a, b: string;
|
|
expect: int8;
|
|
end;
|
|
|
|
const
|
|
Cases: array[0 .. 4] of CaseRec = (
|
|
(a: '100000000000000000000'; b: '100000000000000000001'; expect: -1),
|
|
(a: ' 10 hi'; b: '010 hi'; expect: 0),
|
|
(a: 'score: 10'; b: 'score:010'; expect: 0),
|
|
(a: '9'; b: ' '; expect: -1),
|
|
(a: 'A'; b: ''; expect: +1)
|
|
);
|
|
|
|
procedure TTestStrUtils.TestNaturalCompareText;
|
|
|
|
var
|
|
somethingFailed: boolean = false;
|
|
|
|
function RandomString: string;
|
|
|
|
const
|
|
TextChars = 'abAB ';
|
|
NumberChars = '012';
|
|
var
|
|
iComp, iSym: SizeInt;
|
|
begin
|
|
result := '';
|
|
for iComp := 0 to random(5) do
|
|
case random(2) of
|
|
0:
|
|
for iSym := 0 to random(3) do
|
|
result += TextChars[1 + random(length(TextChars))];
|
|
else
|
|
for iSym := 0 to random(3) do
|
|
result += NumberChars[1 + random(length(NumberChars))];
|
|
end;
|
|
end;
|
|
const
|
|
NFuzzStrings = 200;
|
|
|
|
var
|
|
cs: CaseRec;
|
|
got, ab: integer;
|
|
desc : string;
|
|
fuzz: array of string;
|
|
i, iA, iB, iC: SizeInt;
|
|
comparisons: array[0 .. NFuzzStrings - 1, 0 .. NFuzzStrings - 1] of int8;
|
|
|
|
begin
|
|
for cs in Cases do
|
|
begin
|
|
got := NaturalCompareText(cs.a, cs.b);
|
|
Desc:=Format('a = ''%s'', b = ''%s'' ',[cs.a, cs.b]);
|
|
AssertEquals(Desc,cs.expect,got);
|
|
end;
|
|
SetLength(fuzz, NFuzzStrings);
|
|
fuzz[0] := '';
|
|
fuzz[1] := ' ';
|
|
for i := 2 to High(fuzz) do
|
|
fuzz[i] := RandomString;
|
|
|
|
for iA := 0 to High(fuzz) do
|
|
for iB := iA to High(fuzz) do
|
|
begin
|
|
comparisons[iA, iB] := NaturalCompareText(fuzz[iA], fuzz[iB]);
|
|
comparisons[iB, iA] := NaturalCompareText(fuzz[iB], fuzz[iA]);
|
|
Desc:=Format('Antisymmetry: a= ''%s'', b= ''%s'' ',[fuzz[iA],fuzz[iB]]);
|
|
AssertEquals('Expect '+Desc, -comparisons[iB, iA], comparisons[iA, iB]);
|
|
end;
|
|
|
|
for iA := 0 to High(fuzz) do
|
|
for iB := iA to High(fuzz) do
|
|
begin
|
|
ab := comparisons[iA, iB];
|
|
for iC := 0 to High(fuzz) do
|
|
begin
|
|
Desc:=Format('Transitivity: a= ''%s'', b= ''%s'' , c= ''%s'' ',[fuzz[iA], fuzz[iB], fuzz[iC]]);
|
|
AssertFalse(Desc,(comparisons[iB, iC] = ab) and (comparisons[iA, iC] <> ab));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
initialization
|
|
RegisterTest(TTestStrUtils);
|
|
end.
|
|
|