utf8_ut.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "utf8.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. Y_UNIT_TEST_SUITE(TUtf8Tests) {
  4. Y_UNIT_TEST(Simple) {
  5. UNIT_ASSERT(NYql::IsUtf8(""));
  6. UNIT_ASSERT(NYql::IsUtf8("\x01_ASCII_\x7F"));
  7. UNIT_ASSERT(NYql::IsUtf8("Привет!"));
  8. UNIT_ASSERT(NYql::IsUtf8("\xF0\x9F\x94\xA2"));
  9. UNIT_ASSERT(!NYql::IsUtf8("\xf5\x80\x80\x80"));
  10. UNIT_ASSERT(!NYql::IsUtf8("\xed\xa6\x80"));
  11. UNIT_ASSERT(!NYql::IsUtf8("\xF0\x9F\x94"));
  12. UNIT_ASSERT(!NYql::IsUtf8("\xE3\x85\xB6\xE7\x9C\xB0\xE3\x9C\xBA\xE2\xAA\x96\xEE\xA2\x8C\xEC\xAF\xB8\xE1\xB2\xBB\xEC\xA3\x9C\xE3\xAB\x8B\xEC\x95\x92\xE1\x8A\xBF\xE2\x8E\x86\xEC\x9B\x8D\xE2\x8E\xAE\xE3\x8A\xA3\xE0\xAC\xBC\xED\xB6\x85"));
  13. UNIT_ASSERT(!NYql::IsUtf8("\xc0\xbe\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8e"));
  14. }
  15. Y_UNIT_TEST(CharSize) {
  16. UNIT_ASSERT_VALUES_EQUAL(NYql::WideCharSize(' '), 1);
  17. UNIT_ASSERT_VALUES_EQUAL(NYql::WideCharSize('\x00'), 1);
  18. UNIT_ASSERT_VALUES_EQUAL(NYql::WideCharSize('\x7F'), 1);
  19. UNIT_ASSERT_VALUES_EQUAL(NYql::WideCharSize('\xD1'), 2);
  20. UNIT_ASSERT_VALUES_EQUAL(NYql::WideCharSize('\xF0'), 4);
  21. UNIT_ASSERT_VALUES_EQUAL(NYql::WideCharSize('\xFF'), 0);
  22. }
  23. Y_UNIT_TEST(RoundingDown) {
  24. auto checkDown = [](std::string_view in, std::string_view out) {
  25. auto res = NYql::RoundToNearestValidUtf8(in, true);
  26. UNIT_ASSERT(res);
  27. UNIT_ASSERT(NYql::IsUtf8(*res));
  28. UNIT_ASSERT_VALUES_EQUAL(*res, out);
  29. UNIT_ASSERT(*res <= in);
  30. };
  31. checkDown("привет", "привет");
  32. checkDown("тест\x80", "тест\x7f");
  33. checkDown("привет\xf5", "привет\xf4\x8f\xbf\xbf");
  34. checkDown("тест2\xee\x80\x7f", "тест2\xed\x9f\xbf");
  35. checkDown("ага\xf0\xaa\xaa\xff", "ага\xf0\xaa\xaa\xbf");
  36. }
  37. Y_UNIT_TEST(RoundingUp) {
  38. auto checkUp = [](std::string_view in, std::string_view out) {
  39. auto res = NYql::RoundToNearestValidUtf8(in, false);
  40. UNIT_ASSERT(res);
  41. UNIT_ASSERT(NYql::IsUtf8(*res));
  42. UNIT_ASSERT_VALUES_EQUAL(*res, out);
  43. UNIT_ASSERT(*res >= in);
  44. };
  45. checkUp("", "");
  46. checkUp("привет", "привет");
  47. checkUp("а\xf6", "б");
  48. checkUp("\xf4\x8f\xbf\xbfа\xf4\x8f\xbf\xbf\xf5", "\xf4\x8f\xbf\xbfб");
  49. UNIT_ASSERT(!NYql::RoundToNearestValidUtf8("\xf4\x8f\xbf\xbf\xf5", false));
  50. UNIT_ASSERT(!NYql::RoundToNearestValidUtf8("\xf5", false));
  51. checkUp("тест\x80", "тест\xc2\x80");
  52. checkUp("тест\xdf", "тест\xdf\x80");
  53. checkUp("тест\xf0\x90\xff", "тест\xf0\x91\x80\x80");
  54. checkUp("ааа\xff", "ааб");
  55. }
  56. Y_UNIT_TEST(NextValid) {
  57. auto checkNext = [](std::string_view in, std::string_view out) {
  58. auto res = NYql::NextValidUtf8(in);
  59. UNIT_ASSERT(res);
  60. UNIT_ASSERT(NYql::IsUtf8(*res));
  61. UNIT_ASSERT_VALUES_EQUAL(*res, out);
  62. UNIT_ASSERT(*res > in);
  63. };
  64. UNIT_ASSERT(!NYql::NextValidUtf8(""));
  65. checkNext("привет", "привеу");
  66. checkNext("а", "б");
  67. checkNext(std::string_view("\x00", 1), "\x01");
  68. checkNext("\xf4\x8f\xbf\xbfа\xf4\x8f\xbf\xbf", "\xf4\x8f\xbf\xbfб");
  69. UNIT_ASSERT(!NYql::NextValidUtf8("\xf4\x8f\xbf\xbf"));
  70. UNIT_ASSERT(!NYql::NextValidUtf8("\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf"));
  71. }
  72. Y_UNIT_TEST(NextValidString) {
  73. auto checkNext = [](std::string_view in, std::string_view out) {
  74. auto res = NYql::NextLexicographicString(in);
  75. UNIT_ASSERT(res);
  76. UNIT_ASSERT_VALUES_EQUAL(*res, out);
  77. UNIT_ASSERT(*res > in);
  78. };
  79. UNIT_ASSERT(!NYql::NextLexicographicString(""));
  80. checkNext("привет", "привеу");
  81. checkNext("а", "б");
  82. checkNext(std::string_view("\x00", 1), "\x01");
  83. checkNext("\xf4\x8f\xbf\xbfа\xf4\x8f\xbf\xbf", "\xf4\x8f\xbf\xbfа\xf4\x8f\xbf\xc0");
  84. UNIT_ASSERT(!NYql::NextLexicographicString("\xff"));
  85. UNIT_ASSERT(!NYql::NextLexicographicString("\xff\xff"));
  86. checkNext(std::string_view("x\x00\xff\xff", 4), "x\x01");
  87. }
  88. }