blob: 3efefb80ceb122cb0ae4298f3f5a238f6a9fa633 [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);
William A. Kennington III8ec04ce2021-06-29 18:08:30 -070024 EXPECT_TRUE(cancel);
25 Cancel cancel2(std::move(cancel));
26 EXPECT_FALSE(cancel);
27 EXPECT_TRUE(cancel2);
William A. Kennington III458aeae2021-06-14 15:07:16 -070028 EXPECT_EQ(c.count, 0);
29 }
30 EXPECT_EQ(c.count, 1);
31}
32
William A. Kennington III8ec04ce2021-06-29 18:08:30 -070033TEST(CancelTest, EmptyCancel)
34{
35 Cancel cancel, cancel2(std::nullopt);
36 EXPECT_FALSE(cancel);
37 EXPECT_FALSE(cancel2);
38}
39
William A. Kennington III20cab0c2021-06-14 15:13:19 -070040TEST(CancelTest, AlwaysCallOnceLambda)
41{
42 size_t ctr = 0;
43 {
44 auto i = std::make_unique<size_t>(1);
45 auto acb = alwaysCallOnce([&, i = std::move(i)]() { ctr += *i; });
46 EXPECT_EQ(ctr, 0);
47 acb();
48 EXPECT_EQ(ctr, 1);
49 }
50 EXPECT_EQ(ctr, 1);
51 {
52 auto acb = alwaysCallOnce([&](size_t i) { ctr += i; }, 3);
53 EXPECT_EQ(ctr, 1);
54 }
55 EXPECT_EQ(ctr, 4);
56}
57
58TEST(CanceTest, AlwaysCallOnceFunction)
59{
60 size_t ctr = 0;
61 {
62 auto acb = alwaysCallOnce(std::function<void()>(nullptr));
63 }
64 {
65 auto acb = alwaysCallOnce(std::function<void()>([&]() { ctr++; }));
66 EXPECT_EQ(ctr, 0);
67 acb = alwaysCallOnce(std::function<void()>([&]() { ctr += 2; }));
68 EXPECT_EQ(ctr, 1);
69 }
70 EXPECT_EQ(ctr, 3);
71}
72
William A. Kennington III458aeae2021-06-14 15:07:16 -070073} // namespace stdplus