blob: d8c75a860196a4abae07864eb74aa99d77c36db7 [file] [log] [blame]
William A. Kennington III20cab0c2021-06-14 15:13:19 -07001#include <functional>
William A. Kennington III458aeae2021-06-14 15:07:16 -07002#include <stdplus/cancel.hpp>
3
4#include <gtest/gtest.h>
5
6namespace stdplus
7{
8
9struct FakeCancelable : public Cancelable
10{
11 size_t count = 0;
12 void cancel() noexcept override
13 {
14 count++;
15 }
16};
17
18TEST(CancelTest, Cancel)
19{
20 FakeCancelable c;
21 EXPECT_EQ(c.count, 0);
22 {
23 Cancel cancel(&c);
24 EXPECT_EQ(c.count, 0);
25 }
26 EXPECT_EQ(c.count, 1);
27}
28
William A. Kennington III20cab0c2021-06-14 15:13:19 -070029TEST(CancelTest, AlwaysCallOnceLambda)
30{
31 size_t ctr = 0;
32 {
33 auto i = std::make_unique<size_t>(1);
34 auto acb = alwaysCallOnce([&, i = std::move(i)]() { ctr += *i; });
35 EXPECT_EQ(ctr, 0);
36 acb();
37 EXPECT_EQ(ctr, 1);
38 }
39 EXPECT_EQ(ctr, 1);
40 {
41 auto acb = alwaysCallOnce([&](size_t i) { ctr += i; }, 3);
42 EXPECT_EQ(ctr, 1);
43 }
44 EXPECT_EQ(ctr, 4);
45}
46
47TEST(CanceTest, AlwaysCallOnceFunction)
48{
49 size_t ctr = 0;
50 {
51 auto acb = alwaysCallOnce(std::function<void()>(nullptr));
52 }
53 {
54 auto acb = alwaysCallOnce(std::function<void()>([&]() { ctr++; }));
55 EXPECT_EQ(ctr, 0);
56 acb = alwaysCallOnce(std::function<void()>([&]() { ctr += 2; }));
57 EXPECT_EQ(ctr, 1);
58 }
59 EXPECT_EQ(ctr, 3);
60}
61
William A. Kennington III458aeae2021-06-14 15:07:16 -070062} // namespace stdplus