// // recursive_iterator_accessors.t.h // iterator // // Created by Sam Jaffe on 2/21/17. // #pragma once #include class recursive_iterator_accessors_TestSuite : public CxxTest::TestSuite { public: void test_access_iterator_types() { using layer1 = std::map; using layer2 = std::vector; using object_type = std::map; object_type const obj{{ 1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}}; auto rit = make_recursive_iterator(obj); TS_ASSERT_EQUALS(typeid(decltype(std::get<0>(rit))).name(), typeid(iterator::end_aware_iterator).name()); TS_ASSERT_EQUALS(typeid(decltype(std::get<1>(rit))).name(), typeid(iterator::end_aware_iterator).name()); TS_ASSERT_EQUALS(typeid(decltype(std::get<2>(rit))).name(), typeid(iterator::end_aware_iterator).name()); } void test_construct_inplace_recursive_iterator() { using layer1 = std::map; using layer2 = std::vector; using object_type = std::map; object_type const obj{{ 1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}}; auto const it = make_end_aware_iterator(obj.begin(), obj.end()); auto const it_1 = ++make_end_aware_iterator(it->second); auto const it_2 = make_end_aware_iterator(*it_1); TS_ASSERT_THROWS_NOTHING(make_recursive_iterator(it, it_1, it_2)); } void test_access_iterator_values_match_inplace() { using layer1 = std::map; using layer2 = std::vector; using object_type = std::map; object_type const obj{{ 1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}}; auto const it = make_end_aware_iterator(obj.begin(), obj.end()); auto const it_1 = ++make_end_aware_iterator(it->second); auto const it_2 = make_end_aware_iterator(*it_1); iterator::recursive_iterator rit{ iterator::in_place, it, it_1, it_2 }; TS_ASSERT_EQUALS(std::get<0>(rit), it); TS_ASSERT_EQUALS(std::get<1>(rit), it_1); TS_ASSERT_EQUALS(std::get<2>(rit), it_2); } };