Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 5068e8c

Browse files
committedFeb 7, 2022
Add test for history buffer.
1 parent e3e2a69 commit 5068e8c

File tree

3 files changed

+217
-0
lines changed

3 files changed

+217
-0
lines changed
 

‎CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ if(VPR20_FOUND OR VPR22_FOUND)
6565
endif()
6666
find_package(GMTL)
6767
find_package(OpenSceneGraph)
68+
find_package(Catch2)
6869
find_package(Eigen3)
6970

7071
set(Boost_USE_STATIC_LIBS ON)

‎tests/CMakeLists.txt

+7
Original file line numberDiff line numberDiff line change
@@ -257,4 +257,11 @@ if(NOT MSVC)
257257
endif()
258258
endif()
259259

260+
if(Catch2_FOUND)
261+
add_executable(test_HistoryBuffer HistoryBuffer.cpp)
262+
target_link_libraries(test_HistoryBuffer PRIVATE Catch2::Catch2)
263+
add_test(NAME HistoryBuffer COMMAND test_HistoryBuffer HistoryBuffer)
264+
add_test(NAME HistoryBuffer_IteratorBase COMMAND test_HistoryBuffer IteratorBase)
265+
endif()
266+
260267
add_subdirectory(cleanbuild)

‎tests/HistoryBuffer.cpp

+209
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
// Copyright 2021, Collabora, Ltd.
2+
// SPDX-License-Identifier: BSL-1.0
3+
/*!
4+
* @file
5+
* @brief HistoryBuffer collection tests.
6+
* @author Ryan Pavlik <ryan.pavlik@collabora.com>
7+
*/
8+
9+
#include <iostream>
10+
#include <util/HistoryBuffer.h>
11+
12+
using util::HistoryBuffer;
13+
14+
template <typename Container>
15+
static inline std::ostream &
16+
operator<<(std::ostream &os,
17+
const util::RandomAccessIteratorBase<Container> &iter_base) {
18+
os << "Iterator@[" << iter_base.index() << "]";
19+
return os;
20+
}
21+
22+
#define CATCH_CONFIG_MAIN
23+
24+
#include "catch/catch.hpp"
25+
26+
TEST_CASE("HistoryBuffer") {
27+
HistoryBuffer<int, 4> buffer;
28+
SECTION("behavior when empty") {
29+
CHECK(buffer.empty());
30+
CHECK(0 == buffer.size());
31+
CHECK_FALSE(buffer.begin().valid());
32+
CHECK_FALSE(buffer.end().valid());
33+
CHECK(buffer.begin() == buffer.end());
34+
}
35+
SECTION("behavior with one") {
36+
buffer.push_back(0);
37+
CHECK_FALSE(buffer.empty());
38+
CHECK(buffer.size() == 1);
39+
40+
// check iterators
41+
CHECK(buffer.begin().valid());
42+
CHECK_FALSE(buffer.end().valid());
43+
CHECK_FALSE(buffer.begin() == buffer.end());
44+
{
45+
auto it = buffer.end();
46+
// should be permanently cleared
47+
++it;
48+
CHECK_FALSE(it.valid());
49+
--it;
50+
CHECK_FALSE(it.valid());
51+
}
52+
CHECK(buffer.begin() == buffer.cbegin());
53+
CHECK(buffer.end() == buffer.cend());
54+
55+
// can we decrement our past-the-end iterator to get the begin iterator?
56+
CHECK(buffer.begin() == --(buffer.end()));
57+
58+
// make sure post-decrement works right
59+
CHECK_FALSE(buffer.begin() == (buffer.end())--);
60+
61+
// make sure post-increment works right
62+
CHECK(buffer.begin() == buffer.begin()++);
63+
64+
// make sure pre-increment works right
65+
CHECK_FALSE(buffer.begin() == ++(buffer.begin()));
66+
67+
// check contents
68+
CHECK_NOTHROW(buffer.get_at_index(0));
69+
CHECK_FALSE(buffer.get_at_index(0) == nullptr);
70+
CHECK(*buffer.get_at_index(0) == 0);
71+
72+
CHECK_FALSE(buffer.get_at_age(0) == nullptr);
73+
CHECK(*buffer.get_at_age(0) == 0);
74+
CHECK_FALSE(buffer.get_at_clamped_age(0) == nullptr);
75+
CHECK(*buffer.get_at_clamped_age(0) == 0);
76+
77+
CHECK(buffer.get_at_age(1) == nullptr);
78+
79+
CHECK_FALSE(buffer.get_at_clamped_age(1) == nullptr);
80+
CHECK(*buffer.get_at_clamped_age(1) == 0);
81+
82+
CHECK_FALSE(buffer.get_at_clamped_age(2) == nullptr);
83+
CHECK(*buffer.get_at_clamped_age(2) == 0);
84+
85+
CHECK_NOTHROW(buffer.front());
86+
CHECK(buffer.front() == 0);
87+
88+
CHECK_NOTHROW(buffer.back());
89+
CHECK(buffer.back() == 0);
90+
91+
CHECK(*buffer.begin() == buffer.front());
92+
}
93+
94+
SECTION("behavior with two") {
95+
buffer.push_back(0);
96+
buffer.push_back(1);
97+
CHECK_FALSE(buffer.empty());
98+
CHECK(buffer.size() == 2);
99+
SECTION("check iterators") {
100+
// check iterators
101+
CHECK(buffer.begin().valid());
102+
CHECK_FALSE(buffer.end().valid());
103+
CHECK_FALSE(buffer.begin() == buffer.end());
104+
{
105+
auto it = buffer.end();
106+
// should be permanently cleared
107+
++it;
108+
CHECK_FALSE(it.valid());
109+
--it;
110+
CHECK_FALSE(it.valid());
111+
}
112+
CHECK(buffer.begin() == buffer.cbegin());
113+
CHECK(buffer.end() == buffer.cend());
114+
115+
// can we decrement our past-the-end iterator to get the begin
116+
// iterator?
117+
CHECK(buffer.begin() == --(--(buffer.end())));
118+
119+
// make sure post-decrement works right
120+
CHECK_FALSE(buffer.begin() == (buffer.end())--);
121+
122+
// make sure post-increment works right
123+
CHECK(buffer.begin() == buffer.begin()++);
124+
125+
// make sure pre-increment works right
126+
CHECK_FALSE(buffer.begin() == ++(buffer.begin()));
127+
}
128+
SECTION("check contents") {
129+
// check contents
130+
CHECK_NOTHROW(buffer.get_at_index(0));
131+
CHECK_FALSE(buffer.get_at_index(0) == nullptr);
132+
CHECK(*buffer.get_at_index(0) == 0);
133+
CHECK_FALSE(buffer.get_at_index(1) == nullptr);
134+
CHECK(*buffer.get_at_index(1) == 1);
135+
CHECK(buffer.get_at_index(2) == nullptr);
136+
137+
CHECK_NOTHROW(buffer.get_at_age(0));
138+
CHECK_FALSE(buffer.get_at_age(0) == nullptr);
139+
CHECK(*buffer.get_at_age(0) == 1);
140+
CHECK_FALSE(buffer.get_at_clamped_age(0) == nullptr);
141+
CHECK(*buffer.get_at_clamped_age(0) == 1);
142+
143+
CHECK_FALSE(buffer.get_at_age(1) == nullptr);
144+
CHECK(*buffer.get_at_age(1) == 0);
145+
CHECK_FALSE(buffer.get_at_clamped_age(1) == nullptr);
146+
CHECK(*buffer.get_at_clamped_age(1) == 0);
147+
148+
CHECK(buffer.get_at_age(2) == nullptr);
149+
150+
CHECK_FALSE(buffer.get_at_clamped_age(2) == nullptr);
151+
CHECK(*buffer.get_at_clamped_age(2) == 0);
152+
153+
CHECK_FALSE(buffer.get_at_clamped_age(3) == nullptr);
154+
CHECK(*buffer.get_at_clamped_age(3) == 0);
155+
156+
CHECK_NOTHROW(buffer.front());
157+
CHECK(buffer.front() == 0);
158+
159+
CHECK_NOTHROW(buffer.back());
160+
CHECK(buffer.back() == 1);
161+
162+
CHECK(*buffer.begin() == buffer.front());
163+
CHECK(buffer.back() == *(--buffer.end()));
164+
}
165+
}
166+
167+
SECTION("algorithm behavior with 3") {
168+
buffer.push_back(0);
169+
buffer.push_back(2);
170+
buffer.push_back(4);
171+
CHECK_FALSE(buffer.empty());
172+
CHECK(buffer.size() == 3);
173+
CHECK(buffer.begin() == std::find(buffer.begin(), buffer.end(), 0));
174+
CHECK(++(buffer.begin()) == std::find(buffer.begin(), buffer.end(), 2));
175+
CHECK(buffer.end() == std::find(buffer.begin(), buffer.end(), 5));
176+
177+
CHECK(++(buffer.begin()) ==
178+
std::lower_bound(buffer.begin(), buffer.end(), 1));
179+
}
180+
}
181+
182+
TEST_CASE("IteratorBase") {
183+
184+
HistoryBuffer<int, 4> buffer;
185+
buffer.push_back(0);
186+
buffer.push_back(2);
187+
buffer.push_back(4);
188+
using namespace util;
189+
using const_iterator = typename HistoryBuffer<int, 4>::const_iterator;
190+
const_iterator default_constructed{};
191+
const_iterator begin_constructed = buffer.begin();
192+
const_iterator end_constructed = buffer.end();
193+
194+
SECTION("Check default constructed") {
195+
CHECK_FALSE(default_constructed.valid());
196+
CHECK(default_constructed.is_cleared());
197+
}
198+
SECTION("Check begin constructed") {
199+
CHECK(begin_constructed.valid());
200+
CHECK_FALSE(begin_constructed.is_cleared());
201+
CHECK((--begin_constructed).is_cleared());
202+
}
203+
SECTION("Check end constructed") {
204+
CHECK_FALSE(end_constructed.valid());
205+
CHECK_FALSE(end_constructed.is_cleared());
206+
// if we go past the end, we can go backwards into validity.
207+
CHECK_FALSE((++end_constructed).is_cleared());
208+
}
209+
}

0 commit comments

Comments
 (0)
Please sign in to comment.