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