test_encodings.cxx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "../test_helpers.hxx"
  2. #include "pqxx/internal/encodings.hxx"
  3. namespace
  4. {
  5. void test_scan_ascii()
  6. {
  7. auto const scan{pqxx::internal::get_glyph_scanner(
  8. pqxx::internal::encoding_group::MONOBYTE)};
  9. std::string const text{"hello"};
  10. PQXX_CHECK_EQUAL(
  11. scan(text.c_str(), std::size(text), 0), 1ul,
  12. "Monobyte scanner acting up.");
  13. PQXX_CHECK_EQUAL(
  14. scan(text.c_str(), std::size(text), 1), 2ul,
  15. "Monobyte scanner is inconsistent.");
  16. }
  17. void test_scan_utf8()
  18. {
  19. auto const scan{
  20. pqxx::internal::get_glyph_scanner(pqxx::internal::encoding_group::UTF8)};
  21. // Thai: "Khrab".
  22. std::string const text{"\xe0\xb8\x95\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x9a"};
  23. PQXX_CHECK_EQUAL(
  24. scan(text.c_str(), std::size(text), 0), 3ul,
  25. "UTF-8 scanner mis-scanned Thai khor khwai.");
  26. PQXX_CHECK_EQUAL(
  27. scan(text.c_str(), std::size(text), 3), 6ul,
  28. "UTF-8 scanner mis-scanned Thai ror reua.");
  29. }
  30. void test_for_glyphs_empty()
  31. {
  32. bool iterated{false};
  33. pqxx::internal::for_glyphs(
  34. pqxx::internal::encoding_group::MONOBYTE,
  35. [&iterated](char const *, char const *) { iterated = true; }, "", 0);
  36. PQXX_CHECK(!iterated, "Empty string went through an iteration.");
  37. }
  38. void test_for_glyphs_ascii()
  39. {
  40. std::string const text{"hi"};
  41. std::vector<std::ptrdiff_t> points;
  42. pqxx::internal::for_glyphs(
  43. pqxx::internal::encoding_group::UTF8,
  44. [&points](char const *gbegin, char const *gend) {
  45. points.push_back(gend - gbegin);
  46. },
  47. text.c_str(), std::size(text));
  48. PQXX_CHECK_EQUAL(std::size(points), 2u, "Wrong number of ASCII iterations.");
  49. PQXX_CHECK_EQUAL(points[0], 1u, "ASCII iteration started off wrong.");
  50. PQXX_CHECK_EQUAL(points[1], 1u, "ASCII iteration was inconsistent.");
  51. }
  52. void test_for_glyphs_utf8()
  53. {
  54. // Greek: alpha omega.
  55. std::string const text{"\xce\x91\xce\xa9"};
  56. std::vector<std::ptrdiff_t> points;
  57. pqxx::internal::for_glyphs(
  58. pqxx::internal::encoding_group::UTF8,
  59. [&points](char const *gbegin, char const *gend) {
  60. points.push_back(gend - gbegin);
  61. },
  62. text.c_str(), std::size(text));
  63. PQXX_CHECK_EQUAL(std::size(points), 2u, "Wrong number of UTF-8 iterations.");
  64. PQXX_CHECK_EQUAL(points[0], 2u, "UTF-8 iteration started off wrong.");
  65. PQXX_CHECK_EQUAL(points[1], 2u, "ASCII iteration was inconsistent.");
  66. // Greek lambda, ASCII plus sign, Old Persian Gu.
  67. std::string const mix{"\xce\xbb+\xf0\x90\x8e\xa6"};
  68. points.clear();
  69. pqxx::internal::for_glyphs(
  70. pqxx::internal::encoding_group::UTF8,
  71. [&points](char const *gbegin, char const *gend) {
  72. points.push_back(gend - gbegin);
  73. },
  74. mix.c_str(), std::size(mix));
  75. PQXX_CHECK_EQUAL(std::size(points), 3u, "Mixed UTF-8 iteration is broken.");
  76. PQXX_CHECK_EQUAL(points[0], 2u, "Mixed UTF-8 iteration started off wrong.");
  77. PQXX_CHECK_EQUAL(points[1], 1u, "Mixed UTF-8 iteration got ASCII wrong.");
  78. PQXX_CHECK_EQUAL(
  79. points[2], 4u, "Mixed UTF-8 iteration got long char wrong.");
  80. }
  81. void test_encodings()
  82. {
  83. test_scan_ascii();
  84. test_scan_utf8();
  85. test_for_glyphs_empty();
  86. test_for_glyphs_ascii();
  87. test_for_glyphs_utf8();
  88. }
  89. PQXX_REGISTER_TEST(test_encodings);
  90. } // namespace