recursive_iterator_accessors.t.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. //
  2. // recursive_iterator_accessors.t.h
  3. // iterator
  4. //
  5. // Created by Sam Jaffe on 2/21/17.
  6. //
  7. #pragma once
  8. #include <cxxtest/TestSuite.h>
  9. class recursive_iterator_accessors_TestSuite : public CxxTest::TestSuite {
  10. public:
  11. void test_access_iterator_types() {
  12. using layer1 = std::map<int, int>;
  13. using layer2 = std::vector<layer1>;
  14. using object_type = std::map<int, layer2>;
  15. object_type const obj{{ 1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}};
  16. auto rit = make_recursive_iterator(obj);
  17. TS_ASSERT_EQUALS(typeid(decltype(std::get<0>(rit))).name(),
  18. typeid(iterator::end_aware_iterator<object_type::const_iterator>).name());
  19. TS_ASSERT_EQUALS(typeid(decltype(std::get<1>(rit))).name(),
  20. typeid(iterator::end_aware_iterator<layer2::const_iterator>).name());
  21. TS_ASSERT_EQUALS(typeid(decltype(std::get<2>(rit))).name(),
  22. typeid(iterator::end_aware_iterator<layer1::const_iterator>).name());
  23. }
  24. void test_construct_inplace_recursive_iterator() {
  25. using layer1 = std::map<int, int>;
  26. using layer2 = std::vector<layer1>;
  27. using object_type = std::map<int, layer2>;
  28. object_type const obj{{ 1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}};
  29. auto const it = make_end_aware_iterator(obj.begin(), obj.end());
  30. auto const it_1 = ++make_end_aware_iterator(it->second);
  31. auto const it_2 = make_end_aware_iterator(*it_1);
  32. TS_ASSERT_THROWS_NOTHING(make_recursive_iterator(it, it_1, it_2));
  33. }
  34. void test_access_iterator_values_match_inplace() {
  35. using layer1 = std::map<int, int>;
  36. using layer2 = std::vector<layer1>;
  37. using object_type = std::map<int, layer2>;
  38. object_type const obj{{ 1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}};
  39. auto const it = make_end_aware_iterator(obj.begin(), obj.end());
  40. auto const it_1 = ++make_end_aware_iterator(it->second);
  41. auto const it_2 = make_end_aware_iterator(*it_1);
  42. iterator::recursive_iterator<object_type::const_iterator> rit{
  43. iterator::in_place,
  44. it, it_1, it_2
  45. };
  46. TS_ASSERT_EQUALS(std::get<0>(rit), it);
  47. TS_ASSERT_EQUALS(std::get<1>(rit), it_1);
  48. TS_ASSERT_EQUALS(std::get<2>(rit), it_2);
  49. }
  50. };