Skip to content

Commit 9632ed8

Browse files
authored
Merge pull request #14 from vinitjames/feature/tests
Feature/tests
2 parents 1b9ecf4 + 8668e89 commit 9632ed8

File tree

5 files changed

+130
-64
lines changed

5 files changed

+130
-64
lines changed

circular_buffer.h

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#include <mutex>
66
#include <memory>
77
#include <iterator>
8-
#include <type_traits>
98
#include <algorithm>
109
#include <utility>
1110

@@ -20,7 +19,7 @@ class CircularBuffer {
2019
typedef const T& const_reference;
2120
typedef size_t size_type;
2221
typedef ptrdiff_t difference_type;
23-
template <bool isConst> struct BufferIterator;
22+
template <bool isConst> struct BufferIterator;
2423

2524

2625
public:
@@ -80,7 +79,7 @@ class CircularBuffer {
8079
}
8180
return *this;
8281
}
83-
82+
8483
void push_back(const value_type& data);
8584
void push_back(value_type&& data) noexcept;
8685
void pop_front();
@@ -116,31 +115,33 @@ class CircularBuffer {
116115
void _decrement_bufferstate();
117116
mutable std::mutex _mtx;
118117
std::unique_ptr<value_type[]> _buff;
119-
120118
size_type _head = 0;
121119
size_type _tail = 0;
122120
size_type _size = 0;
123121
size_type _max_size = 0;
124-
122+
125123
template<bool isConst = false>
126124
struct BufferIterator{
127125
public:
128-
129-
typedef std::random_access_iterator_tag iterator_type;
126+
friend class CircularBuffer<T>;
127+
typedef std::random_access_iterator_tag iterator_category;
128+
typedef ptrdiff_t difference_type;
129+
typedef T value_type;
130130
typedef typename std::conditional<isConst, const value_type&, value_type&>::type reference;
131131
typedef typename std::conditional<isConst, const value_type*, value_type*>::type pointer;
132132
typedef typename std::conditional<isConst, const CircularBuffer<value_type>*,
133133
CircularBuffer<value_type>*>::type cbuf_pointer;
134-
134+
private:
135135
cbuf_pointer _ptrToBuffer;
136136
size_type _offset;
137137
size_type _index;
138138
bool _reverse;
139-
139+
140140
bool _comparable(const BufferIterator<isConst>& other) const{
141141
return (_ptrToBuffer == other._ptrToBuffer)&&(_reverse == other._reverse);
142142
}
143143

144+
public:
144145
BufferIterator()
145146
:_ptrToBuffer{nullptr}, _offset{0}, _index{0}, _reverse{false}{}
146147

@@ -159,8 +160,9 @@ class CircularBuffer {
159160
pointer operator->() { return &(operator*()); }
160161

161162
reference operator[](size_type index){
162-
this->_index += index;
163-
return this->operator*();
163+
BufferIterator iter = *this;
164+
iter._index += index;
165+
return *iter;
164166
}
165167

166168
BufferIterator& operator++(){
@@ -206,6 +208,11 @@ class CircularBuffer {
206208
return lhsiter;
207209
}
208210

211+
friend difference_type operator-(const BufferIterator& lhsiter, const BufferIterator& rhsiter){
212+
213+
return lhsiter._index - rhsiter._index;
214+
}
215+
209216
BufferIterator& operator-=(difference_type n){
210217
_index -= n;
211218
return *this;
@@ -246,7 +253,6 @@ class CircularBuffer {
246253
return false;
247254
return ((_index + _offset)>=(other._index+other._offset));
248255
}
249-
250256
};
251257
};
252258

tests/CMakeLists.txt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,23 @@ add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src
3333
${CMAKE_CURRENT_BINARY_DIR}/googletest-build
3434
EXCLUDE_FROM_ALL)
3535

36-
add_executable(int_buffer int_buffer.cpp)
37-
target_link_libraries(int_buffer
36+
add_executable(simple_int_test simple_int_test.cpp)
37+
target_link_libraries(simple_int_test
3838
circularbuffer
3939
gtest_main
4040
)
41-
add_test(NAME test_int_buffer COMMAND int_buffer)
41+
add_test(NAME simple_int_test COMMAND simple_int_test)
4242

43-
add_executable(string_buffer string_buffer.cpp)
44-
target_link_libraries(string_buffer
43+
add_executable(member_func_test member_func_test.cpp)
44+
target_link_libraries(member_func_test
4545
circularbuffer
4646
gtest_main
4747
)
48-
add_test(NAME test_string_buffer COMMAND string_buffer)
49-
48+
add_test(NAME member_func_test COMMAND member_func_test)
5049

50+
add_executable(iterator_test iterator_test.cpp)
51+
target_link_libraries(iterator_test
52+
circularbuffer
53+
gtest_main
54+
)
55+
add_test(NAME iterator_test COMMAND iterator_test)

tests/iterator_test.cpp

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
#include "circular_buffer.h"
2+
#include <algorithm>
3+
#include <iostream>
4+
#include <string.h>
5+
#include <utility>
6+
#include "gtest/gtest.h"
7+
8+
#define TEST_BUFFER_SIZE 100
9+
#define REDUCE_SIZE 100
10+
11+
class CircularBufferTest : public ::testing::Test{
12+
13+
protected:
14+
15+
CircularBuffer<std::string> test_str_buff{TEST_BUFFER_SIZE};
16+
CircularBuffer<int> test_int_buff{TEST_BUFFER_SIZE};
17+
};
18+
19+
TEST_F(CircularBufferTest, IteratorBasedLoopTest){
20+
//create full buffer
21+
for(int i=0; i<TEST_BUFFER_SIZE; i++)
22+
test_str_buff.push_back("string" + std::to_string(i));
23+
int i = 0;
24+
for(auto it = test_str_buff.begin(); it!=test_str_buff.end(); it++)
25+
EXPECT_EQ(*it, "string" + std::to_string(i++));
26+
//partially fill buffers
27+
test_str_buff.clear();
28+
for(int i=0; i<TEST_BUFFER_SIZE/2; i++)
29+
test_str_buff.push_back("string" + std::to_string(i));
30+
//test begin and end on partially full buffer
31+
i = 0;
32+
for(auto it = test_str_buff.begin(); it!=test_str_buff.end(); it++)
33+
EXPECT_EQ(*it, "string" + std::to_string(i++));
34+
//test size with increment variable
35+
EXPECT_EQ(i, TEST_BUFFER_SIZE/2);
36+
}
37+
38+
TEST_F(CircularBufferTest, RangeBasedLoopTest){
39+
//create full buffer
40+
for(int i=0; i<TEST_BUFFER_SIZE; i++)
41+
test_str_buff.push_back("string" + std::to_string(i));
42+
int i = 0;
43+
//copied elements
44+
for(auto buff_elem : test_str_buff)
45+
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
46+
//auto reference
47+
i = 0;
48+
for(auto& buff_elem : test_str_buff)
49+
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
50+
//auto const reference
51+
i = 0;
52+
for(const auto& buff_elem : test_str_buff)
53+
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
54+
//check iterators after modifications
55+
for(int i = 0; i<REDUCE_SIZE; i++)
56+
test_str_buff.pop_front();
57+
i = 0;
58+
for(const auto& buff_elem : test_str_buff)
59+
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
60+
EXPECT_EQ(i, TEST_BUFFER_SIZE - REDUCE_SIZE);
61+
}
62+
63+
TEST_F(CircularBufferTest, FindTest){
64+
//create full buffer
65+
for(int i=0; i<TEST_BUFFER_SIZE; i++)
66+
test_str_buff.push_back("string" + std::to_string(i));
67+
auto result = std::find(test_str_buff.cbegin(), test_str_buff.cend(), "string50");
68+
EXPECT_EQ(*result, "string50");
69+
result = std::find(test_str_buff.cbegin(), test_str_buff.cend(), "string100");
70+
EXPECT_EQ(result, test_str_buff.cend());
71+
//partial buffer search
72+
result = std::find(test_str_buff.cbegin(), test_str_buff.cbegin() + 50, "string30");
73+
EXPECT_EQ(*result, "string30");
74+
result = std::find(test_str_buff.cbegin(), test_str_buff.cbegin() + 50, "string51");
75+
EXPECT_EQ(result, test_str_buff.cbegin() + 50);
76+
}
77+
78+
TEST_F(CircularBufferTest, ForEachTest){
79+
//create full buffer
80+
for(int i=0; i<TEST_BUFFER_SIZE; i++)
81+
test_str_buff.push_back("string" + std::to_string(i));
82+
std::for_each(test_str_buff.begin(), test_str_buff.end(), [](std::string& elem){ elem = elem + "modified";});
83+
int i=0;
84+
for(const auto& elem: test_str_buff)
85+
EXPECT_EQ(elem, "string" + std::to_string(i++) + "modified");
86+
}
87+
88+
TEST_F(CircularBufferTest, SortTest){
89+
//create full buffer
90+
for(int i=0; i<TEST_BUFFER_SIZE; i++)
91+
test_int_buff.push_back(i);
92+
std::sort(test_int_buff.begin(), test_int_buff.end(), std::greater<int>());
93+
int i = 99;
94+
for(const auto& elem: test_int_buff)
95+
EXPECT_EQ(elem, i--);
96+
}
97+
98+
99+

tests/string_buffer.cpp renamed to tests/member_func_test.cpp

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ TEST_F(CircularBufferTest, AtFunctionTest){
242242
}
243243

244244
TEST_F(CircularBufferTest, AccessOperatorTest){
245-
// push back & at access for individual elements
245+
// push back & [] access for individual elements
246246
test_buff.push_back("string1");
247247
test_buff.push_back("string2");
248248
EXPECT_EQ(test_buff.size(), 2);
@@ -389,51 +389,7 @@ TEST_F(CircularBufferTest, CendIteratorTest){
389389
}
390390

391391

392-
TEST_F(CircularBufferTest, IteratorBasedLoopTest){
393-
//create full buffer
394-
for(int i=0; i<TEST_BUFFER_SIZE; i++)
395-
test_buff.push_back("string" + std::to_string(i));
396-
int i = 0;
397-
for(auto it = test_buff.begin(); it!=test_buff.end(); it++)
398-
EXPECT_EQ(*it, "string" + std::to_string(i++));
399-
//partially fill buffers
400-
test_buff.clear();
401-
for(int i=0; i<TEST_BUFFER_SIZE/2; i++)
402-
test_buff.push_back("string" + std::to_string(i));
403-
//test begin and end on partially full buffer
404-
i = 0;
405-
for(auto it = test_buff.begin(); it!=test_buff.end(); it++)
406-
EXPECT_EQ(*it, "string" + std::to_string(i++));
407-
//test size with increment variable
408-
EXPECT_EQ(i, TEST_BUFFER_SIZE/2);
409-
410-
411-
}
412392

413-
TEST_F(CircularBufferTest, RangeBasedLoopTest){
414-
//create full buffer
415-
for(int i=0; i<TEST_BUFFER_SIZE; i++)
416-
test_buff.push_back("string" + std::to_string(i));
417-
int i = 0;
418-
//copied elements
419-
for(auto buff_elem : test_buff)
420-
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
421-
//auto reference
422-
i = 0;
423-
for(auto& buff_elem : test_buff)
424-
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
425-
//auto const reference
426-
i = 0;
427-
for(const auto& buff_elem : test_buff)
428-
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
429-
//check iterators after modifications
430-
for(int i = 0; i<REDUCE_SIZE; i++)
431-
test_buff.pop_front();
432-
i = 0;
433-
for(const auto& buff_elem : test_buff)
434-
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
435-
EXPECT_EQ(i, TEST_BUFFER_SIZE - REDUCE_SIZE);
436-
}
437393

438394

439395

File renamed without changes.

0 commit comments

Comments
 (0)