stream_test.cxx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. //
  2. // stream_td.hpp
  3. // stream
  4. //
  5. // Created by Sam Jaffe on 1/28/17.
  6. //
  7. #include <gmock/gmock.h>
  8. #include <string>
  9. #include <vector>
  10. #include "stream/streams.hpp"
  11. using ::testing::Eq;
  12. // Workaround for OSX and pointer-to-member-functions
  13. template class std::basic_string<char>;
  14. using int_t = int const &;
  15. TEST(StreamTest, IteratorPreservesElements) {
  16. std::vector<int> v{1, 2, 3, 4, 5};
  17. auto s = stream::make_stream(v);
  18. std::vector<int> o{s.begin(), s.end()};
  19. EXPECT_THAT(v, o);
  20. }
  21. TEST(StreamTest, CollectPreservesElements) {
  22. std::vector<int> v{1, 2, 3, 4, 5};
  23. auto s = stream::make_stream(v);
  24. std::vector<int> o{s.begin(), s.end()};
  25. std::vector<int> o2{s.collect()};
  26. EXPECT_THAT(v, o);
  27. EXPECT_THAT(v, o2);
  28. }
  29. TEST(StreamTest, CollectToObjectPreservesElements) {
  30. std::vector<int> v{1, 2, 3, 4, 5};
  31. auto s = stream::make_stream(v);
  32. std::set<int> o{};
  33. s.collect(o);
  34. for (int i : v) {
  35. EXPECT_THAT(o.count(i), Eq(1));
  36. }
  37. }
  38. TEST(StreamTest, MapToSelfIsSelfs) {
  39. std::vector<int> v{1, 2, 3, 4, 5};
  40. auto identity = [](int_t i) { return i; };
  41. auto s = stream::make_stream(v).map( identity );
  42. std::vector<int> o{s.begin(), s.end()};
  43. EXPECT_THAT(v, o);
  44. }
  45. TEST(StreamTest, MapCanAlterValues) {
  46. std::vector<int> v{1, 2, 3, 4, 5};
  47. std::vector<int> expected{3, 5, 7, 9, 11};
  48. auto fmap = [](int_t i) { return 2*i+1; };
  49. auto s = stream::make_stream(v).map( fmap );
  50. std::vector<int> o{s.begin(), s.end()};
  51. EXPECT_THAT(expected, o);
  52. }
  53. TEST(StreamTest, CanBuildFromSingleElement) {
  54. int_t value = 11;
  55. auto even = [](int_t i) { return i%2==0; };
  56. auto s = stream::make_stream(&value).filter( even );
  57. EXPECT_TRUE(s.empty());
  58. }
  59. TEST(StreamTest, CanBuildFromIterators) {
  60. std::vector<int> v{1, 2, 3, 4, 5};
  61. std::vector<int> expected{5, 7};
  62. auto fmap = [](int_t i) { return 2*i+1; };
  63. auto s = stream::make_stream(v.begin()+1, v.begin()+3).map(fmap);
  64. std::vector<int> o{s.begin(), s.end()};
  65. EXPECT_THAT(o, Eq(expected));
  66. }
  67. TEST(StreamTest, NoOpFilterReturnOriginal) {
  68. std::vector<int> v{1, 2, 3, 4, 5};
  69. auto pass = [](int_t) { return true; };
  70. auto s = stream::make_stream(v).filter( pass );
  71. std::vector<int> o{s.begin(), s.end()};
  72. EXPECT_THAT(o, Eq(v));
  73. }
  74. TEST(StreamTest, CanFilterOutElements) {
  75. std::vector<int> v{1, 2, 3, 4, 5};
  76. std::vector<int> expected{2, 4};
  77. auto even = [](int_t i) { return i%2 == 0; };
  78. auto s = stream::make_stream(v).filter(even);
  79. std::vector<int> o{s.begin(), s.end()};
  80. EXPECT_THAT(o, Eq(expected));
  81. }
  82. TEST(StreamTest, AccumulateDefaultsToAdd) {
  83. std::vector<int> v{1, 2, 3, 4, 5};
  84. auto even = [](int_t i) { return i%2 == 0; };
  85. auto s = stream::make_stream(v).filter( even );
  86. EXPECT_THAT(s.accumulate(0), Eq(6));
  87. }
  88. TEST(StreamTest, AccumulateCanTakeCustomAccumulator) {
  89. std::vector<int> v{1, 2, 3, 4, 5};
  90. auto even = [](int_t i) { return i%2 == 0; };
  91. auto prod = [](int_t lhs, int_t rhs) { return lhs * rhs; };
  92. auto s = stream::make_stream(v).filter(even);
  93. EXPECT_THAT(s.accumulate(prod, 0), Eq(0));
  94. EXPECT_THAT(s.accumulate(prod, 1), Eq(8));
  95. }
  96. TEST(StreamTest, FlatmapJoinsIterableOutputs) {
  97. std::vector<int> vv{1, 2, 3, 4, 5};
  98. auto next3 = [](int_t i) { return std::vector<int>{i, i+1, i+2}; };
  99. std::vector<int> expected{1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7};
  100. auto s = stream::make_stream(vv).flatmap(next3);
  101. std::vector<int> o{s.begin(), s.end()};
  102. EXPECT_THAT(o, Eq(expected));
  103. }
  104. TEST(StreamTest, CanDereferenceElements) {
  105. int val = 5;
  106. std::vector<int*> v{&val};
  107. auto data = stream::make_stream(v).deref().collect();
  108. EXPECT_THAT(data.front(), val);
  109. }
  110. TEST(StreamTest, CanForEachConsume) {
  111. int hits = 0;
  112. std::vector<int> v{1, 2, 3, 4, 5};
  113. stream::make_stream(v).each([&hits](int_t){ ++hits; });
  114. EXPECT_THAT(hits, 5);
  115. }
  116. TEST(StreamTest, CanFetchMemPtr) {
  117. struct test { int val; };
  118. std::vector<test> v{{1}, {3}, {2}};
  119. std::vector<int> expected{1, 3, 2};
  120. auto out = stream::make_stream(v).map(&test::val).collect();
  121. EXPECT_THAT(out, Eq(expected));
  122. }
  123. TEST(StreamTest, CanMapToMemFn) {
  124. std::vector<std::string> v{"hello", "goodbye"};
  125. std::vector<std::string::size_type> expected{5, 7};
  126. auto out = stream::make_stream(v).map(&std::string::size).collect();
  127. EXPECT_THAT(out, Eq(expected));
  128. }
  129. TEST(StreamTest, CastStreamToParentType) {
  130. struct base { char cat[4] = "cat"; };
  131. struct test : base { test(int v) : val(v) {} int val; };
  132. std::vector<test> v{{1}, {3}, {2}};
  133. auto strm = stream::make_stream(v).cast<base>();
  134. auto first = stream::make_stream(v).map([](test const & t) { return (void*)&t; }).collect();
  135. auto second = strm.map([](base const & t) { return (void*)&t; }).collect();
  136. EXPECT_THAT(first, second);
  137. }