utcstrutils.pp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. unit utcstrutils;
  2. {$mode ObjFPC}{$H+}
  3. {$COPERATORS ON}
  4. interface
  5. uses
  6. sysutils, strutils, fpcunit, testregistry;
  7. Type
  8. { TTestStrUtils }
  9. TTestStrUtils = class(TTestCase)
  10. Published
  11. Procedure TestNaturalCompareText;
  12. end;
  13. implementation
  14. { TTestStrUtils }
  15. type
  16. CaseRec = record
  17. a, b: string;
  18. expect: int8;
  19. end;
  20. const
  21. Cases: array[0 .. 4] of CaseRec = (
  22. (a: '100000000000000000000'; b: '100000000000000000001'; expect: -1),
  23. (a: ' 10 hi'; b: '010 hi'; expect: 0),
  24. (a: 'score: 10'; b: 'score:010'; expect: 0),
  25. (a: '9'; b: ' '; expect: -1),
  26. (a: 'A'; b: ''; expect: +1)
  27. );
  28. procedure TTestStrUtils.TestNaturalCompareText;
  29. var
  30. somethingFailed: boolean = false;
  31. function RandomString: string;
  32. const
  33. TextChars = 'abAB ';
  34. NumberChars = '012';
  35. var
  36. iComp, iSym: SizeInt;
  37. begin
  38. result := '';
  39. for iComp := 0 to random(5) do
  40. case random(2) of
  41. 0:
  42. for iSym := 0 to random(3) do
  43. result += TextChars[1 + random(length(TextChars))];
  44. else
  45. for iSym := 0 to random(3) do
  46. result += NumberChars[1 + random(length(NumberChars))];
  47. end;
  48. end;
  49. const
  50. NFuzzStrings = 200;
  51. var
  52. cs: CaseRec;
  53. got, ab: integer;
  54. desc : string;
  55. fuzz: array of string;
  56. i, iA, iB, iC: SizeInt;
  57. comparisons: array[0 .. NFuzzStrings - 1, 0 .. NFuzzStrings - 1] of int8;
  58. begin
  59. for cs in Cases do
  60. begin
  61. got := NaturalCompareText(cs.a, cs.b);
  62. Desc:=Format('a = ''%s'', b = ''%s'' ',[cs.a, cs.b]);
  63. AssertEquals(Desc,cs.expect,got);
  64. end;
  65. SetLength(fuzz, NFuzzStrings);
  66. fuzz[0] := '';
  67. fuzz[1] := ' ';
  68. for i := 2 to High(fuzz) do
  69. fuzz[i] := RandomString;
  70. for iA := 0 to High(fuzz) do
  71. for iB := iA to High(fuzz) do
  72. begin
  73. comparisons[iA, iB] := NaturalCompareText(fuzz[iA], fuzz[iB]);
  74. comparisons[iB, iA] := NaturalCompareText(fuzz[iB], fuzz[iA]);
  75. Desc:=Format('Antisymmetry: a= ''%s'', b= ''%s'' ',[fuzz[iA],fuzz[iB]]);
  76. AssertEquals('Expect '+Desc, -comparisons[iB, iA], comparisons[iA, iB]);
  77. end;
  78. for iA := 0 to High(fuzz) do
  79. for iB := iA to High(fuzz) do
  80. begin
  81. ab := comparisons[iA, iB];
  82. for iC := 0 to High(fuzz) do
  83. begin
  84. Desc:=Format('Transitivity: a= ''%s'', b= ''%s'' , c= ''%s'' ',[fuzz[iA], fuzz[iB], fuzz[iC]]);
  85. AssertFalse(Desc,(comparisons[iB, iC] = ab) and (comparisons[iA, iC] <> ab));
  86. end;
  87. end;
  88. end;
  89. initialization
  90. RegisterTest(TTestStrUtils);
  91. end.