1*b5645947SKrzysztof Grobelny #include "utils/unique_call.hpp"
2*b5645947SKrzysztof Grobelny 
3*b5645947SKrzysztof Grobelny #include <gmock/gmock.h>
4*b5645947SKrzysztof Grobelny 
5*b5645947SKrzysztof Grobelny namespace utils
6*b5645947SKrzysztof Grobelny {
7*b5645947SKrzysztof Grobelny 
8*b5645947SKrzysztof Grobelny using namespace testing;
9*b5645947SKrzysztof Grobelny 
10*b5645947SKrzysztof Grobelny class TestUniqueCall : public Test
11*b5645947SKrzysztof Grobelny {
12*b5645947SKrzysztof Grobelny   public:
13*b5645947SKrzysztof Grobelny     void uniqueCallIncrementCounter()
14*b5645947SKrzysztof Grobelny     {
15*b5645947SKrzysztof Grobelny         uniqueCall1([this](auto context) { ++counter; });
16*b5645947SKrzysztof Grobelny     }
17*b5645947SKrzysztof Grobelny 
18*b5645947SKrzysztof Grobelny     void uniqueCallWhileUniqueCallIsActiveIncrementCounter()
19*b5645947SKrzysztof Grobelny     {
20*b5645947SKrzysztof Grobelny         uniqueCall2([this](auto context) {
21*b5645947SKrzysztof Grobelny             ++counter;
22*b5645947SKrzysztof Grobelny             uniqueCallWhileUniqueCallIsActiveIncrementCounter();
23*b5645947SKrzysztof Grobelny         });
24*b5645947SKrzysztof Grobelny     }
25*b5645947SKrzysztof Grobelny 
26*b5645947SKrzysztof Grobelny     UniqueCall uniqueCall1;
27*b5645947SKrzysztof Grobelny     UniqueCall uniqueCall2;
28*b5645947SKrzysztof Grobelny     uint32_t counter = 0u;
29*b5645947SKrzysztof Grobelny };
30*b5645947SKrzysztof Grobelny 
31*b5645947SKrzysztof Grobelny TEST_F(TestUniqueCall, shouldExecuteNormally)
32*b5645947SKrzysztof Grobelny {
33*b5645947SKrzysztof Grobelny     for (size_t i = 0; i < 3u; ++i)
34*b5645947SKrzysztof Grobelny     {
35*b5645947SKrzysztof Grobelny         uniqueCallIncrementCounter();
36*b5645947SKrzysztof Grobelny     }
37*b5645947SKrzysztof Grobelny 
38*b5645947SKrzysztof Grobelny     ASSERT_THAT(counter, Eq(3u));
39*b5645947SKrzysztof Grobelny }
40*b5645947SKrzysztof Grobelny 
41*b5645947SKrzysztof Grobelny TEST_F(TestUniqueCall, shouldNotExecuteWhenPreviousExecutionIsStillActive)
42*b5645947SKrzysztof Grobelny {
43*b5645947SKrzysztof Grobelny     for (size_t i = 0; i < 3u; ++i)
44*b5645947SKrzysztof Grobelny     {
45*b5645947SKrzysztof Grobelny         uniqueCallWhileUniqueCallIsActiveIncrementCounter();
46*b5645947SKrzysztof Grobelny     }
47*b5645947SKrzysztof Grobelny 
48*b5645947SKrzysztof Grobelny     ASSERT_THAT(counter, Eq(3u));
49*b5645947SKrzysztof Grobelny }
50*b5645947SKrzysztof Grobelny 
51*b5645947SKrzysztof Grobelny } // namespace utils
52