unit TestVarious; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FpPascalBuilder, LazLogger, TestOutputLogger, fpcunit, testutils, testregistry; type { TTestVarious } TTestVarious = class(TTestCase) published procedure TestQuoteString; end; implementation procedure TTestVarious.TestQuoteString; const N: array [0..9] of string = ( #0, #1, 'a', '1', '''', 'ä', // correct utf8 #193, #225#129, #225, #129 // broken ); E: array [0..9] of string = ( '#$00', '#$01', 'a', '1', '''''', 'ä', '#$C1', '#$E1#$81', '#$E1', '#$81' // broken ); Q=''''; var c: array [1..5] of integer; l, i: Integer; s1, s2: String; InQuote: Boolean; begin AssertEquals(Q+Q, QuoteText('')); AssertEquals(Q+'a'+Q, QuoteText('a')); AssertEquals(Q+Q+Q+Q, QuoteText(Q)); AssertEquals('#$09', QuoteText(#9)); for l := 1 to 5 do begin for i := 1 to l do c[i] := 0; while true do begin s1 := ''; s2 := ''; InQuote := False; for i := 1 to l do begin s1 := s1 + N[c[i]]; // input if (E[c[i]][1] <> '#') xor InQuote then begin s2 := s2 + Q; InQuote := not InQuote; end; s2 := s2 + E[c[i]]; // expect end; if InQuote then s2 := s2 + Q; AssertEquals(s2, QuoteText(s1)); // iterate all variations for length 1 - 5 i := 1; while i <= l do begin if c[i] < 9 then begin inc(c[i]); // avoid combining 2 broken into one correct char if (c[i] in [6,7,8]) and (i < l) and (c[i+1] = 9) then c[i] := 9; break; end else begin c[i] := 0; inc(i); end; end; if i > l then break; end; end; end; initialization RegisterTest(TTestVarious); end.