15 #include <gmock/gmock.h>
16 #include <gtest/gtest.h>
23 #include <range/v3/range/concepts.hpp>
24 #include <range/v3/range/conversion.hpp>
25 #include <range/v3/view/stride.hpp>
26 #include <range/v3/view/transform.hpp>
33 TEST(CircularArrayTest, Empty) {
35 EXPECT_EQ(array.size(), 0);
36 EXPECT_EQ(array.effective_size(), 0);
37 EXPECT_EQ(array.max_size(), 2);
38 EXPECT_TRUE(array.empty());
39 EXPECT_FALSE(array.full());
42 TEST(CircularArrayTest, PartiallyFilled) {
44 EXPECT_EQ(array.size(), 1);
45 EXPECT_EQ(array.effective_size(), 1);
46 EXPECT_EQ(array.max_size(), 2);
47 EXPECT_FALSE(array.empty());
48 EXPECT_FALSE(array.full());
51 TEST(CircularArrayTest, Full) {
53 EXPECT_EQ(array.size(), 2);
54 EXPECT_EQ(array.effective_size(), 2);
55 EXPECT_EQ(array.max_size(), 2);
56 EXPECT_FALSE(array.empty());
57 EXPECT_TRUE(array.full());
60 TEST(CircularArrayTest, FromRange) {
61 auto input = std::array{1, 2, 3};
63 EXPECT_THAT(array, ::testing::ElementsAre(1, 2, 3));
67 TEST(CircularArrayTest, FromRangeUsingReverseLayout) {
68 auto input = std::array{1, 2, 3};
71 EXPECT_THAT(array, ::testing::ElementsAre(1, 2, 3));
75 TEST(CircularArrayTest, Read) {
77 EXPECT_EQ(array.front(), 1);
78 EXPECT_EQ(array.back(), 3);
79 EXPECT_EQ(array[0], 1);
80 EXPECT_EQ(array.at(0), 1);
81 EXPECT_EQ(array[1], 2);
82 EXPECT_EQ(array.at(1), 2);
83 EXPECT_EQ(array[2], 3);
84 EXPECT_EQ(array.at(2), 3);
85 EXPECT_THROW({ (void)array.at(3); }, std::out_of_range);
86 EXPECT_THAT(array, ::testing::ElementsAre(1, 2, 3));
89 TEST(CircularArrayTest, ReverseLayoutRead) {
92 EXPECT_EQ(array.front(), 1);
93 EXPECT_EQ(array.back(), 3);
94 EXPECT_EQ(array[0], 1);
95 EXPECT_EQ(array.at(0), 1);
96 EXPECT_EQ(array[1], 2);
97 EXPECT_EQ(array.at(1), 2);
98 EXPECT_EQ(array[2], 3);
99 EXPECT_EQ(array.at(2), 3);
100 EXPECT_THROW({ (void)array.at(3); }, std::out_of_range);
101 EXPECT_THAT(array, ::testing::ElementsAre(1, 2, 3));
104 TEST(CircularArrayTest, ExtrapolateOnRead) {
107 EXPECT_EQ(array.size(), 3);
108 EXPECT_EQ(array.effective_size(), 5);
109 EXPECT_EQ(array.max_size(), 5);
110 EXPECT_THAT(array, ::testing::ElementsAre(1, 2, 3, 3, 3));
113 TEST(CircularArrayTest, Write) {
115 EXPECT_TRUE(array.empty());
118 EXPECT_TRUE(array.full());
119 EXPECT_THROW({ array.push_back(3); }, std::length_error);
120 EXPECT_THAT(array, ::testing::ElementsAre(1, 2));
122 EXPECT_THAT(array, ::testing::ElementsAre(2));
124 EXPECT_TRUE(array.empty());
127 TEST(CircularArrayTest, ReverseLayoutWrite) {
130 EXPECT_TRUE(array.empty());
133 EXPECT_TRUE(array.full());
134 EXPECT_THROW({ array.push_front(3); }, std::length_error);
135 EXPECT_THAT(array, ::testing::ElementsAre(2, 1));
137 EXPECT_THAT(array, ::testing::ElementsAre(2));
139 EXPECT_TRUE(array.empty());
142 TEST(CircularArrayTest, FrontInsertWrite) {
146 std::copy(input_array.begin(), input_array.end(), std::front_inserter(output_array));
147 std::copy(input_array.rbegin(), input_array.rend(), std::front_inserter(output_array));
148 EXPECT_THAT(output_array, ::testing::ElementsAre(1, 3, 2, 2, 3, 1));
151 TEST(CircularArrayTest, BackInsertWrite) {
154 std::copy(input_array.begin(), input_array.end(), std::back_inserter(output_array));
155 std::copy(input_array.rbegin(), input_array.rend(), std::back_inserter(output_array));
156 EXPECT_THAT(output_array, ::testing::ElementsAre(1, 3, 2, 2, 3, 1));
159 TEST(CircularArrayTest, NoWriteWhenFull) {
161 EXPECT_THROW({ array.push_back(3); }, std::length_error);
164 TEST(CircularArrayTest, RolloverOnWrite) {
168 EXPECT_THAT(array, ::testing::ElementsAre(2, 3));
171 TEST(CircularArrayTest, Fill) {
173 EXPECT_THAT(array, ::testing::ElementsAre(1));
175 EXPECT_THAT(array, ::testing::ElementsAre(1, 0, 0));
178 TEST(CircularArrayTest, Swap) {
180 constexpr
auto kFlags =
186 EXPECT_THAT(lhs, ::testing::ElementsAre(3, 2, 1));
187 EXPECT_THAT(rhs, ::testing::ElementsAre(-2, -1, 0));
190 TEST(CircularArrayTest, RangeLike) {
193 const auto output_array = input_array | ranges::views::stride(2) |
194 ranges::views::transform([](
int x) {
return x * x; }) |
196 EXPECT_THAT(output_array, ::testing::ElementsAre(1, 9, 25));
199 TEST(CircularArrayTest, TupleLike) {
202 const auto& [a, b, c] = array;