test75.cxx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include <iostream>
  2. #include <vector>
  3. #include <pqxx/transaction>
  4. #include "test_helpers.hxx"
  5. // Test program for libpqxx. Compare const_reverse_iterator iteration of a
  6. // result to a regular, const_iterator iteration.
  7. namespace
  8. {
  9. void test_075()
  10. {
  11. pqxx::connection conn;
  12. pqxx::work tx{conn};
  13. pqxx::test::create_pqxxevents(tx);
  14. auto const R(tx.exec("SELECT year FROM pqxxevents"));
  15. PQXX_CHECK(not std::empty(R), "No events found, cannot test.");
  16. PQXX_CHECK_EQUAL(R[0], R.at(0), "Inconsistent result indexing.");
  17. PQXX_CHECK(not(R[0] != R.at(0)), "result::row::operator!=() is broken.");
  18. PQXX_CHECK_EQUAL(R[0][0], R[0].at(0), "Inconsistent row indexing.");
  19. PQXX_CHECK(
  20. not(R[0][0] != R[0].at(0)), "result::field::operator!=() is broken.");
  21. std::vector<std::string> contents;
  22. for (auto const &i : R) contents.push_back(i.at(0).as<std::string>());
  23. PQXX_CHECK_EQUAL(
  24. std::size(contents), std::vector<std::string>::size_type(std::size(R)),
  25. "Number of values does not match result size.");
  26. for (pqxx::result::size_type i{0}; i < std::size(R); ++i)
  27. PQXX_CHECK_EQUAL(
  28. contents[static_cast<std::size_t>(i)], R.at(i).at(0).c_str(),
  29. "Inconsistent iteration.");
  30. // Thorough test for result::const_reverse_iterator
  31. pqxx::result::const_reverse_iterator ri1(std::rbegin(R)), ri2(ri1),
  32. ri3(std::end(R));
  33. ri2 = std::rbegin(R);
  34. PQXX_CHECK(ri2 == ri1, "reverse_iterator copy constructor is broken.");
  35. PQXX_CHECK(ri3 == ri2, "result::end() does not generate rbegin().");
  36. PQXX_CHECK_EQUAL(
  37. ri2 - ri3, 0,
  38. "const_reverse_iterator is at nonzero distance from its own copy.");
  39. PQXX_CHECK(ri2 == ri3 + 0, "reverse_iterator+0 gives strange result.");
  40. PQXX_CHECK(ri2 == ri3 - 0, "reverse_iterator-0 gives strange result.");
  41. PQXX_CHECK(not(ri3 < ri2), "operator<() breaks on equal reverse_iterators.");
  42. PQXX_CHECK(ri2 <= ri3, "operator<=() breaks on equal reverse_iterators.");
  43. PQXX_CHECK(ri3++ == ri2, "reverse_iterator post-increment is broken.");
  44. PQXX_CHECK_EQUAL(ri3 - ri2, 1, "Wrong nonzero reverse_iterator distance.");
  45. PQXX_CHECK(ri3 > ri2, "reverse_iterator operator>() is broken.");
  46. PQXX_CHECK(ri3 >= ri2, "reverse_iterator operator>=() is broken.");
  47. PQXX_CHECK(ri2 < ri3, "reverse_iterator operator<() is broken.");
  48. PQXX_CHECK(ri2 <= ri3, "reverse_iterator operator<=() is broken.");
  49. PQXX_CHECK(ri3 == ri2 + 1, "Adding int to reverse_iterator is broken.");
  50. PQXX_CHECK(
  51. ri2 == ri3 - 1, "Subtracting int from reverse_iterator is broken.");
  52. PQXX_CHECK(ri3 == ++ri2, "reverse_iterator pre-increment is broken.");
  53. PQXX_CHECK(ri3 >= ri2, "operator>=() breaks on equal reverse_iterators.");
  54. PQXX_CHECK(ri3 >= ri2, "operator<=() breaks on equal reverse_iterators.");
  55. PQXX_CHECK(
  56. *ri3.base() == R.back(), "reverse_iterator does not arrive at back().");
  57. PQXX_CHECK(
  58. ri1->at(0) == (*ri1).at(0),
  59. "reverse_iterator operator->() is inconsistent with operator*().");
  60. PQXX_CHECK(ri2-- == ri3, "reverse_iterator post-decrement is broken.");
  61. PQXX_CHECK(ri2 == --ri3, "reverse_iterator pre-decrement is broken.");
  62. PQXX_CHECK(ri2 == std::rbegin(R), "reverse_iterator decrement is broken.");
  63. ri2 += 1;
  64. ri3 -= -1;
  65. PQXX_CHECK(
  66. ri2 != std::rbegin(R), "Adding to reverse_iterator does not work.");
  67. PQXX_CHECK(
  68. ri3 == ri2, "reverse_iterator operator-=() breaks on negative distances.");
  69. ri2 -= 1;
  70. PQXX_CHECK(
  71. ri2 == std::rbegin(R),
  72. "reverse_iterator operator+=() and operator-=() do not cancel out.");
  73. // Now verify that reverse iterator also sees the same results...
  74. auto l{std::rbegin(contents)};
  75. for (auto i{std::rbegin(R)}; i != std::rend(R); ++i, ++l)
  76. PQXX_CHECK_EQUAL(*l, i->at(0).c_str(), "Inconsistent reverse iteration.");
  77. PQXX_CHECK(l == std::rend(contents), "Reverse iteration ended too soon.");
  78. PQXX_CHECK(not std::empty(R), "No events found in table, cannot test.");
  79. }
  80. } // namespace
  81. PQXX_REGISTER_TEST(test_075);