aboutsummaryrefslogtreecommitdiff
path: root/pw_containers/flat_map_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'pw_containers/flat_map_test.cc')
-rw-r--r--pw_containers/flat_map_test.cc174
1 files changed, 167 insertions, 7 deletions
diff --git a/pw_containers/flat_map_test.cc b/pw_containers/flat_map_test.cc
index bd236bd4c..da7028675 100644
--- a/pw_containers/flat_map_test.cc
+++ b/pw_containers/flat_map_test.cc
@@ -17,9 +17,13 @@
#include <limits>
#include "gtest/gtest.h"
+#include "pw_polyfill/language_feature_macros.h"
namespace pw::containers {
namespace {
+
+using Single = FlatMap<int, char, 1>;
+
constexpr FlatMap<int, char, 5> kOddMap({{
{-3, 'a'},
{0, 'b'},
@@ -27,46 +31,81 @@ constexpr FlatMap<int, char, 5> kOddMap({{
{50, 'd'},
{100, 'e'},
}});
+
} // namespace
+TEST(FlatMap, PairEquality) {
+ Pair<char, int> p1{'a', 1};
+ Pair<char, int> p2{'a', 1};
+ Pair<char, int> p3{'b', 1};
+ Pair<char, int> p4{'a', 2};
+
+ EXPECT_EQ(p1, p2);
+ EXPECT_NE(p1, p3);
+ EXPECT_NE(p1, p4);
+}
+
TEST(FlatMap, Size) { EXPECT_EQ(kOddMap.size(), static_cast<uint32_t>(5)); }
TEST(FlatMap, EmptyFlatMapSize) {
- constexpr FlatMap<int, char, 0> kEmpty({{}});
+ PW_CONSTEXPR_CPP20 FlatMap<int, char, 0> kEmpty({{}});
EXPECT_EQ(kEmpty.size(), static_cast<uint32_t>(0));
}
TEST(FlatMap, Empty) {
- constexpr FlatMap<int, char, 0> kEmpty({{}});
+ PW_CONSTEXPR_CPP20 FlatMap<int, char, 0> kEmpty({{}});
EXPECT_TRUE(kEmpty.empty());
}
TEST(FlatMap, NotEmpty) {
- constexpr FlatMap<int, char, 1> kNotEmpty({{}});
+ PW_CONSTEXPR_CPP20 FlatMap<int, char, 1> kNotEmpty({{}});
EXPECT_FALSE(kNotEmpty.empty());
}
TEST(FlatMap, EmptyFlatMapFind) {
- constexpr FlatMap<int, char, 0> kEmpty({{}});
+ PW_CONSTEXPR_CPP20 FlatMap<int, char, 0> kEmpty({{}});
EXPECT_EQ(kEmpty.find(0), kEmpty.end());
}
TEST(FlatMap, EmptyFlatMapLowerBound) {
- constexpr FlatMap<int, char, 0> kEmpty({{}});
+ PW_CONSTEXPR_CPP20 FlatMap<int, char, 0> kEmpty({{}});
EXPECT_EQ(kEmpty.lower_bound(0), kEmpty.end());
}
TEST(FlatMap, EmptyFlatMapUpperBound) {
- constexpr FlatMap<int, char, 0> kEmpty({{}});
+ PW_CONSTEXPR_CPP20 FlatMap<int, char, 0> kEmpty({{}});
EXPECT_EQ(kEmpty.upper_bound(0), kEmpty.end());
}
TEST(FlatMap, EmptyEqualRange) {
- constexpr FlatMap<int, char, 0> kEmpty({{}});
+ PW_CONSTEXPR_CPP20 FlatMap<int, char, 0> kEmpty({{}});
EXPECT_EQ(kEmpty.equal_range(0).first, kEmpty.end());
EXPECT_EQ(kEmpty.equal_range(0).second, kEmpty.end());
}
+TEST(FlatMap, ConstAtReturnsCorrectValues) {
+ for (const auto& [key, value] : kOddMap) {
+ EXPECT_EQ(value, kOddMap.at(key));
+ }
+}
+
+TEST(FlatMap, MutableAtReturnsCorrectMutableValues) {
+ FlatMap<int, char, 5> mutable_map({{
+ {-4, 'a'},
+ {-1, 'b'},
+ {0, 'c'},
+ {49, 'd'},
+ {99, 'e'},
+ }});
+
+ for (const auto& [key, value] : mutable_map) {
+ const char original_value{value};
+ EXPECT_EQ(original_value, mutable_map.at(key));
+ ++mutable_map.at(key);
+ EXPECT_EQ(original_value + 1, mutable_map.at(key));
+ }
+}
+
TEST(FlatMap, Contains) {
EXPECT_TRUE(kOddMap.contains(0));
EXPECT_FALSE(kOddMap.contains(10));
@@ -81,6 +120,40 @@ TEST(FlatMap, Iterate) {
}
}
+TEST(FlatMap, ForwardsMappedValuesIterationWithDeferenceWorks) {
+ FlatMap<int, char, 5> map({{
+ {-4, 'a'},
+ {-1, 'b'},
+ {0, 'c'},
+ {49, 'd'},
+ {99, 'e'},
+ }});
+
+ char value = 'a';
+ for (auto it = map.mapped_begin(); it != map.mapped_end(); ++it) {
+ EXPECT_EQ(value, *it);
+ ++value;
+ }
+}
+
+TEST(FlatMap, BackwardsMappedValuesIterationWithDereferenceWorks) {
+ FlatMap<int, char, 5> map({{
+ {-4, 'a'},
+ {-1, 'b'},
+ {0, 'c'},
+ {49, 'd'},
+ {99, 'e'},
+ }});
+
+ char value = 'e';
+ auto it = map.mapped_end();
+ do {
+ --it;
+ EXPECT_EQ(value, *it);
+ --value;
+ } while (it != map.mapped_begin());
+}
+
TEST(FlatMap, EqualRange) {
auto pair = kOddMap.equal_range(1);
EXPECT_EQ(1, pair.first->first);
@@ -187,4 +260,91 @@ TEST(FlatMap, DontDereferenceEnd) {
EXPECT_EQ(unsorted_array.contains(3), false);
}
+TEST(FlatMap, NullMappedIteratorNotEqualToValidOne) {
+ Single map({{{-4, 'a'}}});
+
+ EXPECT_NE(Single::mapped_iterator(), map.mapped_begin());
+}
+
+TEST(FlatMap, CopyConstructedMapIteratorEqualToSource) {
+ Single map({{{-4, 'a'}}});
+
+ EXPECT_EQ(Single::mapped_iterator(map.mapped_begin()), map.mapped_begin());
+}
+
+TEST(FlatMap, CopyAssignedMapIteratorEqualToSource) {
+ Single map({{{-4, 'a'}}});
+
+ Single::mapped_iterator it;
+ EXPECT_NE(it, map.mapped_begin());
+ it = map.mapped_begin();
+ EXPECT_EQ(it, map.mapped_begin());
+}
+
+TEST(FlatMap, MappedIteratorCorrectDereferenceMutation) {
+ constexpr int kKey = -4;
+ constexpr char kValue = 'a';
+ Single mutable_map({{{kKey, kValue}}});
+
+ ++*mutable_map.mapped_begin();
+ EXPECT_EQ(kValue + 1, mutable_map.at(kKey));
+}
+
+TEST(FlatMap, MappedIteratorValueCorrectMemberAccess) {
+ constexpr int kAValue{5};
+ struct A {
+ int a;
+ };
+ FlatMap<int, A, 1> map({{{-4, A{kAValue}}}});
+
+ EXPECT_EQ(kAValue, map.mapped_begin()->a);
+}
+
+TEST(FlatMap, MappedIteratorValueCorrectMemberMutation) {
+ constexpr int kAValue{5};
+ struct A {
+ int a;
+ };
+ FlatMap<int, A, 1> map({{{-4, A{kAValue}}}});
+
+ ++map.mapped_begin()->a;
+ EXPECT_EQ(kAValue + 1, map.mapped_begin()->a);
+}
+
+TEST(FlatMap, MappedIteratorPrefixIncrementCorrectReturnAndSideEffect) {
+ Single map({{{-4, 'a'}}});
+
+ auto it = map.mapped_begin();
+ auto it_incremented = ++it;
+ EXPECT_EQ(it, it_incremented);
+ EXPECT_NE(map.mapped_begin(), it_incremented);
+}
+
+TEST(FlatMap, MappedIteratorPostfixIncrementCorrectReturnAndSideEffect) {
+ Single map({{{-4, 'a'}}});
+
+ auto it = map.mapped_begin();
+ auto it_original = it++;
+ EXPECT_EQ(map.mapped_begin(), it_original);
+ EXPECT_NE(it, it_original);
+}
+
+TEST(FlatMap, MappedIteratorPrefixDecrementCorrectReturnAndSideEffect) {
+ Single map({{{-4, 'a'}}});
+
+ auto it = map.mapped_end();
+ auto it_decremented = --it;
+ EXPECT_EQ(it, it_decremented);
+ EXPECT_NE(map.mapped_end(), it_decremented);
+}
+
+TEST(FlatMap, MappedIteratorPostfixDecrementCorrectReturnAndSideEffect) {
+ Single map({{{-4, 'a'}}});
+
+ auto it = map.mapped_end();
+ auto it_original = it--;
+ EXPECT_EQ(map.mapped_end(), it_original);
+ EXPECT_NE(it, it_original);
+}
+
} // namespace pw::containers