test82.cxx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include <iostream>
  2. #include <pqxx/nontransaction>
  3. #include "test_helpers.hxx"
  4. // Test program for libpqxx. Read and print table using row iterators.
  5. namespace
  6. {
  7. void test_082()
  8. {
  9. pqxx::connection conn;
  10. pqxx::nontransaction tx{conn};
  11. pqxx::test::create_pqxxevents(tx);
  12. std::string const Table{"pqxxevents"};
  13. pqxx::result R{tx.exec("SELECT * FROM " + Table)};
  14. PQXX_CHECK(not std::empty(R), "Got empty result.");
  15. std::string const nullstr("[null]");
  16. for (auto const &r : R)
  17. {
  18. pqxx::row::const_iterator f2(r[0]);
  19. for (auto const &f : r)
  20. {
  21. PQXX_CHECK_EQUAL(
  22. (*f2).as(nullstr), f.as(nullstr), "Inconsistent iteration result.");
  23. ++f2;
  24. }
  25. PQXX_CHECK(
  26. std::begin(r) + pqxx::row::difference_type(std::size(r)) == std::end(r),
  27. "Row end() appears to be in the wrong place.");
  28. PQXX_CHECK(
  29. pqxx::row::difference_type(std::size(r)) + std::begin(r) == std::end(r),
  30. "Row iterator addition is not commutative.");
  31. PQXX_CHECK_EQUAL(
  32. std::begin(r)->num(), 0, "Wrong column number at begin().");
  33. pqxx::row::const_iterator f3(r[std::size(r)]);
  34. PQXX_CHECK(f3 == std::end(r), "Did not get end() at end of row.");
  35. PQXX_CHECK(
  36. f3 > std::begin(r), "Row end() appears to precede its begin().");
  37. PQXX_CHECK(
  38. f3 >= std::end(r) and std::begin(r) < f3,
  39. "Row iterator operator<() is broken.");
  40. PQXX_CHECK(f3 > std::begin(r), "Row end() not greater than begin().");
  41. pqxx::row::const_iterator f4{r, std::size(r)};
  42. PQXX_CHECK(f4 == f3, "Row iterator constructor with offset is broken.");
  43. --f3;
  44. f4 -= 1;
  45. PQXX_CHECK(f3 < std::end(r), "Last field in row is not before end().");
  46. PQXX_CHECK(f3 >= std::begin(r), "Last field in row precedes begin().");
  47. PQXX_CHECK(
  48. f3 == std::end(r) - 1, "Back from end() doese not yield end()-1.");
  49. PQXX_CHECK_EQUAL(
  50. std::end(r) - f3, 1, "Wrong distance from last row to end().");
  51. PQXX_CHECK(f4 == f3, "Row iterator operator-=() is broken.");
  52. f4 += 1;
  53. PQXX_CHECK(f4 == std::end(r), "Row iterator operator+=() is broken.");
  54. for (auto fr = std::rbegin(r); fr != std::rend(r); ++fr, --f3)
  55. PQXX_CHECK_EQUAL(
  56. *fr, *f3,
  57. "Reverse traversal is not consistent with forward traversal.");
  58. }
  59. // Thorough test for row::const_reverse_iterator
  60. pqxx::row::const_reverse_iterator ri1(std::rbegin(R.front())), ri2(ri1),
  61. ri3(std::end(R.front()));
  62. ri2 = std::rbegin(R.front());
  63. PQXX_CHECK(
  64. ri1 == ri2, "Copy-constructed reverse_iterator is not equal to original.");
  65. PQXX_CHECK(ri2 == ri3, "result::end() does not generate rbegin().");
  66. PQXX_CHECK_EQUAL(
  67. ri2 - ri3, 0,
  68. "Distance between identical const_reverse_iterators was nonzero.");
  69. PQXX_CHECK(
  70. pqxx::row::const_reverse_iterator(ri1.base()) == ri1,
  71. "Back-conversion of reverse_iterator base() fails.");
  72. PQXX_CHECK(ri2 == ri3 + 0, "reverse_iterator+0 gives strange result.");
  73. PQXX_CHECK(ri2 == ri3 - 0, "reverse_iterator-0 gives strange result.");
  74. PQXX_CHECK(
  75. not(ri3 < ri2),
  76. "reverse_iterator operator<() breaks on identical iterators.");
  77. PQXX_CHECK(
  78. ri2 <= ri3,
  79. "reverse_iterator operator<=() breaks on identical iterators.");
  80. PQXX_CHECK(ri3++ == ri2, "reverse_iterator post-increment is broken.");
  81. PQXX_CHECK_EQUAL(ri3 - ri2, 1, "Wrong reverse_iterator distance.");
  82. PQXX_CHECK(ri3 > ri2, "reverse_iterator operator>() is broken.");
  83. PQXX_CHECK(ri3 >= ri2, "reverse_iterator operator>=() is broken.");
  84. PQXX_CHECK(ri2 < ri3, "reverse_iterator operator<() is broken.");
  85. PQXX_CHECK(ri2 <= ri3, "reverse_iterator operator<=() is broken.");
  86. PQXX_CHECK(ri3 == ri2 + 1, "Adding number to reverse_iterator goes wrong.");
  87. PQXX_CHECK(ri2 == ri3 - 1, "Subtracting from reverse_iterator goes wrong.");
  88. PQXX_CHECK(
  89. ri3 == ++ri2, "reverse_iterator pre-incremen returns wrong result.");
  90. PQXX_CHECK(
  91. ri3 >= ri2, "reverse_iterator operator>=() breaks on equal iterators.");
  92. PQXX_CHECK(
  93. ri3 >= ri2, "reverse_iterator operator<=() breaks on equal iterators.");
  94. PQXX_CHECK(
  95. *ri3.base() == R.front().back(),
  96. "reverse_iterator does not arrive at back().");
  97. PQXX_CHECK(
  98. ri1->c_str()[0] == (*ri1).c_str()[0],
  99. "reverse_iterator operator->() is inconsistent with operator*().");
  100. PQXX_CHECK(
  101. ri2-- == ri3, "reverse_iterator post-decrement returns wrong result.");
  102. PQXX_CHECK(
  103. ri2 == --ri3, "reverse_iterator pre-increment returns wrong result.");
  104. PQXX_CHECK(
  105. ri2 == std::rbegin(R.front()),
  106. "Moving iterator back and forth doesn't get it back to origin.");
  107. ri2 += 1;
  108. ri3 -= -1;
  109. PQXX_CHECK(
  110. ri2 != std::rbegin(R.front()), "Adding to reverse_iterator doesn't work.");
  111. PQXX_CHECK(
  112. ri2 != std::rbegin(R.front()), "Adding to reverse_iterator doesn't work.");
  113. PQXX_CHECK(
  114. ri3 == ri2, "reverse_iterator operator-=() breaks on negative numbers.");
  115. ri2 -= 1;
  116. PQXX_CHECK(
  117. ri2 == std::rbegin(R.front()),
  118. "reverse_iterator operator+=() and operator-=() do not cancel out");
  119. }
  120. } // namespace
  121. PQXX_REGISTER_TEST(test_082);