fpc/tests/test/tcpstr17.pp
2018-05-09 23:11:48 +00:00

106 lines
2.4 KiB
ObjectPascal

// to have correct test result with delphi set codepage option to 65001
program tcpstr17;
{$ifdef go32v2}
{$define USE_INTERNAL_UNICODE}
{$endif}
{$ifdef USE_INTERNAL_UNICODE}
{$define USE_FPWIDESTRING_UNIT}
{$define USE_UNICODEDUCET_UNIT}
{$define USE_CPALL_UNIT}
{$endif}
{$ifdef FPC}
{$mode delphi}
{$codepage utf8}
{$endif}
{$apptype console}
{$ifndef USE_INTERNAL_UNICODE}
{$ifdef unix}
uses
{$ifdef darwin}iosxwstr{$else}cwstring{$endif};
{$endif unix}
{$else def USE_INTERNAL_UNICODE}
uses
{$ifdef USE_UNICODEDUCET_UNIT}
unicodeducet,
{$endif}
{$ifdef USE_FPWIDESTRING_UNIT}
fpwidestring,
{$endif}
{$ifdef USE_CPALL_UNIT}
cpall,
{$endif}
{ The unit strings is not really used here,
but simpifies the conditional construction
for fpwidestring and unicodeducet use }
strings;
{$endif def USE_INTERNAL_UNICODE}
const
{$ifdef android}
OemCP = 1251;
{$else}
OemCP = 866;
{$endif}
type
TOEMStr = type AnsiString(OemCP);
{$ifndef FPC}
TSystemCodePage = Word;
const
CP_UTF8 = 65001;
{$endif}
procedure TestCodeConvRaw(const s: rawbytestring; const CodePage: TSystemCodePage);
begin
WriteLn(StringCodePage(s), ' ',s);
if CodePage <> StringCodePage(s) then
halt(1);
end;
procedure TestCodeConvAnsi(const s: ansistring; const CodePage: TSystemCodePage);
begin
WriteLn(StringCodePage(s), ' ',s);
if CodePage <> StringCodePage(s) then
halt(2);
end;
procedure TestCodeConvUTF(const s: utf8string; const CodePage: TSystemCodePage);
begin
WriteLn(StringCodePage(s), ' ',s);
if CodePage <> StringCodePage(s) then
halt(3);
end;
var
u: unicodestring;
u8: utf8string;
s: ansistring;
oemstr: TOEMStr;
begin
u := #$0141#$00F3#$0064#$017A;
u8 := u;
TestCodeConvRaw(u8, CP_UTF8);
// if UTF8 codepage is set in options S will have UTF8 codepage
s := u8;
TestCodeConvRaw(s, CP_UTF8);
TestCodeConvAnsi(u8, CP_UTF8);
TestCodeConvAnsi(s, CP_UTF8);
// converts to OemCP
oemstr := u8;
TestCodeConvRaw(oemstr, OemCP);
TestCodeConvAnsi(oemstr, DefaultSystemCodePage);
s := 'test';
TestCodeConvRaw(s, CP_UTF8);
// converts to System codepage
s := oemstr;
TestCodeConvRaw(s, DefaultSystemCodePage);
TestCodeConvUTF(s, DefaultSystemCodePage);
// outputs in source codepage instead of OEM
TestCodeConvRaw('привет', CP_UTF8);
// outputs in OEM codepage
TestCodeConvRaw(TOEMStr('привет'), OemCP);
end.