1 /**
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <gtest/gtest.h>
17
18 #include "utils/ring_buffer.h"
19
20 namespace panda::test {
21 static constexpr size_t DEFAULT_BUFFER_SIZE = 10U;
22
TEST(RingBufferTest,InitializeTest)23 TEST(RingBufferTest, InitializeTest)
24 {
25 constexpr RingBuffer<int, DEFAULT_BUFFER_SIZE> buffer;
26
27 ASSERT_EQ(buffer.size(), 0U);
28 ASSERT_EQ(buffer.capacity(), DEFAULT_BUFFER_SIZE);
29 ASSERT_EQ(buffer.begin(), buffer.end());
30 ASSERT_EQ(buffer.cbegin(), buffer.cend());
31 ASSERT_TRUE(buffer.empty());
32 ASSERT_EQ(buffer.capacity(), DEFAULT_BUFFER_SIZE);
33 ASSERT_FALSE(buffer.full());
34 }
35
TEST(RingBufferTest,PushToBufferTest)36 TEST(RingBufferTest, PushToBufferTest)
37 {
38 RingBuffer<size_t, DEFAULT_BUFFER_SIZE> buffer;
39
40 for (size_t i = 0; i < DEFAULT_BUFFER_SIZE; ++i) {
41 buffer.push_back(i);
42 ASSERT_EQ(buffer.size(), i + 1);
43 ASSERT_EQ(buffer.front(), 0U);
44 ASSERT_EQ(buffer.back(), i);
45 }
46
47 ASSERT_EQ(buffer.size(), DEFAULT_BUFFER_SIZE);
48 ASSERT_NE(buffer.begin(), buffer.end());
49 ASSERT_FALSE(buffer.empty());
50 ASSERT_TRUE(buffer.full());
51
52 size_t i = 0;
53 for (const auto &element : buffer) {
54 ASSERT_EQ(element, i++);
55 }
56
57 // Add new element when buffer is full
58 buffer.emplace_back(i);
59
60 ASSERT_EQ(*buffer.begin(), 1U);
61 ASSERT_EQ(buffer.front(), 1U);
62 ASSERT_EQ(buffer.back(), i);
63 ASSERT_EQ(buffer.size(), DEFAULT_BUFFER_SIZE);
64 ASSERT_NE(buffer.begin(), buffer.end());
65 ASSERT_FALSE(buffer.empty());
66 ASSERT_TRUE(buffer.full());
67
68 i = 1;
69 for (const auto &element : buffer) {
70 ASSERT_EQ(element, i++);
71 }
72 for (auto it = buffer.rbegin(); it != buffer.rend(); ++it) {
73 ASSERT_EQ(*it, --i);
74 }
75
76 auto [mi, ma] = std::minmax_element(buffer.begin(), buffer.end());
77 ASSERT_EQ(*mi, 1U);
78 ASSERT_EQ(*ma, DEFAULT_BUFFER_SIZE);
79
80 buffer.clear();
81 ASSERT_EQ(buffer.size(), 0U);
82 ASSERT_EQ(buffer.capacity(), DEFAULT_BUFFER_SIZE);
83 ASSERT_TRUE(buffer.empty());
84 ASSERT_FALSE(buffer.full());
85 ASSERT_EQ(buffer.begin(), buffer.end());
86 }
87
TEST(RingBufferTest,PushPopToBufferTest)88 TEST(RingBufferTest, PushPopToBufferTest)
89 {
90 RingBuffer<size_t, DEFAULT_BUFFER_SIZE> buffer;
91
92 for (size_t i = 0; i < DEFAULT_BUFFER_SIZE; ++i) {
93 buffer.push_back(i);
94 ASSERT_EQ(buffer.size(), i + 1);
95 ASSERT_EQ(buffer.front(), 0U);
96 ASSERT_EQ(buffer.back(), i);
97 }
98 ASSERT_EQ(buffer.size(), DEFAULT_BUFFER_SIZE);
99 ASSERT_TRUE(buffer.full());
100
101 static_assert(DEFAULT_BUFFER_SIZE >= 3U, "Need 3 elements for tests");
102 size_t i = DEFAULT_BUFFER_SIZE - 1U;
103 buffer.pop_back();
104 ASSERT_EQ(buffer.size(), DEFAULT_BUFFER_SIZE - 1U);
105 ASSERT_EQ(buffer.capacity(), DEFAULT_BUFFER_SIZE);
106 ASSERT_EQ(buffer.front(), 0U);
107 ASSERT_EQ(buffer.back(), i - 1U);
108 ASSERT_NE(buffer.begin(), buffer.end());
109 ASSERT_FALSE(buffer.empty());
110 ASSERT_FALSE(buffer.full());
111
112 buffer.pop_front();
113 ASSERT_EQ(buffer.size(), DEFAULT_BUFFER_SIZE - 2U);
114 ASSERT_EQ(buffer.capacity(), DEFAULT_BUFFER_SIZE);
115 ASSERT_EQ(buffer.front(), 1U);
116 ASSERT_EQ(buffer.back(), i - 1U);
117 ASSERT_NE(buffer.begin(), buffer.end());
118 ASSERT_FALSE(buffer.empty());
119 ASSERT_FALSE(buffer.full());
120
121 i = 1U;
122 for (const auto &element : buffer) {
123 ASSERT_EQ(element, i++);
124 }
125 ASSERT_EQ(i, DEFAULT_BUFFER_SIZE - 1U);
126
127 buffer.clear();
128 ASSERT_EQ(buffer.size(), 0U);
129 ASSERT_EQ(buffer.capacity(), DEFAULT_BUFFER_SIZE);
130 ASSERT_TRUE(buffer.empty());
131 ASSERT_FALSE(buffer.full());
132 ASSERT_EQ(buffer.begin(), buffer.end());
133 }
134 } // namespace panda::test
135