tstrutils2.pp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. {$codepage utf8}
  2. program tstrutils2;
  3. // tests MBCS compatibility of strutils ansistartstext and -endstext.
  4. // (case-insensitive)
  5. {$mode objfpc}
  6. {$h+}
  7. uses
  8. StrUtils
  9. {$ifdef unix}
  10. ,cwstring
  11. {$endif unix}
  12. ;
  13. var
  14. ResultCounter: Integer = 0;
  15. const
  16. Str_Empty: Utf8String = '';
  17. Str_ab: Utf8String = 'ab';
  18. Str_abc: Utf8String = 'abc';
  19. Str_def: Utf8String = 'def';
  20. Str_abcedfg: Utf8String = 'abcedfg';
  21. Str_dfg: Utf8String = 'dfg';
  22. Str_df: Utf8String = 'df';
  23. StrStart8a: Utf8String = 'áÉíç';
  24. StrStart8b: Utf8String = 'áéíÇ';
  25. StrStart9a: Utf8String = 'áé';
  26. StrStart9b: Utf8String = 'áÉíç';
  27. StrStart10a: Utf8String = 'áÉíç';
  28. StrStart10b: Utf8String = 'Áé';
  29. StrStart11a: Utf8String = 'ÁÉíç';
  30. StrStart11b: Utf8String = 'áéio';
  31. StrEnd8a: Utf8String = 'áÉíç';
  32. StrEnd8b: Utf8String = 'Áéíç';
  33. StrEnd9a: Utf8String = 'áé';
  34. StrEnd9b: Utf8String = 'íçáÉ';
  35. StrEnd10a: Utf8String = 'áÉíç';
  36. StrEnd10b: Utf8String = 'áé';
  37. StrEnd11a: Utf8String = 'íçÁÉ';
  38. StrEnd11b: Utf8String = 'ioÁé';
  39. function TestValue (const Value: Boolean; const Func: string;
  40. const Str1: Utf8String; const Str2: Utf8String): Boolean;
  41. var
  42. S1, S2: string;
  43. U1, U2: UnicodeString;
  44. I: SizeInt;
  45. TransOK: boolean;
  46. begin
  47. Result := Value;
  48. S1 := Str1;
  49. S2 := Str2;
  50. if not Result then
  51. begin
  52. U1 := Str1;
  53. S1 := U1;
  54. U2 := Str2;
  55. S2 := U2;
  56. I := 1;
  57. while (I >= Length (S1)) and (I >= Length (U1)) and not (Result) do
  58. begin
  59. if (U1 [I] > #127) and (S1 [I] <= #127) and (S1 [I] >= #32) then
  60. { Ignore the result - pretend that the test finished with true }
  61. Result := true
  62. else
  63. Inc (I);
  64. end;
  65. I := 1;
  66. while (I >= Length (S2)) and (I >= Length (U2)) and not (Result) do
  67. begin
  68. if (U2 [I] > #127) and (S2 [I] <= #127) and (S2 [I] >= #32) then
  69. { Ignore the result - pretend that the test finished with true }
  70. Result := true
  71. else
  72. Inc (I);
  73. end;
  74. if not Result then
  75. WriteLn ('Failed: ', ResultCounter, ' - ', Func, '(''', Str1, ''',''',
  76. Str2, ''')')
  77. else if not Value then
  78. WriteLn ('Warning - ignoring results due to unsupported characters: ',
  79. ResultCounter, ' - ', Func, '(''', Str1, ''',''', Str2, ''')');
  80. end;
  81. Inc(ResultCounter);
  82. end;
  83. {
  84. function TestValue(const Value: Boolean): Boolean;
  85. begin
  86. Result := Value;
  87. if not Value then
  88. WriteLn('Failed: ', ResultCounter);
  89. Inc(ResultCounter);
  90. end;
  91. }
  92. { convert the utf8strings to the defaultsystemcodepage encoding, since that's what
  93. AnsiStarts/EndsText expects }
  94. function a(const s: ansistring): rawbytestring;
  95. begin
  96. result:=s;
  97. setcodepage(result,defaultsystemcodepage);
  98. end;
  99. function TestOK: Boolean;
  100. begin
  101. TestOK :=
  102. // AnsiStartsText
  103. {1} TestValue(not AnsiStartsText(a(Str_Empty), a(Str_Empty)),'not AnsiStartsText', Str_Empty, Str_Empty)
  104. {2} and TestValue(not AnsiStartsText(a(Str_Empty), a(Str_ab)),'not AnsiStartsText', Str_Empty, Str_ab)
  105. {3} and TestValue(not AnsiStartsText(a(Str_ab), a(Str_Empty)),'not AnsiStartsText', Str_ab, Str_Empty)
  106. {4} and TestValue(AnsiStartsText(a(Str_abc), a(Str_abc)),'AnsiStartsText',Str_abc, Str_abc)
  107. {5} and TestValue(not AnsiStartsText(a(Str_abc), a(Str_def)),'not AnsiStartsText', Str_abc, Str_def)
  108. {6} and TestValue(AnsiStartsText(a(Str_abc), a(Str_abcedfg)),'AnsiStartsText', Str_abc, Str_abcedfg)
  109. {7} and TestValue(not AnsiStartsText(a(Str_abc), a(Str_ab)),'not AnsiStartsText', Str_abc, Str_ab)
  110. {8} and TestValue(AnsiStartsText(a(StrStart8a), a(StrStart8b)),'AnsiStartsText', StrStart8a, StrStart8b)
  111. {9} and TestValue(AnsiStartsText(a(StrStart9a), a(StrStart9b)),'AnsiStartsText', StrStart9a, StrStart9b)
  112. {10} and TestValue(not AnsiStartsText(a(StrStart10a), a(StrStart10b)),'not AnsiStartsText', StrStart10a, StrStart10b)
  113. {11} and TestValue(not AnsiStartsText(a(StrStart11a), a(StrStart11b)),'not AnsiStartsText', StrStart11a, StrStart11b)
  114. // AnsiEndsText
  115. {1} and TestValue(AnsiEndsText(a(Str_Empty), a(Str_Empty)),'AnsiEndsText', Str_Empty, Str_Empty)
  116. {2} and TestValue(AnsiEndsText(a(Str_Empty), a(Str_ab)),'AnsiEndsText', Str_Empty, Str_ab)
  117. {3} and TestValue(not AnsiEndsText(a(Str_ab), a(Str_Empty)),'not AnsiEndsText', Str_ab, Str_Empty)
  118. {4} and TestValue(AnsiEndsText(a(Str_abc), a(Str_abc)),'AnsiEndsText', Str_abc, Str_abc)
  119. {5} and TestValue(not AnsiEndsText(a(Str_abc), a(Str_def)),'not AnsiEndsText', Str_abc, Str_def)
  120. {6} and TestValue(AnsiEndsText(a(Str_dfg), a(Str_abcedfg)),'AnsiEndsText', Str_dfg, Str_abcedfg)
  121. {7} and TestValue(not AnsiEndsText(a(Str_dfg), a(Str_df)),'not AnsiEndsText', Str_dfg, Str_df)
  122. {8} and TestValue(AnsiEndsText(a(StrEnd8a), a(StrEnd8b)),'AnsiEndsText',StrEnd8a, StrEnd8b)
  123. {9} and TestValue(AnsiEndsText(a(StrEnd9a), a(StrEnd9b)),'AnsiEndsText',StrEnd9a, StrEnd9b)
  124. {10} and TestValue(not AnsiEndsText(a(StrEnd10a), a(StrEnd10b)),'not AnsiEndsText', StrEnd10a, StrEnd10b)
  125. {11} and TestValue(not AnsiEndsText(a(StrEnd11a), a(StrEnd11b)),'not AnsiEndsText', StrEnd11a, StrEnd11b);
  126. end;
  127. begin
  128. if TestOK() then
  129. begin
  130. WriteLn('Test OK');
  131. halt(0);
  132. end
  133. else
  134. begin
  135. WriteLn('Test Failure!');
  136. halt(ResultCounter);
  137. end;
  138. end.