utcbasenenc.pp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. unit utcbasenenc;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, punit, basenenc;
  6. procedure RegisterTests;
  7. implementation
  8. function BytesToStr(const aBytes: TBytes): String;
  9. var
  10. I: Integer;
  11. begin
  12. Result := '';
  13. for I := Low(aBytes) to High(aBytes) do
  14. begin
  15. if Result <> '' then
  16. Result := Result + ',';
  17. Result := Result + IntToStr(aBytes[I]);
  18. end;
  19. Result := '[' + Result + ']';
  20. end;
  21. function AssertBytesEqual(const Msg: String; const aActual, aExpected: TBytes): Boolean;
  22. var
  23. Cmp: Boolean;
  24. begin
  25. Cmp := (Length(aActual) = Length(aExpected)) and CompareMem(Pointer(aActual), Pointer(aExpected), Length(aActual));
  26. Result := AssertTrue(Msg + '. Expected: ' + BytesToStr(aExpected) + ', Actual: ' + BytesToStr(aActual), Cmp);
  27. end;
  28. function TestBaseN_RFC3548: TTestString;
  29. begin
  30. Result := '';
  31. AssertEquals('RFC3548 B64 1', 'FPucA9l+', Base64.Encode([$14,$fb,$9c,$03,$d9,$7e]));
  32. AssertBytesEqual('RFC3548 B64 1 Decode', [$14,$fb,$9c,$03,$d9,$7e], Base64.Decode('FPucA9l+'));
  33. AssertEquals('RFC3548 B64 2', 'FPucA9k=', Base64.Encode([$14,$fb,$9c,$03,$d9]));
  34. AssertBytesEqual('RFC3548 B64 2 Decode', [$14,$fb,$9c,$03,$d9], Base64.Decode('FPucA9k='));
  35. AssertEquals('RFC3548 B64 3', 'FPucAw==', Base64.Encode([$14,$fb,$9c,$03]));
  36. AssertBytesEqual('RFC3548 B64 3 Decode', [$14,$fb,$9c,$03], Base64.Decode('FPucAw=='));
  37. AssertEquals('RFC3548 B64 URL', 'FPucA9l-', Base64URL.Encode([$14,$fb,$9c,$03,$d9,$7e]));
  38. AssertBytesEqual('RFC3548 B64 URL Decode', [$14,$fb,$9c,$03,$d9,$7e], Base64URL.Decode('FPucA9l-'));
  39. end;
  40. function TestBaseN_RFC4648_Base64: TTestString;
  41. begin
  42. Result := '';
  43. AssertEquals('RFC4648 B64 empty', '', Base64.Encode(''));
  44. AssertEquals('RFC4648 B64 "f"', 'Zg==', Base64.Encode('f'));
  45. AssertEquals('RFC4648 B64 "fo"', 'Zm8=', Base64.Encode('fo'));
  46. AssertEquals('RFC4648 B64 "foo"', 'Zm9v', Base64.Encode('foo'));
  47. AssertEquals('RFC4648 B64 "foob"', 'Zm9vYg==', Base64.Encode('foob'));
  48. AssertEquals('RFC4648 B64 "fooba"', 'Zm9vYmE=', Base64.Encode('fooba'));
  49. AssertEquals('RFC4648 B64 "foobar"', 'Zm9vYmFy', Base64.Encode('foobar'));
  50. end;
  51. function TestBaseN_RFC4648_Base32: TTestString;
  52. begin
  53. Result := '';
  54. AssertEquals('RFC4648 B32 empty', '', Base32.Encode(''));
  55. AssertEquals('RFC4648 B32 "f"', 'MY======', Base32.Encode('f'));
  56. AssertEquals('RFC4648 B32 "fo"', 'MZXQ====', Base32.Encode('fo'));
  57. AssertEquals('RFC4648 B32 "foo"', 'MZXW6===', Base32.Encode('foo'));
  58. AssertEquals('RFC4648 B32 "foob"', 'MZXW6YQ=', Base32.Encode('foob'));
  59. AssertEquals('RFC4648 B32 "fooba"', 'MZXW6YTB', Base32.Encode('fooba'));
  60. AssertEquals('RFC4648 B32 "foobar"', 'MZXW6YTBOI======', Base32.Encode('foobar'));
  61. end;
  62. function TestBaseN_RFC4648_Base32Hex: TTestString;
  63. begin
  64. Result := '';
  65. AssertEquals('RFC4648 B32Hex empty', '', Base32Hex.Encode(''));
  66. AssertEquals('RFC4648 B32Hex "f"', 'CO======', Base32Hex.Encode('f'));
  67. AssertEquals('RFC4648 B32Hex "fo"', 'CPNG====', Base32Hex.Encode('fo'));
  68. AssertEquals('RFC4648 B32Hex "foo"', 'CPNMU===', Base32Hex.Encode('foo'));
  69. AssertEquals('RFC4648 B32Hex "foob"', 'CPNMUOG=', Base32Hex.Encode('foob'));
  70. AssertEquals('RFC4648 B32Hex "fooba"', 'CPNMUOJ1', Base32Hex.Encode('fooba'));
  71. AssertEquals('RFC4648 B32Hex "foobar"', 'CPNMUOJ1E8======', Base32Hex.Encode('foobar'));
  72. end;
  73. function TestBaseN_RFC4648_Base16: TTestString;
  74. begin
  75. Result := '';
  76. AssertEquals('RFC4648 B16 empty', '', Base16.Encode(''));
  77. AssertEquals('RFC4648 B16 "f"', '66', Base16.Encode('f'));
  78. AssertEquals('RFC4648 B16 "fo"', '666F', Base16.Encode('fo'));
  79. AssertEquals('RFC4648 B16 "foo"', '666F6F', Base16.Encode('foo'));
  80. AssertEquals('RFC4648 B16 "foob"', '666F6F62', Base16.Encode('foob'));
  81. AssertEquals('RFC4648 B16 "fooba"', '666F6F6261', Base16.Encode('fooba'));
  82. AssertEquals('RFC4648 B16 "foobar"', '666F6F626172', Base16.Encode('foobar'));
  83. end;
  84. procedure RegisterTests;
  85. begin
  86. AddSuite('TBaseNTests');
  87. AddTest('TestRFC3548', @TestBaseN_RFC3548, 'TBaseNTests');
  88. AddTest('TestRFC4648_Base64', @TestBaseN_RFC4648_Base64, 'TBaseNTests');
  89. AddTest('TestRFC4648_Base32', @TestBaseN_RFC4648_Base32, 'TBaseNTests');
  90. AddTest('TestRFC4648_Base32Hex', @TestBaseN_RFC4648_Base32Hex, 'TBaseNTests');
  91. AddTest('TestRFC4648_Base16', @TestBaseN_RFC4648_Base16, 'TBaseNTests');
  92. end;
  93. end.