libcopp 2.3.1
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
future_test.cpp
Go to the documentation of this file.
1// Copyright 2023 owent
2
5
6#include <cstdio>
7#include <cstring>
8#include <iostream>
9#include <string>
10
11#include "frame/test_macros.h"
12
21
28
30 test_trivial_clazz() = default;
31 test_trivial_clazz(int a) : data(a) {}
32 test_trivial_clazz(int a, int) : data(a) {}
33
34 int data;
35};
36
37#if (defined(__cplusplus) && __cplusplus >= 201402L) || ((defined(_MSVC_LANG) && _MSVC_LANG >= 201402L))
38static_assert(std::is_trivially_constructible<test_trivial_clazz>::value &&
39 std::is_trivially_copyable<test_trivial_clazz>::value,
40 "trivial check");
41#elif (defined(__cplusplus) && __cplusplus >= 201103L) || ((defined(_MSVC_LANG) && _MSVC_LANG >= 201103L))
42static_assert(std::is_trivial<test_trivial_clazz>::value, "trivial check");
43#endif
44
45CASE_TEST(future, poll_void) {
46 copp::future::poller<void> p1;
47 CASE_EXPECT_FALSE(p1.is_ready());
48
49 copp::future::poller<void> p2(123);
50 CASE_EXPECT_TRUE(p2.is_ready() && p2.data());
51 CASE_EXPECT_EQ(p2.data(), &p2.raw_ptr());
52
53 std::unique_ptr<bool> param3 = std::unique_ptr<bool>(new bool(false));
54 copp::future::poller<void> p3(std::move(param3));
55 CASE_EXPECT_TRUE(p3.is_ready() && p3.data());
56 CASE_EXPECT_EQ(p3.data(), &p3.raw_ptr());
57
58 copp::future::poller<void> p4;
59 // set ready
60 p4 = true;
61 CASE_EXPECT_TRUE(p4.is_ready() && p4.data());
62 CASE_EXPECT_EQ(p4.data(), &p4.raw_ptr());
63}
64
65CASE_TEST(future, poll_trival) {
66 copp::future::poller<test_trivial_clazz> p1;
67 CASE_EXPECT_FALSE(p1.is_ready());
68
69 copp::future::poller<test_trivial_clazz> p2(123);
70 CASE_EXPECT_TRUE(p2.is_ready() && p2.data());
71 CASE_EXPECT_EQ(p2.data() ? p2.data()->data : 0, 123);
72
73 std::unique_ptr<test_trivial_clazz> param3 = std::unique_ptr<test_trivial_clazz>(new test_trivial_clazz(234));
74 copp::future::poller<test_trivial_clazz> p3(std::move(param3));
75 CASE_EXPECT_TRUE(p3.is_ready() && p3.data());
76 CASE_EXPECT_EQ(p3.data() ? p3.data()->data : 0, 234);
77
78 copp::future::poller<test_trivial_clazz> p4(test_trivial_clazz(345));
79 CASE_EXPECT_TRUE(p4.is_ready() && p4.data());
80 CASE_EXPECT_EQ(p4.data() ? p4.data()->data : 0, 345);
81
82 copp::future::poller<test_trivial_clazz> p5(456, 456);
83 CASE_EXPECT_TRUE(p5.is_ready() && p5.data());
84 CASE_EXPECT_EQ(p5.data() ? p5.data()->data : 0, 456);
85}
86
87CASE_TEST(future, poll_trival_object) {
88 copp::future::poller<int> p1;
89 CASE_EXPECT_FALSE(p1.is_ready());
90
91 copp::future::poller<int> p2(123);
92 CASE_EXPECT_TRUE(p2.is_ready() && p2.data());
93 CASE_EXPECT_EQ(p2.data() ? *p2.data() : 0, 123);
94
95 std::unique_ptr<int> param3 = std::unique_ptr<int>(new int(234));
96 copp::future::poller<int> p3(std::move(param3));
97 CASE_EXPECT_TRUE(p3.is_ready() && p3.data());
98 CASE_EXPECT_EQ(p3.data() ? *p3.data() : 0, 234);
99}
100
101CASE_TEST(future, poll_no_trivial) {
102 typedef copp::future::poller<test_no_trivial_parent_clazz> test_poll_type;
103
104 test_poll_type p1;
105 CASE_EXPECT_FALSE(p1.is_ready());
106
107 test_poll_type p2(std::unique_ptr<test_no_trivial_parent_clazz>(new test_no_trivial_parent_clazz(123)));
108 CASE_EXPECT_TRUE(p2.is_ready() && p2.data());
109 CASE_EXPECT_EQ(p2.data() ? p2.data()->data : 0, 123);
110
111 test_poll_type p3(std::unique_ptr<test_no_trivial_child_clazz>(new test_no_trivial_child_clazz(234)));
112 CASE_EXPECT_EQ(p3.data() ? p3.data()->data : 0, -234);
113}
114
115CASE_TEST(future, poll_shared_ptr) {
116 typedef copp::future::poller<test_no_trivial_parent_clazz, std::shared_ptr<test_no_trivial_parent_clazz> >
117 test_poll_type;
118
119 test_poll_type p1;
120 CASE_EXPECT_FALSE(p1.is_ready());
121
122 test_poll_type p2(std::unique_ptr<test_no_trivial_parent_clazz>(new test_no_trivial_parent_clazz(123)));
123 CASE_EXPECT_TRUE(p2.is_ready() && p2.data());
124 CASE_EXPECT_EQ(p2.data() ? p2.data()->data : 0, 123);
125 CASE_EXPECT_EQ(p2.data() ? p2.data()->get_type() : 0, 1);
126
127 test_poll_type p3(std::make_shared<test_no_trivial_parent_clazz>(234));
128 CASE_EXPECT_TRUE(p3.is_ready() && p3.data());
129 CASE_EXPECT_EQ(p3.data() ? p3.data()->data : 0, 234);
130 CASE_EXPECT_EQ(p3.data() ? p3.data()->get_type() : 0, 1);
131
132 test_poll_type p4(std::unique_ptr<test_no_trivial_child_clazz>(new test_no_trivial_child_clazz(345)));
133 CASE_EXPECT_TRUE(p4.is_ready() && p4.data());
134 CASE_EXPECT_EQ(p4.data() ? p4.data()->data : 0, -345);
135 CASE_EXPECT_EQ(p4.data() ? p4.data()->get_type() : 0, 2);
136
137 test_poll_type p5(std::make_shared<test_no_trivial_child_clazz>(456));
138 CASE_EXPECT_TRUE(p5.is_ready() && p5.data());
139 CASE_EXPECT_EQ(p5.data() ? p5.data()->data : 0, -456);
140 CASE_EXPECT_EQ(p5.data() ? p5.data()->get_type() : 0, 2);
141}
142
143CASE_TEST(future, poll_strong_rc_ptr) {
144 typedef copp::future::poller<test_no_trivial_parent_clazz, copp::memory::strong_rc_ptr<test_no_trivial_parent_clazz> >
145 test_poll_type;
146
147 test_poll_type p1;
148 CASE_EXPECT_FALSE(p1.is_ready());
149
150 test_poll_type p2(std::unique_ptr<test_no_trivial_parent_clazz>(new test_no_trivial_parent_clazz(123)));
151 CASE_EXPECT_TRUE(p2.is_ready() && p2.data());
152 CASE_EXPECT_EQ(p2.data() ? p2.data()->data : 0, 123);
153 CASE_EXPECT_EQ(p2.data() ? p2.data()->get_type() : 0, 1);
154
155 test_poll_type p3(copp::memory::make_strong_rc<test_no_trivial_parent_clazz>(234));
156 CASE_EXPECT_TRUE(p3.is_ready() && p3.data());
157 CASE_EXPECT_EQ(p3.data() ? p3.data()->data : 0, 234);
158 CASE_EXPECT_EQ(p3.data() ? p3.data()->get_type() : 0, 1);
159
160 test_poll_type p4(std::unique_ptr<test_no_trivial_child_clazz>(new test_no_trivial_child_clazz(345)));
161 CASE_EXPECT_TRUE(p4.is_ready() && p4.data());
162 CASE_EXPECT_EQ(p4.data() ? p4.data()->data : 0, -345);
163 CASE_EXPECT_EQ(p4.data() ? p4.data()->get_type() : 0, 2);
164
165 test_poll_type p5(copp::memory::make_strong_rc<test_no_trivial_child_clazz>(456));
166 CASE_EXPECT_TRUE(p5.is_ready() && p5.data());
167 CASE_EXPECT_EQ(p5.data() ? p5.data()->data : 0, -456);
168 CASE_EXPECT_EQ(p5.data() ? p5.data()->get_type() : 0, 2);
169}
170
171CASE_TEST(future, poll_void_reset_and_swap) {
172 // using copp::future::swap;
173 {
174 copp::future::poller<void> p1;
175 copp::future::poller<void> p2;
176
177 p1 = true;
178 CASE_EXPECT_TRUE(p1.is_ready());
179 CASE_EXPECT_TRUE(p2.is_pending());
180
181 swap(p1, p2);
182
183 CASE_EXPECT_FALSE(p1.is_ready());
184 CASE_EXPECT_FALSE(p2.is_pending());
185
186 p2.reset();
187 CASE_EXPECT_TRUE(p2.is_pending());
188 }
189}
190
191CASE_TEST(future, poll_trivial_reset_and_swap) {
192 // using copp::future::swap;
193 {
194 copp::future::poller<int> p1;
195 copp::future::poller<int> p2;
196
197 p1 = 123;
198 CASE_EXPECT_TRUE(p1.is_ready());
199 CASE_EXPECT_TRUE(p2.is_pending());
200
201 swap(p1, p2);
202
203 CASE_EXPECT_FALSE(p1.is_ready());
204 CASE_EXPECT_FALSE(p2.is_pending());
205 CASE_EXPECT_EQ(123, *p2.data());
206
207 p2.reset();
208 CASE_EXPECT_TRUE(p2.is_pending());
209 }
210}
211
212CASE_TEST(future, poll_no_trivial_reset_and_swap) {
213 // using copp::future::swap;
214 {
215 copp::future::poller<test_no_trivial_parent_clazz> p1;
216 copp::future::poller<test_no_trivial_parent_clazz> p2;
217
218 p1 = copp::future::make_unique<test_no_trivial_parent_clazz>(123);
219 CASE_EXPECT_TRUE(p1.is_ready());
220 CASE_EXPECT_TRUE(p2.is_pending());
221
222 swap(p1, p2);
223
224 CASE_EXPECT_FALSE(p1.is_ready());
225 CASE_EXPECT_FALSE(p2.is_pending());
226 CASE_EXPECT_EQ(123, p2.data()->data);
227
228 p2.reset();
229 CASE_EXPECT_TRUE(p2.is_pending());
230 }
231}
232
233CASE_TEST(future, swap_trivial_result) {
234 // using copp::future::swap;
235 {
236 copp::future::result_type<test_no_trivial_parent_clazz, int> p1 =
237 copp::future::result_type<test_no_trivial_parent_clazz, int>::create_success(123);
238 copp::future::result_type<test_no_trivial_parent_clazz, int> p2 =
239 copp::future::result_type<test_no_trivial_parent_clazz, int>::create_error(456);
240
241 CASE_EXPECT_TRUE(p1.is_success());
242 CASE_EXPECT_TRUE(p2.is_error());
243
244 swap(p1, p2);
245
246 CASE_EXPECT_FALSE(p1.is_success());
247 CASE_EXPECT_FALSE(p2.is_error());
248
249 CASE_EXPECT_EQ(456, *p1.get_error());
250 CASE_EXPECT_EQ(123, p2.get_success()->data);
251 }
252}
253
254CASE_TEST(future, swap_no_trivial_result) {
255 // using copp::future::swap;
256 {
257 copp::future::result_type<int, int> p1 = copp::future::result_type<int, int>::create_success(123);
258 copp::future::result_type<int, int> p2 = copp::future::result_type<int, int>::create_error(456);
259
260 CASE_EXPECT_TRUE(p1.is_success());
261 CASE_EXPECT_TRUE(p2.is_error());
262
263 swap(p1, p2);
264
265 CASE_EXPECT_FALSE(p1.is_success());
266 CASE_EXPECT_FALSE(p2.is_error());
267
268 CASE_EXPECT_EQ(456, *p1.get_error());
269 CASE_EXPECT_EQ(123, *p2.get_success());
270 }
271}
272
273CASE_TEST(future, future_with_void_result) {
274 copp::future::future<void> fut;
275
276 CASE_EXPECT_FALSE(fut.is_ready());
277 CASE_EXPECT_TRUE(fut.is_pending());
278 CASE_EXPECT_EQ(nullptr, fut.data());
279 CASE_EXPECT_EQ(nullptr, fut.raw_ptr().get());
280
281 fut.reset_data(true);
282 CASE_EXPECT_TRUE(fut.is_ready());
283 CASE_EXPECT_FALSE(fut.is_pending());
284}
285
286CASE_TEST(future, future_with_trival_result) {
287 copp::future::future<int32_t> fut;
288 int32_t simulator_result = 12345678;
289
290 CASE_EXPECT_FALSE(fut.is_ready());
291 CASE_EXPECT_TRUE(fut.is_pending());
292 CASE_EXPECT_EQ(nullptr, fut.data());
293 CASE_EXPECT_EQ(nullptr, fut.raw_ptr().get());
294
295 fut.reset_data(simulator_result);
296 CASE_EXPECT_TRUE(fut.is_ready());
297 CASE_EXPECT_FALSE(fut.is_pending());
298
299 CASE_EXPECT_EQ(simulator_result, *fut.data());
300}
301
302CASE_TEST(future, future_with_no_trival_result) {
303 copp::future::future<std::string> fut;
304
305 CASE_EXPECT_FALSE(fut.is_ready());
306 CASE_EXPECT_TRUE(fut.is_pending());
307 CASE_EXPECT_EQ(nullptr, fut.data());
308 CASE_EXPECT_EQ(nullptr, fut.raw_ptr().get());
309
310 fut.reset_data("hello");
311 CASE_EXPECT_TRUE(fut.is_ready());
312 CASE_EXPECT_FALSE(fut.is_pending());
313
314 CASE_EXPECT_EQ("hello", *fut.data());
315}
316
317CASE_TEST(future, future_with_copp_trivial_result) {
318 using result_type = copp::future::result_type<int, long>;
319 static_assert(LIBCOPP_IS_TIRVIALLY_COPYABLE_V(result_type), "result_type<int, long> must be trivial");
320
321 copp::future::future<result_type> fut;
322
323 CASE_EXPECT_FALSE(fut.is_ready());
324 CASE_EXPECT_TRUE(fut.is_pending());
325 CASE_EXPECT_EQ(nullptr, fut.data());
326 CASE_EXPECT_EQ(nullptr, fut.raw_ptr().get());
327
328 fut.reset_data(result_type::make_success(171));
329
330 CASE_EXPECT_TRUE(fut.data()->is_success());
331 CASE_EXPECT_FALSE(fut.data()->is_error());
332 CASE_EXPECT_EQ(171, *fut.data()->get_success());
333}
334
335CASE_TEST(future, future_with_copp_no_trivial_result) {
336 using result_type = copp::future::result_type<int, std::string>;
337 static_assert(!LIBCOPP_IS_TIRVIALLY_COPYABLE_V(result_type), "result_type<int, std::string> must not be trivial");
338
339 copp::future::future<result_type> fut;
340
341 CASE_EXPECT_FALSE(fut.is_ready());
342 CASE_EXPECT_TRUE(fut.is_pending());
343 CASE_EXPECT_EQ(nullptr, fut.data());
344 CASE_EXPECT_EQ(nullptr, fut.raw_ptr().get());
345
346 fut.reset_data(result_type::make_error("hello"));
347
348 CASE_EXPECT_TRUE(fut.is_ready());
349 CASE_EXPECT_FALSE(fut.is_pending());
350 // already moved into fut
351 CASE_EXPECT_FALSE(fut.data()->is_success());
352 CASE_EXPECT_TRUE(fut.data()->is_error());
353
354 CASE_EXPECT_EQ("hello", *fut.data()->get_error());
355}
#define LIBCOPP_IS_TIRVIALLY_COPYABLE_V(X)
Definition type_traits.h:46
test_trivial_clazz()=default
test_trivial_clazz(int a, int)
#define CASE_EXPECT_FALSE(c)
Definition test_macros.h:98
#define CASE_EXPECT_EQ(l, r)
Definition test_macros.h:99
#define CASE_TEST(test_name, case_name)
Definition test_macros.h:47
#define CASE_EXPECT_TRUE(c)
Definition test_macros.h:97