{%skiptarget=$nothread }
{$ifdef fpc}
{$mode objfpc}
{$endif fpc}

{$ifdef go32v2}
  {$define USE_INTERNAL_UNICODE}
{$endif}

{$ifdef USE_INTERNAL_UNICODE}
  {$define USE_FPWIDESTRING_UNIT}
  {$define USE_UNICODEDUCET_UNIT}
  {$define USE_CPALL_UNIT}
{$endif}
uses
 {$ifdef unix}
  cthreads,
 {$endif}
 {$ifndef USE_INTERNAL_UNICODE}
  {$ifdef unix}
   {$ifdef darwin}iosxwstr{$else}cwstring{$endif},
  {$endif unix}
 {$endif ndef USE_INTERNAL_UNICODE}
 {$ifdef USE_UNICODEDUCET_UNIT}
  unicodeducet,
 {$endif}
 {$ifdef USE_FPWIDESTRING_UNIT}
  fpwidestring,
 {$endif}
 {$ifdef USE_CPALL_UNIT}
  cpall,
 {$endif}
  Classes, SysUtils;

type
  tc = class(tthread)
    orgstr: ansistring;
    cnvstr: widestring;
    constructor create(const s: ansistring; const w: widestring);
    procedure execute; override;
  end;

const
  // string with an invalid utf-8 code sequence
  str1 = #$c1#$34'Życie'#$c1#$34' jest jak papier '#$c1#$34'toaletowy'#$c1#$34' : długie, szare i '#$c1#$34'do'#$c1#$34' dupy';
  str2 = 'Życie '#$c1#$34'jest'#$c1#$34' jak papier toaletowy : '#$c1#$34'długie'#$c1#$34', szare i do '#$c1#$34'dupy'#$c1#$34'222222222222222222222222222222222222222222222222';
  str3 = 'Życie jest '#$c1#$34'jak'#$c1#$34' papier 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 toaletowy : długie, '#$c1#$34'szare'#$c1#$34' i do dupy';
  str4 = 'Życie jest 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 jak '#$c1#$34'papier'#$c1#$34' toaletowy : długie, szare '#$c1#$34'i'#$c1#$34' do dupy';
  count = 20000;

var
  wstr: widestring;
//  cnvstr: ansistring;
  error: boolean;


constructor tc.create(const s: ansistring; const w: widestring);
begin
  orgstr:=s;
  cnvstr:=w;
  inherited create(true);
end;


procedure tc.execute;
var
  i: longint;
  w: widestring;
begin
  for i := 1 to count do
    begin
      w:=orgstr;
      if (w<>cnvstr) then
        error:=true;
    end;
end;

var
  a: array[1..4] of tc;
  w1,w2,w3,w4: widestring;
  cnvstr: ansistring;
begin
  error:=false;
  cnvstr:=str1;
  w1:=cnvstr;
  cnvstr:=str2;
  w2:=cnvstr;
  cnvstr:=str3;
  w3:=cnvstr;
  cnvstr:=str4;
  w4:=cnvstr;
  writeln(w1);
  writeln(w2);
  writeln(w3);
  writeln(w4);
  a[1]:=tc.create(str1,w1);
  a[2]:=tc.create(str2,w2);
  a[3]:=tc.create(str3,w3);
  a[4]:=tc.create(str4,w4);
  a[1].resume;
  a[2].resume;
  a[3].resume;
  a[4].resume;
  a[1].waitfor;
  a[2].waitfor;
  a[3].waitfor;
  a[4].waitfor;
  a[1].free;
  a[2].free;
  a[3].free;
  a[4].free;
  
  if error then
    halt(1);  
end.
