base16.cpp 1.9 KB

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