3
3
#include " Fifo3.hpp"
4
4
#include " Fifo4.hpp"
5
5
#include " Fifo5.hpp"
6
- // TODO #include "Fifo7.hpp"
7
6
8
7
#include < gtest/gtest.h>
9
8
10
9
#include < type_traits>
11
10
11
+
12
12
extern " C" {
13
13
void __ubsan_on_report () {
14
14
FAIL () << " Encountered an undefined behavior sanitizer error" ;
@@ -31,7 +31,7 @@ class FifoTestBase : public testing::Test {
31
31
FifoType fifo{4 };
32
32
};
33
33
34
- using test_type = int ;
34
+ using test_type = unsigned int ;
35
35
36
36
37
37
template <typename FifoT> using FifoTest = FifoTestBase<FifoT>;
@@ -96,7 +96,7 @@ TYPED_TEST(FifoTest, pop) {
96
96
for (auto i = 0u ; i < this ->fifo .size (); ++i) {
97
97
auto value = typename TestFixture::value_type{};
98
98
EXPECT_TRUE (this ->fifo .pop (value));
99
- EXPECT_EQ (42 + i, value);
99
+ EXPECT_EQ (42 + i, value);
100
100
}
101
101
EXPECT_FALSE (this ->fifo .pop (value));
102
102
}
@@ -112,7 +112,7 @@ TYPED_TEST(FifoTest, popFullFifo) {
112
112
113
113
for (auto i = 0u ; i < this ->fifo .size ()*4 ; ++i) {
114
114
EXPECT_TRUE (this ->fifo .pop (value));
115
- EXPECT_EQ (42 + i, value);
115
+ EXPECT_EQ (42 + i, value);
116
116
EXPECT_FALSE (this ->fifo .full ());
117
117
118
118
EXPECT_TRUE (this ->fifo .push (42 + 4 + i));
@@ -128,13 +128,28 @@ TYPED_TEST(FifoTest, popEmpty) {
128
128
EXPECT_TRUE (this ->fifo .empty ());
129
129
EXPECT_TRUE (this ->fifo .push (42 + i));
130
130
EXPECT_TRUE (this ->fifo .pop (value));
131
- EXPECT_EQ (42 + i, value);
131
+ EXPECT_EQ (42 + i, value);
132
132
}
133
133
134
134
EXPECT_TRUE (this ->fifo .empty ());
135
135
EXPECT_FALSE (this ->fifo .pop (value));
136
136
}
137
137
138
+ TYPED_TEST (FifoTest, wrap) {
139
+ auto value = typename TestFixture::value_type{};
140
+ for (auto i = 0u ; i < this ->fifo .size () * 2 + 1 ; ++i) {
141
+ this ->fifo .push (42 + i);
142
+ EXPECT_TRUE (this ->fifo .pop (value));
143
+ EXPECT_EQ (42 + i, value);
144
+ }
145
+
146
+ for (auto i = 0u ; i < 8u ; ++i) {
147
+ this ->fifo .push (42 + i);
148
+ EXPECT_TRUE (this ->fifo .pop (value));
149
+ EXPECT_EQ (42 + i, value);
150
+ }
151
+ }
152
+
138
153
139
154
template <typename FifoT> using ProxyTest = FifoTestBase<FifoT>;
140
155
using ProxyFifoTypes = ::testing::Types<
@@ -184,13 +199,29 @@ TYPED_TEST(ProxyTest, pusherRelease) {
184
199
185
200
{
186
201
auto pusher = this ->fifo .push ();
202
+ ASSERT_TRUE (!!pusher);
187
203
pusher = 24 ;
188
204
pusher.release ();
205
+ EXPECT_FALSE (!!pusher);
189
206
}
190
207
EXPECT_EQ (42 , *this ->fifo .pop ());
191
208
EXPECT_TRUE (this ->fifo .empty ());
192
209
}
193
210
211
+ TYPED_TEST (ProxyTest, popperRelease) {
212
+ this ->fifo .push () = 42 ;
213
+ EXPECT_FALSE (this ->fifo .empty ());
214
+
215
+ {
216
+ auto popper = this ->fifo .pop ();
217
+ ASSERT_TRUE (!!popper);
218
+ EXPECT_EQ (42 , *popper);
219
+ popper.release ();
220
+ EXPECT_FALSE (!!popper);
221
+ }
222
+ EXPECT_FALSE (this ->fifo .empty ());
223
+ EXPECT_EQ (42 , *this ->fifo .pop ());
224
+ }
194
225
195
226
196
227
struct ABC
@@ -200,6 +231,13 @@ struct ABC
200
231
int c;
201
232
};
202
233
234
+ // Specialize ValueSizeTraits not to copy ABC::c.
235
+ template <>
236
+ inline std::size_t ValueSizeTraits<ABC>::size(value_type const &) {
237
+ return sizeof (ABC::a) + sizeof (ABC::b);
238
+ }
239
+
240
+
203
241
template <typename FifoT> using ProxyMoveTest = FifoTestBase<FifoT>;
204
242
using ProxyMoveFifoTypes = ::testing::Types<
205
243
Fifo5<ABC>
@@ -212,22 +250,68 @@ TYPED_TEST(ProxyMoveTest, pusherMove) {
212
250
pusher = ABC{100 , 200 , 300 };
213
251
EXPECT_TRUE (!!pusher);
214
252
EXPECT_EQ (100 , pusher->a );
215
- EXPECT_EQ (200 , pusher->b );
216
- EXPECT_EQ (300 , pusher->c );
217
253
218
254
// move ctor
219
255
auto pusher2 = std::move (pusher);
220
256
EXPECT_FALSE (!!pusher);
221
257
EXPECT_TRUE (!!pusher2);
222
258
EXPECT_EQ (100 , pusher2->a );
223
- EXPECT_EQ (200 , pusher2->b );
224
- EXPECT_EQ (300 , pusher2->c );
225
259
226
260
// move assignment
227
261
pusher = std::move (pusher2);
228
262
EXPECT_TRUE (!!pusher);
229
263
EXPECT_FALSE (!!pusher2);
230
264
EXPECT_EQ (100 , pusher->a );
231
- EXPECT_EQ (200 , pusher->b );
232
- EXPECT_EQ (300 , pusher->c );
265
+ }
266
+
267
+ TYPED_TEST (ProxyMoveTest, popperMove) {
268
+ for (auto i = 0 ; i < static_cast <int >(this ->fifo .size ()); ++i) {
269
+ this ->fifo .push (ABC{42 + i, 43 , 44 });
270
+ }
271
+
272
+ for (auto i = 0u ; i < this ->fifo .size (); ++i) {
273
+ auto popper = this ->fifo .pop ();
274
+ ASSERT_TRUE (!!popper);
275
+ EXPECT_EQ (42 + i, popper->a );
276
+
277
+ // move ctor
278
+ auto popper2 = std::move (popper);
279
+ EXPECT_FALSE (!!popper);
280
+ ASSERT_TRUE (!!popper2);
281
+ EXPECT_EQ (42 + i, popper2->a );
282
+
283
+ // move assignment
284
+ popper = std::move (popper2);
285
+ ASSERT_TRUE (!!popper);
286
+ EXPECT_FALSE (!!popper2);
287
+ EXPECT_EQ (42 + i, popper->a );
288
+ }
289
+ EXPECT_TRUE (this ->fifo .empty ());
290
+ }
291
+
292
+ TYPED_TEST (ProxyMoveTest, pusherUsesValueSizeTraits) {
293
+ // Push and pop a value into every slot of the fifo using assign
294
+ // directly to value_type&. This bypasses use of ValueSizeTraits.
295
+ for (auto i = 0 ; i < static_cast <int >(this ->fifo .size ()); ++i) {
296
+ {
297
+ auto pusher = this ->fifo .push ();
298
+ *pusher = ABC{1 , 2 , 3 };
299
+ }
300
+ auto popper = this ->fifo .pop ();
301
+ EXPECT_EQ (1 , popper->a );
302
+ EXPECT_EQ (2 , popper->b );
303
+ EXPECT_EQ (3 , popper->c );
304
+ }
305
+
306
+ // Now push using operator= and a different value
307
+ {
308
+ auto pusher = this ->fifo .push ();
309
+ pusher = ABC{100 , 200 , 300 };
310
+ }
311
+
312
+ auto popper = this ->fifo .pop ();
313
+ EXPECT_EQ (100 , popper->a );
314
+ EXPECT_EQ (200 , popper->b );
315
+ EXPECT_EQ (3 , popper->c );
316
+
233
317
}
0 commit comments