stream_test.cxx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //
  2. // stream_td.hpp
  3. // stream
  4. //
  5. // Created by Sam Jaffe on 1/28/17.
  6. //
  7. #include "xcode_gtest_helper.h"
  8. #include <map>
  9. #include <string>
  10. #include <vector>
  11. #include "stream/streams.hpp"
  12. using ::testing::ElementsAre;
  13. using ::testing::ElementsAreArray;
  14. using ::testing::Eq;
  15. namespace views = stream::views;
  16. namespace ranges = stream::ranges;
  17. TEST(StreamTest, CanBuildFromSingleElement) {
  18. int value = 11;
  19. auto even = [](int i) { return i % 2 == 0; };
  20. auto s = views::single(value) | views::filter(even);
  21. EXPECT_THAT(ranges::size(s), 0);
  22. }
  23. TEST(StreamTest, CanBuildFromIterators) {
  24. std::vector<int> input{1, 2, 3, 4, 5};
  25. std::vector<int> expected{5, 7};
  26. auto fmap = [](int i) { return 2 * i + 1; };
  27. auto out = ranges::subrange(input.begin() + 1, input.begin() + 3) |
  28. views::transform(fmap) | ranges::to_vector();
  29. EXPECT_THAT(out, Eq(expected));
  30. }
  31. TEST(StreamTest, CanDereferenceElements) {
  32. int val = 5;
  33. std::vector<int *> input{&val};
  34. auto data = input | views::deref() | ranges::to_vector();
  35. EXPECT_THAT(data.front(), Eq(val));
  36. }
  37. TEST(StreamTest, CanForEachConsume) {
  38. int hits = 0;
  39. std::vector<int> input{1, 2, 3, 4, 5};
  40. ranges::for_each(views::all(input), [&hits](int) { ++hits; });
  41. EXPECT_THAT(hits, Eq(5));
  42. }
  43. //
  44. // TEST(StreamTest, CastStreamToParentType) {
  45. // struct base {
  46. // char cat[4] = "cat";
  47. // };
  48. // struct test : base {
  49. // test(int v) : val(v) {}
  50. // int val;
  51. // };
  52. // std::vector<test> input{{1}, {3}, {2}};
  53. //
  54. // auto addressof_void = [](auto const & p) { return (void *)&p; };
  55. //
  56. // auto strm = stream::of(input).cast<base>();
  57. // auto first = stream::of(input).map(addressof_void).collect();
  58. // auto second = strm.map(addressof_void).collect();
  59. //
  60. // EXPECT_THAT(first, second);
  61. //}