// // cascade_iterator_test.cpp // iterator-test // // Created by Sam Jaffe on 9/24/25. // Copyright © 2025 Sam Jaffe. All rights reserved. // #include "iterator/projecting_recursive_iterator.h" #include "ranges.h" #include "xcode_gtest_helper.h" using iterator::ProjectingRecursiveIterator; struct Baz { std::vector ints; std::map> tags; }; struct Bar { std::vector doubles; std::map bazes; }; struct Foo { std::map> example; std::vector bars_; std::vector const & bars() const { return bars_; } std::vector bars_copy() { return bars_; } }; TEST(ProjectingRecursiveIterator, OneProjectorIsTwoLevels) { std::vector foos; auto iter = ProjectingRecursiveIterator(foos, &Foo::bars); testing::StaticAssertTypeEq(); } TEST(ProjectingRecursiveIterator, TwoProjectorIsThreeLevels) { std::vector foos; auto iter = ProjectingRecursiveIterator(foos, &Foo::bars, &Bar::bazes); testing::StaticAssertTypeEq>(); } TEST(ProjectingRecursiveIterator, IsRvalueSafe) { std::vector foos; auto iter = ProjectingRecursiveIterator(foos, &Foo::bars_copy, &Bar::bazes); testing::StaticAssertTypeEq>(); } TEST(ProjectingRecursiveIterator, CanProjectUnboundedTail) { std::vector foos; auto iter = ProjectingRecursiveIterator(foos, iterator::unbounded{}, &Foo::example); static_assert( std::same_as>); testing::StaticAssertTypeEq< decltype(*iter), std::tuple>(); } TEST(ProjectingRecursiveIterator, CanProjectBoundedTail) { std::vector foos; auto iter = ProjectingRecursiveIterator(foos, iterator::bounded<3>{}, &Foo::example); static_assert( std::same_as>); testing::StaticAssertTypeEq< decltype(*iter), std::tuple>(); }