|
|
@@ -1,9 +1,11 @@
|
|
|
#include "iterator/filter_iterator.hpp"
|
|
|
|
|
|
+#include <vector>
|
|
|
+
|
|
|
#include <gmock/gmock.h>
|
|
|
|
|
|
TEST(FilterIteratorTest, CanPerformSkipsOnData) {
|
|
|
- int data[] = {1, 2, 3, 4, 5};
|
|
|
+ std::vector<int> const data = {1, 2, 3, 4, 5};
|
|
|
auto pred = [](int i) { return i % 2 == 0; };
|
|
|
auto it = make_filter_iterator(pred, data);
|
|
|
decltype(it) end = {};
|
|
|
@@ -12,8 +14,28 @@ TEST(FilterIteratorTest, CanPerformSkipsOnData) {
|
|
|
EXPECT_THAT(*it++, 4);
|
|
|
}
|
|
|
|
|
|
+// TODO: Maybe this should actually move
|
|
|
+TEST(FilterIteratorTest, MutatingContainerDoesNotMoveIterator) {
|
|
|
+ std::vector<int> data = {1, 2, 3, 4, 5};
|
|
|
+ auto pred = [](int i) { return i % 2 == 0; };
|
|
|
+ auto it = make_filter_iterator(pred, data);
|
|
|
+ decltype(it) end = {};
|
|
|
+ EXPECT_THAT(std::distance(it, end), 2);
|
|
|
+ *it = 1;
|
|
|
+ EXPECT_THAT(std::distance(it, end), 2);
|
|
|
+ EXPECT_THAT(*it, 1);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(FilterIteratorTest, CanConstructFilterFromSubRange) {
|
|
|
+ std::vector<int> data = {1, 2, 3, 4, 5};
|
|
|
+ auto pred = [](int i) { return i % 2 == 0; };
|
|
|
+ auto it = make_filter_iterator(pred, data.begin(), data.begin() + 3);
|
|
|
+ decltype(it) end = {};
|
|
|
+ EXPECT_THAT(std::distance(it, end), 1);
|
|
|
+}
|
|
|
+
|
|
|
TEST(FilterIteratorTest, IfNonMatchThenStartIsEnd) {
|
|
|
- int data[] = {1, 3, 5};
|
|
|
+ std::vector<int> const data = {1, 3, 5};
|
|
|
auto pred = [](int i) { return i % 2 == 0; };
|
|
|
auto it = make_filter_iterator(pred, data);
|
|
|
decltype(it) end = {};
|
|
|
@@ -21,7 +43,7 @@ TEST(FilterIteratorTest, IfNonMatchThenStartIsEnd) {
|
|
|
}
|
|
|
|
|
|
TEST(FilterIteratorTest, IncrementEndIsNoOp) {
|
|
|
- int data[] = {1, 2, 3, 4, 5};
|
|
|
+ std::vector<int> const data = {1, 2, 3, 4, 5};
|
|
|
auto pred = [](int i) { return i % 2 == 0; };
|
|
|
auto it = make_filter_iterator(pred, data);
|
|
|
decltype(it) end = {};
|