base16.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #ifndef __VIC_USE_MODULES
  2. #include<__vic/base16.h>
  3. #include<__vic/sreaders/string.h>
  4. #include<__vic/swriters/string.h>
  5. #include<iostream>
  6. #include<exception>
  7. #include<string>
  8. #endif
  9. #include<cassert>
  10. #ifdef __VIC_USE_MODULES
  11. import std;
  12. import __vic;
  13. #endif
  14. namespace tests {
  15. typedef std::string bytes;
  16. typedef __vic::string_sreader bytes_sreader;
  17. typedef __vic::string_swriter bytes_swriter;
  18. std::string encode_byte_lower(unsigned char byte)
  19. {
  20. std::string res;
  21. __vic::base16::encode_byte_lower(byte, __vic::string_swriter(res));
  22. return res;
  23. }
  24. std::string encode_byte_upper(unsigned char byte)
  25. {
  26. std::string res;
  27. __vic::base16::encode_byte_upper(byte, __vic::string_swriter(res));
  28. return res;
  29. }
  30. std::string encode_lower(const bytes &s)
  31. {
  32. std::string res;
  33. res.reserve(s.length() * 2);
  34. __vic::base16::encode_lower(bytes_sreader(s), __vic::string_swriter(res));
  35. return res;
  36. }
  37. std::string encode_upper(const bytes &s)
  38. {
  39. std::string res;
  40. res.reserve(s.length() * 2);
  41. __vic::base16::encode_upper(bytes_sreader(s), __vic::string_swriter(res));
  42. return res;
  43. }
  44. bytes decode(const std::string &s)
  45. {
  46. bytes res;
  47. res.reserve(s.length() / 2);
  48. __vic::base16::decode(__vic::string_sreader(s), bytes_swriter(res));
  49. return res;
  50. }
  51. void run()
  52. {
  53. assert(encode_byte_lower(0xAB) == "ab");
  54. assert(encode_byte_upper(0xCD) == "CD");
  55. assert(encode_lower("\x12\x34\xAB") == "1234ab");
  56. assert(encode_upper("\x12\x34\xAB") == "1234AB");
  57. assert(decode("1234ab") == "\x12\x34\xAB");
  58. assert(decode("1234AB") == decode("1234ab"));
  59. try
  60. {
  61. decode("12ZX"); // non-HEX digit
  62. assert(false);
  63. }
  64. catch(const __vic::base16::bad_digit & ) {} // OK
  65. try
  66. {
  67. decode("12A"); // odd length
  68. assert(false);
  69. }
  70. catch(const __vic::base16::bad_length & ) {} // OK
  71. }
  72. } // namespace
  73. int main()
  74. {
  75. try
  76. {
  77. tests::run();
  78. return 0;
  79. }
  80. catch(const std::exception &ex)
  81. {
  82. std::cerr << ex.what() << '\n';
  83. }
  84. return 1;
  85. }