projecting_recursive_iterator_test.cxx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. //
  2. // cascade_iterator_test.cpp
  3. // iterator-test
  4. //
  5. // Created by Sam Jaffe on 9/24/25.
  6. // Copyright © 2025 Sam Jaffe. All rights reserved.
  7. //
  8. #include "iterator/projecting_recursive_iterator.h"
  9. #include "ranges.h"
  10. #include "xcode_gtest_helper.h"
  11. using iterator::ProjectingRecursiveIterator;
  12. struct Baz {
  13. std::vector<int> ints;
  14. std::map<int, std::vector<std::string>> tags;
  15. };
  16. struct Bar {
  17. std::vector<double> doubles;
  18. std::map<int, Baz> bazes;
  19. };
  20. struct Foo {
  21. std::map<int, std::map<std::string, int>> example;
  22. std::vector<Bar> bars_;
  23. std::vector<Bar> const & bars() const { return bars_; }
  24. std::vector<Bar> bars_copy() { return bars_; }
  25. };
  26. TEST(ProjectingRecursiveIterator, OneProjectorIsTwoLevels) {
  27. std::vector<Foo> foos;
  28. auto iter = ProjectingRecursiveIterator(foos, &Foo::bars);
  29. testing::StaticAssertTypeEq<decltype(*iter), Bar const &>();
  30. }
  31. TEST(ProjectingRecursiveIterator, TwoProjectorIsThreeLevels) {
  32. std::vector<Foo> foos;
  33. auto iter = ProjectingRecursiveIterator(foos, &Foo::bars, &Bar::bazes);
  34. testing::StaticAssertTypeEq<decltype(*iter),
  35. std::tuple<int const &, Baz const &>>();
  36. }
  37. TEST(ProjectingRecursiveIterator, IsRvalueSafe) {
  38. std::vector<Foo> foos;
  39. auto iter = ProjectingRecursiveIterator(foos, &Foo::bars_copy, &Bar::bazes);
  40. testing::StaticAssertTypeEq<decltype(*iter),
  41. std::tuple<int const &, Baz const &>>();
  42. }
  43. TEST(ProjectingRecursiveIterator, CanProjectUnboundedTail) {
  44. std::vector<Foo> foos;
  45. auto iter =
  46. ProjectingRecursiveIterator(foos, iterator::unbounded{}, &Foo::example);
  47. static_assert(
  48. std::same_as<decltype(*iter),
  49. std::tuple<int const &, std::string const &, int &>>);
  50. testing::StaticAssertTypeEq<
  51. decltype(*iter), std::tuple<int const &, std::string const &, int &>>();
  52. }
  53. TEST(ProjectingRecursiveIterator, CanProjectBoundedTail) {
  54. std::vector<Foo> foos;
  55. auto iter =
  56. ProjectingRecursiveIterator(foos, iterator::bounded<3>{}, &Foo::example);
  57. static_assert(
  58. std::same_as<decltype(*iter),
  59. std::tuple<int const &, std::string const &, int &>>);
  60. testing::StaticAssertTypeEq<
  61. decltype(*iter), std::tuple<int const &, std::string const &, int &>>();
  62. }