fpc/packages/fcl-base/tests/testbasenenc.lpr
Michaël Van Canneyt b32e940beb * PChar -> PAnsiChar
2023-07-15 18:22:41 +02:00

170 lines
3.9 KiB
ObjectPascal

{
This file is part of the Free Pascal run time library.
Copyright (c) 2021 by Michael Van Canneyt,
member of the Free Pascal development team
Test for Base 16,32,32hex,32-crockford, 64,64url encoding/decoding, with or without padding
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
program testbasenenc;
{$mode objfpc}
{$h+}
uses sysutils, basenenc;
Procedure AssertEquals(Const aActual,aExpected : TBytes; aMsg : String);
function ToStr(aBytes : TBytes) : String;
Var
I : Integer;
begin
Result:='';
For I:=0 to Length(aBytes) do
begin
if I>0 then
Result:=Result+',';
Result:=Result+IntToStr(aBytes[i]);
end;
Result:='['+Result+']';
end;
begin
if (Length(aActual)<>Length(aExpected))
or Not CompareMem(PByte(aActual),PByte(aExpected),Length(aActual)) then
begin
Writeln(aMsg,': results differ, actual: "',ToStr(aActual),'" <> "',ToStr(aExpected),'" (expected)');
Halt(1);
end;
end;
Procedure AssertEquals(Const aActual,aExpected,aMsg : String);
begin
if aActual<>aExpected then
begin
Writeln(aMsg,': results differ, actual: "',aActual,'" <> "',aExpected,'" (expected)');
Halt(1);
end;
end;
Procedure DoTest(B : Tbytes; aExpected : String; aURL : Boolean = False);
Var
B2 : TBytes;
S : Ansistring;
begin
if aURL then
S:=Base64URL.Encode(B)
else
S:=Base64.Encode(B);
AssertEquals(S,aExpected,'DoTest Wrong encode');
if aURL then
B2:=Base64URL.Decode(S)
else
B2:=Base64.Decode(S);
AssertEquals(B2,B,'DoTest Wrong decode');
end;
Procedure DoTest64(aValue, aExpected : String);
begin
DoTest(TEncoding.UTF8.GetAnsiBytes(aValue),aExpected);
end;
Procedure DoTest32(aValue, aExpected : String);
Var
B2 : TBytes;
S : Ansistring;
begin
S:=Base32.Encode(aValue);
AssertEquals(S,aExpected,'base32 encode');
B2:=Base32.Decode(S);
AssertEquals(b2,TEncoding.UTF8.GetAnsiBytes(aValue),'Base32 Wrong encode for '+aValue);
end;
Procedure DoTest32Hex(aValue, aExpected : String);
Var
B2 : TBytes;
S : Ansistring;
begin
S:=Base32Hex.Encode(aValue);
AssertEquals(S,aExpected,'Base32-hex Wrong encode for '+aValue);
B2:=Base32Hex.Decode(S);
AssertEquals(B2,TEncoding.UTF8.GetAnsiBytes(aValue),'Base32Hex Wrong encode for '+aValue);
end;
Procedure DoTest16(aValue, aExpected : String);
Var
B2 : TBytes;
S : Ansistring;
begin
S:=Base16.Encode(aValue);
AssertEquals(S,aExpected,'Base16 Wrong encode for '+aValue);
B2:=Base16.Decode(S);
AssertEquals(B2,TEncoding.UTF8.GetAnsiBytes(aValue),'Base16 Wrong decode for '+aValue);
end;
begin
// From RFC 3548
DoTest([$14,$fb,$9c,$03,$d9,$7e],'FPucA9l+');
DoTest([$14,$fb,$9c,$03,$d9],'FPucA9k=');
DoTest([$14,$fb,$9c,$03],'FPucAw==');
DoTest([$14,$fb,$9c,$03,$d9,$7e],'FPucA9l-',True);
// From RFC 4648
DoTest64('','');
DoTest64('f','Zg==');
DoTest64('fo','Zm8=');
DoTest64('foo','Zm9v');
DoTest64('foob','Zm9vYg==');
DoTest64('fooba','Zm9vYmE=');
DoTest64('foobar','Zm9vYmFy');
DoTest32('','');
DoTest32('f','MY======');
DoTest32('fo','MZXQ====');
DoTest32('foo','MZXW6===');
DoTest32('foob','MZXW6YQ=');
DoTest32('fooba','MZXW6YTB');
DoTest32('foobar','MZXW6YTBOI======');
DoTest32HEX('','');
DoTest32HEX('f','CO======');
DoTest32HEX('fo','CPNG====');
DoTest32HEX('foo','CPNMU===');
DoTest32HEX('foob','CPNMUOG=');
DoTest32HEX('fooba','CPNMUOJ1');
DoTest32HEX('foobar','CPNMUOJ1E8======');
DoTest16('','');
DoTest16('f','66');
DoTest16('fo','666F');
DoTest16('foo','666F6F');
DoTest16('foob','666F6F62');
DoTest16('fooba','666F6F6261');
DoTest16('foobar','666F6F626172');
Writeln('All OK');
end.